二.掌握系统调用的实现过程,通过编译内核方法,增加一个新

合集下载

编译内核-新增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和↑键出现开机启动项(如果是真机开机一般会自动出现开机启动项),选择新建的内核版本进入。

编译Linux2.6内核并添加一个系统调用

编译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内核增加一个系统调用一、背景介绍操作系统是计算机硬件与应用程序之间的接口,负责管理和调度计算机系统的各种资源,并提供用户与计算机系统的交互界面。

内核是操作系统的核心部分,负责管理和分配计算机系统的资源,执行各种任务。

系统调用是操作系统提供给应用程序的一种接口,可以让应用程序访问内核提供的功能,例如文件操作、进程管理、网络通信等。

在一些情况下,我们可能需要在LINUX内核中增加新的系统调用,以满足特定的需求。

本文将介绍如何向LINUX内核增加一个系统调用的具体步骤。

二、增加系统调用的步骤1.编写系统调用的具体实现代码首先,我们需要编写一个具体的系统调用的实现代码。

在LINUX内核中,系统调用的实现代码通常位于内核的/syscalls目录下。

我们可以在该目录下新建一个.c文件,编写我们自己的系统调用代码。

2.修改内核源代码3.更新系统调用表每个系统调用都在内核中有一个唯一的标识符,存储在一个叫做系统调用表的地方。

我们需要更新系统调用表,将新增的系统调用添加到表中。

这样,用户程序才能够通过系统调用号来调用新增的系统调用。

4.重新编译内核在修改完内核源代码后,我们需要重新编译内核。

这通常涉及到一些繁琐的步骤,例如配置内核选项、编译内核、安装内核等。

在重新编译内核之后,我们需要重新启动计算机,使新的内核生效。

5.修改用户程序最后,我们需要修改用户程序,以便能够调用新增的系统调用。

用户程序通常是通过C语言编写的,我们可以在用户程序的代码中添加对新增系统调用的调用代码。

三、实验结果在完成上述步骤后,我们就成功地向LINUX内核增加了一个系统调用。

用户程序可以通过系统调用调用自己新增的系统调用,从而实现特定的功能。

总结:本文介绍了向LINUX内核增加一个系统调用的具体步骤,包括编写系统调用的具体实现代码、修改内核源代码、更新系统调用表、重新编译内核和修改用户程序。

在实施这些步骤之前,我们需要对操作系统和内核的相关概念有一定的了解,并具备一定的编程能力。

增加系统调用实验报告(3篇)

增加系统调用实验报告(3篇)

第1篇一、实验目的1. 了解系统调用的基本概念和作用。

2. 掌握在Linux内核中增加系统调用的方法。

3. 熟悉系统调用在用户空间和内核空间之间的交互过程。

4. 提高编程能力和系统理解能力。

二、实验环境1. 操作系统:Linux2. 编译器:gcc3. 开发工具:内核源代码、makefile三、实验原理系统调用是操作系统提供的一种服务,允许用户空间程序请求内核空间的服务。

在Linux内核中,系统调用通过系统调用表来实现。

增加系统调用需要修改内核源代码,并重新编译内核。

四、实验步骤1. 创建系统调用函数首先,我们需要创建一个系统调用函数,该函数将实现一个简单的功能,例如打印一条消息。

以下是一个简单的系统调用函数示例:```cinclude <linux/module.h>include <linux/kernel.h>include <linux/init.h>static int __init hello_init(void) {printk(KERN_INFO "Hello, World!\n");return 0;}static void __exit hello_exit(void) {printk(KERN_INFO "Goodbye, World!\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("A simple system call module");MODULE_VERSION("0.1");```2. 修改系统调用表接下来,我们需要修改内核源代码中的系统调用表,以注册我们创建的系统调用。

计算机操作系统实验指导计算机系统调用

计算机操作系统实验指导计算机系统调用

