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
学习时间 20分钟
操作时间 3分钟
按键次数 68次
实验次数 4次
报告字数 3294字
是否完成 完成