ubuntu系统中添加新的系统调用2.6.33.1(linux)
编译内核-新增Linux系统调用过程

一、题目:新增Linux系统调用(1)需要重新编译Linux内核(2)增加一个Linux的系统调用(3)写一个用户程序进行调用测试。
系统调用实现的功能:计算一个数字的三次方,并打印出来。
二、版本:编译版本:Win10上虚拟机(Virtual Box) Ubuntu(64bit)15.04系统原内核版本:3.19.0编译的新内核源码版本:3.2.75不同内核版本,32位和64位文件位置以及文件名可能有所不同。
添加系统调用时要根据自己的版本的文件位置和文件名修改相应的三个文件。
三、步骤:1.前期准备:下载内核及解压1.1下载内核:1.2打开终端获得权限然后再输入su输入刚刚设置的密码。
1.3移动文件并解压下载目录2.添加系统调用2.1添加系统调用函数在文末添加调用函数。
然后保存,关闭。
2.2 添加调用函数声明在文末#endif前添加函数声明。
然后保存关闭。
2.3添加系统调用号因为前一个系统调用号是311 所以这里我们写312将原本的#defineNR_syscalls (__NR_syscall_max+1)修改为:#defineNR_syscalls (__NR_syscall_max + 2)然后保存,关闭。
3.编译内核3.1安装基本编译器套件3.2编译3.1make mrproper清除以前配置(如果是第一次编译,不用执行此操作)3.2 make menuconfig配置内核(此处选择了默认配置)3.3 make编译内核如果电脑是双核则也可以用make–j4代替make(双核编译会更快一些)接下来就是漫长的等待过程,不过要随时注意是否编译过程中因有错误而停止。
我的电脑用了两个小时。
(也有教程里用的是make bzlmage和makemodules,make bzlmage+make modules=make)4.安装内核4.1makemodules_install4.2makeinstall4.2 reboot重启(或不使用命令直接对电脑进行重启)ﻩ重启之后在开机时候开机时候,如果是虚拟机需要同时按esc和↑键出现开机启动项(如果是真机开机一般会自动出现开机启动项),选择新建的内核版本进入。
linux实验_添加系统调用-完整版

实验一添加一个新的系统调用一、实验目的理解操作系统内核与应用程序的接口关系;加深对内核空间和用户空间的理解;学会增加新的系统调用。
二、实验内容与要求首先增加一个系统调用函数,然后连接新的系统调用,重建新的Linux内核,用新的内核启动系统,使用新的系统调用(2.4内核和2.6内核任选一个)三、实验指导(2.6版本)⑴获得源代码(本次实验的内核版本是2.6.22.5,必须是root用户)1.从教育在线上下载内核源代码到本地磁盘;保存在/usr/src目录下2.进入终端,输入命令cd /usr/src 进入/usr/src目录(可以输入ls命令会发现目录下有一个名为LINUX_2_6_22_5.TAR.BZ2的压缩文件)3.当前目录下(/usr/src)输入命令tar –xjvf LINUX_2_6_22_5.TAR.BZ2 解压缩源代码,命令执行完毕后,会出现/usr/src/linux-2.6.22.5文件夹4.修改文件夹下的3个文件第一,编辑/usr/src/linux-版本号/kernel/sys.c文件,添加函数:asmlinkage long sys_mycall(long number){printk(“call number is %d\n”,number);return number;}第二,修改/usr/src/linux-版本/include/asm-i386/unistd.h添加一行#define __NR_mycall 324 到当前的最大系统调用号之后,比如原来最大的是323,在323的这一行之后加上一行#define __NR_mycall 324修改#define NR_systemcalls 的值,改成原来的值+1,比如原来是324 改成325第三,编辑/usr/src/linux-版本/arch/i386/kernel/syscall_table.S,在文件最后加上一行:.long sys_mycall5.重新编译内核在终端输入命令,进入源代码文件夹,cd /usr/src/linux-2.6.22.5 依次执行如下命令:make mrpropermake cleanmake xconfig (自己配置内核,出现图形对话框后,直接点保存,关闭)make(耗时最长,大约20分钟)make modules_install (安装模块)以上命令执行完毕后,会在当前目录下生成一个名为System.map的文件,会在/usr/src/linux-版本号/arch/i386/boot/下生成一个bzImage文件。
编译Linux2.6内核并添加一个系统调用

