收藏 分享(赏)

系统功能调用实验.doc

上传人:精品资料 文档编号:11090122 上传时间:2020-02-06 格式:DOC 页数:6 大小:1.30MB
下载 相关 举报
系统功能调用实验.doc_第1页
第1页 / 共6页
系统功能调用实验.doc_第2页
第2页 / 共6页
系统功能调用实验.doc_第3页
第3页 / 共6页
系统功能调用实验.doc_第4页
第4页 / 共6页
系统功能调用实验.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、西安电子科技大学计算机学院实验报告题目: Linux 系统调用的实现 班级: 姓名: 学号: 西安电子科技大学操作系统原理实验报告一、理论分析1.系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用的存在,有以下重要的意义:用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,从而大大简化了用户程序的开发。比如:用户程序通过 write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上;系统调用使得用户程序有更好的可移植性。只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,从一个系统迁移到另

2、一个操作系统;系统调用使得内核能更好的管理用户程序,增强了系统的稳定性。因为系统调用是内核实现的,内核通过系统调用来控制开放什么功能及什么权限给用户程序。这样可以避免用户程序不正确的使用硬件设备,从而造成破坏;系统调用有效的分离了用户程序和内核的开发。用户程序只需关心系统调用API,通过这些 API 来开发自己的应用,不用关心 API 的具体实现。内核则只要关心系统调用 API 的实现,而不必管它们是被如何调用的。简言之,用户程序,系统调用,内核,硬件设备的调用关系如下图: 2.Linux 系统调用基本原理:对于 Linux 系统调用的理解我们需要清楚以下两点: l 系统调用的函数名称转换;

3、l 系统调用的参数传递。 首先看第一个问题。实际上,Linux 西安电子科技大学操作系统原理实验报告中每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表sys_call_table,表中的元素是系统 调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。在 x86 上,系统调用号是通过 eax 寄存器传递给内核的。 通知内核的机制靠软件中断实现。首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号。参数设置完成后,程序执行“系统调用”指 令。x86 系统上的软中断由 int 0x80 产生。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器切换到内核

4、态并跳转到一个新的地址,并开始执行那里的异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。它与硬件体系结构紧密相关。新地址的指令会保存程序的状态,计算出应该调 用哪个系统调用,调用内核中实现那个系统调用的函数。 从系统分析的角度,Linux 的系统调用涉及 3 个方面的问题。 (1)响应函数 sys_xxx 响应函数名以“sys_”开头,后跟该系统调用的名字。 例如:系统调用 fork()的响应函数是 sys_fork()。 (2)系统调用表与系统调用号:数组与下标 文件 include/asm/unisted.h 为每个系统调用规定了唯一的编号。 系统调用表 sys_call_ta

5、ble 记录了各 sys_name 函数在表中的位置。有了这张表,就很容易根据特定系统调用在表中的偏移量,找到对应的系统调用响应函 数的入口地址。 系统调用号相当关键,一旦分配就不能再有任何变更,否则编译好的应用 程序就会崩溃。Linux 有一个“未实现”系统调用 sys_ni_syscall(),它除了返回 ENOSYS 外不做任何其他工作,这个错误号就是专门针对无效的系统调用而设 的。 (3)int 0x80 中断过程 宏定义_syscallN()(见 include/asm/unisted.h)用于系统调用的格式转换和参 数的传递。N 取 05 之间的整数。参数个数为 N 的系统调用由_

6、syscallN()负责 格式转换和参数传递。系统调用号放入 eax 寄存器,启动 int 0x80 后,规定返 回值送 eax 寄存器。西安电子科技大学操作系统原理实验报告二、设计与实现(1)内核源代码的下载:使用命令下载 #apt-get install linux-source,下载的源码在/usr/src/目录下。解压缩:下载的源码为 bz2 格式的压缩包,因此需要首先进行解码。 #tar -xjvf 压缩包名(2)代码的修改:添加一个系统功能调用,需要修改如下几处代码: 1)打开/usr/src/linux-source-3.2.0/kernel/sys.c 在后添加我自己定义的函数

7、,如下: 2)打开/usr/src/linux-source-3.2.0/arch/x86/kernel/syscall_table_32.S 添加一行,并记住其位置(编号)。 .long sys_mycall 使用 223 号,因为这个调用号目前已被废弃。 如下:3)打开/usr/src/linux-source-3.2.0/arch/x86/include/asm/unistd_32.h 在合适的位置(根据上面的编号)添加一行: #define _NR_mycall N /*N 为上面的编号*/西安电子科技大学操作系统原理实验报告(3)内核的编译:先安装环境,执行命令: #apt-get

8、install build-essential kernel-package libncurses5-dev fakeroot 编译步骤如下: 1)进入源代码目录: #cd /usr/src/linux-source-3.2.0 inux-source-3.2.0 为源码目录名。 2)清理以前编译留下的临时文件, #make mrproper 3)使用 make localmodconfig 自动精简内核 #make localmodconfig 4)开始编译 #make-kpkg clean #fakeroot make-kpkg -initrd -append-to-version=-xi

9、dian kernel_image 编译过程会持续很长时间。(4)安装内核:编译好的内核在上一层目录,执行命令: #cd #dpkg -i linux-image-3.2.39-xidian_3.2.39-xidian-10.00.Custom_i386.deb linux-image-3.2.39-xidian_3.2.39-xidian-10.00.Custom_i386.deb 是编译后的安 装文件名。(5)重启验证内核 #reboot 重启后打开终端输入 #uname -r 查看版本号,内核替换成功。 三、实验结果测试:编写如下程序:西安电子科技大学操作系统原理实验报告编译并运行:输出了200,证明实验成功。四、心得与收获Linux 中每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表syscall_table_32.S。文件 unisted.h 为每个系统调用规定了唯一的编号。文件sys.c定义了每个系统函数的内容。在这个实验中,我们只需要将这3个文件的相应内容增加与改变,并编译给系统。然后我们只要在c源代码中include相应的系统包,就可以调用我们自己定义的系统函数。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报