Linux内核开发教程:动态添加系统调用与实现.pdfVIP

  • 0
  • 0
  • 约1.66千字
  • 约 6页
  • 2026-01-23 发布于北京
  • 举报

Linux内核开发教程:动态添加系统调用与实现.pdf

一、回顾

1、动态添加系统调用是可行的

2、通过动态修改机器码的方式取消动态添加系统调用

的限制

二、添加一个系统调用

1、以helloworld开始

asmlinkagelongsys_hello(int

i){printk(“helloworld\n,i);

return0;

}

2、加入运行中的系统内核

1.、从/proc/new_syscall中得到新的系统调用表

的地址;

2.、从/proc/new_syscall中得到appendi的地址,

它保存了当前的最大系统调用号。

3、模块实现

1.、内核模块实现

2.、用户态程序

#includestdio.h

#includestdlib.h

#includeunistd.h

#includeerrno.h

intmain(intargc,char*argv[])

{

ret=syscall(atoi(argv[1]),atoi(argv[2]));

return0;

}

编译好了,运行:

./test_new_call284123

用dmesg验证,有helloworld:123的输出

三、寻找系统调用表以及系统调用entry的地址

1、通过procfs或者System.map文件

2、使用第0x80个中断描述符

1.、使用中断描述符找到system_call

2.、在system_call附近寻找callXX的机器码特征

3、使用dump_stack

[f88f300b]init_module+0xb/0x53

[gettable]

[c013adc4]

sys_init_module+0x104/0x250

[c010620b]syscall_call+0x7/0xb

4、直接使用栈结构获取

栈保存了函数调用的路径。对于内核模块而言,

在insmod加载它并初始化的时候,这个栈就是

insmod进程的内核栈。我们可以顺着这个内核栈

来向上回溯,直到找到:

call*sys_call_table(,%eax,4)

的下一跳指令的地址。

5、使用/dev/mem在用户态完成内存的机器码编程

感谢您对华章培训网的支持!

.

文档评论(0)

1亿VIP精品文档

相关文档