文章目录
- Linux驱动开发入门
- 什么是内核模块?
- 第一个内核模块
- main.c
- Makefile
- 编译和加载模块
- 总结
Linux驱动开发入门
Linux内核驱动开发是一个高级话题,涉及到对操作系统核心部分的深入理解。这个系列的笔记旨在帮助初学者理解Linux驱动开发的基础知识。我们从最基本的部分开始:创建、编译和加载一个简单的内核模块。
什么是内核模块?
内核模块是Linux内核的一部分,可以在系统运行时动态加载和卸载。这使得内核可以在不重启系统的情况下扩展功能。模块被用于各种目的,包括设备驱动程序、文件系统和网络协议等。
第一个内核模块
我们的第一个内核模块非常简单:在加载和卸载时打印消息到内核日志。
main.c
#include <linux/module.h> // 基础功能
#include <linux/kernel.h> // 主要数据结构和函数
#include <linux/init.h> // 模块宏MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux driver for the kernel.");
MODULE_VERSION("0.1");static int __init hello_start(void) {printk(KERN_INFO "Loading hello module...\n");printk(KERN_INFO "Hello world\n");return 0;
}static void __exit hello_end(void) {printk(KERN_INFO "Goodbye Mr.\n");
}module_init(hello_start);
module_exit(hello_end);
Makefile
为了编译这个模块,你需要以下 Makefile
:
obj-m += main.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
编译和加载模块
- 将
main.c
和Makefile
保存在同一目录。 - 在该目录下运行
make
命令编译模块。 - 使用
sudo insmod main.ko
加载模块。 - 使用
sudo rmmod main
卸载模块。 - 用
dmesg
查看内核打印的信息。
总结
通过这个简单的例子,我们学习了如何创建、编译和加载一个Linux内核模块。这是Linux内核驱动开发的基础,为更复杂的驱动开发打下了基础。