崔丹依 L3 2018-05-27 03:04:58 系统调用
552 0

“操作系统原理与实践(南阳理工学院)”实验报告

系统调用

1.准备实验环境

cd ~/oslab

tar zxvf hit-oslab-linux-20110823.tar.gz

2.修改"unistd.h"文件,对新增系统调用增加相应的宏定义:

cd oslab/linux-0.11/include

gedit unistd.h

图片描述 在原第131行和第132行之间增加如下代码:

define __NR_iam 72

define __NR_whoami 73

图片描述 在254行添加

int iam(const char name);

int whami(char name,unsigned int size); 图片描述 3.修改"system_call.s"文件,扩大系统调用函数的数量:

cd /home/shiyanlou/oslab/oslab/linux-0.11/kernel

gedit system_call.s

将文件第61行改为:

nr_system_calls = 74

图片描述

4.修改"sys.h"文件,使0x80号中断能调用相应的系统函数:

打开"/home/shiyanlou/oslab/linux-0.11/include/linux"目录,然后用"gedit"软件打开"sys.h",

在原第72行和第73行之间增加如下代码:

extern int sys_iam();

extern int sys_whoami();

在88行添加

sys_iam,sys_whoami

图片描述

5.创建"who.c"文件:

进入"/home/shiyanlou/oslab/linux-0.11/kernel"目录,创建"who.c"文件,键入

define LIBRARY

include <unistd.h>

include <errno.h>

include <asm/segment.h>

char usnm[64]={0};

int sys_iam(const char* name)

{

int result=0; int cnt;

while(get_fs_byte(name+result) != '\0' && result<64) result++;

if(result>23) return -EINVAL;

else

{

for(cnt=0;cnt<=result;cnt++){usnm[cnt]=get_fs_byte(name+cnt);} return result; }

}

int sys_whoami(char* name, unsigned int size)

{

int result=0; int cnt;

while(usnm[result] != '\0' && result<64) result++;

if(result>size) return -1;

else

{

for(cnt=0;cnt<=result;cnt++){put_fs_byte(usnm[cnt],(name+cnt));} return result;

}

}

6.修改"Makefile"文件:

打开"/home/shiyanlou/oslab/linux-0.11/kernel"目录,然后用"gedit"软件打开"Makefile",将文件第29行修改为:

signal.o mktime.o who.o

在原第50行和第51行之间增加如下代码:

who.s who.o:who.c ../include/unistd.h ../include/errno.h \

../include/asm/segment.h

图片描述 7.挂载虚拟机硬盘

cd linux-0.11/

make all

cd ..

sudo ./mount-hdc

(在oslab目录下执行命令$ ./mount-hdc),打开目录"/home/shiyanlou/oslab/hdc/usr/include",添加头文件"usname.h":

define LIBRARY

include <unistd.h>

include <errno.h>

include <asm/segment.h>

_syscall1(int,iam,const char,name)

_syscall2(int,whoami,const char,name,unsigned int,size)

8.将文件:

"/home/shiyanlou/oslab/linux-0.11/include/unistd.h"

复制到以下路径:

"/home/shiyanlou/oslab/hdc/usr/include";

将文件:

"/home/shiyanlou/oslab/linux-0.11/include/linux/sys.h"

复制到以下路径:

"/home/shiyanlou/oslab/hdc/usr/include/linux";

9.在"/home/shiyanlou/oslab/hdc/usr/root"目录下编写程序"iam.c"和"whoami.c":

iam.c

include <usname.h>

int main(int argc,char* argv[])

{

if(argc>1) {if(iam(argv[1])<0) return -1;}

else return -1;

return 0;

}

whoami.c

include<usname.h>

include<stdio.h>

int main(void)

{

char str[128]; if(whoami(str, 24)<0) return -1;

else printf("%s\n", str);

return 0;

}

10.从"/home/teacher"拷贝文件"testlab2.c"和"testlab.sh"至以下路径:

"/home/shiyanlou/oslab/hdc/usr/root"

11.取消虚拟机硬盘挂载,运行虚拟机:

在oslab目录下执行命令$ sudo umount hdc

../run

(1)键入以下三个命令:

gcc –o testlab2 testlab2.c

gcc -o iam iam.c -Wall

gcc -o whoami whoami.c -Wall

(2)键入以下两个命令:

./iam aa

./whoami

之后键入:

./testlab2 (3) 键入以下两个命令:

chmod +x testlab2.sh

./testlab2.sh

最新评论
暂无评论~