CentOS6.2 自定义系统调用
我使用的是CentOS6.2
1.下載內核
以linux-2.6.39.tar.bz2為例
2.解壓縮
解壓縮至/usr/src/kernels/linux-2.6.39
3.添加函數到內核映像中
? 系統調用必須編譯到內核映像中去,此例放入linux-2.6.39/kernels/sys.c,也可以放入其他的.c文件,主要是功能聯系相關
觀察sys.c文件,找一個函數舉例:
1 SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len) 2 { 3 int errno; 4 char tmp[__NEW_UTS_LEN]; 5 6 if (!capable(CAP_SYS_ADMIN)) 7 return -EPERM; 8 if (len < 0 || len > __NEW_UTS_LEN) 9 return -EINVAL; 10 11 down_write(&uts_sem); 12 errno = -EFAULT; 13 if (!copy_from_user(tmp, name, len)) { 14 struct new_utsname *u = utsname(); 15 16 memcpy(u->domainname, tmp, len); 17 memset(u->domainname + len, 0, sizeof(u->domainname) - len); 18 errno = 0; 19 } 20 up_write(&uts_sem); 21 return errno; 22 }
SYSCALL_DEFINE2只是一個宏,數字2表示該函數有2個參數,宏展開之后如下:
asmlinkage long sys_setdomainname(char __user* name, int len)
asmlinkage是限定詞,這是一個編譯指令,通知編譯器通過棧傳遞函數參數,默認的是通過寄存器傳參,所有的系統調用都需要這個限定詞。
?
在sys.c文件中,加入自己寫的系統調用:
?
1 asmlinkage int sys_sumtest(int number) 2 3 { 4 5 int i=0,sum=0; 6 7 printk("<0>""這是添加的系統調用\n"); 8 9 while(i<=number) 10 11 sum+=i++; 12 13 return sum; 14 15 }?
?
?
?
4.注冊系統調用號
?
?
在? linux-2.6.39/arch/x86/include/unistd_32.h 頭文件中注冊系統調用號
?
實例代碼:
?
#define __NR_sumtest??? 333
?
5.填寫系統調用表
?
?linux-2.6.39/arch/x86/kernel/syscalls_table_32.S,在syscall_table(系統調用表)中對應于系統調用號的位置,填寫系統調用函數。
?
實例代碼:
?
ENTRY(sys_call_table)
?
??? .long sys_restart_syscall???
?
??? .long sys_exit
?
??? .......
??? .......
?
??? .long sys_syncfs
?
??? .long sys_sumtest??? //333 本次添加的系統調用函數
?
?
6.編譯、安裝內核
?
?? 另外一篇文章有詳細過程
?
7.重啟,使用新內核引導開機,測試系統調用
?
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(int argc,char ** argv) 5 { 6 int temp; 7 int src=5; 8 if(argc>2) 9 printf("argument error!\n"); 10 else 11 { 12 if(argc==1) 13 temp=syscall(345,src); 14 else 15 { 16 src=atoi(argv[1]); 17 temp=syscall(345,src); 18 } 19 printf("sum of 1 to %d is tmp=%d\n",src,temp); 20 } 21 return 0; 22 }?
?
?
轉載于:https://www.cnblogs.com/Ripper-Y/archive/2012/06/17/2552698.html
總結
以上是生活随笔為你收集整理的CentOS6.2 自定义系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ActiveMQ支持的传输协议
- 下一篇: 转:Windows Phone 7 设计