1. 0 让新 内核和 旧内核 都可 以加载 的配置 的步骤 :
my. r h i 8 / o t z ma e/ o t / c /3 6 b o / l g b o a b mv. y t m. p/ o t / s e ma b o S
mv/ o t zma e/o t mln z 261 ..5 3 b / l g b b / i u - ..510 0 v
2 1 年第 4期 0 1
福
建 电
脑
19 4
编 译 iu26内 并 添 加 一 个 系统调 用 Ln x . 核
张 伟 华 .王 海 英 。高 静
(河南 财经政 法 大学成 功 学院 河 南 郑 州 4 10 5 2 0)
【 摘 要 】 本 文 以实例 来详 细描 述 了从 准备 一直 到使 用新 内核 的 Lnx 。 : iu 26内核 编译过 程 , 然后介 绍 了
轻 易地 对它进 行修 改 .使 我们 能够 根据 自己的要 求 度 身 定制 一个更 高效 、 更稳 定 的 内核 。
系统调 用【 用户 进程 与 系统之 间 的接 口, 们在 2 ] 是 它 内核 中实 现 .其 主要 目的是 使得 用户 可 以使 用操 作 系 统提 供 的操作底 层设 备 的功 能 用 户 程序 肯定 要 操作
mv/ o t y tm. p/ o ' y t m. p 2 6 1 .. 5 b / se ma b oJ s e ma - .. 5 10 03 S , S mk n td/ o g n td 2.. 5 10 0 . 6.5 1 ii b r i i - 6 1 . . 5 3 i 2. 1 r mg v / o t rbgu e n ib / u / r b.o f g
linux系统调用流程

linux系统调用流程Linux系统调用流程主要包括以下几个步骤:1. 用户程序发起系统调用:用户程序通过调用C库函数(如read、write等)发起系统调用。
C库函数会将系统调用的参数打包到指定的寄存器中,并通过软中断(int 0x80或sysenter指令)触发一个中断。
2.内核保存现场:当用户程序触发中断后,CPU会从用户态切换到核心态,此时控制权转交给内核。
内核会保存用户程序执行的上下文(即寄存器状态、代码段选择器等),以便系统调用执行完后返回到用户程序继续执行。
3.系统调用处理:内核根据中断向量号找到系统调用处理函数的入口地址,并执行相应的处理代码。
系统调用处理函数根据调用的系统调用号(存储在EAX寄存器中)在系统调用表中查找对应的处理函数。
4.参数传递与验证:系统调用处理函数根据规定的参数个数和顺序,从寄存器或用户程序的堆栈中读取参数。
内核会对参数进行验证,确保用户程序没有越权访问操作系统资源。
5.执行系统调用:系统调用处理函数根据参数的具体内容执行相应的系统调用操作,如打开文件、读写文件、创建进程等。
内核代码会完成对应的系统调用功能,并更新相关的数据和状态。
6.返回结果:系统调用完成后,会将结果存储在指定的寄存器中,如EAX寄存器。
再将保存的用户程序上下文恢复,将控制权从内核返回到用户程序。
用户程序可以通过检查返回值来判断系统调用是否执行成功。
总结:Linux系统调用流程包括用户程序发起系统调用、内核保存现场、系统调用处理、参数传递与验证、执行系统调用和返回结果等步骤。
通过系统调用,用户程序能够获取操作系统提供的服务和资源,实现各种功能。
系统调用流程涉及用户态和核心态的切换,用户程序和内核通过寄存器和堆栈传递参数和返回结果,确保了用户程序与操作系统之间的安全和可靠交互。
两种方法添加系统调用

