添加系统调用的层次关系

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1
sys_mycall(int number) { return number; }
asmlinkage int sys_mycall(int number)
使用在linux内核中添加的系统调用
/* xtdy.c */ #include <Linux/unistd.h> _syscall1(int,mycall,int,ret) main() { printf("%d \n",mycall(100)); }
_syscall1的定义
文 件 : sur/src/linux/include/asm-i386/unistd.h 定 义 了_syscall1:
新加的系统调用为mycall(int number), 在/usr/src/Linux/kernel/sys.c 文件中添加源代码 如下: asmlinkage int sys_mycall(int number) { return number; }
约束条件字母
系统调用处理流程
#include <Linux/unistd.h> _syscall1(int,mycall,int,ret) main() int 0x80 { printf("%d 传递的参数: \n",mycall(100)); __NR_mycall }
_syscall1(int,mycall,int,ret)传入对系 统调用编号表第243项的调用
在entry.S中的调用表中加入口地址
/usr/src/Linux/arch/i386/kernel/entry.S 该文件中有类似如下的清单: .long SYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化 该数组包含指向内核中每个系统调用的指针 每添加一项则便是在数组中增加新的内核函数的指针
在unistd.h中定义系统调用号
/usr/src/Linux/include/asm-i386/unistd.h 该文件含有系统调用编号,每一行的格式如下: #define __NR_name NNN
所添加的系统调用号如下: #define __NR_mycall 243 此处的__NR_mycall由
#define _syscall1(type,name,type1,arg1) \ type name(type1 arg1) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(arg1))); \ __syscall_return(type,__res); \ }
在Linux C程序中嵌入汇编代码
1、在C程序中嵌入汇编: __asm__ __volatile__(指令部分:输出部分:输入部分:损坏部分) 2、嵌入汇编程序的解释(gcc) #define _syscall1(type,name,type1,arg1) \ type name(type1 arg1) \ {long __res; \ __asm__ volatile (“int $0x80” \指令部分 : “=a” (__res) \当完成 int 0x80 后,取得返回值在eax寄存器中。 : “0” (__NR_##name),“b” ((long)(arg1))); \ __NR_mycall存放在第一个通用寄存器中,arg1存放在ebx中,将它们传入
.long SYMBOL_NAME(sys_mycall)
entry.S(系统调用表)
返回值在eax中
0 sys_ni_syscall … … 243 sys_mycall
sys.c(新的系统调用函数)
unistd.h(定义编号)
#define __NR_exit
… … #define __NR_mycall 243
int 0x80 中断处理程序。##表示符号连接。
wk.baidu.com
__syscall_return(type,__res); }
__syscall_return
/* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */ #define __syscall_return(type, res) \ do { \ if ((unsigned long)(res) >= (unsigned long)(-125)) { \ errno = -(res); \ res = -1; \ } \ return (type) (res); \ } while (0)
加入清单最后一行(即表中的第243项)的新函数指针是:
.long SYMBOL_NAME(sys_mycall)
此处的sys_mycall与在sys.c中加入的名字相同,通过此表调用sys.c中 的函数:
asmlinkage int sys_mycall(int number)
在sys.c中添加新的系统调用
相关文档
最新文档