实验链接
前言
做实验前一定要先拍个快照!!
操作系统实验环境的搭建请看如下链接(Ubuntu系统)
提示:以下是本篇文章正文内容,下面案例可供参考
一、实验内容
二.基础知识
具体请查看此文章
三、实验步骤
参考的文章
注:因为实验一已经修改过启动文件。但此次实验需要完整的启动文件,所以需要新的linux0.11环境。(在做实验一之前拍过一个快照所以我们只需要回复快照就行)
步骤一:打开unistd.h文件(在linux-0.11/include目录下)
在第132和133行添加如下代码
#define __NR_whoami 72
#define __NR_iam 73
步骤二:打开system_call.s文件(在linux-0.11/kernel目录下)
将61行的72改成74,因为现在总的系统调用有74个多了两个我们自己添加的系统调用
步骤三:进入sys.h文件(在linux-0.11/include/linux/目录下)
在第73行和第74行添加两句话
extern int sys_whoami();
extern int sys_iam();
并在第89行把两个系统调用名添加到最后
步骤四:在路径:linux-0.11/kernel目录下创建who.c文件并添加如下代码
代码来源处
#define __LIBRARY__
#include <unistd.h>
#include <errno.h> /* 要求设置错误为EINVAL */
#include <asm/segment.h> /* 使用put_fs_byte和get_fs_byte */
char temp[64]={0}; /* 存储sys_iam获取的字符串 */
int sys_iam(const char* name)
{
int i=0; /* 用户空间数据name长度 */
while(get_fs_byte(name+i)!='\0') i++;
if(i>23) return -EINVAL;
printk("%d\n",i);
i=0; /* 获取name至temp */
while((temp[i]=get_fs_byte(name+i))!='\0'){
i++;
}
return i;
}
int sys_whoami(char* name,unsigned int size)
{
int i=0; /* 内核空间数据temp长度 */
while (temp[i]!='\0') i++;
if (size<i) return -1;
i=0; /* 获取temp至name */
while(temp[i]!='\0'){
put_fs_byte(temp[i],(name+i));
i++;
}
return i;
}
步骤六: 修改linux-0.11/kernel下的makefile文件
进入makefile文件,按A键进行编辑,编辑完后按ESC退出编辑模式
按完ESC后再按shift+:,然后输入wq!保存退出
改动如下:
①:在OBJS最后添加 who.o
②:再到### Dependencies:下添加这句话:
who.s who.o: who.c …/include/linux/kernel.h …/include/unistd.h
步骤七:在此路径下打开终端,输入代码:make
他会出现一点错误,但无伤大雅。
而且会生成一些.o文件,如下图
步骤八:在oslab目录下创建whoami.c和iam.c两个测试文件
文件内容如下
代码来源处
/ / iam.c
/* iam.c */
#define __LIBRARY__
#include "unistd.h"
_syscall1(int, iam, const char*, name);
int main(int argc, char** argv){
int wlen = 0;
if(argc < 1){
printf("not enougth argument\n");
return -2;
}
wlen = iam(argv[1]);
return wlen;
}
/ / whoami.c
/* whoami.c */
#define __LIBRARY__
#include "unistd.h"
_syscall2(int, whoami,char*,name,unsigned int,size);
int main(int argc, char** argv){
char buf[30];
int rlen;
rlen = whoami(buf, 30);
printf("%s\n", buf);
return rlen;
}
步骤九:挂载到hdc目录中
我们添加到linux-0.11中的系统调用只能在bochs虚拟机中运行,不能在终端上运行
在oslab目录下打开终端,输入以下命令
↓
sudo ./mount-hdc
可以看到hdc目录下明显多了许多内容
步骤十:在步骤九的终端下输入以下命令
cp /home/你自己的用户名/oslab/linux-0.11/include/unistd.h /home/你自己的用户名/oslab/hdc/usr/include/unistd.h
cp /home/你自己的用户名/oslab/linux-0.11/include/linux/sys.h /home/你自己的用户名/oslab/hdc/usr/include/linux/sys.h
cp /home/你自己的用户名/oslab/iam.c hdc/usr/root
cp /home/你自己的用户名/oslab/whoami.c hdc/usr/root
步骤十一:验证结果
进入目录oslab/linux-0.11,打开终端,输入以下命令进入bochs虚拟机
↓
make all
../run
在bochs下输入一下代码
gcc -o iam iam.c
gcc -o whoami whoami.c
./iam 后面加一段字符串,你想写什么就写什么
./whoami
完结