两种⽅法添加系统调⽤通过修改内核源代码添加系统调⽤通过以上分析linux系统调⽤的过程,将⾃⼰的系统调⽤加到内核中就是⼀件容易的事情。
下⾯介绍⼀个实际的系统调⽤,并把它加到内核中去。
要增加的系统调⽤是:inttestsyscall(),其功能是在控制终端屏幕上显⽰hello world,执⾏成功后返回0。
1编写inttestsyscall()系统调⽤编写⼀个系统调⽤意味着要给内核增加1个函数,将新函数放⼊⽂件kernel/sys.c中。
新函数代码如下:asmlingkage sys_testsyscall(){ console_print("hello world ");return 0;}2连接新的系统调⽤编写了新的系统调⽤过程后,下⼀项任务是使内核的其余部分知道这⼀程序的存在,然后重建包含新的系统调⽤的内核。
为了把新的函数连接到已有的内核中去,需要编辑2个⽂件:1).inculde/asm/unistd.h在这个⽂件中加⼊#define_NR_testsyscall 1912).are/i386/kernel/entry.s这个⽂件⽤来对指针数组初始化,在这个⽂件中增加⼀⾏:.long SYMBOL_NAME(_sys_tsetsycall)将.rept NR_syscalls-190改为NR_SYSCALLS-191,然后重新奖励和运⾏新内核。
3).使⽤新的系统调⽤在保证的C语⾔库中没有新的系统调⽤的程序段,必须⾃⼰建⽴其代码如下#inculde_syscall0(int,testsyscall)main(){tsetsyscall();}在这⾥使⽤了_syscall0()宏指令,宏指令本⾝在程序中将扩展成名为syscall()的函数,它在main()函数内部加以调⽤。
在testsyscall()函数中,预处理程序产⽣所有必要的机器指令代码,包括⽤系统调⽤参数值加载相应的cpu寄存器,然后执⾏int 0x80中断指令。
添加系统调用(模块添加法2.6内核)

添加系统调用(模块添加法fedora10:2.6.27.5内核)
一、为什么要使用内核模块的方式添加系统调用?
⏹编译内核的方式费时间,一般的PC机都要两三个小时。
⏹不方便调试,一旦出现问题前面的工作都前功尽弃。
二、用内核模块的方式实现系统调用有个前提,就是系统必须导出sys_call_table 内核符号,但是在2.6内核和2.4.18以上版本中,sys_call_table不再导出。
也就是说模块中不能再通过简单的extern void *sys_call_table[];来获得系统调用
表地址。
但是,即使内核不导出sys_call_table,也可以在内存中找到它的地址,下面是它的实现方法:
第1步:编写syscall_my.c程序:
pptprogram/syscall/module_syscall/syscall_my.c
第2步:编写Makefie文件
见pptprogram/syscall/module_syscall/Makefile
第3步.执行make命令编译模块
第4步:执行insmod命令插入模块,此时会把自己编写的系统调用插入到系统调用表中。
Ubuntu编译安装Linux内核过程

Ubuntu编译安装Linux内核过程编译安装Linux内核是Ubuntu系统用户进行内核优化、定制和个性化的重要方式之一、本文将介绍Ubuntu编译安装Linux内核的过程,帮助用户完成编译安装。
## 1. 获取Linux内核源代码##2.安装必要的工具和依赖项在编译安装Linux内核之前,需要安装一些必要的工具和依赖项,以确保编译过程的顺利进行。
你可以通过以下命令来安装它们:```sudo apt updatesudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev```##3.解压源代码```tar -xf linux-x.x.x.tar.xz```##4.进入源代码目录进入解压后的源代码目录:```cd linux-x.x.x```##5.配置内核在继续编译之前,需要对内核进行配置。
你可以使用以下命令打开配置窗口:```make menuconfig```这个命令会打开一个文本界面的配置窗口,你可以在其中选择和配置不同的内核选项。
根据你的需求进行自定义配置。
##6.编译内核完成内核配置后,可以执行以下命令来开始编译内核:```make -j4```这个命令中的“-j4”表示使用4个线程进行编译。
你可以根据你的系统硬件配置自定义线程数量。
编译内核的时间会根据你的系统配置和编译选项的不同而有所不同。
请耐心等待编译过程完成。
##7.安装内核完成编译后,可以执行以下命令来安装编译得到的内核:```sudo make modules_install install```这个命令将编译得到的内核模块和内核文件安装到系统中。
安装完成后,你需要更新系统的引导加载程序(grub)以使用新的内核。
##8.更新引导加载程序执行以下命令来更新引导加载程序(grub):```sudo update-grub```这个命令会自动检测并添加新安装的内核到引导菜单中。
linux文件系统的系统调用命令

