linux驱动最困难工作,Linux驱动学习 scull工作过程

Linux驱动学习 scull工作过程

scull工作的大致过程:

1. Linux启动时运行加载驱动模块的脚本。脚本首先做insmod。insmod时会调用驱动模块的init函数。

在init 中,进行了一些与设备本身相关的初始化设置以后(比如scull需要分配内存空间),会调用

cdev_init()和cdev_add()来进行字符设备的初始化,并把这个设备添加进系统。这个过程会创建

/proc/modules、/proc/devices两个文件和/sys/devices/目录中相应的项目。接下来脚本用mknod命令

创建/dev/目录下的文件。这里创建的/dev/scull0,对应的就是前面说到的inode结构。

2. 用户空间的程序通过系统调用open打开设备文件(比如在程序中fopen("/dev/scull0", "w" )),

Linux会生成一个file结构,其中会包含f_pos(位置指针)、f_mode(打开方式是否只读等)等状态信息,

然后调用驱动模块中定义的 open()函数,把刚刚生成的file结构作为参数传给open()。open()通常需要

根据情况做一些诸如设置互斥标记位之类的工作。

3. 用户空间的程序通过系统调用进行读写操作(比如使用fprintf()等函数),会调用驱动程序中的

read()、write()、llseek()等函数。这些操作会改变file结构中的信息,比如f_pos。

4. 这时如果有另一个用户空间的程序打开这个设备文件,会再创建一个file结构,因为两个进程在

访问时file结构中的信息是不同的,比如位置指针就不同。所以Linux把创建file结构的工作放在open系统

调用时,而不是系统加载驱动模块时。但是需要注意的是,和第一个打开这个设备的文件不同,这次的

file结构是从第一个进程中fork出来。这样,这个fork出来的进程不需要调用驱动程序中定义的release函

数,在其返回时,file结构就会自动销毁。

也就是说,只有一个进程会调用驱动程序中的open和release函数(虽然可能不只一个进程会试图关闭

设备文件),也就保证了文件打开和关闭的次数不会有不同。

5. 每一个程序完成操作,关闭设备文件时(比如使用fclose()函数),会销毁对应的file结构。但是

只有最后一个进程关闭文件时才会调用驱动程序的release()函数。

6. 关机时自然就是调用驱动模块中的exit函数,释放资源了。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值