linux0.11系统调用原理及实验总结

char N_MAX[26];
int sys_whoami(char* name, unsigned int size)
{
if(strlen(N_MAX)>size)
return -EINVAL;
int i;
for(i=0;N_MAX[i]!='\0';i++)
{
put_fs_byte(N_MAX[i],&name[i]);
那么下面就说这个宏干了什么,也就是说上面的那个“调用过程”是怎么样的呢?在这个宏中嵌入了汇编代码,做的工作就是int 0x80,其中将字符串“_NR_”和name连接,组成一个宏并将这个宏的值,也就是被调用的系统函数在sys_call_table中偏移量送到eax寄存器中;同时指明系统函数将来的返回值放到eax中。
}
return strlen(N_MAX);
}
int sys_iam(char *name)
{
char c;
char str[100];
memset(str,'\0',sizeof(str));
int i;
for(i = 0; i <= MAX; i++)
{
if((c=get_fs_byte(&name[i]))!='\0')
addr = &system_call = 0x7119通过查找system.map可以查到中断处理程序的地址
*/
#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
"movw %0,%%dx\n\t" \
#define _syscall1(type,name,atype,a) \
type name__res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(a))); \
"movw %0,%%dx\n\t"
字操作16位操作,操作低16位,
高16位已经有调用函数的地址.
"movl %%eax,%1\n\t"
双字操作,为门的0--31位赋值
"movl %%edx,%2\n\t"
双字操作,为门的32--63位赋值
3.2以_syscall1为例,分析系统调用入口宏的含义。
其中_syscall1是一个宏,在include/unistd.h中定义。将_syscall1(int,close,int,fd)进行宏展开,可以得到:
调用接口宏含义说明:
它先将宏__NR_##name存入EAX,将参数fd存入EBX,然后进行0x80中断调用。调用返回后,从EAX取出返回值,存入__res,再通过对__res的判断决定传给API的调用者什么样的返回值。__NR_##name就是系统调用的编号,在include/unistd.h中定义;在上面的例子中,我们添加了两个自己的系统调用接口,如下:
printf("a=%d", a);
a = whoami(cc,8);
printf("iam=%s\n",cc);
return(1);
}
3系统调用相关代码的分析
3.1初始化软件中断门。
3.1.1函数调用层次
初始化软件中断门,就是把0x80软件中断的处理函数system_call挂载到中断向量表idt中,以确保发生软件中断时会运行system_call函数,这个函数在system_call.s实现。初始化的流程如下:
"d" ((char *) (addr)),"a" (0x00080000))
3.1.3分析初始化宏_set_gate的实现
__asm__格式为嵌入式汇编的格式,分析可知代码有5个传入的参数%0,%1,%2,%3,%4如下:
%0,立即数
"i" ((short) (0x8000+(dpl<<13)+(type<<8)))
{
str[i] = c;
}
else
break;
}
if((c != '\0') ||(i>MAX))
{
return -EINVAL;
}
memset(N_MAX,'\0',sizeof(N_MAX));
for(i=0;str[i]!='\0';i++)
{
N_MAX[i]=str[i];
}
return i;
#define __NR_iam73
int whoami(void);
intaim(void);
2.2.2在exit.c文件中添加系统调用处理函数的实现
系统调用的函数可以在其他.c文件中添加或在新建文件中添加,只要编辑进image都是可以的,这里为了调试方便就在exit.c文件中添加了。
#define MAX 23
完成的功能是将字符串参数name的内容拷贝到内核中保存下来。要求name的长度不能超过23个字符。返回值是拷贝的字符数。如果name的字符个数超过了23,则返回“-1”,并置errno为EINVAL。
第二个系统调用是whoami(),其原型为:
int whoami(char* name, unsigned int size);
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
}
传入参数说明:
其中type表示系统调用的返回值类型,name表示该系统调用的名称,atype、a分别表示第1个参数的类型和名称;可以有n个系统调用的传入参数,它们的数目和_syscall后面的数字一样大。
#define __NR_whoami72
#define __NR_iam73
3.3对_system_call函数的分析
处理流程图
处理流程分析
_system_call:
cmpl $nr_system_calls-1,%eax #调用号如果超出范围的话就在eax中置-1并退出。
ja bad_sys_call
所以,系统调用过程是这样的:
应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回。
另外一种访问内核的方式是直接添加一个系统调用,供自己的应用程序使用,这样就不再使用库函数了,变得更为直接,效率也会更高。
1.2相关的数据结构
在说具体的调用过程之前,这里先要说几个数据结构。
_syscall1(int,iam,char*,name)
_syscall2(int,whoami,char*,name, unsigned int,size)
int main()
{
int a = 0;
char bb[26] = "champion";
char cc[26] = "";
a = iam(bb);
L
1系统调用的原理
1.1概述
系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。
1.2.3系统调用宏
系统调用宏_syscalln(type,name)在内核的unistd.h文件中定义的,对它展开就是:
type name(参数列表)
{
调用过程;
};
其中,n为参数个数,type为函数返回值类型,name为所要调用的系统函数的名字。在unistd.h中共定义了4个这样的宏(n从0到3),也就是说,0.11核中系统调用最多可带3个参数。
它将内核中由iam()保存的名字拷贝到name指向的用户地址空间中,同时确保不会对name越界访存(name的大小由size说明)。返回值是拷贝的字符数。如果size小于需要的空间,则返回“-1”,并置errno为EINVAL。
2.2代码添加修改步骤
2.2.1在unistd.h中添加系统调用接口
#define __NR_whoami72
1.3系统调用处理过程
下面我再说一下系统调用的核心软中断int 0x80具体干了什么。这条指令会引起CPU的软件中断,cpu会根据中断号找到中断处理程序。这个中断处理程序是在System_call.s中。在中断处理程序的工作过程大致是这样的:
1.3.1将寄存器ds,es,fs以及存有参数的edx,ecx,ebx入栈,再ds,es,指向内核段,fs指向用户段。
1.2.1系统调用函数表
系统调用函数表sys_call_table是在sys.h中定义的,它是一个函数指针数组,每个元素是一个函数指针,它的值是各个系统提供的供上层调用的系统函数的入口地址。也就是说通过查询这个表就可以调用软中断0x80所有的系统函数处理函数。
1.2.2函数指针偏移宏
这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。
合集下载

试述系统调用的实现原理,并写出系统调用的处理逻辑。

试述系统调用的实现原理,并写出系统调用的处理逻辑。

试述系统调用的实现原理,并写出系统调用的处理逻辑。

系统调用是操作系统提供给用户程序的一种接口,用于访问操作系统的功能和资源。

系统调用的实现原理可以分为以下几个步骤:
1. 用户程序发起系统调用请求:用户程序通过指令或软中断等方式向操作系统发起系统调用请求。

请求包括系统调用号、参数和返回值等信息。

2. 保存用户程序的上下文:操作系统会保存用户程序的上下文,包括程序计数器、寄存器状态等,以便在系统调用执行完成后恢复用户程序的执行。

3. 切换到内核模式:操作系统将处理器从用户模式切换到内核模式,以便能够执行操作系统的特权指令和访问受保护的资源。

4. 执行系统调用服务例程:根据系统调用号,操作系统会调用相应的系统调用服务例程。

系统调用服务例程是操作系统中实现具体功能的代码段,负责执行用户程序请求的功能。

5. 参数传递和处理:系统调用服务例程会获取用户程序传递的参数,并进行必要的处理。

参数可以通过寄存器、堆栈、内存等方式传递。

6. 执行相应操作:系统调用服务例程根据参数和具体需求执行相应的操作,可能涉及到对操作系统内部资源的访问、数据的读写等操作。

7. 返回结果和恢复上下文:系统调用服务例程执行完毕后,将结果返回给用户程序。

操作系统会根据具体实现的方式将结果传递给用户程序,并恢复用户程序的上下文。

8. 切换回用户模式:操作系统将处理器从内核模式切换回用户模式,以便用户程序继续执行。

系统调用的处理逻辑可以概括为用户程序发起请求、操作系统切换到内核模式、执行系统调用服务例程、返回结果和恢复上下文、切换回用户模式。

具体的操作和实现方式依赖于不同的操作系统和处理器架构。

增加系统调用实验报告(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. 修改系统调用表接下来,我们需要修改内核源代码中的系统调用表,以注册我们创建的系统调用。

Linux 系统调用实现机制实验报告-内核安装详解

Linux 系统调用实现机制实验报告-内核安装详解

Linux系统调用实现机制实验报告实验目的:熟悉Linux系统调用过程,掌握系统调用的基本原理并在实验中实现系统调用的添加。

实验所需软件:实验平台:VMware WorkStation;系统环境:Red Hat Linux9.0;传输工具:Ftp server(Serv USetup);实验过程:一、实验环境的搭建(一)在Window下安装虚拟机VMware WorkStation;(二)在虚拟机上安装Red Hat 9.0系统;(三)在Window下安装Ftp Server,实现Linux与windows文件共享。

1. Ftp服务器的配置打开Ftp Server,在[管理控制台]中选择[新建域],系统会弹出配置域向导的对话框,这里按要求填入相应信息,即可配置成功一个ftp服务器。

步骤1要求用户填入域的[名称]和[说明],[名称]必须填写,[说明]可以不填。

例如:在名称中输入[Linux实验],选择[下一步],便进入到域向导的步骤2。

步骤2是服务器访问协议和端口的配置,默认即可,点击[下一步]进入步骤3。

步骤3是IP地址的配置,输入Windows主机的IP地址(202.112.147.176)。

确认无误后,点击[完成]。

接下来要做的就是为域添加用户,根据添加用户向导,逐个填写[用户名],[密码],[根目录(即共享的文件目录)]以及[访问权限]。

本次实验的配置为:tml(用户名),密码为空,E:\安全操作系统\实验材料(存放config-2.4.18forMP.txt和linux-2.4.18.tar.gz的目录),完全访问(访问权限)。

到此,服务器的配置已经完成。

2. 在Linux下访问服务器,并下载文件启动VMware中的Red Hat9.0系统,打开终端控制台,进入到/home/tml 目录下(接下来就是要把Ftp服务器的共享文件下载到此目录下)。

1) 通过命令ifconfig 设置虚拟机IP 地址,具体为在命令行中输入:ifconfig eth0 202.112.147.175(与服务器同一个段);2) 接下来便可访问ftp服务器,在linux命令行下输入:ftp202.112.147.176;3) 服务器询问你用户名和口令,分别输入tml(密码为空)待认证通过即可;用get命令下载文件,get config-2.4.18forMP.txt config-2.4.18forMP.txt (下载文件config-2.4.18 for MP.txt到/home/tml目录),getlinux-2.4.18.tar.gz linux-2.4.18.tar.gz 。

