应用程序调用驱动程序的具体过程:
linux操作系统中的应用程序通过什么方式来访问各种各样的设备?
--------------------------------------------------------------------------
1.linux用户程序通过设备文件(也称:设备节点)来使用驱动程序操作字符设备和块设备
2.并且每个设备都有一个设备节点名,及设备节点号码
--------------------------------------------------------------------------
linux下有四类文件:
--------------------------------------------------------------------------
普通文件,目录文件(d),连接文件(l),设备文件(b/c)
设备文件的属性:
1.文件名 /dev/leds 在哪里被命名:在驱动注册的时候,或者是在加载模块的时候,insmod /dev/leds c 100 0
2. 类别 (-:常规文件, c:字符设备节点, b:块设备节点, d:目录)
3.设备号(主设备号(就是这个驱动程序的编号),次设备号) 设备号哪里来的?
4.权限 (不需要关心)
设备号:
------------------------------------------------------------------------------------------------------
在linux中设备号是一个无符号的32位的长整型,其中高12位为主设备号,低20位为次设备号。
内核中获得设备号的方法:dev_t
MKDEV(major,minor)
设备号的作用?:
------------------------------------------------------------------------------------------------------
用来找设备所对应的驱动程序。
(怎么找?等会讲!!!!)
其中主设备号表示哪类的设备,次设备号代表哪个设备
怎么分配主设备号?主设备号谁来分配?:
------------------------------------------------------------------------------------------------------
linux中有两种方法来分配设备号,一种是静态分配的方式,一种是动态分配的方式
静态的分配方式就是由程序员通过查看哪个设备号没有被应用就分配给他,所以这种方式的设备号是有程序员来分配的
动态的分配方式则是由内核给你自动的分配,内核会自动的去查找,看哪个号码没有被应用。
(等会带你们到内核里面走走!!!!!)
注册的时候涉及到的知识点:需要向内核注册哪些东西?????
------------------------------------------------------------------------------------------------------
1. 设备号:主设备号,次设备号
2. 设备名字
3. 操作设备的方法(操作函数):实现方法用file_operations结构
具体的注册步骤如下:
------------------------------------------------------------------------------------------------------
老的方法:
1.申请设备号:
2. 创建设备节点:
新的方法:
1. 申请设备号:
2. 创建一个描述字符设备的结构体
3. 给此结构体申请一块内存
4. 初始化设备结构体
5. 添加设备结构体
6. 创建设备节点
系统调用的相关知识点:
在linux中,为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),
他们分别运行于不同的级别上,逻辑上是相互隔离的。因此,用户进程在通常情况下不允许访问内核数据 ,也无法
使用内核函数,他们只能在用户空间操作用户数据,调用用户空间的函数。
系统调用通知内核的机制是靠软中断来实现的,每个系统调用都会有一个唯一的系统调用号,而且每次的系统调用都会
产生一个软中断,从而使进程切换到内核态。
用户态: app: open(“设备文件”,“权限”), write , read 注意:没个设备文件都有一定的属性,有哪些属性呢?
--------------------------------------------------------------------------------------------------------------------------------
产生系统调用,并产生一个软件中断(swi )从而陷入到内核态
--------------------------------------------------------------------------------------------------------------------------------
内核态: 调用中断服务程序 sys_call
sys_call根据传入进来的系统调用号,最终会掉用到VFS层中的相应的函数
在VFS层中会有对应的sys_open ,sys_write ,sys_read等函数
完后,sys_open又会根据传入进来的文件的某些属性去相应的地方找到相应的驱动程序
最终会调用到驱动程序的对应的xxx_open ,xxx_write, xxx_read等函数
其中xxx_open ,xxx_write, xxx_read函数中就实现了相应的操作硬件的功能。
阅读(1682) | 评论(0) | 转发(1) |