字符驱动程序框架

框架:
…………………………………………………………………………………………………………………………………………………………………………………………………………
应用部分:应用程序: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)修饰一下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值