Chinaunix首页 | 论坛 | 博客
  • 博客访问: 557311
  • 博文数量: 104
  • 博客积分: 4131
  • 博客等级: 上校
  • 技术积分: 1137
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 15:05
文章分类

全部博文(104)

文章存档

2011年(13)

2010年(23)

2009年(68)

我的朋友

分类: LINUX

2009-08-01 11:19:41

  刚接触到Linux下驱动编程,一般都是照着模式写代码,或是修改一下已有源码,对驱动的调用过程并不是很熟悉。在网上不断的淘宝,算是有点明白了,现在我就说下自己的了解。
我们加载驱动模块后都会做一个工作,就是通过mknod在/dev文件夹下建立一个设备文件
mknod /dev/${device} c $major 0
$major 为主设备号,0次设备号
   这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序是哪一个了。
当你执行indmod命令时,这个函数可以完成三件大事:
第一,申请主设备号(major),或者指定,或者动态分配;
第二,在内核中注册设备的名字("device");
第三,指定fops方法(&bao_fops)。
其中所指定的fops方法就是我们对设备进行操作的方法(例如read,write,seek,dir,open,release等),如何实现这些方法,是编写设备驱动程序大部分工作量所在。
以下是对write的整个调用流程举例:
1,insmod驱动程序。驱动程序申请设备名和主设备号,这些可以在/proc/devieces中获得。
2,从/proc/devices中获得主设备号,并使用mknod命令建立设备节点文件。这是通过主设备号将设备节点文件和设备驱动程序联系在一起。设备节点文件中的file属性中指明了驱动程序中fops方法实现的函数指针。
3,用户程序使用open打开设备节点文件,这时操作系统内核知道该驱动程序工作了,就调用fops方法中的open函数进行相应的工作。open方法一般返回的是文件标示符,实际上并不是直接对它进行操作的,而是有操作系统的系统调用在背后工作。
4,当用户使用write函数操作设备文件时,操作系统调用sys_write函数,该函数首先通过文件标示符得到设备节点文件对应的inode指针和flip指针。inode指针中有设备号信息,能够告诉操作系统应该使用哪一个设备驱动程序,flip指针中有fops信息,可以告诉操作系统相应的fops方法函数在那里可以找到。
5,然后这时sys_write才会调用驱动程序中的write方法来对设备进行写的操作。
其中1-3都是在用户空间进行的,4-5是在核心空间进行的。用户的write函数和操作系统的write函数通过系统调用sys_write联系在了一起。
从以上可以看到用户所使用的函数怎么在驱动中得以实现。 
 
阅读(1103) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~