Chinaunix首页 | 论坛 | 博客
  • 博客访问: 501779
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-03-09 23:52:12

I/O系统
主要提供以下功能:
1)管理设备驱动程序;
2)实现设备命名;
3)向用户提供统一的调用。
管理设备驱动程序通过驱动程序地址表来实现。
应用层可以通过设备名来使用设备,I/O系统和驱动程序内部则采用主/次设备号来操作设备,即用主设备号来区别不同的驱动程序,而用次设备号来区别多个同类设备。I/O系统需要提供将设备名映射到主/次设备号的方法。另外,应用层如果每次都通过设备名来使用设备并不方便。为此,I/O系统可采用文件描述符的机制来简化这一过程。用户打开设备后获得该设备的文件描述符,以后对设备的操作都通过这个文件描述符来进行。
为便于I/O系统使用的统一性,通常都要求I/O系统提供统一的调用接口。I/O系统的统一接口主要实现以下对设备的操作:
1)设备初始化;
2)打开设备;
3)关闭设备;
4)读设备;
5)写设备;
6)设备控制。
I/O系统的层次关系:

        应用
    --------------------
内    I/O系统    文件描述符机制
        设备名称机制
核        主设备名机制
    --------------------    
    驱动程序1...驱动程序3


I/O系统的三种机制的映射:

文件描述符实际上是访问文件描述符表的索引。文件描述符表的每一项才是真正的文件描述符结构。
用文件描述符访问文件描述符表,文件描述符表结构中的pDNT是指向设备名表中的对应项,再访问设备名表就可以得到主设备号,用主设备号访问驱动程序地址表就可以调用设备驱动程序提供的调用。

索引号/文件描述符  文件描述符表  文件描述符结构            设备名表
                         设备名 主设备号 次设备号
0                  LCD----------pDNT----------->LCD       0      0
1           key -        size            key       1      0
                  -      offset        
                        ----sem


文件系统
文件系统是指在磁盘或者磁盘分区(包括闪存、内存等)进行文件组织管理的方法。
在Linux中,根目录是系统启动时加载的。其他的文件系统是加载到目录树的节点上的。

 用户层 目录树

-----------------------------------------------------------------------------

内核层 虚拟文件系统(VFS)

JFFS2 RAMFS

----------------------------------------------------------------------------

底层驱动 MTD字符设备 MTD块设备

MTD设备驱动

----------------------------------------------------------------------------

硬件层  NORFLASH       NAND FLASH RAM


Linux支持多种文件系统,不同的设备可以使用适合自己的文件系统,然后挂载在目录树的节点上,通过VFS统一接口,就可以访问。设备的文件系统是运行在该设备上的映像。
通过这样的机制,Linux可以无差别的访问不同设备的文件系统,包括NFS网络文件系统。

驱动程序
设备驱动程序是操作系统内核和机器硬件之间的接口,为应用程序屏蔽了硬件的细节。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件进行操作。
设备驱动程序主要完成这些功能:
1)探测设备和初始化设备;
2)从设备接受数据并提交给内核;
3)从内核接受数据送到设备;
4)检测和处理设备错误。
Linux系统把设备分成3种类型:字符设备,块设备和网络设备。
使用mknod命令可以创建指定类型的设备文件,同时为其分配相应的主设备号和次设备号。
mknod /dev/had1 b 12 0
/dev/had1是设备名, b表示设备类型-块设备, 12是主设备号, 0是次设备号。
设备文件不同于普通文件,它只有文件名,没有正文。它提供的信息只有三项:目标设备所属类型,主设备号和次设备号,这些信息放在文件的目录项中。
Linux打开设备文件的过程大致如下:
1)根据设备文件名,在文件系统找到目标文件的目录项,从中获得主设备名和次设备名。
2)在本进程的结构数据组中分配一个空闲的file结构,其下标为打开文件号(只对本进程有意义)。
3)根据设备类型和主设备号找到相应的file_operations结构,并将其地址记录在file结构中。同时,把与目标项有关的数据结构的地址也记录在file结构中,以便获得次设备号。
Linux的设备驱动都是在内核中,即系统空间实现的。方式有两种:静态连接在内核映像中或者成为“可安装模块”,需要时由系统调用动态的安装或拆卸。
由于所有设备驱动都实现于内核中,并且只能实现于内核中,对设备的操作就最终要进入内核才能完成。而系统调用是进程主动进入内核的唯一途径。
虽然作为文件系统的一部分,设备可以通过open(),close(),read(),write()等文件统一接口来访问,但是为了能够控制硬件,最常用的通过设备驱动程序完成控制动作的方法就是实现爱ioctl(I/O Control)。ioctl系统调用为驱动程序执行相关操作提供了一个与设备相关的入口点(read()等是设备无关的)。它允许应用程序访问被驱动硬件的特性功能————配置设备以及进入或退出的操作模式。例如改变串口的波特率。
阅读(1344) | 评论(0) | 转发(0) |
0

上一篇:V4L2

下一篇:使用map的一个程序

给主人留下些什么吧!~~