当前位置:文档之家› 实验1 增加新的系统调用

实验1 增加新的系统调用

间的接口。 内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用 (system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调 用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。系统调 用运行在内核态,是用户态进入内核态的唯一入口。
2014-11-14
系统调用分类
。。。。。。。。。。。。。
2014-11-14
编译安装内核
# make modules_install(安装模块)
。。。。。。。。。。。。。。。。
2014-11-14
编译安装内核
#make install(安装内核)
。。。。。。。。。。。。
2014-11-14
系统调用的名字
• 系统调用的名字,比如mysyscall。一旦这个名字确定,那么在系 统调用中几个相关的名字也就确定了。 • 系统调用编号:#define __NR_name NNN (name为系统调用名称,NNN为系统调用对应的号码) 例如: #define __NR_mysyscall 338 • 内核中系统调用的实现程序的函数名字:sys_mysyscall
2014-11-14
添加系统调用函数
• 在内核源码目录(linux-3.17.1)kernel下修改sys.c文件
asmlinkage long sys_mysyscall(int num) { printk("This is my system calling."); return num ; }
2014-11-14
配置内核
• 在usr/src下的内核源码目录(linux-3.17.1)下,输入如下命令: # make menuconfig(需要安装ncurses)
2014-11-14
编译安装内核
• 在usr/src下的内核源码目录(linux-3.17.1)下,输入如下命令: # make (编译内核)
2014-11-14
实验要求
• 按照要求完成实验,写出实验报告。 • 自定义新的系统调用,添加到内核。 • 分析系统调用与库函数之间的区别。 • 完成实验报告,按时提交。
ቤተ መጻሕፍቲ ባይዱ
实验1 增加新的系统调用
目录
实验基础知识介绍
• 系统调用概念 • 系统调用分类 • 系统调用实现
实验目的 实验内容和步骤 实验要求
2014-11-14
系统调用概念
由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接
口(Application Programming Interface,API)。系统调用是应用程序同系统之
2014-11-14
系统调用实现
Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数。 操作系 统实现系统调用的基本过程是:
• • • • • • 应用程序调用库函数(API); API将系统调用号存入EAX,然后通过中断调用使系统进入内核态; 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用); 系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数; 中断处理函数返回到API中; API将EAX返回给应用程序。
Linux操作系统中系统调用分类:
• • • • • • • • • 进程管理,如fork(), clone(), execve(), exit()等。 进程通信,如signal(), msgctl(), pipe()等。 控制硬件,如open(), read(), write()等。 设置系统状态或读取内核信息,如getpid(), getpriority(), setpriority()等。 内存管理,如brk(), mmap(), mlock()等。 系统控制 网络管理 socket控制 用户管理
实验内容
•下载、解压内核 •配置内核 •编译安装内核 •添加系统调用函数 •添加系统调用号 •声明 •测试新的系统调用
下载、解压内核
• 下载内核 在官网:/下载linux内核, 完成后, 将下载文件放入 /usr/src/目录下 • 解压内核 将下载的文件解压缩, 在 /usr/src/目录下, 输入如下命令: # xz -d linux-3.17.1.tar.xz # tar -xvf linux-3.17.1.tar 解压后的文件夹名为:linux-3.17.1
2014-11-14
声明
• 在在内核源码目录(linux-3.17.1)include/linux下修改文件 syscalls.h文件。 文件中加入如下代码: asmlinkage long sys_mysyscall(int num);
2014-11-14
测试新的系统调用
• 编写测试程序(test.c) #include <unistd.h> #include <stdio.h> int main() { syscall(380,1); return 1; } • 执行如下命令查看结果 # cc -o xtdy test.c # cc -o xtdy tese.c
应用程序调用系统调用的过程是:
• 把系统调用的编号存入EAX • 把函数参数存入其它通用寄存器 • 触发0x80号中断(int 0x80)
2014-11-14
实验目的
阅读Linux内核源代码,通过添加一个简单的系统调用实验,进
一步理解Linux操作系统处理系统调用的统一流程。
掌握Linux内核编译方法
2014-11-14
添加系统调用号
• 在内核源码目录arch/x86/include/asm下修改文件unistd.h,在 unistd.h中添加系统调用号,格式为: #define __NR_name NNN • (name为系统调用名称,NNN为系统调用对应的号码) 例如: #define __NR_mysyscall 380 • 然后修改系统中所用的系统调用总数 #define __NR_syscalls 381
2014-11-14
配置内核
• 安装ncurses-5.9: 下载ncurses-5.9.tar.gz文件,并解压 # tar zxvf ncurses-5.9.tar.gz (解压) #cd ncurses-5.9(当前目录) #./configure(检查) #make (编译) #make install(安装)
相关主题