linux文件系统的系统调用命令Linux文件系统的系统调用命令Linux是一个开源的操作系统,提供了许多强大且灵活的系统调用命令来管理文件系统。
本文将深入探讨Linux文件系统的系统调用命令,包括创建、删除、重命名、复制和移动文件,以及设置文件权限和属性等功能。
一、文件系统简介在Linux系统中,文件系统是指对存储设备的管理和组织。
它使用层次结构来管理文件和目录,允许用户在存储设备上创建、访问和操作文件。
文件系统的目的是提供一种有效和可靠的方式来组织和存储数据。
二、系统调用命令Linux系统提供了一系列的系统调用命令,可以通过调用这些命令来操作文件系统。
1.创建文件创建文件是文件系统中的常见操作。
在Linux中,可以使用open系统调用命令来创建文件。
open命令的语法如下:int open(const char *pathname, int flags, mode_t mode);pathname:指定文件的路径和名称。
flags:指定文件的打开模式,如O_RDONLY(只读)、O_WRONLY (只写)、O_RDWR(读写)等。
mode:指定文件的权限模式。
open命令返回一个文件描述符,以便在后续的操作中引用该文件。
2.删除文件删除文件是通过unlink系统调用命令实现的。
unlink命令的语法如下:int unlink(const char *pathname);pathname:指定要删除的文件的路径和名称。
3.重命名文件重命名文件是通过rename系统调用命令实现的。
rename命令的语法如下:int rename(const char *oldpath, const char *newpath);oldpath:指定要重命名的文件的路径和名称。
newpath:指定重命名后的文件的路径和名称。
4.复制文件复制文件是通过使用read和write系统调用命令实现的。
read命令用于从源文件中读取数据,write命令用于将数据写入目标文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。
(1) 添加源代码
第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个
函数,该函数的名称应该是新的系统调用名称前面加上sys_标志。
假设新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkage int sys_mycall(int number)
{
return number;
}
作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值。
(2) 连接新的系统调用
添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存
在。
为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。
在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要
修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h
该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。
文
件中每一行的格式如下:
#define __NR_name NNN
其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。
应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。
我们的系统调用如下:
#define __NR_mycall 191
系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190。
(在后来的版本中系统调用一般都是插入表中作为倒数第二个调用的。
我使用ubuntu9-10,内核为2.6.33.1实现的)
第二个要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
.long SYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化。
该数组包含指向内核中每个
系统调用的指针。
这样就在数组中增加了新的内核函数的指针。
我们在清单最后添加一行:
.long SYMBOL_NAME(sys_mysyscall)
(3) 重建新的Linux内核
为使新的系统调用生效,需要重建Linux的内核。
这需要以超级用户身份登
录。
#pwd
/usr/src/linux
#
超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。
#make menuconfig
#make dep
#make clearn
#make bzImage
编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:
/usr/src/linux/arch/i386/boot/bzImage
对与(3)在内核为2.4之后的内核制作过程中只要执行以下命令
Make mrproper 清除之前编译留下的文件,如果你是第一次编译就不必要执行Make menuconfig 进行相关的配置,保存退出
Make 制作内核
Make modules_install 安装模块
Make install 安装内核
(4) 用新的内核启动系统
要使用新的系统调用,需要用重建的新内核重新引导系统。
为此,需要修改/etc/lilo.conf文件,在我们的系统中,该文件内容如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/had
首先编辑该文件,添加新的引导内核:image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
添加完毕,该文件内容如下所示:boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/hda
这样,新的内核映象bzImage-new成为缺省的引导内核。
为了使用新的lilo.conf配置文件,还应执行下面的命令:
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
其次配置lilo:
# /sbin/lilo
现在,当重新引导系统时,在boot:提示符后面有三种选择:linux-new 、linux、dos,新内核成为缺省的引导内核。
至此,新的Linux内核已经建立,新添加的系统调用已成为操作系统的一部分,重新启动Linux,用户就可以在应用程序中使用该系统调用了。
(5)使用新的系统调用
在应用程序中使用新添加的系统调用mycall。
同样为实验目的,我们写了一个
简单的例子xtdy.c。
#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d n",mycall(100));
}
编译该程序:
# cc -o xtdy xtdy.c
执行:
# xtdy
结果:
# 100
注意,由于使用了系统调用,编译和执行程序时,用户都应该是超级用户身份。