实验一 操作系统系统调用 实验报告

实验一 操作系统系统调用 实验报告

Linux系统调用实验报告一、实验目的深入理解操作系统是虚拟机二、实验方法利用UNIX/LINUX所提供的系统调用来编写C语言程序,程序中要体现出一些典型的系统调用(函数)三、实验任务编写一个C语言程序,该程序将一个存放了一系列整数的文本文件进行排序,每个整数占据文件的一行,排序的结果存放到一个新的文件之中。

源文件和目标文件的文件名由命令行输入。

例如:假设可执行文件的文件名是sort,源文件与目标文件的名字分别是data和newdata,那么命令行的情形为如下所示内容:./sort data newdata四、实验要点命令行参数传递、系统调用的使用五、实验内容5.1 命令行参数传递C语言标准规定,C语言程序的入口函数(main 函数)的定义如下:int main(int argc, char** args)其中,argc 表示args这个指针数组元素的数量,而args则储存程序的命令行参数,其中,args[0]储存着可执行文件的文件名,args[1]储存第一个命令行参数,如此类推。

以在命令行中输入./sort data newdata 为例,args[0]的值为“./sort”,args[1]的值为”data”,args[2]的值为”newdata”。

5.2 打开文件在操作系统中,需要对一个文件进行读写操作前需要打开文件。

