linux-2.6.32.63内核版本增加系统调用过程
编译内核-新增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内核增加一个系统调用

操作系统实验一向LINUX内核增加一个系统调用一、背景介绍操作系统是计算机硬件与应用程序之间的接口,负责管理和调度计算机系统的各种资源,并提供用户与计算机系统的交互界面。
内核是操作系统的核心部分,负责管理和分配计算机系统的资源,执行各种任务。
系统调用是操作系统提供给应用程序的一种接口,可以让应用程序访问内核提供的功能,例如文件操作、进程管理、网络通信等。
在一些情况下,我们可能需要在LINUX内核中增加新的系统调用,以满足特定的需求。
本文将介绍如何向LINUX内核增加一个系统调用的具体步骤。
二、增加系统调用的步骤1.编写系统调用的具体实现代码首先,我们需要编写一个具体的系统调用的实现代码。
在LINUX内核中,系统调用的实现代码通常位于内核的/syscalls目录下。
我们可以在该目录下新建一个.c文件,编写我们自己的系统调用代码。
2.修改内核源代码3.更新系统调用表每个系统调用都在内核中有一个唯一的标识符,存储在一个叫做系统调用表的地方。
我们需要更新系统调用表,将新增的系统调用添加到表中。
这样,用户程序才能够通过系统调用号来调用新增的系统调用。
4.重新编译内核在修改完内核源代码后,我们需要重新编译内核。
这通常涉及到一些繁琐的步骤,例如配置内核选项、编译内核、安装内核等。
在重新编译内核之后,我们需要重新启动计算机,使新的内核生效。
5.修改用户程序最后,我们需要修改用户程序,以便能够调用新增的系统调用。
用户程序通常是通过C语言编写的,我们可以在用户程序的代码中添加对新增系统调用的调用代码。
三、实验结果在完成上述步骤后,我们就成功地向LINUX内核增加了一个系统调用。
用户程序可以通过系统调用调用自己新增的系统调用,从而实现特定的功能。
总结:本文介绍了向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中断指令。
(完整word版)Linux内核中增加一个系统调用

选题要求:在Linux内核中增加一个系统调用,并编写对应的linux应用程序。
利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。
目录一.程序的主要设计思路,实现方式 (1)1.1 添加系统调用的两种方法 (1)1.1.1编译内核法 (1)1.1.2内核模块法 (1)1.2 程序的主要设计思路 (1)1.3 环境 (2)二.程序的模块划分,及对每个模块的说明 (2)2.1 通过内核模块实现添加系统调用 (2)2.1.1修改系统调用的模块 (2)2.1.2获取sys_call_table的地址 (2)2.1.3清除内存区域的写保护 (3)2.2 编写系统调用指定自己的系统调用 (4)2.2.1内核的初始化函数 (4)2.2.2自己的系统调用服务例程 (4)2.2.3移除内核模块时,将原有的系统调用进行还原 (6)2.2.4模块注册相关 (6)2.3 编写用户态的测试程序 (6)2.4 编写Makefile文件 (7)三.所遇到的问题及解决的方法 (8)3.1 进程个数确定 (8)3.2 被更改的系统调用号的选择 (8)3.3 获取系统调用表的地址 (8)3.4 内核和用户态数据交换 (8)四.程序运行结果及使用说明 (8)4.1 将编译出来的内核模块hello.ko加载到内核中 (8)4.2通过dmesg查看输出信息是否正确 (9)4.3运行测试程序,输出树状打印结果(部分结果截图) (9)4.4卸载自定义模块 (10)五.附录 (11)5.1 内核模块程序hello.c (11)5.2 测试程序hello_test.c (14)5.3 Makefile文件 (14)一.程序的主要设计思路,实现方式1.1 添加系统调用的两种方法1.1.1编译内核法编写好源码之后以上准备工作做完之后,然后就要进行编译内核了,以下是编译内核的一个过程1.1.2内核模块法内核模块可以作为独立程序来编译的函数和数据类型的集合。
添加系统调用(模块添加法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命令插入模块,此时会把自己编写的系统调用插入到系统调用表中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1要求
1、不能只是简单的实验步骤,要有过程截图和对过程的分析;
2、要对实验结果进行分析,自己对整个实验的认识;
3、鼓励对实验进行扩展;
例如:添加多个系统调用,多个系统调用之间相互调用;自己添加的系统调用去调用内核自带的系统调用。
4、实验要有创新(加分)!
(实验上交时间另行通知)
注意事项:
由于新版本的linux内核编译过程时间长,因此将linux-2.6.32.63(2.6版本系列过程相同)内核版本添加系统调用过程整理如下;但不同版本内核添加系统调用过程相差很大,修改方法也不近相同,请同学们注意;大家可以尝试安装其它版本的内核,研究如何去实现添加过程。
(linux-2.6.32.63)此版本需要32位Ubuntu操作系统
1、下载linux-2.6.32.63版本内核,解压到usr/src目录下;
2、配置、编译、安装内核;
注意:高版本的Ubuntu会自动生成initrd.img-2.6.32.63文件;如果没有生成initrd.img-2.6.32.63文件,就就执行下面的命令手动生成initrd.img-2.6.32.63;
#mkinitramfs -o /boot/initrd.img-2.6.32.63
3、修改/boot/grub/grub.cfg文件,添加内核选项或着输入命令:update-grub更新grub.cfg文件;
注意:高版本的Ubuntu会自动更新grub.cfg文件,如果不能更新,就手动更新;
4、重启系统,选择linux-2.6.32.63内核进入系统;
5、添加系统调用函数:
在usr/src/linux-2.6.32.63/arch/x86/kernel/sys_i386_32.c文件中添加函数
6、添加系统调用号:
在usr/src/linux-2.6.32.63/arch/x86/include/unistd_32.h文件
在usr/src/linux-2.6.32.63/arch/x86/kernel/sys_table_32.S文件
9、编写测试程序(例如test.c)
10、测试系统调用
输入命令:#gcc test.c -o test (编译)
#./test(执行)
#dmesg(显示结果)。