zoukankan      html  css  js  c++  java
  • 向linux内核增加一个系统调用-1

    验证编辑编译内核的流程,并增加新的系统调用


    注意:需要/目录至少10GB空间,/boot目录500MB空间


    下载内核并解压

    kernel下载
    百度云搬运 密码: qc8b
    进入 /usr/src目录
    tar -xvf linux-4.13.10.tar.xz
    cd linux-4.13.10

    添加系统调用号

    vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)

    声明系统调用函数原型

    vim ./include/linux/syscalls.h

    其中的asmlinkage用在大多数的系统调用中。在一些情况下是需要明确的告诉编译器使用stack来传递参数,X86中的系统调用是先将参数压入stack以后调用sys_函数的,所以所有的sys_函数都有asmlinkage来告诉编译器不要使用寄存器来编译。

    添加系统调用函数的定义

    vim kernel/sys.c 末尾添加

    编译

    make menuconfig

    (缺失ncurses,sudo apt-get install libncurses5-dev,)选择save 然后exit

    make clean
    make -jn

    并行编译,加快编译速度,n=cpu核心数×2,双核即-j4
    scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 sudo apt-get install libssl-dev
    作为参考,i5-6200u 2.8GHZ需要40min左右

    安装

    make modules
    make modules_install 安装模块
    make install 安装内核
    update-grub

    测试

    重启选择新的内核(grub引导界面选择ubuntu高级设置,选择linux-4.13.10)
    进入后可uname -a确认内核版本

    #include<stdio.h>
    #include<unistd.h>
    
    int main()
     {
        int a=syscall(333,2);
        printf("system call return %d
    ",a);
        return 0;
    }
    

    编译后运行返回2,并在日志中打印hello world

  • 相关阅读:
    初步了解Ajax
    什么是applet
    FilterLog代码分析
    Async分析
    HttpServletRequest hrequest
    xml的定义用途
    企业级与应用级的区别
    未来规划
    黄金点游戏
    hashCode与eqauls
  • 原文地址:https://www.cnblogs.com/yueshangzuo/p/7782295.html
Copyright © 2011-2022 走看看