linux下编写一个内核模块程序,获取系统核心寄存器的值。

linux下编写一个内核模块程序,获取系统核心寄存器的值。,第1张

这个没你想的那么复杂,相当简单,

Linux下面就是把AT&T语法的汇编程序编译成.o

文件,这个汇编程序只包含一个函数即可,这个函数就是把你想要寄存器的值存在通用寄存器里作为返回值。另外你再写一个C语言程序文件,C里调用这个汇编函数后,把返回值printk出来即可。这个是最简单的分两个文件混合C,assem

另外,用GCC还可以在单个文件混合汇编。可以参考一下。

(1)应用程序基本上是从头到尾执行单个任务,而模块却需要事先向系统注册自己以便为将来的请求服务,并且模块有自己的模块初始化函数和模块退出函数。

(2)不是所有的应用程序都是事件驱动的,但内核模块却是,应用模块在退出时,可以不需要释放自己之前申请的资源或者其他的清除工作,但模块的退出却需要使用模块退出函数来仔细撤销初始化函数所做的一切,否则在系统重新引导之前某些东西就会残留在系统中。

(3)应用程序可以调用用户未定义的函数,但这个函数在某个库中,在链接过程中,编译器能够解析外部引用从而使用适当的函数库来调用这个函数,例如,定义在libc中的printf函数就是这种可直接调用的函数,但对于内核模块来说,模块仅仅被链接到内核中,只能调用由内核定义导出的函数,如printk就是由内核提供给模块使用的一个类printf的内核版本,故而模块源文件中不能包含通常的头文件。另外,printf和printk最大的不同在于printk缺乏对浮点数的支持。

(4)还有一点不同在于不同环境下二者处理错误的方式不同,对于应用程序,在开发过程中发生段错误是无害的,可以使用调试器跟踪到源代码问题所在,但内核错误即使不影响整个系统,也至少会杀死当前进程。

首先说模块是一个程序代码块的集合,在我们实际项目开中往往同一个模块多个地方都需要使用,这时候就需要加载一个模块。 

1.这个函数首先查找 package.loaded 表, 检测 modname 是否被加载过。 如果被加载过,require 返回 package.loaded[modname] 中保存的值。 否则,它试着为模块寻找 加载器 。

require 遵循 package.searchers 序列的指引来查找加载器。 如果改变这个序列,我们可以改变 require 如何查找一个模块。 下列说明基于 package.searchers 的默认配置。

2.首先 require 查找 package.preload[modname] 。 如果这里有一个值,这个值(必须是一个函数)就是那个加载器。 否则 require 使用 Lua 加载器去查找 package.path 的路径。 如果查找失败,接着使用 C 加载器去查找 package.cpath 的路径。 如果都失败了,再尝试 一体化 加载器 (参见 package.searchers)。

3.每次找到一个加载器,require 都用两个参数调用加载器: modname 和一个在获取加载器过程中得到的参数。 (如果通过查找文件得到的加载器,这个额外参数是文件名。) 如果加载器返回非空值, require 将这个值赋给 package.loaded[modname]。 如果加载器没能返回一个非空值用于赋给 package.loaded[modname], require 会在那里设入 true 。 无论是什么情况,require 都会返回 package.loaded[modname] 的最终值。

4.如果在加载或运行模块时有错误, 或是无法为模块找到加载器, require 都会抛出错误。

一个描述有一些为包管理准备的编译期配置信息的串。 这个字符串由一系列行构成:

第一行是目录分割串。 对于 Windows 默认是 '\' ,对于其它系统是 '/' 。

第二行是用于路径中的分割符。默认值是 '' 。

第三行是用于标记模板替换点的字符串。 默认是 '?' 。

第四行是在 Windows 中将被替换成执行程序所在目录的路径的字符串。 默认是 '!' 。

第五行是一个记号,该记号之后的所有文本将在构建 luaopen_ 函数名时被忽略掉。 默认是 '-'。

这个路径被 require 在 C 加载器中做搜索时用到。

让宿主程序动态链接 C 库 libname 。

5.当 funcname 为 "*", 它仅仅连接该库,让库中的符号都导出给其它动态链接库使用。 否则,它查找库中的函数 funcname ,以 C 函数的形式返回这个函数。 因此,funcname 必须遵循原型 lua_CFunction (参见 lua_CFunction)。

这是一个低阶函数。 它完全绕过了包模块系统。 和 require 不同, 它不会做任何路径查询,也不会自动加扩展名。 libname 必须是一个 C 库需要的完整的文件名,如果有必要,需要提供路径和扩展名。 funcname 必须是 C 库需要的准确名字 (这取决于使用的 C 编译器和链接器)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12036329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存