框架:
…………………………………………………………………………………………………………………………………………………………………………………………………………
应用部分:应用程序:open read write(这些函数由C库实现)
(C库怎么进入内核)open read write 的调用实际上是执行一条swi val 指令,这条汇编指令就会引发一个异常,相当于中断一样,当发生这个异常的时候,就会进入内核的异常处理函数里面,
…………………………………………………………………………………………………………………………………………………………………………………………………………
内核部分:
system call interface层 (系统调用接口)作用:在异常处理函数里面根据发生中断的原因(swi val 指令),调用不同的处理函数.例:open read write的传进来的val值分别对应1、2、3,则内核里面的系统调用接口就会根据传进来的不同val值去调用sys_open sys_read sys_write
VFS层 sys_open sys_read sys_write 区分不同的行为 (sys_open sys_read sys_write 根据打开的不同的文件,识别某个行为,来调用不同的底层驱动程序,调用驱动程序里面不同的led_open led_read led_write函数)
驱动程序:(led_open led_read led_write点灯)(……)(……)……
…………………………………………………………………………………………………………………………………………………………………………………………………………
定义fileoperation结构
register_chrdev(major主设备号,"驱动名字",&fileoperation结构) //注册,告知内核
register_chrdev被驱动入口函数调用,如:假设入口函数是first_drv_init()
module_init(first_drv_init)内核怎么知道哪个函数是驱动函数的入口函数,则需要修饰一下
module就是定义一个结构体,这个结构体里面有一个函数指针,这个指针指向入口函数first_drv_init
当加载一个驱动或安装一个驱动程序的时候,内核就会自动找到这么一个结构体,调用里面的函数指针,就指向入口函数first_drv_init,把里面的fileoperation结构告诉内核
app应用程序打开一个设备文件 open(“/dev/xxx”)
xxx属性:c(字符设备)_ _ _,_ _ _,_ _ _,major(), mior()
主设备号 次设备号
当注册驱动程序的时候register_chrdev(major主设备号,"驱动名字",&fileoperation结构) 里面也包含有一个主设备号
应用程序最终怎么找到注册的这个fileoperation结构里面的open()成员呢?
是利用设备类型(c字符设备)和设备号major
VFS 利用设备类型(c字符设备)和设备号major 在字符数组里面以major为索引,就能够找到注册进去的fileoperation结构
register_chrdev()最简单的实现方法:
在一个内核数组里面:利用设备类型,以major为索引,找到一项,把fileoperation结构填充进去
first_drv_exit()为出口函数,含有unregister_chrdev(major主设备号,"驱动名字")//下载驱动
内核怎么知道调用你呢?则也需要module_init(first_drv_exit)修饰一下