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

2023-11-17

实验链接


前言

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

在这里插入图片描述

操作系统实验环境的搭建请看如下链接(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 <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 

在这里插入图片描述

完结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈工大操作系统实验二:系统调用的实现 的相关文章

  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐

  • 错误 无法使用未定义类型“Ui::MainWidow“

    一 问题分析 在Qt Creator中创建Qt项目时 Creator会自动给你声明一个命名空间Ui namespace Ui class MainWindow 这是命名空间Ui里的一个类 类名是MainWindow 和你声明的MainWin
  • 安卓4.4手机运行崩溃,类无法找到,实际却是存在

    java lang RuntimeException Unable to get provider com SdkFileProvider java lang ClassNotFoundException Didn t find class
  • oracle-- 数据更新操作和事务操作

    一 sql语言操作分类 需要背 面试需要 1 数据定义语言DDL DATA DEFINE LANAGUAGE 定义 操作数据的结构 gt java的变量定义 CREATE 在数据库中创建新的数据对象 ALTER 修改数据库中对象的数据结构
  • redis:key设计原则

    redis与关系型数据库的适合场景 场景 书有标签 一本书可能有多个标签 一个标签可能对应多本书 如果是关系型数据库来存储 create table book id int title char 20 engine myisam chars
  • 以 STM32最小系统核心板(STM32F103C8T6)+面板板+LED 搭建电路,使用GPIO端口控制LED灯

    目录 STM32寄存器操作 寄存器的定义 寄存器操作GPIO 点灯 打开GPIO口的时钟 初始化GPIO口 选择推挽输出 设置低电平 实践操作 keil生成 hex 电路连接 芯片 烧录 总结 STM32寄存器操作 寄存器的定义 寄存器是存
  • Stable Diffusion web UI 安装教程

    Stable Diffusion web UI 安装教程 欢迎来到猫说AI wx搜索 猫说AI接入了最新版Chatgpt供大家免费使用 注意 这是ubuntu20 04安装步骤 conda创建python虚拟环境 conda create
  • pom报错,但不提示错误

    1 删除工作空间文件 workspace projects metadata plugins org eclipse m2e jdt 项目名称 container
  • Java获取指定日期的0点以及24点

    指定Date date 比如是 2022 12 09 12 34 28 获取这天的开始时间和结束时间 获得某天最大时间 2022 12 09 23 59 59 public static Date getEndOfDay Date date
  • 没有客户端执行mysql_重学MySQL:谈一谈MySQL架构

    作为一名Web后端程序员 需要经常与MySQL打交道 不过更多的时候还是停留在增删改查 CURD 的应用层面 然而随着负责项目的数据量增长和服务器硬件性能开始出现瓶颈 让我感觉有必要更加全面深入地学习与了解MySQL 以便更好地发挥MySQ
  •  使用jsp实现留言板功能

    使用jsp实现留言板功能 一 开发环境 本项目使用eclipse MySQL8 0进行开发 在开发的过程中使用了一个jar包 mysql connector java 8 0 16 jar 点我下载 二 项目结构 1 index jsp
  • 信息安全建设之开源安全产品

    对于中小企业来说 有很多免费且开源的路由器和防火墙解决方案 甚至可以作为企业的选择 这类产品中 很多都提供局域网服务 如VPN服务 热点网关和通过强制网络门户以共享无线网络 当我们在考虑安全解决方案的时候 最便于操作的肯定是商业产品 最经济
  • [整理][LaTex]小技巧之——首行缩进

    0 简介 在LaTex编辑时 有时会遇到这样一个有关于首行缩进的问题 在汉语环境的编辑下 习惯上每段会进行一个两个字的缩进 但是在默认编辑模式下 一个章节下的首段是没有首行缩进的 本文的目的主要是解决中文情况下首段缩进的情况 1 默认情况
  • Java入门 (超详细)JDK(1.8)下载与安装及环境变量的配置教程

    第一步 下载JDK 8 Oracle官网下载地址 https www oracle com java technologies javase javase8u211 later archive downloads html 进入官网JDK
  • 鸿蒙是一个怎么样的操作系统,真的是安卓套壳吗?

    从鸿蒙项目正式推出以来 就一直有各自声音 有看好的 认为鸿蒙的出现将会成为一个智能终端设备操作系统的框架和平台 促进万物互联产业的繁荣发展 也有的人在唱衰 觉得鸿蒙发展不起来 甚至认为鸿蒙只是安卓的换皮 套壳 那事实是怎么样的 鸿蒙与安卓之
  • 微信群发图文消息步骤说明

    前段时间学习微信接口开发 心得与大家分享 第一步 调用 上传下载多媒体接口 上传图片 接收微信服务器返回结果 解析获取返回的url的值 等待备用 第二步 调用 上传图文消息素材 接口 截图中红色方框标记的thumb media id的值替换
  • WireShark常用过滤规则

    一 地址过滤 对源地址及目的地址过滤 ip src 192 168 0 1 ip dst 192 168 0 1 对源地址或者目的地址过滤 ip addr 192 168 0 1 排除某个地址数据包过滤 ip addr 192 168 0
  • Linux中使用pip安装库时出现Aborted (core dumped)问题解决方案

    作者 陈玓玏 在Linux中安装上pip后 通过pip install安装python库时出现这个问题 root DZG0370 mnt c Windows System32 pip3 install pandas Downloading
  • Inno Setup 如何让生成的setup.exe文件有管理员权限

    首先 在 Setup 段 PrivilegesRequired admin 然后 找到INNO安装目录下的SetupLdr e32文件 将程序中的Manifest更改一下 用reshacker这类工具改 这样运行程序的时候 Windows
  • php use not allowed,PHP Curl - Received HTTP/0.9 when not allowed

    问题 I stumbled over a weird behavior when I try to send a post HTTP 2 0 request to apples push service http2ch curl init
  • 哈工大操作系统实验二:系统调用的实现

    实验链接 文章目录 前言 做实验前一定要先拍个快照 操作系统实验环境的搭建请看如下链接 Ubuntu系统 Linux0 11环境搭建 一 实验内容 二 基础知识 三 实验步骤 注 因为实验一已经修改过启动文件 但此次实验需要完整的启动文件