字符设备驱动模块加载与卸载
2023-12-14 23:33:24
一. 简介
我们在学习裸机或者
STM32
的时候关于驱动的开发就是初始化相应的外设寄存器,在
Linux
驱动开发中,肯定也是要初始化相应的外设寄存器。
只是在
Linux
驱动开发中,
我们需要按照其规定的框架来编写驱动,所以说学
Linux
驱动开发重点是学习其驱动框架。
本文继上一篇文章的学习,前面几篇文章对字符设备驱动进行了简单的了解。文章地址如下:
本文学习字符设备驱动的开发,主要学习字符设备驱动模块的加载与卸载。
二.? 字符设备驱动模块加载与卸载
1.? Linux驱动的运行方式
Linux
驱动有两种运行方式,第一种就是将驱动编译进
Linux
内核中,这样当
Linux
内核启
动时就会自动运行驱动程序。
第二种就是将驱动编译成模块
(Linux
下模块扩展名为
.ko)
,在
Linux
内核启动以后使用 “
insmod
” 命令加载驱动模块。
选择驱动运行方式
在调试驱动时,一般都选择将其编译
为(.ko)模块,这样我们修改驱动以后,只需要编译一下驱动代码即可,不需要编译整个
Linux
代码。
而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编
译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进
Linux
内核中。
2.?? 驱动的加载与卸载
模块有加载和卸载两种操作,我们在编写驱动时,需要注册这两种操作函数,模块的加载和
卸载注册函数如下:
module_init(xxx_init); //注册模块加载函数
module_exit(xxx_exit); //注册模块卸载函数
module_init()
函数用来向
Linux
内核注册一个模块加载函数,参数
xxx_init
就是需要注册的具体函数,当使用 “
insmod
” 命令加载驱动时,
xxx_init()
这个函数就会被调用。
module_exit() 函数用来向
Linux
内核注册一个模块卸载函数,参数
xxx_exit
就是需要注册的具体函数,当使
用 “
rmmod
” 命令卸载具体驱动时,
xxx_exit()
函数就会被调用。
3.? 编写字符设备驱动模块加载与卸载框架
(1)? 在 ubuntu系统下,创建一个存放驱动代码工程的目录,我这里在自己之前创建的正点原子文件目录下创建:
用 vscode软件打开 上面创建的工程目录 1_chrdevbase。通过 vscode在 目录 1_chrdevbase下创建一个 .c文件,命名为 chrdevbase.c,如下所示:
(2)? 使用 vscode软件再打开 Linux内核源码,这里使用之前我更改的 NXP官方的 Linux内核源码。
Linux内核源码一般都会有使用到 驱动模块加载与卸载注册函数的。
在 Linux内核源码工程中,搜索 module_init() 函数与 module_eixt() 函数:
文章来源:https://blog.csdn.net/wojiaxiaohuang2014/article/details/135005400
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!