open这个系统调用的作用就是打开指定的文件,并返回一个文件描述符。

通过这个文件描述符可以对文件进行读写操作。

open系统调用的定义如下:int open(const char* pathname, int flags)int open(const char* pathname, int flags, mode_t mode)其中,pathname是要打开文件的路径,flags参数指定文件打开的方式,这个参数可以通过多个常数的位或运算传递多种的方式,其中包括只读(O_RDONLY),只写(O_WRONLY),读写(O_RDWR),创建文件(O_CREAT),追加方式打开(O_APPEND);当使用O_CREAT方式打开文件时,可以通过一个额外的mode参数来控制所创建文件的权限。

系统调用知识点总结

系统调用知识点总结

系统调用知识点总结一、系统调用的概念系统调用是操作系统内核提供给用户程序的接口,用于访问操作系统内核提供的服务和资源。

操作系统提供了各种系统调用,包括文件操作、进程管理、网络通信、内存管理、设备管理等。

用户程序通过系统调用可以向操作系统请求服务,比如打开文件、创建进程、发送网络数据等。

系统调用是用户程序和操作系统内核之间的桥梁,它为用户程序提供了访问操作系统内核功能的途径。

二、系统调用的实现原理系统调用的实现原理涉及到用户态和内核态的切换。

当用户程序执行系统调用时,会触发处理器从用户态切换到内核态,然后执行相应的内核代码。

