Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4710754
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-05-07 16:09:32

比较详细的介绍,大家可以去看看ibm的
http://www.ibm.com/developerworks/cn/linux/l-system-calls/

主要有以下几步:
 1.添加源码
   在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:

asmlinkage long sys_getjiffies( void )
{
return (long)get_jiffies_64();
}

asmlinkage long sys_diffjiffies( long ujiffies )
{
return (long)get_jiffies_64() - ujiffies;
}
asmlinkage long sys_pdiffjiffies( long ujiffies,
long __user *presult )
{
long cur_jiffies = (long)get_jiffies_64();
long result;
int err = 0;

if (presult) {

result = cur_jiffies - ujiffies;
err = put_user( result, presult );

}

return err ? -EFAULT : 0;
}


2. 连接新的系统调用

修改的文件是:

  /usr/src/linux/include/asm-i386/unistd.h

  该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。文
件中每一行的格式如下:

  #define __NR_name NNN

  其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。应该将
新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用
号。

#define __NR_getjiffies 333
#define __NR_diffjiffies 334
#define __NR_pdiffjiffies 335
#define NR_syscalls 336
注意要连续....333这个数字根据你自己的系统来.

修改的文件是:
  /usr/src/linux/arch/i386/kernel/entry.S

  该文件中有类似如下的清单:

  .long SYMBOL_NAME()

  该清单用来对sys_call_table[]数组进行初始化。该数组包含指向内核中每个
系统调用的指针。这样就在数组中增加了新的内核函数的指针。我们在清单最后添
加:


.long sys_getjiffies
.long sys_diffjiffies
.long sys_pdiffjiffies


note:以上三个文件路径一般都会变化的.根据自己的环境来.

3.重新编译内核.
这个^_^

4.现在可以写调用了.
[root@mip-123456 ~]# cat test.c
#include
#include
#include
#include

#define __NR_getjiffies 333

int main()
{
long jiffies;

jiffies = syscall( __NR_getjiffies );

printf( "Current jiffies is %lx\n", jiffies );

return 0;
}

[root@mip-123456 ~]# ./test
Current jiffies is 7819b

这里只写一个例子了...

明白这个过程了,再结合IBM那篇文章,应该没什么大问题了.
阅读(1424) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~