使用内核编译法添加系统调用
为了验证系统调用是否成功,编写验证代码如下。 #include <stdio.h> #include <linux/kernel.h> #include <sys/syscall.h> #include <unistd.h> int main() { long int a = syscall(三三三); printf("System call sys_helloworld reutrn %ld\n", a); return 0; }
如图地执行结果,我们得到sys_call_table地址:ffffffffabe00一a0 三. 编写Makefile文件,可参考实验指导书地内容。 四. 编译并装入模块 # sudo make //编译 # sudo insmod hello.ko //装入模块 # lsmod //该命令查看所有模块,用以检查hello是否被装入系统 # sudo rmmod hello.ko //卸载模块
三三三 六四 helloworld
sys_helloworld
使用内核编译法添加系统调用
六. 配置内核 # cd /usr/src/linux-四.一六.一0 # sudo make mrproper # sudo make clean # sudo make menuconfig 七. 编译与安装内核(与第七章类似) # sudo make -j八 # sudo make modules -j八 # sudo make modules_install # sudo make install 八. 重启系统 # uname -r 查看此时地内核版本
编译验证代码: # gcc hello.c

Linux系统调用详细全过程

Linux系统调用详细全过程
方法分配和释放内存。
6
系统命令、内核函数
系统调用与系统命令

系统命令相对API来说,更高一层。每个系统命令
都是一个执行程序,如ls命令等。这些命令的实现
调用了系统调用。
系统调用与内核函数


系统调用是用户进入内核的接口层,它本身并非内
核函数,但是它由内核函数实现。
进入内核后,不同的系统调用会找到各自对应的内
常,CPU便被切换到内核态执行内核函
数,转到了系统调用处理程序的入口:
system_call()。
int $0x80指令将用户态的执行模式转变为内
核态,并将控制权交给系统调用过程的起点
system_call()处理函数。
4
system_call()函数
system_cal()检查系统调用号,该号码告诉内核
SYMBOL_NAME(sys_exit)
.long
.longSYMBOL_NAME(sys_read)
SYMBOL_NAME(sys_fork)
.long
.longSYMBOL_NAME(sys_write)
SYMBOL_NAME(sys_read)
.long
.longSYMBOL_NAME(sys_open)
SYMBOL_NAME(sys_write)
.long
.long
…… SYMBOL_NAME(sys_open)
……
……
……
.long
SYMBOL_NAME(sys_getuid)
.long SYMBOL_NAME(sys_getuid)
* 4
+
21
系统调用的返回
当服务例程结束时,system_call( ) 从eax

实验报告增加新的系统调用参考模板

实验报告增加新的系统调用参考模板

操作系统《实验2》实验报告实验项目2:增加新的系统调用学号1209050123 姓名宋玉美课程号实验地点指导教师万少华时间2013.11评语:成绩教师签字万少华线性表链式存储(双向链表)插入、删除运算1、预备知识:Linux内核结构、Linux内核源码、Linux系统调用2、实验目的:增加新的系统调用3、实验内容及要求:(1)增加新的系统调用新增的系统调用名为get_proc_run_time,其功能是根据指定的进程pid,从该进程的进程描述符task_struct结构中提取出它的系统时间stime与用户时间utime (2)编译内核用编译内核的方法,将其增加到内核源码并编译内核(3)程序测试在用户空间编写测试程序测试该系统调用。

程序中调用此系统调用能准确的度量一个程序的时间效率,考虑是否还有别的方法比这更准确的学生信息,参数x, i,j从键盘输入(4)给出程序运行截图。

4、该文档的文件名不要修改,存入<学号><姓名> 命名的文件夹中5、该表中的数据只需填空,已有内容不要修改1.添加系统调用函数,修改文件/usr/src/linux—3.5/kernel/sys.c2. 添加系统调用号,修改文件/arch/x86/systemcalls/syscall_32.tbl3. 添加声明到头文件,修改文件,/include/linux/syscalls.h4. 重新编译内核(前几步只顾着运行忘记截图了,不好意思哈老师~)1)安装ncurses2)make menuconfig3)make dep 确定依赖性4)make clean 清理编译中间文件5)make bzImage 生成新内核6)make modules 生成modules 7)安装modules9)安装内核make install 10)配置grub引导程序13)重启。

重启系统,从grub菜单中选中新内核引导linux。

简述系统调用的实现过程

简述系统调用的实现过程

简述系统调用的实现过程系统调用是操作系统提供给用户程序的一种服务机制,用户程序可以通过系统调用来向操作系统发出请求,以获取需要的服务。

