日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

CentOS6.2 自定义系统调用

發布時間:2023/12/18 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 自定义系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。