Linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录
本文将进一步介绍如何在内核中新增驱动代码目录和子目录。
在上一篇文章中,我们已经了解到了 Linux 内核驱动的基本知识和编写方法。本文将进一步介绍如何在内核中新增驱动代码目录和子目录。
对于大型项目而言,如果所有的驱动代码都放在一个文件夹下面,会显得比较混乱。因此,为了更好地管理和组织代码,我们需要将不同类型的驱动分别放置到不同的文件夹下面。
首先,在 Linux 内核源码树(例如 /usr/src/linux)下创建一个新文件夹(例如 mydriver),并且将其添加到 Makefile 文件中。Makefile 文件是用来指示编译器如何编译程序的脚本文件。
具体操作如下:
1. 进入 Linux 内核源码树所在路径
“`
cd /usr/src/linux
2. 创建新文件夹 mydriver
mkdir mydriver
3. 将新建立的 mydriver 添加到 Makefile 中
打开 Makefile 文件,在 obj-y 或者 obj-m 后面添加相对路径。
如果想要静态链接,则选择 obj-y;如果想要模块化,则选择 obj-m。
例如:
obj-$(CONFIG_MYDRIVER) += mydriver/
4. 在刚才创建的 mydriver 文件夹下创建子目录(例如 mynet、myusb 等)和对应的驱动代码文件(例如 mynet.c、mynet.h 等)。
cd mydriver
mkdir mynet
cd mynet
touch mynet.c
在编写驱动代码时,需要注意以下几点:
![Linux 驱动学习笔记02–应用实例:在内核中新增驱动代码目录和子目录缩略图 Linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录](https://www.72715.net/wp-content/uploads/2023/05/79ba17caf8d9d60f841171088799fe9a.png)
1. 驱动代码必须遵循 Linux 内核的规范,包括函数名、参数等方面。可以参考内核源码中已有的驱动代码进行编写。
2. 驱动代码需要包含头文件 linux/module.h 和 linux/init.h。其中 module.h 包含了一些与模块相关的宏定义和函数声明;init.h 包含了 init_module 和 cleanup_module 函数声明,这两个函数分别用于初始化和卸载模块。
3. 在编写 Makefile 文件时,需要将新添加的文件夹和驱动代码文件添加到相应位置。如果新增加了一个子目录,则需要在 Makefile 中指定其路径。
obj-$(CONFIG_MYDRIVER) +=
mydriver/
mydriver-y :=
mynet/
mynet-y :=
mynet.o
obj-m +=
myusb.o
4. 编译模块时,可以使用 make 命令进行编译。如果只想要编译某个特定的模块,则可以使用 make 模块名.ko 命令。
make modules # 编译所有模块
make mydriver.ko # 编译 mydriver 模块
make mynet.ko # 编译 mynet 子模块
5. 安装模块时,可以使用 insmod 命令进行安装。如果想要卸载某个模块,则可以使用 rmmod 命令。
insmod mydriver.ko # 安装 mydriver 模块
rmmod mydriver # 卸载 mydriver 模块
通过以上步骤,我们就可以在 Linux 内核中新增驱动代码目录和子目录了。
总之,在编写 Linux 驱动时,良好的代码组织和管理是非常重要的。只有将不同类型的驱动代码放置到对应的文件夹下面,并且按照规范编写 Makefile 文件和驱动代码文件,才能更好地维护、管理和扩展项目。