在Linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核

在Linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核,第1张

若要在 kernel 里面新增加一个自己的 sys call,大致需要这么几个步骤:

a,新增自己 sys call 的代码,并修改相应 makefile;

b,修改相应头文件,分配自己的系统调用号;

c,系统调用通过中断加查表的方式实现,所以需要在系统调用表里面增加相关的项目,这需要修改相关的汇编源文件;

d,重新编译内核,并写测试程序测试新增的sys call;

注意几点:

1,上述步骤所要修改的文件/位置等对不同处理器架构来说,不尽相同;

2,对于应用层的测试代码来说,在 2.6.20 版本之前,可以使用相应的 _syscallN 宏;

但是2.6.20 版本后,这些宏已经被从 kernel 中去掉了,你需要使用应用层的 syscall 函数

来测试。

你可以在自己的sys call实现文件中加上 EXPORT_SYMBOL / EXPORT_SYMBOL_GPL

等宏来导出你的全局变量或者函数,导出后,另外的模块或者其他内核代码就可以使用

这些变量和函数。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

杭州巨立安(JulianTec)是杭州市场上

唯一由资深研发工程师所创办的机构。所以:

就专业程度和实在程度而言,杭州巨立安(JulianTec)

是您在arm架构下学习嵌入式Linux研发的上佳指导!

第一步,在系统中添加一个不用传递参数的系统调用;执行这个系统调用,使用户的uid等于0。显然,这不是一个有实际意义的系统调用。我们的目的并不是实用不实用,而是通过最简单的例子,帮助熟悉对系统调用的添加过程,为下面我们添加更加复杂的系统调用打好基础。

第二步,用kernel module机制,实现系统调用gettimeofday的简化版,返回调用时刻的日期和时间。

实验指导

1.一个简单的例子

在我们开始学习系统调用这一章之前,让我们先来看一个简单的例子。就好像哪个经典的编程书上都会使用到的例子一样:

1: int main(){

2: printf(“Hello World!\n”)

3: }

我们也准备了一个例子给你:

1: #include <linux/unistd.h>/* all system calls need this header */

2: int main(){

3: int i = getuid()

4: printf(“Hello World! This is my uid: %d\n”, i)

5: }

这就是一个最简单的系统调用的例子。与上面那个传统的例子相比,在这个例子中多了2行,他们的作用分别是:

第一行:包括unistd.h这个头文件。所有用到系统调用的程序都需要包括它,因为系统调用中需要的参数(例如,本例中的“__NR_getuid”,以及_syscall0()函数)包括在unistd.h中;根据C语言的规定,include <linux/unistd.h>意味着/usr/include/linux目录下整个unistd.h都属于Hello World源程序了。

第三行:进行getuid()系统调用,并将返回值赋给变量i。

好了,这就是最简单的一个使用了系统调用的程序,现在你可以在你的机器上试一试它。然后我们一起进入到系统调用的神秘世界中去。


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

原文地址:https://54852.com/bake/11805912.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存