庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

如何在Linux Kernel內新增一个System Call

 作者:本站收集   日期:2005-4-13
字号选择〖 〗/ 双击滚屏 单击停止   
本文作者: gpmoney
使用 system call 去呼叫系統的函式是非常好玩的,但是要如何寫出一個自己的system call 呢?這邊有以下數個步驟,如果你是自己想要呼叫 system call 那可以跳過 (1) (2) 直接到第三項這邊假設你己經熟悉 kernel 的 compile 和如何利用新 compile 的 kernel 重新開機


(1) 設定 include 檔內的 syscall function


首先,找到 /usr/inlcude/asm/unistd.h 這個檔案,在這一行



#define __NR_getdents64 220
#define __NR_fcntl64 221



的後面加上 :


#define __NR_myfunc 222



然後找到 /usr/include/bits/syscall.h 這個檔案,再加上一行 :


#define SYS_myfunc __NR_myfunc



找到 /usr/src/linux/arch/i386/kernel/entry.S 這個檔案也是在最後面加上並修改標記為紅色的這二行



.long SYMBOL_NAME(sys_getdents64) /* 220 */
.long SYMBOL_NAME(sys_fcntl64)
.long SYMBOL_NAME(sys_myfunc) --> 增加這一行
#ifdef CONFIG_TUX
.long SYMBOL_NAME(__sys_tux)
#else
# ifdef CONFIG_TUX_MODULE
.long SYMBOL_NAME(sys_tux)
# endif
#endif

/*
* NOTE!! This doesn't have to be exact - we just have
* to make sure we have _enough_ of the "sys_ni_syscall"
* entries. Don't panic if you notice that this hasn't
* been shrunk every time we add a new system call.
*/
.rept NR_syscalls-222 ----> 改成 NR_syscalls-223
.long SYMBOL_NAME(sys_ni_syscall)
.endr




(2) 撰寫 syscall 的範例程式


假設你的 linux kernel code 在 /usr/src/linux 下找到 /usr/src/linux/kernel/sys.c

加上以上這幾行 :


asmlinkageintsys_myfunc(int input){
printk("<1> Input value is : %d \n",input);
return input*10;
}



改完以後,就可以重新 compile kernel 並且重新開機了。


(3) 撰寫 user space 的小程式



use_syscall.c
#include
#include
#include

static inline _syscall1(int,myfunc,int,a)

int main(void){
printf("Return Value: %d\n",myfunc(10));
}



這樣執行完以後,你就可以看到這個程式輸出 100

如果你還有興趣,可以使用 tail -f /var/log/message 會出現類似的訊息,表示你的程式有經由 printk 印到畫面上


Sep 3 22:02:02 private kernel: Input value is : 10



_syscall1 是一個 macro 指令,事實上是 _syscallN 的指令 , N 代表系統呼叫所需要用到的參數個數

_syscallN(arg1,arg2,arg3,arg4) :

arg1 : 代表的是傳回值
arg2 : 代表的是要呼叫的 syscall name
arg3 : 代表的是傳入參數的型態
arg4 : 代表的是傳入參數的名稱


系統總共定義了 6 個 _syscallN , 從 _syscall0 到 _syscall5 . 因為這是呼叫 int 0x80 的限制,各位大概發現了一件事,這個只是協助各位去呼叫 int 0x80 這個系統中斷函式,不過 linux 幫我們包的很好


(4) 編譯程式



#gcc -O2 use_syscall.c use_syscall
#./use_syscall



Return Value: 100
上一篇:Unix(Linux) C编程问题精粹    下一篇:linux下糟糕的异常处理方式  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-13
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