linux内核怎么增加系统调用

linux内核怎么增加系统调用,第1张

进入arch/x86/kernel目录下,然后vim syscall_table_32.S,在此文件的最后一行添加自己的系统调用表项:

1 .long sys_rt_tgsigqueueinfo/* 335 */

2 .long sys_perf_event_open

3 .long sys_mycall //这是我们自己添加的表项

好了,下面开始添加系统调用号。

2.2 添加自己的系统调用号

现在进入目录 arch/x86/include/asm,该目录下有三个文件unistd_32.h, unistd_64.h, unistd.h。由于我们编译的是32位内核,所以需要在unistd_32.h中添加系统调用号。

vim unistd_32.h,在最后添加代码:

1 #define __NR_perf_event_open336

2 #define __NR_mycall 337 //添加的

3 #ifdef __KERNEL__

4

《linux内核设计与实现》读书笔记(五)-系统调用主要内容:什么是系统调用linux上的系统调用实现原理一个简单的系统调用的实现1ernel/sys.c我在sys.c中追加了2个函数:sys_foo和sys_bar如果是在x86_64的内核中增加一个系统调用,只需修改 arch/x86/include/asm/unistd_64.h,比如sys_bar。修改内容参见下面的diff文件:diff -r new/arch/x86/ia32/ia32entry.S old/arch/x86/ia32/ia32entry.S855d854< .quad sys_foodiff -r new/arch/x86/include/asm/unistd_32.h old/arch/x86/include/asm/unistd_32.h357d356<#define __NR_foo 349361c360<#define NR_syscalls 350--- >#define NR_syscalls 349diff -r new/arch/x86/include/asm/unistd_64.h old/arch/x86/include/asm/unistd_64.h689,692d688<#define __NR_foo 312<__SYSCALL(__NR_foo, sys_foo)<#define __NR_bar 313<__SYSCALL(__NR_bar, sys_bar)diff -r new/arch/x86/kernel/syscall_table_32.S old/arch/x86/kernel/syscall_table_32.S351d350< .long sys_foodiff -r new/include/asm-generic/unistd.h old/include/asm-generic/unistd.h694,695d693<#define __NR_foo 272<__SYSCALL(__NR_foo, sys_foo)698c696<#define __NR_syscalls 273--->#define __NR_syscalls 272diff -r new/kernel/sys.c old/kernel/sys.c1920,1928d1919<<asmlinkage long sys_foo(void)<{< return 1112223334444555<}<asmlinkage long sys_bar(void)<{< return 1234567890<} 3.3 编译内核#cd linux-3.2.28#make menuconfig (选择要编译参数,如果不熟悉内核编译,用默认选项即可)#make all (这一步真的时间很长......)#make modules_install#make install (这一步会把新的内核加到启动项中)#reboot (重启系统进入新的内核)3.4 编写调用的系统调用的代码#include <unistd.h>#include <sys/syscall.h>#include <string.h>#include <stdio.h>#include <errno.h>#define __NR_foo 312#define __NR_bar 313 int main(){printf (result foo is %ld/n, syscall(__NR_foo)) printf(%s/n, strerror(errno)) printf (result bar is %ld/n, syscall(__NR_bar)) printf(%s/n, strerror(errno)) return 0}编译运行上面的代码:#gcc test.c -o test#./test运行结果如下:result foo is 1112223334444555Successresult bar is 1234567890Success

若要在 kernel 里面新增加一个自己的 sys call,大致需要这么几个步骤: a,新增自己 sys call 的代码,并修改相应 makefile; b,修改相应头文件,分配自己的系统调用号; c,系统调用通过中断加查表的方式实现,


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

原文地址: http://outofmemory.cn/bake/11831046.html

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

发表评论

登录后才能评论

评论列表(0条)

保存