嵌入式linux的驱动程序
[摘至嵌入式linux设备驱动开发详解]
1.4 嵌入式linux驱动程序
1.4.1 嵌入式linux的内核空间和用户空间
目前,各种处理器都能防止资源的未经授权访问,包括嵌入式处理器。一般都是给CPU划分不同的操作模式。不同的模式有不同的作用,某些操作不允许在低级别模式使用。
内核态和用户态是在硬件上的习惯说法,两个状态分别对应处理器的两个不同操作模式。例如,ARM中的用户态对应usr模式,而内核态对应svc模式。内核态可以控制内存映射方式、特殊寄存器、中断和DMA等,而用户态则不可以。内核空间和用户空间是软件上的习惯说法,两个空间分别引用不同的地址映射。程序代码使用不同的地址空间。如果想直接通过指针把地址空间的数据地址传到内核是不可能的,需要先通过地址转换将用户态地址转换为内核态地址。
嵌入式linux利用系统调用和硬件中断来完成从用户空间到内核空间的控制转移。同时,嵌入式linux提供了一系列函数完成不同空间地址的转换,如get_user、put_user、copy_from_user、copy_to_user。
1.4.2 嵌入式linux的文件系统
操作系统最重要的两部分:进程管理和文件系统。linux从一开始就把外部设备全部当成文件处理。凡是可以产生或接受消息的都是文件。嵌入式中常用的文件系统都是普通linux文件系统的简化版,为了适应嵌入式的特点,包括有cramfs、romfs、jffs、jffs2等。
linux支持很多不同种类的文件系统,甚至设备也被当做文件处理。而要支持这样种类繁多的文件系统,必须将不同文件系统的操作和控制纳入一个统一的框架之中、使得用户可以通过统一的标准来调用不同的文件系统,而感觉不到其中的差异,甚至设备的调用也是通过文件调用的标准来实现的。而这样的功能的实现是通过虚拟文件系统来实现的(virtual filesystem switch)。
VFS是物理文件系统和服务之间的接口层,对用户程序屏蔽掉不同文件系统的实现细节,仅给用户一个统一的、抽象、虚拟的文件系统接口,使得不同文件系统在linux的其他进程看来都是相同的。VFS不是一个实际的文件系统,它随系统启动产生,关闭结束。仅存于内存中,不占外存空间,主要功能有:记录可用的文件系统类型;将设备与文件系统对应联系起来;处理面向文件的通用操作。
有了VFS,仅通过一系列的标准的系统调用便可以实现所需要的操作,如read()、write()、lseek()等。这些操作主要通过一个f_op结构指针指向具体的file_operations结构体来实现系统调用的转换。每个文件系统都有自己的file_operations结构体,内部几乎全都是函数指针,相当于一个函数跳转表。f_op指向了特定的file_operations就等于指向了特定的文件系统。
1.4.3 嵌入式linux的设备管理
设备管理,即输入/输出系统是操作系统的重要组成部分。相比于进程管理、内存管理和文件系统管理,设备管理稍显复杂。主要是因为多种多样的设备同时存在,给制定一个通用的解决方法带来了极大的难度。尽管设备种类繁多,为了便于使用,下层必须使用一个统一的设备接口,在linux下,硬件设备也是被当做文件系统来处理的,只是这种文件比较特殊,叫做设备文件。通常这些设备文件存放在文件系统的/dev目录下。
linux通过主次设备号来联系驱动程序和设备文件节点。系统依靠主设备号标识驱动程序,所以同类的设备的主设备号是唯一的。在2.4版本以前的内核一直都是利用设备类型和设备的主次设备号管理设备的方法。在引入了devfs设备文件系统之后,传统方式和devfs管理方式同时发挥作用。传统的方式会受到设备数量的限制(最多254个),而采用devfs之后就没有这个问题了。实现效果上,两者并没有很大的区别。