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

    2019-12-28 20:59:54
    https://www.cnblogs.com/nelolee/p/8430805.html https://blog.csdn.net/u010371710/article/details/80382968

    https://www.cnblogs.com/nelolee/p/8430805.html
    https://blog.csdn.net/u010371710/article/details/80382968

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

    2015-12-14 19:04:55
    本次实验以Linux 2.6.35版本的unbutu系统为基础,在内核上增加一个helloworld程序的系统调用

    本次实验以Linux 2.6.35版本的unbutu系统为基础,在内核上增加一个helloworld程序的系统调用。

    一、重新安装配置内核

    Linux增加系统调用

    本次实验以Linux 2.6.35版本的unbutu系统为基础,在内核上增加一个helloworld程序的系统调用。

    一、重新安装配置内核

    1)安装所需的工具和包:#yum install -y gcc ncurses-devel make wget(ncurses能提供底层终端功能的封装,提供一个相当稳固的工作框架用以产生漂亮的界面)
    若是centos系统,命令则不同:#apt-get install -y gcc libncursesdev make wget wget。

    2)查看所用系统的内核版本,下载所需版本的Linux内核(本实验需要另外的Linux内核,若在本机内核上操作可能导致严重的问题该实验用2.6.35版本),并解压:

    uname -r 
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.tar.gz
    tar xvzf linux-2.6.35.tar.gz

    也可以到www.kernel.org下载相关内核

    3)进入linux-2.6.3,安装配置启动菜单menuconfig:

    make menuconfig

    在启动菜单里选择如下:

    编译内核:#make

    make modules

    4)安装内核(需要用$su命令取得权限):

    make modules_install
    make install

    (unbutu用户需要先执行:#sudo update-initramfs -c -k 2.6.35 手动生成ini)

    5)修改配置文件

    vim /boot/grub/menu.lst

    修改文件中的内容:default=0,timeout=25
    (unbutu用户则#sudo vim /etc/default/grub 并修改:GRUB_DEFAULT=2,GRUB_TIMEOUT=25,最后更新grub:#sudo update-grub)

    6)重启系统并观察版本号:

    reboot
    uname -r

    二、增加新的系统调用

    1)编写调用程序:

    cd linux-2.6.35
    mkdir my_source
    touch my_soucer/sys_hellowoeld.c
    vim my_soucer/sys_hellowoeld.c

    文件内程序如下:

    include<linux/kernel.h>
    include<linux/sched.h>
    Asmlinkage int sys_helloworld(void)
    {
    Printk(KERN_EMENG “Hello World! \n”);
    Return 1;
    }

    2)增加配置文件:

    touch my_source/Makefile
    vim my_source/Makefile

    文件内容为:

    Makefile of the new system call
    
    Obj-y :-sys_helloworld.o

    3)修改原有配置文件
    在linux2.6.35目录下打开原有配置文件:#vim Makefile
    在下行末尾加上my_source:
    Core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ my_source/

    4)增加系统调用号
    vim arch/x86/kernel/sys_table_32.S
    在系统调用表末尾增加一个未使用的调用号,最好接上上一个,我用的是339:

    .long sys_helloworld /* 339 */  
    vim /arch/x86/include/asm/unistd_32.h

    增加一行:#define __NR_helloworld 339
    将总调用数增加1,变成339:#define NR_syscalls 339

    vim /arch/x86/include/asm/syscall.h

    增加一行:asmlinkage int sys_helloworld(void);

    5)返回第一步编译安装内核并重启

    6)编写测试程序代码test_syscall.c,程序内容如下:

    include<linux/unistd.h>
    include<sys/syscall.h>
    include<sys/types.h>
    include<stdio.h>
    define __NR_helloworld 339
    Int main(int argc,char *argv||)
    {
            syscall(__NR_helloworld);
    Return 0;
    }

    7)编译执行测试程序

    gcc test_syscall.c -o test_syscall
    ./test_syscall
    展开全文
  • @Linux增加系统调用 Linux增加系统调用 一、题目要求 实现一个linux的系统调用 二、实现思路 首先,需要准备相应的环境和内核,通过官网下载,然后将内核在虚拟机中解压,在新的内核下添加相应的系统调用函数、声明...

    @Linux增加系统调用

    Linux增加系统调用

    一、题目要求

    实现一个linux的系统调用

    二、实现思路

    首先,需要准备相应的环境和内核,通过官网下载,然后将内核在虚拟机中解压,在新的内核下添加相应的系统调用函数、声明、id,之后配置内核,重启并测试是否成功。

    三、操作步骤

    第一步:装载Linux

    具体方法可见下方链接,不再赘述。
    https://blog.csdn.net/colin_lisicong/article/details/70193539
    需要注意的是,硬盘内存务必多分配些,否则在内核编译时会失败。

    第二步:更新软件源代码和软件依赖包

    1、打开终端
    打开终端,在Ubuntu中可用快捷键Ctrl+Alt+t打开,也可以在桌面右键出现的下拉菜单中选择
    在这里插入图片描述
    2、获取管理员权限

    在终端输入指令:sudo su
    随即会显示要求你输入密码,即登录密码,这时将密码输入后直接回车即可。(注:密码不会显示在终端屏幕上)

    在这里插入图片描述
    3、安装相关编译程序

    sudo apt-get update
    

    在这里插入图片描述

    sudo apt-get install libncurses5-dev libssl-dev
    

    在这里插入图片描述

    sudo apt-get install build-essential openssl
    

    在这里插入图片描述

    sudo apt-get install zlibc minizip
    

    在这里插入图片描述

    sudo apt-get install bison[添加链接描述](https://www.kernel.org/)
    

    在这里插入图片描述
    (由于我做的时候忘记拍照,这是后来补拍的,所以都已经更新完成了)

    第三步:获取内核

    1、下载内核

    https://www.kernel.org/
    https://www.kernel.org/
    在此网址中,可以下载最新的内核,可以先保存在Windows桌面上,然后将下载好的内核压缩包直接拖入虚拟机桌面上(我用的内核是linux-5.6)
    在这里插入图片描述
    2、将压缩文件移入/usr/src/文件夹中

    在终端接着输入以下代码即可

    sudo mv /home/dwj/桌面/linux-5.6.tar /usr/src/
    

    在这里插入图片描述
    (这里mv后面的是你内核的所在位置)

    3、进入/usr/src解压此压缩文件

    接着输入:

    `cd /usr/src`
    
    sudo tar -xvf /usr/src/linux-5.6.tar.xz
    

    在这里插入图片描述
    第四步:安装vim编辑器
    1、进入解压出的文件目录

    cd /usr/src/linux-5.6/kernel
    

    2、安装vim

    sudo apt-get install vim
    

    在这里插入图片描述
    第五步:加入所要的系统调用函数

    1、打开sys.c

    sudo vim sys.c
    

    注意:在vim中, i进入编辑, esc退出编辑状态. G跳到末尾, gg进入开头。 :wq保存退出, :q不保存退出)

    2、在文件末尾添加函数

    asmlinkage long sys_helloworld(void)
    {
        printk( "helloworld!");
         return 1;
    }
    

    在这里插入图片描述
    第六步:添加声明

    1、用vim打开linux-4.16.10/arch/x86/include/asm/syscalls.h,

    cd /usr/src/linux-5.6/arch/x86/include/asm/
     
    

    在这里插入图片描述

    sudo vim syscalls.h
    

    2、加入系统调用函数声明
    插入asmlinkage long sys_helloworld(void);
    在这里插入图片描述
    第七步:加入系统调用号

    1、进入/usr/src/linux-5.6/arch/x86/syscalls目录

    cd /usr/src/linux-5.6/arch/x86/entry/syscalls
    

    在这里插入图片描述
    2、打开文件syscall_64.tbl(该文件有一个系统调用列表,最前面的属性是id)

    sudo vim syscall_64.tbl
    

    3、添加自己的系统调用号

      439   64   helloworld           sys_helloworld
    

    在这里插入图片描述
    4、使用esc +:wq命令保存退出

    cd  /usr/src/linux-5.6
    

    在这里插入图片描述
    之后依次输入:

    sudo make mrproper
    

    在这里插入图片描述

    sudo make clean
    

    在这里插入图片描述

     sudo apt-get install bison
    
              `sudo apt-get install flex`(安装这两个包防止在下面一步出现错误信息)`
    
    sudo make menuconfig
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    出现窗口后用键盘左右键控制直接save->ok->exit->exit
    接着输入:

    sudo apt-get install libssl-dev
    
              `sudo make -j4`(根据自己处理器的最大线程数目编译)
    

    此后,开始漫长的编译过程
    在这里插入图片描述
    在这里插入图片描述
    (在执行这本大块的步骤时,终端窗口最大化,否则有可能会报错)

    第九步:安装内核

    编译后安装内核到系统中.

    sudo make modules_install  
    

    在这里插入图片描述

    sudo make install 
    

    在这里插入图片描述
    第十步:重启虚拟机

    sudo reboot
    

    将之前的工作保存后直接重启,重启后点击鼠标进入ubuntu并且迅速按住shift,长按。
    有选择内核的过程时(我的电脑没有选择,可以直接登录)
    选第一个进去,继续第一个进去,基本完成。

    第十一步:测试

    1、登录

    2、打开终端

    3、输入以下指令

    (1) uname -r
    可以看到版本号已经变化
    在这里插入图片描述
    (2)sudo vim test.c
    然后在打开的c文件中输入以下代码
    在这里插入图片描述
    esc+:wq保存退出
    (3)输入

    gcc -o test test.c
    ./test
    

    在这里插入图片描述
    成功啦!

    耐心最重要啦,做这个作业的时候我重装了无数遍虚拟机等了无数个漫长的两三小时,有些问题也不知道为什么突然就好了,不过做完还是很有成就感的。

    展开全文
  • PAGE 1 中国地质大学武汉 操作系统原理课程实验报告 数据科学与大数据技术专业 班级195182学生姓名钟欢 任课教师康晓军 完成时间2020年3月31日 实验一实现一个linux系统调用 一实验目的 1.加深对系统调用的理解...
  • Linux 增加系统调用 + 内核编译1. Linux系统调用机制1.1 系统调用是什么1.2 系统调用实现方式2. Linux内核2.1 操作系统与内核2.2 Linux内核的特性3. 添加系统调用3.1 环境3.2 下载源码3.3 修改SYS_CALL_TBL3.4 修改...

    1. Linux系统调用机制

    1.1 系统调用是什么

    Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

    1.2 系统调用实现方式

    系统调用是靠一些宏,一张系统调用表,一个系统调用入口来完成。进程是不能访问内核的:它不能访问内核所占内存空间也不能调用内核函数;系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置。在Intel CPU中,这个由中断0x80实现。进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,最后返回到进程。

    2. Linux内核

    2.1 操作系统与内核

    操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

    2.2 Linux内核的特性

    Linux由C语言写成,符合POSIX标准的类Unix操作系统。Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。

    3. 添加系统调用

    3.1 环境

    本次实验环境是Windows 10(x64)上使用VMware® Workstation 12 Pro(12.5.0 build-4352439)搭建的Linux虚拟机Ubuntu 14.04.3(32位),内核版本4.4.0-31-generic (buildd@lgw01-01), gcc版本4.8.4。

    3.2 下载源码

    首先,从www.kernel.org下载内核源代码 ,使用命令解压源码包,命令如下:

    tar -zxvf linux-4.4.tar.gz
    sudo chmod 777 -R linux-4.4

    接着,将源码移动到/usr/src文件夹下。

    3.3 修改SYS_CALL_TBL

    向文件./arch/x86/syscalls/syscall_32.tbl中添加系统调用号:

    359 hello sys_hello

    3.4 修改SYSCALL头文件

    向文件./include/linux/syscalls.h中添加系统调用函数原型:

    asmlinkage long sys_hello(void);

    3.5 修改SYS源文件

    修改文件./kernel/sys.c,添加系统调用函数的定义:

    asmlinkage long sys_hello(void)
    {
    printk(KERN_DEBUG"Hello World!");
    return 0;
    }

    注意此处使用的是内核态的printk,相关内容在后文中解释。

    4. 编译Linux内核

    4.1 准备

    接下来进行内核编译,编译之前首先检查依赖库的情况,安装需要的库:

    sudo apt-get install libssl-dev
    sudo apt-get install libncurses5-dev

    4.2 获取本地配置

    输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config ,目的是使用在boot目录下的原配置文件。使用

    sudo make localmodconfig

    则按照本地配置来编译内核。

    4.3 编译

    依此运行如下命令:

    sudo make -j4
    sudo make -j4 modules_install
    sudo make -j4 install

    分别是使用四个线程编译内核、编译模块和安装。

    4.4 修改和更新GRUB

    5. 附录

    Printk函数

    printk相当于printf的孪生姐妹,她们一个运行在用户态的,另一个则在内核态被人们所熟知的。使用方法是:

    printk(日志级别 “消息文本”);

    日志级别一共有8个级别,printk的日志级别定义如下(在kernel.h中):

    #defineKERN_EMERG"<0>"/紧急事件消息,系统崩溃之前提示,表示系统不可用/
    #defineKERN_ALERT"<1>"/报告消息,表示必须立即采取措施/
    #defineKERN_CRIT"<2>"/临界条件,通常涉及严重的硬件或软件操作失败/
    #defineKERN_ERR"<3>"/错误条件,驱动程序常用KERN_ERR来报告硬件的错误/
    #defineKERN_WARNING"<4>"/警告条件,对可能出现问题的情况进行警告/
    #defineKERN_NOTICE"<5>"/正常但又重要的条件,用于提醒。常用于与安全相关的消息/
    #defineKERN_INFO"<6>"/提示信息,如驱动程序启动时,打印硬件信息/
    #defineKERN_DEBUG"<7>"/调试级别的消息/

    展开全文
  • Linux 增加系统调用大致步骤: 1、下载好内核文件,在内核源文件中添加好自己的调用函数。 2、编译内核 3、验证。 一、在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解压。 过程参考...
  • Linux 增加系统调用大致步骤: 1、下载好内核文件,在内核源文件中添加好自己的调用函数。 2、编译内核 3、验证。 一、在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解压。 过程参考...
  • Linux增加系统调用

    2020-12-16 15:56:53
    1、前期准备工作 (2)安装 必要软件 sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison (2)查看当前内核版本 及...sudo apt-get install linux
  • 本文对Linux增加系统调用并安装新内核过程进行了简单介绍。
  • linux增加系统调用

    2011-12-25 23:46:00
    (原创作品 转载请务必注明出处!) 在Bochs模拟器下给0.12内核的linux增加一个系统调用 sethostname2(char* hostname, int len),以实现:给系统设置主机名称并在屏幕...修改 kernel/sys.c 增加系统调用的实现 。 ...

空空如也

空空如也

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

linux增加系统调用

linux 订阅