欢迎访问雅博体育中国历史网!

嵌入操作系统Linux可加载内核模块机制的研究与应用

时间:2022-09-20 01:45作者:雅博体育官网

本文摘要:1.章节 Linux系统对外开放源代码、系统漏洞较少,在面临病毒和黑客侵略时能获取更佳的安全性和稳定性,基于以上这些优点,近年来对Linux操作系统及其涉及技术的应用于和研究更加多。对Linux操作系统扩展或剪裁功能必须在新的编译器内核上花费大量的时间。LKM机制由于大大缩短了研发和测试的时间,在Linux研发、研究的过程中起着了举足轻重的起到。

雅博体育app

1.章节  Linux系统对外开放源代码、系统漏洞较少,在面临病毒和黑客侵略时能获取更佳的安全性和稳定性,基于以上这些优点,近年来对Linux操作系统及其涉及技术的应用于和研究更加多。对Linux操作系统扩展或剪裁功能必须在新的编译器内核上花费大量的时间。LKM机制由于大大缩短了研发和测试的时间,在Linux研发、研究的过程中起着了举足轻重的起到。

  LKM主要还包括内核模块在操作系统中的读取和修理两部分功能,内核模块是一些在启动的操作系统内核必须时可以写入内核继续执行的代码块,不必须时由操作系统修理。它们拓展了操作系统内核功能却不必须新的编译器内核、启动系统[1]。如果没内核模块,就被迫重复编译器分解操作系统的内核镜像来重新加入新功能,当可选的功能很多时,还不会使内核显得散漫。

  2.LKM的撰写和编译器  2.1内核模块的基本结构  一个内核模块最少包括两个函数,模块被读取时继续执行的初始化函数init_module()和模块  被修理时继续执行的完结函数cleanup_module()。在近期内核平稳版本2.6中,两个函数可以起  给定的名字,通过宏module_init()和module_exit()构建。

唯一必须留意的地方是函数必需在宏的用于前定义。例如:  staticint__inithello_init(void){}  staticvoid__exithello_exit(void){}  module_init(hello_init);  module_exit(hello_exit);  这里声明函数为static的目的是使函数在文件以外不可见,__init的起到是在已完成初始化后交还该函数闲置的内存,宏__exit用作模块被编译器入内核时忽视完结函数。这两个宏只针对模块被编译器入内核的情况,而对动态读取模块是违宪的。

这是因为编译器入内核的模块是没清扫收尾工作的,而动态读取模块却必须自己已完成这些工作。  2.2内核模块的编译器  编译器时必须获取一个makefile来隐蔽底层大量的简单操作者,使用户通过make命令就可以已完成编译器的任务。

下面就是一个非常简单的编译器hello.c的makefile文件:  obj-m+=hello.ko  KDIR:=/lib/modules/$(shelluname-r)/build  PWD:=$(shellpwd)  default:  $(MAKE)-C$(KDIR)SUBDIRS=$(PWD)modules  编译器后取得可读取的模块文件hello.ko。  内核版本2.6中用于.ko文件后缀替换了.o,这是为了与普通可执行文件互为区别。  3.LKM的主要功能  3.1模块的读取  模块的读取有两种方法,第一种是用于insmod命令读取,另一种是当内核找到必须读取某个模块时,催促内核后台进程kmod读取必要的模块。当内核必须读取模块时,kmod被苏醒并继续执行modprobe,同时传送须要读取模块的名字作为参数。

modprobe像insmod一样将模块读取入内核,有所不同的是在模块被读取时查阅它否牵涉到到当前没定义在内核中的任何符号。如果有,在当前模块路径的其他模块中查询。如果寻找,它们也不会被读取到内核中。但在这种情况下用于insmod,不会以未解析符号信息完结。

  关于模块读取,可以用图3.1来详细叙述:图3.1 LKM模块的取出  insmod程序必需寻找拒绝读取的内核模块,这些内核模块是已链接的目标文件,与其他文件有所不同的是,它们被链接成可重定位新形式即新形式没被链接到特定地址上。insmod将继续执行一个特权级系统调用来查询内核的输入符号,这些符号都以符号名和数值形式如地址值成对留存。内核输入符号表被留存在内核确保的模块链表的第一个module结构中。

只有特殊符号才被加到,它们在内核编译器与链接时确认。insmod将模块读取虚拟内存并通过用于内核输入符号来改动其并未解析的内核函数和资源的提到地址。这些工作采行由insmod程序必要将符号的地址载入模块中适当地址来展开。

  当insmod改动完了模块对内核输入符号的提到后,它将再度用于特权级系统调用申请人充足的空间容纳新的模块。内核将为其分配一个新的module结构以及充足的内核内存来留存新的模块,并将其放入到内核模块链表的尾部,最后将新的模块标志为UNINITIALIZED。insmod将模块拷贝到已分配空间中,如果为它分配的内核内存可用完了,将再度申请人,但模块被多次读取必定正处于有所不同的地址。另外此重定位工作还包括用于必要地址来改动模块新形式。

雅博体育官网

如果新的模块也期望将其符号输入到系统中,insmod将为其结构输入符号新形式表格。每个内核模块必需包括模块初始化和完结函数,所以为了防止冲突它们的符号被设计成不输入,但是insmod必需告诉这些地址,这样可以将它们传送给内核。在所有这些工作已完成以后,insmod将调用初始化代码并继续执行一个特权级系统调用将模块的初始化和完结函数地址传送给内核。当将一个新的模块读取到内核中时,内核必需改版其符号表并改动那些被新的模块用于的老模块。

那些依赖其他模块的模块必需在其符号表尾部确保一个提到链表并在其module数据结构中指向它。内核调用模块的初始化函数,如果顺利将加装此模块。

模块的完结函数地址被存储在其module结构中,将在模块修理时由内核调用,模块的状态最后被设置成RUNNING。


本文关键词:嵌入,操作系统,Linux,可,加载,内核,雅博体育官网,模块,机制

本文来源:雅博体育-www.kmhykj.com