缥缈峰一座01号

梁二伯的窝

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录
  86篇文章 :: 0篇收藏:: 27篇评论:: 0个Trackbacks

公告

Equality && Free

文章

收藏

相册

存档


正在读取评论……


何谓system call? 很多人认为system call就是我们编程中使用的各种API,其实不然,我们在
编程中调用的各种API其实是对system call的一种包装,例如:我们在程序中使用printf(),
这个printf()就是libc对各种system call的封装。
在linux 2.6.16.4中有两种方式实现system call,从user space 切换到kernel space
1. int $0x80   对应返回使用iret
2. sysenter    对应返回使用sysexit
如何编写system call?
在 arch/***/kernel/syscall_table.S  ***为具体的体系(例如I386)添加一个新表项

ENTRY(sys_call_table)
 .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
 .long sys_exit
 .long sys_fork
 .long sys_read
 .long sys_write
 .long sys_open  /* 5 */
 .long sys_close
 .long sys_waitpid
 .long sys_creat
 .long sys_link
 .long sys_unlink /* 10 */
 .long sys_execve
 .long sys_chdir
 .long sys_time
 .long sys_mknod
 .long sys_chmod  /* 15 */
 ……
 ……
 .long sys_mycall /* 313*/ 例如添加sys_mycall
 
 在 include/Asm-***/unistd.h中添加,其中的313为sys_mycall
 在sys_call_table中的序号,从0开始编号
 
#define __NR_mycall      313

kernel/Sched.c //把实现放在Sched.c中,可以任意,最好放在功能相关文件中
//=====================================================================
// 返回当前pid
//=====================================================================
#include <……>//包含必要的头文件
asmlinkage long sys_mycall(void)
{
        return current->tgid;  //返回当前pid
}


修改完毕后重新编译内核。

test.c
//=====================================================================
// 返回当前pid
//=====================================================================
#include <stdio.h>

#define __NR_mycall 313
__syscall0(long, mycall)

int main()
{
 long pid = 0;
 pid = mycall();
 printf("当前进程PID为:%d",);
 
 return 0;
}



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1009511


[点击此处收藏本文]  发表于2006年08月21日 3:56 PM




正在读取评论……

发表评论

大名:
网址:
验证码
评论