操作系统-实验报告单(2)

目录

1 实验目标

2 实验工具

3 实验内容、实验步骤及实验结果

一、自定义操作系统并启动

1. 最简单操作系统的编写并生成镜像文件

2.虚拟机启动操作系统

【思考题:1、仔细阅读helloos.nas,结合操作系统启动过程尝试分析它的作用;2、若要将显示改为“Hello,MyOS!”该如何操作,请分析并截图出操作过程。】

二、系统调用的使用方法

1. 系统调用的方法

【思考题:调试运行下列程序,说明显式和隐式调用的不同之处。并尝试列出几个常用的系统调用号。】

2、常见系统调用函数

【思考题:请说明系统调用函数与库函数的区别。】

三、编写代码实现简单的 Shell

【思考题:试分析并编写一个简单的shell,能读取用户输入的命令并正确执行。并能通过ps指令查看到自己编写的shell的执行。】

4 实验总结


实  验  报  告  单(2)

实验名称:    操作系统的启动及接口                 

时间202-11-5

     

1 实验目

1、掌握操作系统的启动过程

2、理解操作系统的接口工作原理

3、掌握操作系统系统调用的原理

2 实验工具

  • 记事本:用于编写简单操作系统的汇编代码。
  • e2_tools:用于将汇编代码生成为启动文件。
  • VMware:用于创建虚拟机并启动自定义操作系统。
  • 命令行界面:用于执行生成镜像文件的命令。

3 实验内容、实验步骤及实验结果

一、自定义操作系统并启动

1. 最简单操作系统的编写并生成镜像文件

; hello-os; TAB=4ORG     0x7c00              ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP     entryDB      0x90DB      "HELLOIPL"      ; 启动扇区名称(8字节)DW      512             ; 每个扇区(sector)大小(必须512字节)DB      1               ; 簇(cluster)大小(必须为1个扇区)DW      1               ; FAT起始位置(一般为第一个扇区)DB      2               ; FAT个数(必须为2)DW      224             ; 根目录大小(一般为224项)DW      2880            ; 该磁盘大小(必须为2880扇区【1440*1024/512】)DB      0xf0            ; 磁盘类型(必须为0xf0)DW      9               ; FAT的长度(必须??扇区)DW      18              ; 一个磁道(track)有几个扇区(必须为18)DW      2               ; 磁头数(必须??)DD      0               ; 不使用分区,必须是0DD      2880            ; 重写一次磁盘大小DB      0,0,0x29        ; 意义不明【固定】DD      0xffffffff      ; (可能是)卷标号DB      "HELLO-OS "     ; 磁盘的名称(必须为11字?, 不是填空格)DB      "FAT12   "      ; 磁盘格式名称(必须8字?, 不是填空格)RESB    18              ; 先空出18字节; 程序主体entry:MOV     AX,0            ; 初始化寄存器MOV     SS,AXMOV     SP,0x7c00MOV     DS,AXMOV     ES,AXMOV     SI,msgputloop:MOV AL, [SI]         ; 给 SI 加 1ADD SI, 1CMP AL, 0JE fin               ; 如果 AL 为 0,跳转到 finMOV AH, 0x0e         ; 显示一个文字MOV BX, 10           ; 指定字符颜色INT 0x10             ; 调用显卡 BIOSJMP putloopfin:HLT                  ; 让 CPU 停止,等待指令JMP fin              ; 无限循环msg:DB 0x0a, 0x0a        ; 换行两次DB "hello, world"    ; 输出字符串 "hello, world"DB 0x0a, 0x0a        ; 换行两次DB "This is MyOS"    ; 输出字符串 "This is MyOS"DB 0x0a              ; 换行DB 0                 ; 字符串结束符RESB 0x7dfe - $      ; 填充 0x00 直到 0x001feDB 0x55, 0xaa        ; 文件结束标记

步骤1:使用 Notepad++ 编写简单操作系统 helloos.nas 汇编代码。

步骤2:使用 e2_tools 文件夹中的 makeFile 工具将 helloos.nas 文件生成为启动文件 helloos.img。

Step1:将 helloos.nas 文件放入 e2_tools 文件夹中。

Step2:打开命令行界面,并将当前目录重定位至实验二工具“e2_tools”位置。

Step3:输入命令“make img”在当前位置生成 helloos.img 文件。

nask.exe helloos.nas helloos.bin helloos.lst

edimg.exe imgin:../e2_tools/fdimg0at.tek wbinimg src:helloos.bin len:512 from:0 to:0   imgout:helloos.img

2.虚拟机启动操作系统

Step1:启动 VMware,创建一个新的虚拟机 MyOS(注意加上软盘驱动器)。

Step2:设置从软盘镜像文件中启动系统,文件为刚做好的 helloos.img。

Step3:启动该虚拟机。

