【Linux内核模块编程】
Linux内核模块编程是Linux系统中一种灵活的扩展机制,允许开发者在不重新编译整个内核的情况下添加或修改功能。报告1主要涵盖了以下几个知识点:
1. **内核模块相关指令**:
- **insmod**: 用于插入内核模块,例如`insmod hello.ko`会将名为`hello.ko`的模块加载到内核中。
- **rmmod**: 用于移除内核模块,例如`rmmod hello`会卸载名为`hello`的模块。
- **lsmod**: 列出当前已加载的内核模块,通过`lsmod | grep hello`可以筛选出特定名称的模块信息。
- **modinfo**: 查看模块详细信息,如`modinfo hello.ko`显示模块的元数据。
- **modprobe**: 自动处理模块的依赖关系并插入模块,如`modprobe hello.ko`。
2. **Linux内核数据结构**:
- **inode**: 存储文件元信息的数据结构,包含文件大小、权限、所有者ID等,多个文件名可指向同一个inode,实现硬链接。
- **file**: 表示已打开文件的结构体,内核在文件打开时创建,文件关闭时释放。
- **file_operations**: 描述设备驱动接口的结构体,定义了如open、read、write等操作函数。
3. **/proc文件系统**:
- /proc是一个虚拟文件系统,用于反映和控制系统的状态,如进程信息、系统状态等,实时更新且不占用硬盘空间。
4. **实验内容**:
- **模块一**:基础的模块加载/卸载。这个模块会在加载和卸载时通过`printk()`函数在系统日志中输出信息,展示了内核模块的基本框架。
- **模块二**:接收整型、字符串和数组参数并在内核中打印,展示了内核模块如何处理用户传入的参数。
- **模块三**:在/proc下创建只读文件,提供读取信息的功能,体现了内核与用户空间的交互。
- **模块四**:在/proc下创建目录并创建一个可读可写文件,展示了对/proc文件系统的进一步操作。
5. **代码结构**:
- 内核模块编程通常需要包含`<linux/kernel.h>`(包含`printk()`等)、`<linux/module.h>`(模块加载和卸载功能)和`<linux/init.h>`(模块初始化宏)等头文件。
- `module_init()`和`module_exit()`宏分别定义模块的初始化和清理函数。
- `MODULE_LICENSE()`, `MODULE_DESCRIPTION()`, `MODULE_AUTHOR()`宏用于指定模块的许可、描述和作者信息。
实验目的是通过编写和测试这些模块,使学习者理解Linux内核模块的编写、加载、卸载过程,以及如何利用内核数据结构和/proc文件系统与内核进行交互。通过这些实践,开发者可以更好地理解和掌握Linux内核的动态扩展能力。