栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

哈工大操作系统实验二:系统调用的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

哈工大操作系统实验二:系统调用的实现

实验链接

文章目录
  • 前言
    • 做实验前一定要先拍个快照!!
    • 操作系统实验环境的搭建请看如下链接(Ubuntu系统)
    • Linux0.11环境搭建


  • 一、实验内容
  • 二.基础知识
  • 三、实验步骤
    • 注:因为实验一已经修改过启动文件。但此次实验需要完整的启动文件,所以需要新的linux0.11环境。(在做实验一之前拍过一个快照所以我们只需要回复快照就行)
      • 我们添加到linux-0.11中的系统调用只能在bochs虚拟机中运行,不能在终端上运行
    • 完结


前言 做实验前一定要先拍个快照!!

操作系统实验环境的搭建请看如下链接(Ubuntu系统) Linux0.11环境搭建





提示:以下是本篇文章正文内容,下面案例可供参考

一、实验内容






二.基础知识

具体请查看此文章

三、实验步骤

参考的文章

注:因为实验一已经修改过启动文件。但此次实验需要完整的启动文件,所以需要新的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 		
#include 		
#include 	
 
 
char temp[64]={0};		
 
int sys_iam(const char* name)
{
   int i=0;			
   while(get_fs_byte(name+i)!='') i++;	
   if(i>23) return -EINVAL;
   printk("%dn",i);
   
   i=0;			
   while((temp[i]=get_fs_byte(name+i))!=''){
	i++;
   }   
    return i;
}
 
int sys_whoami(char* name,unsigned int size)
{
    int i=0;			
    while (temp[i]!='') i++;
    if (size	
	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

#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 argumentn");
        return -2;
    }
    wlen = iam(argv[1]);
    return wlen;
}

/ / 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("%sn", 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 

完结
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号