字符设备驱动模块加载与卸载

2023-12-14 23:33:24

一. 简介

我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器,在 Linux 驱动开发中,肯定也是要初始化相应的外设寄存器。
只是在 Linux 驱动开发中, 我们需要按照其规定的框架来编写驱动,所以说学 Linux 驱动开发重点是学习其驱动框架。

本文继上一篇文章的学习,前面几篇文章对字符设备驱动进行了简单的了解。文章地址如下:

字符设备驱动开发基础-CSDN博客

本文学习字符设备驱动的开发,主要学习字符设备驱动模块的加载与卸载。

二.? 字符设备驱动模块加载与卸载

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。