全部博文(930)
分类: LINUX
2009-05-07 16:09:32
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那篇文章,应该没什么大问题了.