在Linux系统中,系统调用的实现原理一般包括以下几个步骤:1. 用户程序通过系统调用指令(比如int 0x80或syscall指令)发起系统调用请求。

2. 处理器从用户态切换到内核态,执行相应的内核代码。

3. 内核根据系统调用号(syscall number)找到相应的系统调用处理函数。

4. 内核执行系统调用处理函数,完成相应的操作。

5. 内核将处理结果返回给用户程序,然后从内核态切换回用户态。

三、系统调用的调用方式系统调用的调用方式包括直接调用、库函数封装和系统命令等。

用户程序可以通过直接调用系统调用指令来执行系统调用,也可以通过库函数封装的方式来调用系统调用,比如C 标准库中的文件操作函数(如open、read、write等)就是封装了系统调用的库函数,用户程序可以直接调用这些库函数来进行文件操作。

此外,用户程序还可以通过系统命令来触发系统调用,比如在命令行中使用cat命令来读取文件就是通过系统命令来触发系统调用。

四、常用系统调用常用系统调用包括文件操作、进程管理、网络通信、内存管理、设备管理等。

在Linux系统中,常见的系统调用包括:1. 文件操作系统调用:open、read、write、close、lseek等。

2. 进程管理系统调用:fork、exec、wait、exit等。

linux0.11系统调用原理及实验总结

linux0.11系统调用原理及实验总结

linux0.11系统调用原理及实验总结第一篇:linux0.11系统调用原理及实验总结Linux0.11系统调用原理及实验总结系统调用的原理1.1 概述系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。

通过int 0x80,就可使用内核资源。

不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。

所以,系统调用过程是这样的:应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回。

另外一种访问内核的方式是直接添加一个系统调用,供自己的应用程序使用,这样就不再使用库函数了,变得更为直接,效率也会更高。

1.2 相关的数据结构在说具体的调用过程之前,这里先要说几个数据结构。

1.2.1 系统调用函数表系统调用函数表sys_call_table是在sys.h中定义的,它是一个函数指针数组,每个元素是一个函数指针,它的值是各个系统提供的供上层调用的系统函数的入口地址。

也就是说通过查询这个表就可以调用软中断0x80所有的系统函数处理函数。

1.2.2 函数指针偏移宏这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。

1.2.3 系统调用宏系统调用宏_syscalln(type,name)在内核的unistd.h文件中定义的,对它展开就是: type name(参数列表){ 调用过程; };其中,n为参数个数,type为函数返回值类型,name为所要调用的系统函数的名字。

在unistd.h中共定义了4个这样的宏(n从0到3),也就是说,0.11核中系统调用最多可带3个参数。

linux0.11内核学习--main.c,调用函数而已。

linux0.11内核学习--main.c,调⽤函数⽽已。

到了main.c,其实main.c中的⼤部分的内容是调⽤函数来实现初始化的⼯作,但是还是将它看完了。

下⾯就是代码了。

主要参考的是linux内核完全注释,在⼀些不太明⽩的地⽅,参考⽹上的介绍。

废话少说。

还有很长的路啊。

努⼒啊O(∩_∩)O~。