【思考题:1、仔细阅读helloos.nas,结合操作系统启动过程尝试分析它的作用;2、若要将显示改为“Hello,MyOS!”该如何操作,请分析并截图出操作过程。】
  1. helloos.nas是一个操作系统启动代码,它定义了操作系统的启动扇区(Boot Sector),负责从磁盘加载操作系统并启动。通过汇编语言编写,它直接操作硬件,设置CPU寄存器、初始化堆栈、加载操作系统内核等。
  2. 在helloos.nas文件中找到字符串显示部分,修改字符串内容。

二、系统调用的使用方法

1. 系统调用的方法

隐式调用:用户通过封装了系统调用的 API 使用系统调用。

显式调用:使用 syscall() 函数实现调用,int syscall(int number,…),number 是系统调用号。

思考题:

调试运行下列程序,说明显式和隐式调用的不同之处。并尝试列出几个常用的系统调用号。

#include <syscall.h>#include <unistd.h>#include <stdio.h>#include <sys/types.h>int main (void) {long ID1, ID2;ID1 = syscall(SYS_getpid); /* 显式系统调用 */printf("syscall(SYS_getpid) = %ld\n", ID1);ID2 = getpid();  /* 使用 libc 封装的隐式系统调用 */printf("getpid() = %ld\n", ID2);return 0;}

【思考题:调试运行下列程序,说明显式和隐式调用的不同之处。并尝试列出几个常用的系统调用号。】

显式和隐式调用的不同之处:

显式调用:直接使用syscall()函数,通过系统调用号调用内核服务,程序员需要知道具体的系统调用号。

隐式调用:通过C库函数(如getpid())间接调用系统调用,程序员无需知道具体的系统调用号,由库函数封装。

常用系统调用号:

  1. SYS_getpid:获取进程ID。
  2. SYS_open:打开文件。
  3. SYS_read:读取文件。
  4. SYS_write:写入文件。
  5. SYS_exit:退出程序

2、常见系统调用函数

请用open()、read()、write()等常见系统调用函数完成创建或打开某目录下的文件,并写入指定语句“This is system call”。再次打开文件,将文字读出并打印输出到屏幕。

【给出代码截图、调试过程、运行结果。】

代码截图:

调试过程:

写入文件时使用sizeof(data)是不正确的,sizeof(data)返回的是指针的大小,应该使用strlen(data)来获取字符串的实际长度并写入.

运行结果:

【思考题:请说明系统调用函数与库函数的区别。】
  • 系统调用函数:直接调用内核服务,执行特权指令,通常在用户态和内核态之间切换。
  • 库函数:在用户态执行,通常是对系统调用的封装,提供更高层次的接口。

三、编写代码实现简单的 Shell

操作系统不信任用户,所以提供了一系列系统接口让用户通过命令行的形式去使用内核。Shell 就是一个命令行解释器,将用户输入的命令行解释为 OS 能够理解的可执行程序并执行该程序以运行。因此,Shell 实际上就是读取用户输入的信息,并创建新的子进程并用系统调用函数 exec 类函数调用该信息所指向的程序。

【思考题:试分析并编写一个简单的shell,能读取用户输入的命令并正确执行。并能通过ps指令查看到自己编写的shell的执行。】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>#define MAX_INPUT_SIZE 1024int main(void) {char input[MAX_INPUT_SIZE];pid_t pid;while (1) {printf("myshell> ");fgets(input, MAX_INPUT_SIZE, stdin);input[strcspn(input, "\n")] = 0; // Remove newline characterif (strcmp(input, "exit") == 0) {break;}pid = fork();if (pid == 0) { // Child processexeclp(input, input, NULL);perror("exec");exit(1);} else if (pid > 0) { // Parent processwait(NULL);} else {perror("fork");}}return 0;
}

4 实验总结

通过这次实验报告册的编写与实验操作,我对操作系统的启动过程、接口工作原理以及系统调用的原理有了更深入的理解。以下是我的实验总结:

操作系统的启动及接口:首先学习了操作系统的启动过程。通过编写并生成自定义操作系统的镜像文件,我掌握了操作系统从磁盘加载到内存的过程,并且理解了操作系统如何初始化寄存器、堆栈以及加载内核。此外,我还学会了使用汇编语言编写简单的操作系统启动代码,并通过虚拟机成功启动了自定义操作系统。系统调用的使用方法:在这部分实验中,我了解了系统调用的基本方法,包括显式调用和隐式调用。通过实际编程实践,我体会到了直接使用syscall()函数进行显式调用和使用C库函数进行隐式调用的不同之处。此外,我还尝试了使用open()、read()、write()等系统调用函数来创建和操作文件,这增强了我对文件系统操作的理解。简单Shell的实现:最后,我尝试编写了一个简单的Shell程序。这个程序能够读取用户输入的命令,并通过创建子进程和调用exec类函数来执行相应的程序。这个过程让我对操作系统如何管理进程和执行命令有了更加直观的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7616.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

城镇住房保障:SpringBoot系统优化技巧

3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架&#xff0c;JA…