系统调用的实现过程可以分为以下几个步骤:1.客户程序发出系统调用请求:当用户程序需要操作系统提供的项服务时,它会通过指定的接口函数(通常是一个特定的汇编指令或函数调用)向操作系统发出系统调用请求。

这个接口函数通常被包含在操作系统的动态链接库中,用户程序通过加载并调用该库中的函数来实现系统调用。

2.用户程序传递参数:用户程序在发出系统调用请求时,通常需要传递给操作系统一些参数,以指定需要的服务和操作。

这些参数通常被存储在特定的寄存器或栈帧中,并通过调用操作系统的接口函数来传递给操作系统。

3.用户程序切换到内核模式:在进行系统调用时,用户程序需要从用户模式切换到内核模式。

这是因为系统调用需要访问操作系统的内核空间,而用户程序只能访问自己的用户空间。

为了实现这一切换,处理器会通过异常或中断的方式将控制权转移到操作系统的特定处理程序中,使得操作系统可以执行系统调用服务。

4.操作系统处理请求:当操作系统接收到用户程序发出的系统调用请求后,它会根据用户程序提供的参数和请求类型来执行相应的操作。

操作系统会根据请求的性质,执行相应的服务并返回结果。

5.操作系统返回结果给用户程序:在操作系统完成请求的处理后,它会将结果返回给用户程序。

返回结果通常也通过寄存器或栈帧来传递,并通过操作系统的接口函数返回给用户程序。

6.返回用户模式:当操作系统返回结果给用户程序后,用户程序会从内核模式切换回用户模式。

这样用户程序就可以继续执行后续的指令,并对操作系统返回的结果进行处理和使用。

总结起来,系统调用的实现过程包括发出系统调用请求、传递参数、切换到内核模式、操作系统处理请求、返回结果给用户程序以及返回用户模式等步骤。

通过这个过程,用户程序可以利用操作系统提供的服务来完成各种任务。

系统调用是操作系统与用户程序之间的桥梁,它为用户程序提供了一种方便且安全地访问操作系统功能的手段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二.掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。

另编写一个应用程序,调用新增加的系统调用。

(1) 实现的功能是:文件拷贝;
操作步骤:
1。

先在/usr/src/linux-2.4.18-3/kernel/sys.c文件末尾添加mycopy_s.c里的代码。

2。

修改文件 /usr/src/linux-2.4.18-3/include/asm-i386/unistd.h文件在文件中相应位置加上:
#define __NR_mycopy 239
3.修改文件 /usr/src/linux-2.
4.18-3/arch/i386/kernel/entry.S文件
在文件中相应位置加上:
.long SYMBOL_NAME(sys_mycopy)
编译内核:(过程中要先后使用的命令如下,其中后两步操作为非必要,若不执行,则新内核下某些系统功能将无法实现)
make mrproper
make oldconfig
make dep
make clean
make bzImage
make modules
make modules_install
maek install
这几步均成功完成后,新内核已经生成,执行如下步骤:
cp /usr/src/linux-2.4.18-3/arch/i386/boot/bzImage /boot/bzImage-new cp /usr/src/linux-2.4.18-3/System.map /boot/System.map-new
ln –sf /boot/System.map-new /boot/System.map
然后进入 /etc/lilo.conf(本机采用Lilo配置),添加如下代码:
image=/boot/bzImage-new
label=linux-new
root=/dev/hda1 /* hda1为安装linux的分区 */
然后进入 /sbin,运行lilo,完成配置。

重启系统后选择标签为linux-new的新内核进入。

在新内核下测试系统调用,其运行结果如下:
[YAKUZA$root] ls
copy.c test.c
[YAKUZA$root] gcc mycopy_test.c –o mycopy_test
[YAKUZA$root] ls
mycopy_test mycopy_test.c test.c
[YAKUZA$root] cat test.c
#include <stdio.h>
main()
{
printf(“This is a test!!”);
}
[YAKUZA$root] ./mycopy_test test.c test1.c
[YAKUZA$root] ls
mycopy_test mycopy_test.c test.c test1.c
[YAKUZA$root] cat test1.c
#include <stdio.h>
main()
{
printf(“This is a test!!”);
}
(2) 实现的功能是:P、V操作。

1。