/** main.c功能描述。

*///main.c程序的主要功能是利⽤setup.s程序取得的系统参数设置系统的// 的根⽂件设备号和⼀些全局变量。

这些变量⾄两名了内存的开始地址// 系统包含的内存容量和作为⾼速缓存区内存末端地址。

如果还定义了// 虚拟盘,则主存将会相应的减少。

整个内存的镜像如下 ://// -------------------------------------------// | kernel | buffer | ramdisk | main memory |// -------------------------------------------//// ⾼速缓存部分还要扣除显存和rom bios占⽤的部分。

⾼速缓冲区主要// 是磁盘等设备的临时存放数据的场所。

主存的区域主要是由内存管理// 模块mm通过分页机制进⾏内存的管理分配,以4k字节为⼀个页单位。

// 内核程序可以直接访问⾃由的⾼速缓冲区,但是对于页⾯的访问,则// 需要通过mm模块才能实现将其分配到内存页⾯。

//// 然后内核进⾏所有⽅⾯的硬件初始化⼯作。

设置陷阱门,块设备,字符设备// 和tty,包括⼈⼯创建的第⼀个任务task 0.待所有的设置⼯作完成时,开启// 中断。

在阅读这些初始化程序时最好跟着这些被调⽤函数深⼊看下去。

//// 整个内核的初始化完成后,内核将执⾏权限切换到⽤户模式,即是cpu从// 0特权级切换到3特权级。

然后系统第⼀次调⽤函数fork,创建出第⼀个⽤于// 运⾏的init⼦程序。

//// 在该进程中系统将运⾏控制台程序。

Linux系统调用与ptrace分析(实验报告)_[文档在线提供]

Linux系统调用与ptrace分析概述1.Linux的系统结构在Linux系统结构中,最核心的是计算机硬件,它提供对Linux软件的支持,靠近硬件的内层是Linux内核程序(即操作系统)。

内核直接和硬件打交道是程序和硬件之间的接口或界面。

它对一切外层程序提供公共服务,把外部程序同硬件隔离开。

内核程序大致可分为文件系统管理,进程管理,内存管理等几部分。

进程管理又分为低级进程管理和高级进程管理。

低级进程管理主要包括:进程调度分配,控制占用处理器的程序和基本的进程通信。

高级进程管理主要包括:进程的创建,终止,进程间通信,进程在内存和外存之间的转储,信号机构和进程间跟踪控制等。

内核程序的外层是实用程序,内核提供对实用程序的支持,两层之间的界面是系统调用。

内核外的实用程序通过系统调用来和内核打交道。

实现的过程是通过一种特殊的指令(陷入指令)进入内核,然后转入相应的系统调用处理程序。

这也是本文将主要讨论的问题。

2.80386体系结构80386的体系结构承认两类事件。

1.异常(exceptions)2.中断(interrupts)他们两都会引起“上下文转换”同时建立一个过程或任务,中断可以随时随地发生(包括在执行程序时)所以用来响应硬件信号。

而异常则由指令内部错误引起。

每一个异常或中断都有一个唯一的标识符,在linux中被称为向量。

指令内部异常和NMI(不可屏蔽中断)的中断向量的范围从0—31。

32-255的任何向量都可以用做1.可屏蔽中断2.编程(调试)异常至于可屏蔽中断则取决于该系统的硬件配置。

外部中断控制器在中断响应周期把中断向量放到总线上。

3.Linux系统调用流程概述L inux系统调用的流程非常简单,它由0x80号中断进入系统调用入口,通过使用系统调用表保存系统调用服务函数的入口地址来实现,本文首先分析一般Linux系统调用的流程,然后再分析Linux系统调用sys_ptrace().一. Linux系统调用的流程分析1.1设定0x80号中断系统启动后,先进行初始化,其中一部分重要的工作在start_kernel()函数(main.c中定义)中进行,在该函数中先做必要的初始化工作(setup_arch()与paging_init()),各种trap入口就在该函数中通过调用trap_init()(traps.c)被设置,其中与系统调用有关的是:set_system_gate(0x80,&system_call);“set_system_gate()”是一宏,它在“system.h”中被定义:#define set_system_gate(n,addr) \_set_gate(&idt[n],15,3,addr)……中断描述表结构(head.s)其中“_set_gate()”也是在该文件中定义的宏:#define _set_gate(gate_addr,type,dpl,addr) \__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \"movw %2,%%dx\n\t" \"movl %%eax,%0\n\t" \"movl %%edx,%1" \:"=m" (*((long *) (gate_addr))), \"=m" (*(1+(long *) (gate_addr))) \:"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \"d" ((char *) (addr)),"a" (KERNEL_CS << 16) \:"ax","dx")调用该宏,将使addr地址值置入gate_addr中的地址值所指向的内存单元中,以上过程,使中断向量描述表中的第128项(16进制第80项)保存了0x80号中断的中断服务程序,即system_call。