FlyMcu串口下载STLink Utility

1、FlyMcu FlyMcu串口下载&#xff0c;同STC-ISP&#xff08;51单片机下载&#xff09;。 使用步骤&#xff1a; 1、STM32的USART1通过串口转usb连接到电脑 2、通过keil生成Hex、bin文件 生成bin、hex文件可参考 keil生成bin文件&#xff08;简单&#xff09;-CSDN博客 创建…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot&#xff0c;AWS实例存储 学习内容&#xff1a; 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot恢复数…

论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对机器人辅助微创手术中定向障碍和缺乏导航信息的问题&#xff0c;设计了一种智能控制导航手术机器人系统。该系统采用可靠和安全的定位技术、7自由度机械臂以及避免关节角度限制的逆运动学控制策…

《数据结构与算法》二叉树基础OJ练习

二叉树的基础知识详见&#xff1a;《数据结构与算法》二叉树-CSDN博客 1 单值二叉树 思路 我们把树分成当前树&#xff08;用根和左孩子还有右孩子进行比较&#xff0c;如果左孩子或者右孩子为空那就不比了&#xff0c;如果左右孩子或者其中一个存在就比较&#xff0c;相等就是…

栈和队列(C 语言)

目录 一、栈1. 栈的概念2. 栈的结构3. 栈的实现思路4. 栈的实现代码 二、队列1. 队列的概念2. 队列的结构3. 队列的实现思路4. 队列的实现代码5. 循环队列 一、栈 1. 栈的概念 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除操作&#xff0c;该端被称为栈…

自动化测试工具Ranorex Studio(二十五)-库的拆分

默认地&#xff0c;每一个Ranorex Studio项目包含一个对象库文件&#xff0c;这个文件自动用在每一个新创建的录制中。你可以在一个单独的库文件中管理一个测试套件项目中所有的UI元素&#xff0c;但是在一个自动化测试项目中多个对象库的存在还是有一些原因的&#xff1a; .测…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

99、Python并发编程:多线程的问题、临界资源以及同步机制

引言 多线程技术的引入&#xff0c;可以帮助我们实现并发编程&#xff0c;一方面可以充分利用CPU计算资源&#xff0c;另一方面&#xff0c;可以在用户体验上带来极大的改善。但是&#xff0c;多线程技术也存在一些问题。本文就来简单聊一下多线程引入导致的问题&#xff0c;以…

jmeter常用配置元件介绍总结之取样器

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 jmeter常用配置元件介绍总结之取样器 2.取样器2.1.HTTP请求2.2.Debug Sampler2.3.JSR223 Sampler2.4.JDBC Connection Configuration和J…

Python练习11

Python日常练习 题目&#xff1a; 编写一个石头剪刀布游戏&#xff0c;该程序要求完成如下功能&#xff1a; (1) 显示游戏规则&#xff0c;提醒用户输入一个1-3的整数或者直接回车。 用户输入回车时游戏结束。 用户输入不合法&#xff08;包括输入的…

什么是欧拉角和四元数

涉及机器人调度工作的一些基本概念整理理解 目录 什么是欧拉角和四元数 &#xff1f;相关工具网站相关工具代码 什么是欧拉角和四元数 &#xff1f; 这里画了一张图&#xff0c;简明方便理解&#xff1a; 欧拉角 (Euler Angles) 是一种描述物体在三维空间旋转姿态的方法&…

关于几种卷积

1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权&#xff0c;对于一个通道来说&#xff0c;每个像素点加权是一样的&am…

std::copy

std::copy 是 C 标准库中的一个算法&#xff0c;用于将一个序列中的元素复制到另一个位置。这个算法定义在 <algorithm> 头文件中。 --- 函数原型 std::copy 有几个不同的重载版本&#xff0c;但以下是最常用的两个&#xff1a; template <class InputIterator, c…

PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!

数据集列表 帮忙采集开源数据集&#xff0c;包括YOLO格式数据集和Pascal VOC格式数据集&#xff0c;含图像原文件和标注文件&#xff0c;几百张到几千张不等&#xff0c;国内外公开数据集均可。 针对目标检测&#xff0c;YOLO系列模型训练&#xff0c;分类训练等。 部分数据…

Vue前端开发:元素动画效果之过渡动画

在Vue中&#xff0c;专门提供了一个名称为transition 的内置组件&#xff0c;来完成单个DOM元素的动画效果&#xff0c;该组件本身和它的顶层并不渲染动画效果&#xff0c;而只是将动画效果应用到被组件包裹的DOM元素上&#xff0c;代码实现的格式如下所示。 <transition&g…

【C/C++】strcmp函数的模拟实现

零.导言 之前我们学习了strcmp函数&#xff0c;不妨我们现在尝试模拟实现strcmp函数的功能。 一.实现strcmp函数的要点 strcmp函数是一种字符串函数&#xff0c;可以比较字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;第一个字符…

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…