在/usr/src/linux-2.4.18-3/kernel/sys.c末尾添加pv_s.c代码:
2。

修改文件 /usr/src/linux-2.4.18-3/include/asm-i386/unistd.h文件在文件相关位置加上:
#define __NR_creatsem 240
#define __NR_deletesem 241
#define __NR_myp 242
#define __NR_myv 243
3.修改文件 /usr/src/linux-2.
4.18-3/arch/i386/kernel/entry.S文件
在文件相关位置加上:
.long SYMBOL_NAME(sys_creatsem)
.long SYMBOL_NAME(sys_deletesem)
.long SYMBOL_NAME(sys_myp)
.long SYMBOL_NAME(sys_myv)
按照上题的方法编译产生新内核,在新内核下测试该系统调用
测试pv操作的程序:
算法思想:
通过创建进程的方法,申请一块共享内存(大小为一个字节),一个进程往里写数据,另外一个进程往外读数据,写数据的进程每往共享内存中写入一个数据后睡眠一段时间,而读数据的进程不采用睡眠机制,观察程序运行结果,如果读数据的进程也会同样跟随写数据进程的睡眠而等待,则说明PV机制得已实现。

运行结果:
[YAKUZA$root] ls
pv_test.c
[YAKUZA$root] gcc pv_test.c -o pv_test
[YAKUZA$root] ./pv_test
Father pid put 0 into memory!
Kid pid get 0 from memory!
Father pid put 1 into memory!
Kid pid get 1 from memory!
Father pid put 2 into memory!
Kid pid get 2 from memory!
Father pid put 3 into memory!
Kid pid get 3 from memory!
Father pid put 4 into memory!
Kid pid get 4 from memory!
Father pid put 5 into memory!
Kid pid get 5 from memory!
Father pid put 6 into memory!
Kid pid get 6 from memory!
Father pid put 7 into memory!
Kid pid get 7 from memory!
Father pid put 8 into memory!
Kid pid get 8 from memory!
Father pid put 9 into memory!
Kid pid get 9 from memory!
The members for the program are:
Shi Xiaolei :2001011830691
Zhang Rui :2001011830689
Xu Faqiang :2001011830690
Yang Yaxi :2001011830705
Li Fengming :2001011830703
调试过程:
本题主要让我们了解了如何在Linux下增加新的系统调用。

首先,Linux下的系统调用函数都有一定的标准格式,并且增加新的系统调用需要修改Linux 中不同地方的几个文件。

开始将系统调用加到内核里面去了以后,运行copy的测试程序时,发现拷贝出了一个空的文件,令人百思不得其解。

后面请教了老师,才知道系统调用时,需要现将用户态下的文件内容拷贝到核态下,再由核态拷贝回用户态下,这其中涉及到段的操作,于是在系统调用函数中加入了段操作的语句,重新编译内核,终于实现了增加新的copy系统调用。

但是,不知为什么PV就是不能实现,编译内核,和测试程序编译是都没有出现错误,就是读写进程不相互等待,输出是先执行完一个进程后再执行另一个进程,开始想不明白为什么,并且发现其他组也遇到类似的问题,在此郁闷了相当长一段时间。

后来与其他组的同学相互协作,查了些相关资料,才发现我们对函数semget ()的理解有误,此函数是建立一个信号灯集,而不是建立一个信号灯,struct sembuf 应该是对应于信号灯集的一个数组,建立信号灯时,需要指定信号灯集重信号灯的个数,再通过数组sembuf的下标对每一个信号灯操作。

根据上述思想修改后,实现了PV功能。

真可谓好事多磨!
体会与心得:
通过这次操作系统课程设计,我收获颇丰:对世界上最优秀的操作系统的内核有了一定了解,加深了对pv操作的理解,知道了怎么写设备驱动;而且增强了克服困难的能力。

刚看到课程设计内容时就懵了,linux根本就不太熟系,而且设备驱动程序从来没看过,感觉无从下手;后来寒假回去看了两本有关linux 方面的书,终于是找到一点头绪了;等到开学经老师讲解后,就有信心了。

但是在编程中还是遇到很多困难,我们大家一起查资料、讨论、分析、交流经验,最后终于搞定了。

相关文档
最新文档