模块 /构建 /制造 /测试 / POC / Rehearsal / Notes / Precraper /许可 /书籍 /链接
Linux内核模块(LKM)沙盒是一个不同模块的集合,可以学习,发现和实验Linux内核模块的开发。该存储库的目的也是在Linux内核中实践开发并研究其他概念,然后再向内核提交第一个补丁。
大多数模块说明了一个概念,并显示了如何使用内核API。一些模块结合了一个以上的概念,以表明概念如何共同运作。例如,模块LKM_DEVICE正在访问字符设备并将其主要编号存储在 /proc中。或模块LKM_MEM也正在通过 /proc中的文件公开内存 /交换信息。
我希望它对于尝试接近Linux内核的其他开发人员可能很有价值。
| 不。 | 模块 | 来源 | 描述 |
|---|---|---|---|
| 1 | LKM Debugfs | lkm_debugfs.c | 模块显示如何使用调试文件系统debugfs |
| 2 | LKM设备 | lkm_device.c | 模块显示如何使用字符设备运行并在 /proc中存储设备信息 |
| 3 | LKM设备编号 | lkm_device_numbers.c | 说明静态和动态分配的设备编号 |
| 3 | LKM内存 | lkm_mem.c | 模块将内存和交换信息揭示到 /PROC |
| 4 | LKM基于内存的设备 | lkm_mev.c | 基于内存的角色设备的驱动程序,在一定程度上,在书籍Linux设备驱动程序中开发的驱动程序,第3章 |
| 5 | LKM参数 | lkm_parameters.c | 用于传递参数从用户到内核空间的模块 |
| 6 | LKM漂亮的printk | lkm_pp.c | 用于测试Pretty-Printk集成的模块 |
| 7 | LKM Proc | lkm_proc.c | 使用顺序I /O访问 /PROC文件系统的模块 |
| 8 | LKM过程 | lkm_process.c | 访问和打印当前过程信息 |
| 9 | LKM沙箱 | lkm_sandbox.c | 用于不同实验的沙盒模块 |
| 10 | LKM骨骼 | lkm_skeleton.c | 用于更快的新模块脚手架的骨架模块 |
第一次克隆时,请用--recurse-submodules的子模型克隆,以使其变得非常贴合。
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
要运行所有可用的测试,包括基本的加载/卸载和所有其他概念测试。
make test通过加载,卸载和输出内核环缓冲区进行测试(Sudo将要求根本权限)。
make test-module name= < module-name >用于沙箱设备的其他测试,包括加载模块,从 /PROC收集主要设备号,创建设备并比较最终消息,然后将MakeFile目标运行的make test-device运行或运行以下命令。
对于创建字符设备,需要主要数字,可以通过偏用文件 /proc /lkm_device_major来获得。该主要数字也写在内核环缓冲区。可以使用模块参数param_major_num加载该模块,并加载此模块,例如sudo insmod lkm_device.ko param_major_num=241 (此刻此静态分配似乎不可靠。有时会像以前的情况一样,有时尝试了sandbox设备的注册。
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device沙箱访问 /PROC的其他测试,包括加载模块,测试是否存在 /PROC是否存在并输出该文件。用make test-proc -proc运行MakeFile Target测试过程,或者以下几个命令:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc有关将参数传递到模块LKM_PARAMETER的其他测试,请使用make test-parameters 。这将加载/卸载模块,并比较在/sys filesystem(/sys/module/lkm_parameters/parameters/*)中,将模块加载时传递的参数编号和消息。或运行以下命令。
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parameters在分盘,调试和处理错误和问题时,尝试一些代码并编写POC来证明某些陈述或回答问题可能会派上用场。在以下内容中是这样的POC集合,该集合跟进了我最近遇到的陈述,想法和问题。
| 文件 | 描述 | 动机 |
|---|---|---|
| 比较iopl-ioperm.c | 比较IOPL和IOPERM授予的I/O权限 | BUG 205317 -IOPL(2) - 特权级别设置为每个程序还是每条线程? |
| 权限 - 重新诉讼 | 使用克隆,叉,execve或pthread时,如何/o权限如何授予? | BUG 205317 -IOPL(2) - 特权级别设置为每个程序还是每条线程? |
为了更好地了解内核空间中的概念,有必要审查和排练C和标准库的基本基础。除了能够提高理解之外,可以比较方法。这些基础知识大多数都是低级的,从文件I/O开始,可以作为伴侣来源视为。排练事情永远不会是不好的,但是有时候承认不得不排练这样的事情有些尴尬:)
| 文件 | 概念 |
|---|---|
| 克隆 | 用克隆()克隆过程 |
| execve.c | 用execve()执行另一个过程 |
| 叉 | 用fork()创建子过程 |
| io_ports.c | 低级端口映射I/O操作 |
| 读 | 在香草C中读取文件 |
| simple_circular_buffer.c | 简单直接的圆形缓冲区 |
| write.c | 写/附加到香草C中的文件 |
要构建这些文件,只需运行make clean && make in ./rehearsals/ ,所有可执行文件将放置在构建目录中。
“ Linux内核模块是一块编译的二进制代码,该代码直接插入Linux内核,在RING 0上运行,这是X86-64处理器中最低和最不受保护的执行环。”
“传统的应用程序开发范例可以在很大程度上被丢弃。除了加载和卸载模块之外,您还将编写对系统事件响应的代码,而不是按顺序模式进行操作。”
“随着内核的开发,您正在编写API,而不是应用程序本身。”
该存储库会要求您征求根许可,因为某些操作(例如加载/卸载模块和Linux/GNU系统中的文件)取决于根特权。 Makefile将事先指出这些权限将使用的内容。
您可以通过搜索此存储库来查看所有这些操作,并确保不会以任何方式被滥用。我知道这可能是一个安全问题,但是我试图使此过程尽可能透明。但是,还要意识到这些模块就没有任何保修。内核恐慌和数据丢失可能会发生,请最好将它们在虚拟机中使用。
在以下是一个表格的表格,所有位置都使用了sudo(除了readme.md除外)。
grep -n -r " sudo " *| 文件:行 | 使用sudo |
|---|---|
| Makefile:118 | |
| makefile:119 | $(eval number_file_content = sudo cat $(number_file) ) |
| makefile:122 | |
| Makefile:123 | |
| makefile:126 | @sudo rmmod $(module_filename) |
| makefile:140 | @sudo mknod $(device_filename)c cat $(proc_filename) 0 |
| makefile:143 | @sudo rm $(device_filename) |
| makefile:144 | @sudo rmmod $(module_filename) |
| makefile:162 | @sudo rmmod $(module_filename) |
| Makefile:175 | @sudo mknod |
| Makefile:176 | @echo“测试” | sudo tee $(device_file) |
| Makefile:178 | @sudo rm -fv $(device_file) |
| Makefile:179 | @sudo rmmod $(模块) |
| Makefile:190 | @sudo insmod |
| Makefile:193 | @sudo rmmod $(模块) |
| makefile:207 | @sudo rmmod $ {module} |
| Makefile:219 | @sudo insmod $(模块).ko |
| makefile:222 | @sudo rmmod $(模块) |
| tests.mk:31 | @lsmod | awk'{print $$ 1}'| grep -qe“^$(1)$$” &&(sudo rmmod |
| tests.mk:75 | @sudo dmesg-清晰 |
| tests.mk:78 | @sudo rmmod $(1) |
LKM Sandbox是免费软件:您可以将其重新分配和/或根据自由软件基金会发布的GNU通用公共许可证的条款,即许可证的版本2,或(根据您的选项)任何以后的版本。
LKM沙盒的分发是希望它将有用,但没有任何保修;即使没有对特定目的的适销性或适合性的隐含保证。有关更多详细信息,请参见GNU通用公共许可证。
您应该已经收到了GNU通用公共许可证的副本以及LKM Sandbox。如果没有,请参见https://www.gnu.org/licenses/。