linux命令如何调用内核,Linux内核中添加新的系统调用

我这里用到的Linux内核版本是linux2.6.33.3

其实添加系统调用是一件很简单的事情,因为你只是定义一些处理函数,添加符号表,其他的调度都是由内核来帮忙做的。

2.配置

tar -xzvf Linux-2.6.33.3.tar.gz -C /usr/src

cd /usr/src

ln -s Linux-2.6.33.3 Linux

cd Linux

make mrproper # Make sure you have no stale .o files

make menuconfig #生成一个.config文件

具体,根据自己的系统配置进行设置。

3.开始艰难的编译过程

make

make module_install

make install

update-grub2 or update-grub

4.我喜欢先编译一便内核,确保原始的代码能够顺利编译运行成功,然后再进行修改。不然,在一个不能跑的内核上添加系统调用,很费脑筋。

5.主要需要修改的文件及其位置

/usr/src/linux/arch/x86/kernel/syscall_table_32.S

/usr/src/linux/arch/x86/include/asm/unistd_32.h

/usr/src/linux/arch/x86/kernel/sys_i386_32.c

6.实例

1)把sys_mySyscall添加到系统调用表

vim /usr/src/linux/arch/x86/kernel/syscall_table_32.S

................

................

.long sys_recvmmsg

.long sys_mySyscall

2)添加系统调用号到unistd.h

vim /usr/src/linux/arch/x86/include/asm/unistd_32.h

...............

...............

#define __NR_recvmmsg       337

#define __NR_mySyscall   338

记住,不要忘记将下面的

#ifdef __KERNEL__

#define NR_syscalls 338

的值加一。

3)添加系统调用函数体

vim /usr/src/linux/arch/x86/kernel/sys_i386_32.c

extern struct timespec xtime;

asmlinkage long sys_mySyscall( struct timeval * tv, struct timespec * ts)

{

struct timeval ktv;

do_gettimeofday(&ktv);

copy_to_user(tv, &ktv, sizeof(ktv));

copy_to_user(ts, &xtime, sizeof(xtime));

return jiffies;

}

4)重新编译内核,启动新内核

方法同上

5)在用户空间编写测试程序

#include

#include

#include

#include

#include

#define __NR_mySyscall 338

int main()

{

struct timeval v_time;

struct timespec s_time;

long jiffies;

jiffies = syscall(__NR_mySyscall, &v_time, &s_time);

printf("timeval tv_sec = %ld, tv_usec = %ld\n", v_time.tv_sec, v_time.tv_usec);

printf("timespec tv_sec = %ld, tv_nsec = %ld\n", s_time.tv_sec, s_time.tv_nsec);

printf("jiffies = %ld\n", jiffies);

return 0;

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值