当前位置:文档之家› 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命令行下输入:ftp
202.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目录),get
linux-2.4.18.tar.gz linux-2.4.18.tar.gz 。

以上完成了通过FTP服务器实现Windows与Linux系统资源共享的工作,在Linux系统下获得了实验必备的原材料Linux-2.4.18.tar.gz和
config-2.4.18forMP.txt,只是完成的实验的第一步。

二、Linux内核编译、配置与调试
以下的实验步骤都是在VMware WorkStation 虚拟机和Red Hat Linux V9.0 系统操作环境中进行。

1. 内核配置与编译
1) 使用命令tar zxf 解压缩Linux 内核源代码压缩文件
linux-2.4.18.tar.gz ,并将解压缩后生成的目录linux 拷贝一份,并重新命名为linux-2.4.18(放在/home目录下)。

2) 在/home目录下,利用命令mv /tml/config-2.4.18 forMP.txt
/linux-2.4.18/.config 将位于Linux 内核源代码顶层目录的Linux内核缺省配置文件.config 替换为实验用内核配置文件。

3) 进入Linux 内核源代码顶层目录linux-2.4.18,运行如下命令序列配置和编译Linux 系统内核及其模块:
2. 内核安装与测试
为使虚拟机系统基于上面生成的Linux 内核启动,需要做一下几件事:将Linux 内核映像文件bzImage(根文件系统);将系统映射文件System.map 拷贝和安装到启动分区及目录/boot 下;同时,应在系统启动加载程序GRUB配置文件中添加关于该内核的启动配置项。

注意:本步骤要求用户身份为超级管理员即根用户root,具体的操作如下:
1) 将目录/home/linux-2.4.18/arch/i386/boot/下的映像文件拷贝到
/boot目录下,即在linux-2.4.18目录下执行命令:
2) 拷贝和安装Linux 系统映射文件System.map,并创建其与系统映射文件System.map 之间的符号链接,在boot目录下执行以下命令:
3) 修改系统启动加载程序配置文件grub.conf,在目录/boot/grub/下。

在配置文件中添加关于Linux2.4.18内核的启动配置项:
4) 在Linux2.4.18目录下执行命令make modules_install ,安装可动态加载的内核模块。

安装的内容位于/lib/modules/2.4.18 目录下。

5) 执行命令reboot 重启系统,并便可以选择自制Linux 内核系统(如下图)。

6) 接下来,便可执行命令dmesg 查看启动过程输出信息,详细内容参见附录一。

三、Linux系统调用添加与实现
1. 内核增加系统调用
1) 根据题目要求,要在系统中增加一条系统调用,其作用是获取特定进程标识符PID 所对应的资源使用情况,包括用户态或内核态的执行时间(以秒和微秒为单位)、无需或需要物理输入输出操作的页面错误次数、进程置换出内存的次数等。

2) 此系统调用是Linux 内核系统调用getrusage()的一个变种,所以在添加之前先阅读和分析getrusage()及sys_getrusage()相关源代码,在目录
/home/linux-2.4.18/linux/kernel下的sys.c文件中,详细见附录二。

3) 题目为我们提供好了新添加系统调用的名称get_process_usage,其函数原型为:
4) 根据题目条件,结构体struct tml_rusage的可定义为:.
2. 分析getrusage()和sys_getrusage()的源代码
1) 函数getrusage()的作用是获取系统资源使用情况。

2) 数据结构rusage 在头文件 resource.h中定义,详见附录三。

3) sys_getrusage()只是调用了内核函数getrusage(),是内核提供给用户的接口。

3. 新增系统调用并编写应用程序调用该系统
1) 定义数据结构tml_rusage,定义在目录/home/linux-2.4.18/ include/linux的resource.h中。

2) 在添加sys.c中添加函数get_process_usage()和系统调用函数
sys_get_process_usage()的代码;
3) 连接新的系统调用添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在。

为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。

第一个要修改的文件是/home/linux-2.4.18/
include/asm-i386/unistd.h,该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。

应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。

第二个要修改的文件是:
/home/linux-2.4.18/arch/i386/kernel/entry.S,该文件中有类似[.long
SYMBOL_NAME()]的清单, 该清单用来对sys_call_table[]数组进行初始化,该数组包含指向内核中每个系统调用的指针。

我们在清单最后添加一行:
4) 重建新的Linux内核,步骤和之前的“二、内核编译、配置与调试”相同。

5) 编写应用程序get_process_usag.c调用该系统调用
sys_get_process_usage()。

6) 编译应用程序get_process_usage.c。

7) 执行应用程序gpu。

四、实验的结果及分析
经过样例测试,实验满足题目要求:正确获取特定进程标识符PID 所对应的资源使用情况,包括用户态或内核态的执行时间(以秒和微秒为单位)、无需或需要物理输入输出操作的页面错误次数、进程置换出内存的次数等。

相关主题