Linux内核模块导出符号与管理:灵活性与挑战

需积分: 9 2 下载量 4 浏览量 更新于2024-08-20 收藏 133KB PPT 举报
本篇课件主要讲解的是Linux内核模块的导出符号表及其在内核编译中的重要性。Linux内核模块,也被称为Loadable Kernel Module (LKM),是Linux操作系统中实现模块化设计的关键组成部分。模块化设计使得内核更具有灵活性,允许在不重新编译整个内核的情况下添加新功能,这对于系统维护和升级极为有利。 首先,模块内的符号(如全局变量或函数)需要通过`EXPORT_SYMBOL(name)` 或 `EXPORT_SYMBOL_GPL(name)` 进行显式导出,这些宏会在编译时生成特殊的全局变量声明。这是因为模块间通信依赖于符号表,内核确保了模块只能使用由其他模块或内核本身提供的符号,而非外部库(如glibc)。 Linux内核的特点是单体式,即monolithic kernel,但在模块机制下,它能够通过动态加载和卸载模块来扩展功能。模块作为一个目标对象文件,虽然不能独立运行,但其代码在运行时可被内核链接,从而实现内核功能的动态扩展。这包括一组函数和数据结构,它们构成了模块的核心。 尽管模块机制带来了诸多优点,如模块化内核、节省重新编译时间等,但也存在一些潜在的问题。由于模块代码在内核空间运行,且内存不会被交换出去,因此可能导致内存使用效率降低和性能损失。此外,模块的错误使用可能会对系统稳定性造成影响,因为模块可以直接访问内核资源并可能改变其他模块的行为。为了确保模块安全,内核需要维护模块之间的依赖关系,并在模块加载和卸载时更新符号表。 模块与应用程序在运行环境、权限、生命周期等方面有显著区别。应用程序运行在用户空间,通过main()作为入口,而模块则通过`module_init()`初始化,没有明确的退出函数`module_exit()`。模块的编译和加载过程涉及特定的工具,如gcc和insmod,而调试通常借助于gdb、kdb、kgdb等工具。 最后,课件中提到的相关命令包括`insmod`用于加载模块(仅限超级用户权限)、`rmmod`卸载模块、`lsmod`列出所有加载的模块以及`modprobe`(可选参数 `-r` 用于卸载)来管理和查看模块状态。这些命令都是内核模块管理的重要工具,对于理解Linux内核模块的使用和维护至关重要。

(1)在内核中实现缺页次数统计: 1.cd /usr/sec/linux-2.6.32.60 // 切换到预编译内核 2.sudo gedit arch/x86/mm/fault.c / /编辑fault.c 3.Unsigned long volatile pfcount //在fault.c中定义缺页次数全局变量. 4.将pfcount加入到do_page_fault中,用以统计缺页次数. 5.sudo gedit include/linux/mm.h //声明全局变量pfcount到头文件mm.h. 6.在extern int page_cluster下面添加代码 Extern unsigned long volatile pfcount; 7.Sudo gedit kernel/kallsym.c // 导出pfcount全局变量,整个内核都可以访问. 8.在最后一行添加代码EXPORT_SYMBOL(pfcount); (2)编译安装新内核: 1.sudo make mrproper //删除原来编译产生的垃圾 2.sudo cp /boot/config-3.2.0-29-generic-pag .config //导入原系统的内核配置 3.sudo make odlconfig; //更改配置 4.Sudo make clean; 5.make bzImage //编译内核 6.make modules //编译内核模块 7.make modules_install //安装内核模块 8.make install //安装内核 9.Sudo reboot //重新启动Linux系统 (3)新建内核模块,通过/proc实现用户态下查看缺页次数: 1.make source //创建source文件,存放编写的模块程序. 2.cd source/ //切换到source目录. 3.gedit pf.c// 新建用于构建模块的代码 4.Gedit Makefile //构建Makefile 5.在Makefile中添加 obj-m := pf.o 6.Sudo make -C /usr/src/linux-2.6.32.60 SUBDIRS=$PWD modules //编译、构建内核模块 7.sudo insmod pf.ko //加载模块到内核 8.sudo lsmod | grep pf //验证pf内核模块是否加载到内核进程中,运行命令出现pf信息说明加载成功 9.cat /proc/pf/pfcount //查看缺页统计次数通过以上步骤,你能帮我解读实验的结果吗

2023-06-08 上传