Linux内核模块开发实战:Hello World模块

需积分: 0 0 下载量 34 浏览量 更新于2024-08-20 收藏 1.16MB PPT 举报
"动手练习-第二章内核模块" 在Linux操作系统中,内核模块是一种可动态加载和卸载的代码片段,它们允许用户在需要时扩展内核的功能,而不必重新编译整个内核。本章节主要关注的是如何编写、编译以及管理一个简单的“Hello, World”内核模块。 内核模块的定义与特点: 1. 模块在被加载后并不立即执行,而是在特定请求到来时才发挥作用,之后它可以被卸载。 2. 模块可以实现驱动程序、文件系统或其他内核服务。 3. 加载模块后,它们运行在内核空间,与内核紧密集成。 内核模块的代码框架通常包含初始化函数(hello_init)和退出函数(hello_exit),它们分别在模块加载和卸载时被调用。例如: ```c #include<linux/module.h> #include<linux/init.h> static int __init hello_init(void) { printk(KERN_INFO "Hello, world\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO "Goodbye, world\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); ``` `module_init` 和 `module_exit` 宏用于指定模块的入口和出口点。`__init` 和 `__exit` 宏用于告诉编译器这些函数只在初始化或清理阶段使用,可以优化内存使用。 动手实践部分包括编写这个简单的模块,然后修改`Makefile`来编译模块。`Makefile`应配置为编译内核模块,同时更新`Kconfig`文件以包含新模块。使用`make menuconfig`可以选择模块,然后`make modules`来编译所有模块。完成后,你会得到一个`.ko`扩展名的内核模块文件,如`myhello.ko`。 加载和卸载模块: - 使用`insmod`命令加载模块,例如:`# insmod ./myhello.ko` - 使用`rmmod`命令卸载模块,例如:`# rmmod myhello` - 使用`lsmod`命令查看当前已加载的内核模块,例如:`# lsmod` 模块参数功能允许在加载模块时传递参数。通过`module_param`声明单个参数,例如: ```c static char *whom = "world"; module_param(whom, charp, S_IRUGO); ``` 这里,`whom`参数可以被外部设置。`module_param_array`可以用于声明参数数组,但其用法较为复杂,初学者可以先不涉及。 总结来说,本章节的动手练习旨在让学习者了解Linux内核模块的基本概念,包括编写、编译和管理简单模块的流程,以及如何使用参数功能。通过实际操作,能加深对内核模块工作原理的理解,并为后续更复杂的驱动开发打下基础。