中国交通建设集团官网,seo网站优化策划书,网站建设前期,河间网站制作公司文章目录 前言模块的Hello World#xff01; 前言
Linux允许用户通过插入模块#xff0c;实现干预内核的目的。一直以来#xff0c;对linux的模块机制都不够清晰#xff0c;因此本文对内核模块的加载机制进行简单地分析。
ref:https://www.cnblogs.com/fanzhidongyzby/p/… 文章目录 前言模块的Hello World 前言
Linux允许用户通过插入模块实现干预内核的目的。一直以来对linux的模块机制都不够清晰因此本文对内核模块的加载机制进行简单地分析。
ref:https://www.cnblogs.com/fanzhidongyzby/p/3730131.html 模块的Hello World
我们通过创建一个简单的模块进行测试。首先是源文件main.c和Makefile。 florianflorian-pc:~/module$ cat main.c
#includelinux/module.h
#includelinux/init.hstatic int __init init(void){printk(Hi module!\n);return 0;}static void __exit exit(void){printk(Bye module!\n);}module_init(init);module_exit(exit);其中init为模块入口函数在模块加载时被调用执行exit为模块出口函数在模块卸载被调用执行。 florianflorian-pc:~/module$ cat Makefile
obj-m main.o#generate the pathCURRENT_PATH:$(shell pwd)#the current kernel version numberLINUX_KERNEL:$(shell uname -r)#the absolute pathLINUX_KERNEL_PATH:/usr/src/linux-headers-$(LINUX_KERNEL)#complie objectall:make -C (LINUXKERNELPATH)M(CURRENT_PATH) modules#cleanclean:make -C (LINUXKERNELPATH)M(CURRENT_PATH) clean其中obj-m指定了目标文件的名称文件名需要和源文件名相同扩展名除外以便于make自动推导。
然后使用make命令编译模块得到模块文件main.ko。
florianflorian-pc:~/module$ make
make -C /usr/src/linux-headers-2.6.35-22-generic M/home/florian/module modulesmake[1]: 正在进入目录 /usr/src/linux-headers-2.6.35-22-genericBuilding modules, stage 2.MODPOST 1 modulesmake[1]:正在离开目录 /usr/src/linux-headers-2.6.35-22-generic使用insmod和rmmod命令对模块进行加载和卸载操作并使用dmesg打印内核日志。
florianflorian-pc:~/module$ sudo insmod main.ko;dmesg | tail -1
[31077.810049] Hi module!florianflorian-pc:~/module$ sudo rmmod main.ko;dmesg | tail -1
[31078.960442] Bye module!通过内核日志信息可以看出模块的入口函数和出口函数都被正确调用执行。
模块文件 使用readelf命令查看一下模块文件main.ko的信息。
florianflorian-pc:~/module$ readelf -h main.ko
ELF Header:Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2s complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: REL (Relocatable file)Machine: Intel 80386Version: 0x1Entry point address: 0x0Start of program headers: 0 (bytes into file)Start of section headers: 1120 (bytes into file)Flags: 0x0Size of this header: 52 (bytes)Size of program headers: 0 (bytes)Number of program headers: 0Size of section headers: 40 (bytes)Number of section headers: 19Section header string table index: 16userroot:~/module$ sudo readelf -h main.ko
ELF Header:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class: ELF64Data: 2s complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: REL (Relocatable file)Machine: Advanced Micro Devices X86-64Version: 0x1Entry point address: 0x0Start of program headers: 0 (bytes into file)Start of section headers: 2936 (bytes into file)Flags: 0x0Size of this header: 64 (bytes)Size of program headers: 0 (bytes)Number of program headers: 0Size of section headers: 64 (bytes)Number of section headers: 22Section header string table index: 21
我们发现main.ko的文件类型为可重定位目标文件这和一般的目标文件格式没有任何区别。我们知道目标文件是不能直接执行的它需要经过链接器的地址空间分配、符号解析和重定位的过程转化为可执行文件才能执行。
那么内核将main.ko加载后是否对其进行了链接呢
ref:https://www.cnblogs.com/fanzhidongyzby/p/3730131.html