achilles偏要执著 2015-03-21 15:53 采纳率: 0%
浏览 2656
已结题

增添一个系统调用,我的内核版本是linux3.13.0-46-generic.

想要向ubuntu14.04内核增添一个系统调用,我的内核版本是linux3.13.0-46-generic.该怎么做.

  • 写回答

1条回答 默认 最新

  • 挥手007 2015-03-22 07:16
    关注

    一.源码修改
    1下载一个与所用系统内核版本接近的内核,放在/usr/src下,解压,作个链接ln -s linux-2.6.18.1 linux
    2修改:修改三个地方
    1)/usr/src/linux/kerner/sys.c中添加,

    asmlinkage int sys_mysyscall(int a)
    {
    return a;
    }
    2)定义系统调用号,/usr/src/linux/include/asm-i386/unistd.h
    #define _NR_sysmycall 318 //不能与前面已有的重复
    #define _NR_syscalls 319//修改系统中所用系统调用数目
    3)在系统调用向量表里添加自定义的系统调用函数入口位置,
    /usr/src/linux/arch/i386/kernel/syscall_table.S,以前老版本是entry.s
    .long sys_mysyscall
    二、内核编译
    1.在/boot下复制配置文件,到/usr/src/linux下,改名位config,make menuconfig,可以不用修改,直接退出
    2.make clean 清空以前的编译痕迹
    3.make,编译出来的是bzImage
    4.make modules,make modules-install//编译、安装config里配置的模块
    如不执行次步骤,对于有的系统,制作不了initrd文件。系统就启动不了
    5.如果直接make install,系统会自动制作initrd文件,并复制initrd和bzimage文件到/boot下,修改grub.conf文件,重启系统,选择进入新内核
    6.不使用make install命令。复制bzImage到/boot下,改名位vmlinuz-2.6.18.1,手工制作initrd文件,/mkinitrd initrd-2.6.18.1.img 2.6.18.1,initrd文件名位initrd-2.6.18.1
    7.修改grub.conf文件,复制原来已有的启动设置,把title和kernel和initrd改名为新制作的即可
    三、编写代码测试
    int main(void)
    {
    int a=syscall(318,100);//318是系统调用号,100是参数
    printf("%d\n",a);
    return 0;
    }
    syscall是内核提供为用户程序的一个函数,
    如果不使用syscall函数,也可以使用宏定义,但是在2.6.20以后的版本里,没有宏定义,需要自己从其他版本里复制过来添加。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)