zoukankan      html  css  js  c++  java
  • NeuSoft(2)添加系统调用

    1、下载内核
    apt-get install linux-source
    在/usr/src下

    clip_image002clip_image004
    2、解压内核
    cd /usr/src

    clip_image005
    tar -jxvf linux-source-3.2.0.tar.bz2

    clip_image006
    将内核解压到/usr/src
    3、修改文件
    a/usr/src/linux-source-3.2.0/kernel/sys.c
    可以用右键管理员打开或者
    gedit /usr/src/linux-source-3.2.0/kernel/sys.c

    在文件最后添加
    asmlinkage int sys_mycall(int number)
    {
    printk("这是我添加的第一个系统调用");
    return number;
    }
    asmlinkage int sys_addtotal(int number)
    {
    int i=0,enddate=0;
    printk("这是我添加的第二个系统调用");
    while(i<=number)
    enddate+=i++;
    return enddate;
    }
    asmlinkage int sys_three()
    {
    printk("这是我添加的第三个系统调用");
    return 0;
    }

    clip_image008
    b/usr/src/linux-source-3.2.0/arch/x86/kernel/syscall_table_32.S
    可以用右键管理员打开或者
    gedit /usr/src/linux-source-3.2.0/arch/x86/kernel/syscall_table_32.S
    然后在一列 .long sys_XXXX的下一行添加
    .long sys_mycall
    .long sys_addtotal
    .long sys_three
    并记住他们分别是第几个.long sys_XXXX

    clip_image010
    c
    /usr/src/linux-source-3.2.0/arch/x86/include/asm/unistd_32.h
    可以用右键管理员打开或者
    gedit /usr/src/linux-source-3.2.0/arch/x86/include/asm/unistd_32.h
    在一列#define __NR_XXXX NNN后添加几行
    #define __NR_mycall 349
    #define __NR_addtotal 350
    #define __NR_three 351
    注意后面那个数字是接着上面那几行下来的
    clip_image012
    d/usr/src/linux-source-3.2.0/ubuntu/omnibook/Makefile
    如果在后面编译模块时出现

    ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory
    make[2]: *** [ubuntu/omnibook/omnibook.o] Error 1
    make[1]: *** [ubuntu/omnibook] Error 2
    make: *** [ubuntu] Error 2
    以上错误,则需要修改,不过我建议还是先改了再说
    可以用右键管理员打开或者
    gedit /usr/src/linux-source-3.2.0/ubuntu/omnibook/Makefile
    找到下面两行
    #EXTRA_LDFLAGS += $(src)/sections.lds
    EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds
    调换一下‘#’的位置,如下
    EXTRA_LDFLAGS += $(src)/sections.lds
    #EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds

    clip_image014
    4、编译内核
    进入解压目录

    cd /usr/src/linux-source-3.2.0

    a)make mrproper //清除内核中不稳定的目标文件,附属文件及内核配置文件
    b)make clean //清除以前生成的目标文件和其他文件
    c)make oldconfig// 采用默认的内核配置,如果这里出现选项,选择默认的选项,就是方括号内的第一个字母,不过我这里没出现选项

    clip_image016
    d)make bzImage //编译内核,大概需要半小时
    e)make modules //编译模块,大概需要两小时,如果出现错误,看看是不是因为上面的第3步的d)没做

    clip_image018
    f)make modules_install// 安装模块,比较快

    clip_image020
    5、复制内核
    首先查看一下编译好的内核版本,以便命名
    打开 /lib/modules

    clip_image022
    里面应该多了一个纯数字不带"generic"的文件夹,那就是新内核版本号,我的是3.2.50
    然后复制内核
    cp /usr/src/linux-source-3.2.0/arch/i386/boot/bzImage /boot/vmlinuz-3.2.50-mykernel clip_image024
    6、创建 initrd文件
    在创建之前先安装必要的程序
    apt-get install bootcd-mkinitramfs

    clip_image026
    mkinitramfs -o /boot/initrd.img-x.x.x
    耐心等待创建完成

    clip_image028
    7、更新配置GRUB引导列表
    可以用右键管理员打开/boot/grub/grub.cfg或者
    gedit /boot/grub/grub.cfg
    找到下面这种结构
    menuentry 'Ubuntu, with Linux 3.2.0-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    linux /boot/vmlinuz-3.2.0-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splash
    initrd /boot/initrd.img-3.2.0-27-generic
    }
    menuentry 'Ubuntu, with Linux 3.2.0-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    echo 'Loading Linux 3.2.0-27-generic ...'
    linux /boot/vmlinuz-3.2.0-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro single
    echo 'Loading initial ramdisk ...'
    initrd /boot/initrd.img-3.2.0-27-generic
    }
    复制一份在这些结构前粘贴,注意必须贴在

    ### BEGIN /etc/grub.d/10_linux ###

    ……

    ### END /etc/grub.d/10_linux ###

    里面,并将粘贴出来的结构中的
    linux /boot/vmlinuz-3.2.0-27-generic
    initrd /boot/initrd.img-3.2.0-27-generic
    改成你的内核文件地址和initrd文件地址
    linux /boot/vmlinuz-3.2.50-mykernel
    initrd /boot/initrd.img-3.2.50

    clip_image029

    clip_image031

    clip_image033
    最好把其他所有版本相关信息号改成3.2.50(新编译的版本号),以便在Grub菜单选择

    比如改成

    menuentry 'Ubuntu, with Linux 3.2.50' --class ubuntu --class gnu-linux --class gnu --class os {

    recordfail

    gfxmode $linux_gfx_mode

    insmod gzio

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set=root 500bcade-e187-4245-9d3e-e422dd61df83

    linux /boot/vmlinuz-3.2.50-mykernel root=UUID=500bcade-e187-4245-9d3e-e422dd61df83 ro quiet splash $vt_handoff

    initrd /boot/initrd.img-3.2.50

    }

    menuentry 'Ubuntu, with Linux 3.2.50-generic-pae (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {

    recordfail

    insmod gzio

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set=root 500bcade-e187-4245-9d3e-e422dd61df83

    echo 'Loading Linux 3.2.50 ...'

    linux /boot/vmlinuz-3.2.50-mykernel root=UUID=500bcade-e187-4245-9d3e-e422dd61df83 ro recovery nomodeset

    echo 'Loading initial ramdisk ...'

    initrd /boot/initrd.img-3.2.50

    }

    注意检查一下/boot/目录下是否存在上面这两个文件,如果没有,证明上面的几部还没成功

    还有就是这些menuentry的顺序,有些系统启动引导时会直接进入第一个menuentry,如果第一个menuentry不是你想进的内核,则需要在开机时按Shift进入GRUB引导菜单选择内核。如果你的系统开机是直接打开GRUB引导菜单,则无所谓,选择你想进的内核就行
    8
    终端执行以下命令cd /boot
    cp initrd.img-3.2.50 initrd-3.2.50.old
    以上是备份initrid,下面是修改
    depmod –a

    clip_image035
    update-initramfs -k 3.2.50 -c
    cd /tmp
    gzip -dc /boot/initrd.img-3.2.50 | cpio -id
    touch lib/modules/3.2.50/modules.dep
    find ./ | cpio -H newc -o > /boot/initrd.img-3.2.50.new
    gzip /boot/initrd.img-3.2.50.new
    cd /boot
    mv initrd.img-3.2.50.new.gz initrd.img-3.2.50
    clip_image037
    9、重启
    重启ubuntu,如果能进入系统,证明基本上没问题了。
    打开终端输入
    uname -a
    clip_image039
    10、检查系统调用
    打开编译器,新建工程来测试
    在main函数中使用syscall(函数号,参数)测试系统调用
    比如
    syscall(349,1);
    syscall(350,10);
    syscall(351);

    clip_image041
    编译运行,然后打开终端输入
    dmesg -c
    查看是否有添加系统调用成功信息
    clip_image043

  • 相关阅读:
    RedHat 7.0及CentOS 7.0禁止Ping的三种方法
    修改WordPress后台默认登陆地址提高网站安全性
    解决WordPress用户名密码都正确但点击登陆就清空密码的问题
    Windows上使用Git托管代码到Coding
    使用Coding Pages托管网站
    Windows上设置Mozilla Thunderbird邮件客户端后台运行
    在VirtualBox中安装BlackArch Linux
    关于XML学习
    软件工程课程设计团队项目总结与项目报告
    详细设计
  • 原文地址:https://www.cnblogs.com/shenerguang/p/3381491.html
Copyright © 2011-2022 走看看