精华内容
下载资源
问答
  • Linux添加系统调用

    2020-02-29 15:49:01
    Linux添加系统调用 1 概述 通常添加系统调用有两种方案: 重新编译内核 添加内核模块 此处我们采用重新编译内核的方式增加系统调用。 实验环境:X86_64 GNU/Linux 4.15.0 Ubuntu18.04 2操作步骤 下载Linux内核...

    Linux添加系统调用

    1 概述

    通常添加系统调用有两种方案:

    • 重新编译内核
    • 添加内核模块

    此处我们采用重新编译内核的方式增加系统调用。

    实验环境:X86_64 GNU/Linux 4.15.0 Ubuntu18.04

    2操作步骤

    • 下载Linux内核源码(4.19.1)并解压

      1. 下载linux内核4.19.1

        官网链接:

        https://www.kernel.org/

        官网下载经常速度太慢,无法下载,提供另一个链接:

        http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/

      2. 将其拷贝到/usr/src目录下

        cp linux-4.19.1.tar.xz /usr/src/
        
      3. 解压缩并链接

        xz -cd linux-4.19.1.tar.xz| tar xvf -
        

        解压缩后出现linux-4.19.1目录,此时我们创建一个名为linux的目录,将linux软连接到linux-4.19.1,命令如下:

        ln -s linux-4.19.1 linux
        

      在这里插入图片描述

    • 添加系统调用

      共x个文件,此时目录为/usr/src/linux

      arch/x86/entry/syscalls/syscall_64.tbl      //设置系统调用号,如果是32位就用syscall_32.tbl
      
      include/linux/syscalls.h       //系统调用的头文件
      
      kernel/sys.c                    //定义系统调用函数
      
      1. 设置系统调用号

        vim arch/x86/entry/syscalls/syscall_64.tbl
        

      在这里插入图片描述

      1. 头文件中添加声明

        vim include/linux/syscalls.h
        

      在这里插入图片描述

      1. 定义系统调用函数

        vim kernel/sys.c
        

        在头文件中添加linkage.h

        在这里插入图片描述

        添加函数定义,此处函数为输出“operating system work1 succeed!”

      在这里插入图片描述

    • 重新编译内核,此处可以参考文档Linux内核编译

    • 重启后编写测试文件

      hello.c 文件如下

      #define _GNU_SOURCE
      #include<stdio.h>
      #include<unistd.h>
      #include<sys/syscall.h>
      #include<sys/types.h>
      #include<signal.h>
        
      int main(){
          syscall(335);
          return 0;
       }
      

      编译该文件:

      gcc hello.c -o hello
      

      运行该文件

      ./hello
      
    • 用dmesg查看是否成功

      dmesg
      

      在这里插入图片描述

      输出"operating system work1 succed!"表示成功!

    3 参考博客

    https://www.cnblogs.com/lqerio/p/10461937.html(果然我武就是人才辈出)

    (当然还参考了许多其他的博客,可都没什么用!)

    展开全文
  • Linux 添加系统调用

    2019-03-08 14:18:00
    系统 Ubuntu 16.04.6  安装编译内核的工具:sudoaptinstallbisonflexpkg-configbuild-essentiallibncurses5-devlibssl-devlibelf-dev  1.下载内核源代码 ...  2....  3.添加系统函数调用定义 ./...

      系统 Ubuntu 16.04.6

      安装编译内核的工具:sudo apt install bison flex pkg-config build-essential libncurses5-dev libssl-dev libelf-dev 

      1.下载内核源代码  http://www.kernel.org/

      2.解压到 usr/src/

      3.添加系统函数调用定义 ./kernel/sys.c

      4.声明系统调用函数原型  ./include/asm-generic/syscalls.h

      5.添加系统调用号./arch/x86/entry/syscalls/syscall_64.tbl

      在没有使用的系统调用号添加

      6.生成配置文件,在源代码目录下用 make menuconfig,选择save保存配置信息后退出。

      7.编译开始 make -j n,n为线程数

      8.安装模块make modules_install 

      9.安装内核make install

      10.复制生成的内核文件进/boot     

        mkinitramfs -o /boot/initrd.img-4.14.0

        update-initramfs -c -k 4.14.0

      11.添加引导 update-grub2

      12.重新启动 按shift选ubuntu高级选项,选择新安装的内核进入。

     

    转载于:https://www.cnblogs.com/wshr007/p/10495543.html

    展开全文
  • Linux添加系统调用分享一下从编译内核到Linux添加系统调用的过程吧。一、准备我使用的是ubuntu 16.04 LTS,下载的是4.4.25的内核。首先要注意硬盘至少需要30g,不然会爆掉...别问我怎么知道的。内存分配的稍微大点就好...

    Linux添加系统调用

    分享一下从编译内核到Linux添加系统调用的过程吧。

    一、准备

    我使用的是ubuntu 16.04 LTS,下载的是4.4.25的内核。

    首先要注意硬盘至少需要30g,不然会爆掉...别问我怎么知道的。内存分配的稍微大点就好。

    二、编译内核

    编译内核其实很简单~

    我们先切换到root用户,把下载好的内核压缩文件放到/usr/src下,然后进入这个目录解压

    xz -d linux-4.4.25.tar.xz

    tar -xvf linux-4.4.25.tar

    然后如果不是第一次编译或者编译出错需要重新编译最好都执行一下make mrproper

    执行这条命令需要先安装一个包

    apt-get install libncurses5-dev

    我们是刚下载的的干净的内核源码包,所以不用执行make mrproper这条命令。

    make mrproper -Remove all generated files + config + various back files

    make clean - Remove most generated files but keep the config and enough build support to build external modules

    所以我们可以知道make mrproper和make clean的区别主要就是前者会删除所有的编译生成文件,而后者会保留配置文件.config,还有足够的扩展模块的支持。所以其实想清除编译残留数据的话执行make clean就可以了。实际上make mrproper一开始就会调用make clean的。

    好了 下面我们要配置内核选项了

    make menuconfig

    这个就去网上找具体点的吧 选项太多

    会出来一个图形界面 配置好exit会提示save即可。

    之后就是激动人心的编译内核时刻

    我们先安装一个包

    apt-get install libssl-dev

    生成启动映像文件

    make bzImage

    然后去看个番什么的等吧 不过可能要多看几集

    编译完成之后继续编译模块

    make modules

    注意我们一直是在/usr/src/linux-4.4.25这个文件夹下操作的,这次时间就更长了。我的配置一般i5而且是虚拟机,加上编译内核一共可能要几个小时,所以去打会球吧=。=

    模块编译好之后的步骤都很快了,

    安装模块

    make modules_install

    然后要建立载入虚拟内存盘的编在内核中的根文件系统镜像

    mkinitramfs 4.4.25 -o /boot/initrd-4.4.25.img

    配置grub引导

    update-grub2

    最后重启系统就大功告成了

    reboot

    最后可以通过uname -a查看内核版本

    三、添加新的系统调用

    1.分配系统调用号

    先去查看一下系统的调用号使用到多少了,查找一下系统调用表

    /usr/src/linux-4.4.25/arch/x86/entry/syscalls/syscall_64.tbl

    我的版本使用到了325,所以我新的系统调用用326号。注意文件里要看属于x64的系统调用号。

    然后我们修改/usr/include/asm-generic/unistd.h设置系统调用号

    添加

    #define __NR_saulcall 326

    __SYSYCALL(__NR_saulcall,sys_saulcall)

    并且将后面的__NR_syscalls的号加1。

    ps: 起名困难症 不过一看到call就想起better call saul~ 就用了这个

    2.修改系统调用表,关联调用号与调用的服务例程地址

    /usr/src/linux-4.4.25/arch/x86/entry/syscalls/syscall_64.tbl

    326 64 saulcall sys_saulcall

    3.编写服务例程

    要为我们的服务写程序了

    /usr/src/linux-4.4.25/kernel/sys.c

    我这里是一个简单的实现读取进程的nice值和修改进程nice值的服务

    参数flag为1时修改nice

    参数为0时读取nice

    SYSCALL_DEFINE3(saulcall, pid_t, pid, int, flag, int, nicevalue){

    int error = 0;

    struct task_struct *p;

    for(p = &init_task;(p = next_task(p)) != &init_task;){

    if(p->pid == pid){

    if(flag == 0){

    printk("the process's nice = %d",task_nice(p));

    } else if(flag == 1){

    printk("the process changed to %d",nicevalue);

    set_user_nice(p,nicevalue);

    } else {

    error = -EFAULT;

    }

    return error;

    }

    }

    error = -EFAULT;

    return error;

    }

    SYSCALL_DEFINE3的3即为参数个数,其他就不过多解释了,程序轻喷....

    4.重新编译内核

    不重新编译无法生效...等吧=。=

    5.编写用户态程序测试

    下面就可以写程序测试啦

    得引入下头文件

    #include

    #include

    然后可以选择一个进程调用我们的服务修改或者读取nice值啦,

    由于使用了printk,我们要用dmesg查看输出信息。

    可以使用top -p pid查看指定进程的信息。

    提供一个小demo:

    首先我们可以查找一个指定进程的pid,可以用pgrep加指定进程名,

    也可以用top命令显示各个进程资源占用,然后找一个进程的pid来实验我们的系统调用,比方说我先打开火狐浏览器,然后假设用top命令看到firefox的pid为4325,程序就可以如下来写

    #include

    #include

    int main()

    {

    syscall(__NR_saulcall,4325,1,15); // 修改4325进程的nice值为15

    return 0;

    }

    再次使用Top查看firefox进程的nice值可以看到已经被更改成我们想要的数值。

    over.

    展开全文
  • Linux添加系统调用函数并编译 1. 修改Linux内核 1.1 添加系统调用号 在./arch/x86/entry/syscalls/syscall_64.tbl中加入系统调用号 333 64 helloworld sys_helloworld (333表示调用号,64代表64位程序) 1.2 添加...

    Linux添加系统调用函数并编译

    1. 修改Linux内核

    1.1 添加系统调用号

    ./arch/x86/entry/syscalls/syscall_64.tbl中加入系统调用号

    333     64      helloworld              sys_helloworld
    334     64      two                     sys_two
    335     64      three                   sys_three
    

    (333表示调用号,64代表64位程序)

    DFKBE6.png

    1.2 添加系统调用声明

    ./arch/x86/include/asm/syscalls.h文件中加入调用函数声明

    asmlinkage void sys_helloworld(void);
    asmlinkage void sys_three(void);
    asmlinkage void sys_two(void);
    

    Dixw7t.png

    1.3 添加系统调用函数

    /kernel/sys.c中添加系统调用函数

    asmlinkage void sys_helloworld(void)
    {
            printk("helloworld\n");
    }
    asmlinkage void sys_two(void)
    {
            printk("it's my second function\n");
    }
    asmlinkage void sys_three(void){
            printk("it's my thrid function\n");
    }
    

    Dize4f.png

    2. 编译内核并安装内核

    启动内核控制程序

    apt-get install libncurses5-dev libncursesw5-dev
    make menuconfig
    

    DiVeR1.png

    然后就可以对内核做一些配置了~

    每一个配置选项都有三种选择:

    • [] 表示不将功能编译进内核
    • [M] 表示将该功能编译成动态插入内核的代码
    • [*] 直接将功能编译进内核

    选好功能模块后就可以开始编译了

    首先需要安装ssl

    sudo apt-get install libssl-dev
    

    然后编译安装

    sudo make -j4
    sudo make modules_install
    sudo make install 
    

    如果没有什么报错就可以重启了~

    reboot
    

    开机后长按shift键,会进入如下界面,选择高级选项

    DiiIne.png

    在高级选项中选择刚刚编译号的4.14.200版本的内核

    DiFPNn.png

    这里我直接选择这个内核就会卡在开机画面,进不去,枯了,看到网上也有同学是一样的情况,可能是前面的步骤哪里有点问题,但是使用4.14.200的恢复模式就能进入系统(选择恢复模式后,选择resume),进入恢复模式后系统内核也重新更改了,那就这样叭 😦

    更改内核成功

    uname -r
    

    DiFI2V.png

    3. 使用系统调用

    编辑一个C语言程序:

    #include <linux/unistd.h>
    #include <sys/syscall.h>
    int main()
    {
            syscall(333);
            syscall(334);
            syscall(335);
            return 0;
    }
    
    

    然后编译一下~

    gcc test.c
    

    DiEMNj.png

    我们的helloworld使用的是printk函数,是打印在日志中,所以我们首先清空一下日志

    sudo dmesg -C
    

    然后运行我们编译好的程序

    ./a.out
    

    再查看日志

    dmesg
    

    DFK1EV.png

    大功告成 😃

    展开全文
  • 操作系统-Linux添加系统调用

    千次阅读 2017-02-14 14:08:05
    Linux添加系统调用最近一直醉心于专业课~深感CS基础的重要性 但是我依然front-end high~这次就分享一下从编译内核到Linux添加系统调用的过程吧。一、准备我使用的是ubuntu 16.04 LTS,下载的是4.4.25的内核。 首先要...
  • Linux添加系统调用详解

    千次阅读 2018-11-13 20:20:17
    欢迎大家评论交流,题主从linux-2.6一直到linux-4.15的内核都添加过系统调用,各个大版本之间添加系统调用还是有一定区别。现在以linux-4.4.4添加系统调用为例进行一下记录~ 关于内核的下载与编译可以参考博文: ...
  • 本代码已经通过实际...在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。
  • linux添加系统调用总结(内核版本4.4.4)

    万次阅读 多人点赞 2016-03-09 19:34:33
    Linux添加系统调用总结最近在做操作系统的课程设计,其中一题就是给linux系统添加一个copy功能的系统调用,折腾之后总结一下:其实一开始我是不打算写的,但是发现老师的课设指导实在是太过时了,linux内核这都更新...
  • linux添加系统调用,网上一搜一大堆,我很久之前也试图添加过并且按照网上的教程一步一步做,但是都没有成功过,因为网上的教程大体都是一个样子,一份创造多分副本,照着做也不明白为什么,而且linux内核版本从...
  • 1.分配系统调用号,修改系统调用表 1.1 系统调用表格式 <系统调用号><common/64/x32><系统调用名><服务例程入口地址> 1.2 分配 ①进入内核目录,编辑系统调用表 cd usr/src/linux5.4.109/...
  • 【Linux编译内核】Linux添加系统调用

    千次阅读 2016-10-16 15:02:38
    花了一天半的时间,终于是把linux系统调用这个问题给解决掉了。这里记下一些我所遇到的问题以及解决办法等等。 首先在做这个问题之前必须保证自己的linux环境是一个干净的,没有其他人修改过该系统调用表。 之前我...
  • 《操作系统原理》开课没多久,老师猝不及防布置了一项任务,在Linux内核里添加系统调用。在当时还不知道Linux是何方神圣的我怎么也想象不到现在我已经成功完成任务并正在记录着我屡战屡败,屡败屡战的小白斗争史。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,904
精华内容 761
关键字:

linux添加系统调用

linux 订阅