操作系统原理-实验-linux增加系统调用

中国地质大学(武汉)《操作系统原理》课程实验报告数据科学与大数据技术专业班级195182学生姓名钟欢任课教师康晓军完成时间2020年3月31日实验一——实现一个linux的系统调用一、实验目的1.加深对系统调用的理解,掌握增加与调用系统调用的方法。

2.掌握内核编译方法。

二、实验思路1.增加新的系统调用:新增的系统调用名为Hello,其功能是打印输出“This is ZhongHuan ’ s system call ! wo zhong yu cheng gong le !”2.编译内核:用编译内核的方法,将其增加进内核源码并编译内核。

3.测试:在用户控件编写测试程序测试该系统调用。

三、实验步骤1.系统调用的添加在Linux中添加新的系统调用,需执行多个步骤才能添加成功:(1)第一步完成系统调用函数在内核源码目录kernel/sys.c文件中编写待添加的系统调用函数。

该函数的名称应该是新的系统调用名称前面加上sys_标志。

新加的系统调用为hello(void),在kernel/sys.c文件中添加源代码:asmlinkage long sys_hello(void){printk("This is ZhongHuan&apos;s system call! wo zhong yu cheng gong le!");return 1;}(2)第二步在系统函数表中表项添加新的系统调用后,需要让Linux内核的其余部分知晓该程序的存在。

在内核源码目录arch/x86/entry/syscalls下修改文件syscall_64.tbl。

该文件用来对sys_call_table[]数组实行原始化,数组包含指向内核中每个系统调用的指针。

在该文件中的最后一行添加自己的系统调用表项:335 64 hello sys_hello(),这样就在数组中添加了新的内核函数指针。

(3)第三步添加系统调用号在内核源码目录arch/x86/include/asm下修改头文件unistd_32.h。

操作系统实验报告Linux下的系统调用

操作系统实验报告----- Linux下的系统调用计算机10-4 赵俊楠10081407实验目的:实现多个系统调用实验实验内容:添加简单系统调用、添加随机抽牌系统调、用模块添加系统调用实验步骤:(我是将三个系统调用添加完毕后一起编译的)1.在usr/src/linux-2.4/include/asm i386/unistd.h中添加#define __NR_print_info 259和#define __NR_rank 2602.在usr/src/linux-2.4/arch/i386/kernel/entry.S中添加.long SYMBOL_NAME(sys_print_info)和.long SYMBOL_NAME(sys_rank);3.在usr/src/linux-2.4/kernel中添加asmlinkage int sys_rank(int value,int suit){if (value==1) return (int)(4*13+suit);else return (int)(4*(value-1)+suit);};和asmlinkage int sys_print_info(int testflag){printk(KERN_EMERG " It's my syscall function!\n");return 0;}4.在usr/src/linux-2.4/kernel/ksyms中添加#ifndef __mips__EXPORT_SYMBOL(sys_call_table);#endif至此,三个实验的系统调用添加完毕下面开始编译内核。

5.make cleanmake mrpropermake oldconfigmake depmake bzImagemake modulesmake modules_installmake install在添加系统调用时候一定要专心、仔细,否则在编译的时候会出现错误,改起来很麻烦!!6.重启Linux后,显示界面如下(没有改内核版本号)7.进入新内核后不要忘了将#define __NR_print_info 259和#define __NR_rank260添加到中8.然后编写三个测试程序分别测试新的系统调用结果如下图:关于test_print_info关于card关于call和test_call实验总结:本次实验的内容涉及到Linux的系统调用。

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