博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EXPORT_SYMBOL的使用并以使用do_adjtimex调节内核tick_length(滴答长度)为例的说明...
阅读量:7197 次
发布时间:2019-06-29

本文共 973 字,大约阅读时间需要 3 分钟。

EXPORT_SYMBOL出现于2.6内核,可以把内核中的函数导出到全局符号表供其他内核模块(包括用户自己写的内核模块)使用。有个限制是,这个导出的符号不能是static类型。由于需要使用内核的do_adjtimex()函数进行tick_length的调节,而这个函数在/kernel/time/ntp.c中,这里便以此为例。

  首先需要在函数定义后加入“EXPORT_SYMBOL(do_adjtimex);”并且在这个c文件开头进行module.h头文件的包含(#include <linux/module.h>)。这时需要编译内核。

  然后,在自己编写的内核模块用extern声明这个函数,不过我写的这个模块由于包含了<linux/timex.h>,它里面已经用extern声明过,就不必再声明了。这样就可以在内核模块中使用这个函数了。

  为了确定这个函数已经导出,可以使用cat /proc/kallsyms |grep do_adjtimex来查看。

  实际使用中的一个问题:2.6.35内核make内核模块时没有问题,插入时报错:Unknow symbol,而2.6.32没有遇到,这个问题没有找到解释和解决办法。(编译内核时的选项基本无区别)

  

  其实上面这些基本很多博文中都有提到,这里顺便说下do_adjtimex()的用法。adjtimex()根据一个结构体来更改内核中相应参数,并用这个结构体来返回,它调用了do_adjtimex(),只是比后者多了从用户空间拷贝到内核空间和从内核空间拷贝到用户空间这两步。二者用法是一致的。然而有一个需要注意的地方:如果你只是需要修改某一个参数,如此例中的tick,使用tx.modes |= ADJ_TICK很有可能无效,因为非法的mode会导致执行失败。保险的用法是把mode先清零再根据需要异或,或者直接tx.modes &= ADJ_TICK。

  为了验证,需要在终端运行adjtimex -p。这是个软件包,没有的话apt-get install就可以了。它能够输出相应的内核参数。

本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2012/07/12/2587783.html,如需转载请自行联系原作者

你可能感兴趣的文章
【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
查看>>
更新项目经常使用的Linux命令
查看>>
tracert路由跟踪工具使用方法
查看>>
OGG学习笔记03-单向复制简单故障处理
查看>>
软件性能指标
查看>>
第4章 Selenium2-java WebDriver API (三)
查看>>
Coding.net+Myeclipse 2014 Git配置
查看>>
PHP-问题处理Fatal error: Uncaught Error: Call to undefined function mb_strlen()
查看>>
学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)
查看>>
LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘...
查看>>
[2-SAT]【学习笔记】【未完】
查看>>
数据产品经理最佳实践-数据战略规划
查看>>
20个代码生成框架 (.NET JAVA)
查看>>
Apache Rewrite url重定向功能的简单配置
查看>>
每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享(转)...
查看>>
.NetCore简介
查看>>
fiddler4 使用教程
查看>>
TCP (传输控制协议)
查看>>
java.util.concurrent.RejectedExecutionException: event executor terminated解决方法之一
查看>>
TCP_NODELAY 和 TCP_NOPUSH的解释
查看>>