hit_os_lab2 操作系统启动

news2024/10/7 18:24:12

前置知识

1.1 基础概念

入理论课程的学习。 如果网易云上的课程无法查看,也可以看 Bilibili 上的 操作系统哈尔滨工业大学李治军老师。

  • L2 开始揭开钢琴的盖子
  • L3 操作系统启动

同济大学赵炯博士的《Linux 内核 0.11 完全注释(修正版 V3.0)》(以后简称《注释》)的第 6 章是非常有帮助的参考,实验中可能遇到的各种问题,几乎都能找到答案。谢煜波撰写的《操作系统引导探究》也是一份很好的参考。

1.2 概念的代码实现

Linux 0.11 文件夹中的 boot/bootsect.s、boot/setup.s 和 tools/build.c 是本实验会涉及到的源文件。

它们的功能详见《注释》的 6.2、6.3 节和 16 章。

2. 实验内容

阅读《Linux 内核完全注释》的第 6 章,对计算机和 Linux 0.11 的引导过程进行初步的了解;

  1. 按照下面的要求改写 0.11 的引导程序 bootsect.s
  2. 有兴趣同学可以做做进入保护模式前的设置程序 setup.s。
  • 改写 bootsect.s 主要完成如下功能:
  1. bootsect.s 能在屏幕上打印一段提示信息“XXX is booting…”,其中 XXX 是你给自己的操作系统起的名字,例如 LZJos、Sunix 等(可以上论坛上秀秀谁的 OS 名字最帅,也可以显示一个特色 logo,以表示自己操作系统的与众不同。)

改写 setup.s 主要完成如下功能:

  1. bootsect.s 能完成 setup.s 的载入,并跳转到 setup.s 开始地址执行。而 setup.s 向屏幕输出一行"Now we are in SETUP"。
  2. setup.s 能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。
  3. setup.s 不再加载 Linux 内核,保持上述信息显示在屏幕上即可。

2.1 实验提示

操作系统的 boot 代码有很多,并且大部分是相似的。本实验仿照 Linux-0.11/boot 目录下的 bootsect.s 和 setup.s,以剪裁它们为主线。当然,如果能完全从头编写,并实现实验所要求的功能,是再好不过了。

需要注意的是,oslab 中的汇编代码使用 as86 编译。

下面将给出一些更具体的 “提示”。这些提示并不是实验的一步一步的指导,而是罗列了一些实验中可能遇到的困难,并给予相关提示。它们肯定不会涵盖所有问题,也不保证其中的每个字都对完成实验有帮助。所以,它们更适合在你遇到问题时查阅,而不是当作指南一样地亦步亦趋。本课程所有实验的提示都是秉承这个思想编写的。

2.2 实验环境

(1)相关代码文件
Linux 0.11 文件夹中的 boot/bootsect.s、boot/setup.s 和 tools/build.c 是本实验会涉及到的源文件。它们的功能详见《注释》的 6.2、6.3 节和 16 章。

(2)引导程序的运行环境

引导程序bootsect.s 由BIOS 加载并运行, 引导程序在执行的过程中, 操作系统还不存在, 此时整台计算机的所有资源由引导程序掌控, 能使用的功能只有BIOS 中断调用,

在此过程中, 主要使用了 0X10, 0X13 这两个中断。

3. bootsect.s

3.1 修改 bootsect.s

  1. 改动, 这里需要修改的是字符串长度,即用需要输出的字符串长度替换 mov cx,#24 中的 24。要注意:除了我们设置的字符串 msg1 之外,还有三个换行 + 回车,一共是 6 个字符。比如这里 Hello OS world, my name is Chu Yun 的长度是 34,加上 6 后是 40,所以代码应该修改为 mov cx,#40。

  2. 修改启动时的字符串,将 .org 508 修改为 .org 510,是因为这里不需要 root_dev: .word ROOT_DEV,为了保证 boot_flag 一定在最后两个字节,所以要修改 .org。

完整的代码如下:

entry _start
_start:

! Print some inane message
! 读入光标所在位置
	mov	ah,#0x03		! read cursor pos
	xor	bh,bh
	int	0x10

!  显示启动过程中的字符串; “Hello OS world, my name is Chu Yun”	
	!mov	cx,#24
	
	mov cx,#40
	mov	bx,#0x0007		! page 0, attribute 7 (normal)
	mov	bp,#msg1
	
	!mov	ax,#0x1301		! write string, move cursor
	!int	0x10

! es:bp 是显示字符串的地址;
! 相比与原始的代码linux-0.11(原始代码中在输出之前处理了es), 这里增加对es 的处理,
    
	mov ax,#0x07c0
	mov es,ax
	mov ax,#0x1301
	int 0x10

! 设置一个无限循环
inf_loop:
	jmp inf_loop


! 在msg1处放置字符串
msg1:
! 一对回车+ 换行
	.byte  13,10
	.ascii "Hello OS world, my name is Chu Yun"
! 两对回车 + 换行
    .byte  13,10,13,10

.org 510
! 设置引导扇区标记, 0xAA55,  必须有该引导扇区的标记,才能引导;
boot_flag:
	.word 0xAA55

3.2 编译和运行 bootsect.s

执行下面两个命令编译和链接 bootsect.s:

$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o

其中 -0(注意:这是数字 0,不是字母 O)表示生成 8086 的 16 位目标程序,-a 表示生成与 GNU as 和 ld 部分兼容的代码,-s 告诉链接器 ld86 去除最后生成的可执行文件中的符号信息。

如果这两个命令没有任何输出,说明编译与链接都通过了。

Ubuntu 下用 ls -l 可列出下面的信息:

~/os/oslab/linux-0.11/boot$ ls -l
总用量 72
-rwxrwxr-x 1 shiyanlou shiyanlou   544 1129 15:54 bootsect
-rw-rw-r-- 1 shiyanlou shiyanlou   924 1129 15:53 bootsect.o
-rw-r--r-- 1 shiyanlou shiyanlou  5059 828  2008 bootsect_ori.s
-rw-r--r-- 1 shiyanlou shiyanlou  1799 1129 15:55 bootsect.s

其中 bootsect.o 是中间文件。bootsect 是编译、链接后的目标文件。

注意到; bootsect 的文件大小是 544 字节,而引导程序必须要正好占用一个磁盘扇区,即 512 个字节。

造成多了 32 个字节的原因是 ld86 产生的是 Minix 可执行文件格式,这样的可执行文件除了文本段、数据段等部分以外,还包括一个 Minix 可执行文件头部,它的结构如下:

struct exec {
    unsigned char a_magic[2];  //执行文件魔数
    unsigned char a_flags;
    unsigned char a_cpu;       //CPU标识号
    unsigned char a_hdrlen;    //头部长度,32字节或48字节
    unsigned char a_unused;
    unsigned short a_version;
    long a_text; long a_data; long a_bss; //代码段长度、数据段长度、堆长度
    long a_entry;    //执行入口地址
    long a_total;    //分配的内存总量
    long a_syms;     //符号表大小
};

算一算:6 char(6 字节)+ 1 short(2 字节) + 6 long(24 字节)= 32,正好是 32 个字节,去掉这 32 个字节后就可以放入引导扇区了(这是 tools/build.c 的用途之一)。

对于上面的 Minix 可执行文件,其 a_magic[0]=0x01,a_magic[1]=0x03,a_flags=0x10(可执行文件),a_cpu=0x04(表示 Intel i8086/8088,如果是 0x17 则表示 Sun 公司的 SPARC),所以 bootsect 文件的头几个字节应该是 01 03 10 04。

为了验证一下,Ubuntu 下用命令hexdump -C bootsect可以看到:

hexdump -C bootsect
00000000  01 03 10 04 20 00 00 00  00 02 00 00 00 00 00 00  |.... ...........|
00000010  00 00 00 00 00 00 00 00  00 82 00 00 00 00 00 00  |................|
00000020  b8 c0 07 8e d8 b8 00 90  8e c0 b9 00 01 29 f6 29  |.............).)|

3.3 修改 bootsect 文件大小

接下来干什么呢?

是的,要去掉这 32 个字节的文件头部(tools/build.c 的功能之一就是这个)!随手编个小的文件读写程序都可以去掉它。不过,

在 Ubuntu 下可以用命令:

3.4 ubuntu 中读入文件指定大小字节的数据

dd bs=1 if=bootsect of=Image skip=32
记录了512+0 的读入
记录了512+0 的写出
512字节已复制,0.00892562 s,57.4 kB/s
shiyanlou@respectinglife-Inspiron-24-5459:~/os/oslab/linux-0.11/boot$ ls
bootsect  bootsect.o  bootsect_ori.s  bootsect.s  head.o  head.s  Image  setup  setup.o  setup.s

3.5 运行引导文件 bootsect

去掉这 32 个字节后,将生成的文件拷贝到 linux-0.11 目录下,
并一定要命名为Image(注意大小写)。

~/os/oslab/linux-0.11/boot$ cp ./Image  ../Image

然后就“run”吧, 注意到这里是在当前路径下, 回退的方式运行的;

~/os/oslab/linux-0.11/boot$ ../../run

在这里插入图片描述

4. build.c 实验

5. setup.S 实验

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

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

相关文章

防火墙练习实验

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 二. 实验命令 一.实验图纸 二. 实验命令 ciscoasa> en Password: ciscoasa# co…

DJ12-2-4 串操作指令

目录 1. REP 重复前缀 2. 串操作指令的基本概念 3. 串操作指令的指令类型 (1)串传送指令 MOVS (2)串传送指令 CMPS (3)串扫描指令 SCAS (4)串装入指令 LODS (5&a…

如果把网络原理倒过来看,从无到有,一切如此清晰(下)

人生若只如初见。 前言 当我在台灯下,听着远隔17年前五月天的歌,而在数日后,我的文字也会纵使相隔万里远的来到你的屏幕前,就觉得这一切妙不可言。 OSI 网络七层模型 《如果把网络原理倒过来看,从无到有&#xff0c…

Metabase学习教程:仪表盘-5

如何进行时间段比较 我们通过不同的方法来比较一个指标在不同日期范围内的表现。 我们将研究不同的策略来比较两个不同时期的指标,比如将本周与上周、去年同期与上一周进行比较。我们将使用Metabase附带的示例数据库,这样您就可以继续学习了。这个示例…

【Android App】Vulkan实现宇宙中旋转雷达动画效果(附源码和原始视频 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、Vulkan简介 Vulkan是一个跨平台的图形绘制接口,被称为下一代OpenGL,因为尽管OpenGL提供了丰富的图形API,但他在底层实现的C代码早已封装起来,由于开发者修改不了底层代码&#xf…

社区系统项目复盘-5

文章目录Kafka消息队列实现系统通知功能什么是Kafka?Spring是怎么整合Kafka的?发送系统通知显示系统通知Kafka消息队列实现系统通知功能 阻塞队列 可以用阻塞队列来实现消息队列,阻塞队列是一个接口:BlockingQueue,可以…

易云维医院后勤综合管理平台为医院智慧后勤的建设与发展做出贡献

近年来,随着国家医疗卫生改革进程的不断推进,越来越多的医院开始关注运营成本控制问题,医院后勤管理服务模式的创新和优化变得越来越重要。利用医院后勤综合管理平台将医院后勤管理信息化将极大地提高医院智慧后勤建设与发展。在这种形势下&a…

Mac下安装Hadoop

1、引言 如果想在Mac下安装Hadoop而且让Hadoop能正常运行,那安装之前需要先安装java,在Mac环境下安装Hadoop。 2、配置ssh环境 在Mac下如果想使用Hadoop,必须要配置ssh环境, 如果不执行这一步,后面启动hadoop时会出现…

Spring MVC应该怎么学?这份教程带你快速入门,深入剖析源码!

前言: 什么是MVC? MVC(Model-View-Controller):它是一种软件架构设计模式,分为三个部分: Model(模型):业务的数据模型; View(视图)&…

xss-labs/level5

输入 <script>alert(xss)</script> 查看回显 如下所示 能够发现script被恶意替换为scr_ipt 查看源代码 第一个输出点被转义了 所以没有利用价值了 第二个输出点如同刚才所言被进行了关键字的恶意替换操作 那没办法 我们只能继续尝试一下在标签内部构造一个新…

91183-98-1,UDP-N-acetylglucosamine,5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐

5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐 英文名称&#xff1a;UDPAG&#xff1b;UDP-GlcNAc&#xff1b;UDP-N-acetylglucosamine&#xff1b;Uridine 5′-diphospho-N-acetylglucosamine sodium salt 其他名称&#xff1a;尿苷-5′-二磷酸-N-乙酰基-葡糖胺钠盐 CAS号&am…

Linux进阶-进程

目录 终端查询进程参数 进程状态 进程状态转换 子进程被Linux内核调入CPU执行的过程 子进程进入睡眠状态 子进程结束 进程控制 pid_t fork(void)&#xff1a;创建子进程 exec()函数族&#xff1a;运行一个可执行文件。 void exit(int status)&#xff1a;结束进程 w…

Illuminate/22圆桌回顾:Web3互操作性的未来现已到来

Illuminate/22 由Moonbeam主办的Illuminate/22于2022年11月10-11日成功举办。为期2天的线上会议聚集了60演讲嘉宾超过40个话题讨论。通过本次会议&#xff0c;来自行业领先的项目及负责人分享了通过互操作性和跨互连合约实现的最新进展。 本次以“Web3互操作性的未来现已到来”…

AI是如何影响全球的安防监控产业

全球AI安防市场现状 人工智能安防监控技术正在以更快的速度传播到更广泛的国家。全球176个国家中&#xff0c;至少有75个国家正在积极将AI技术用于监视目的。其中包括&#xff1a;智慧城市/安全城市平台&#xff08;56个国家&#xff09;&#xff0c;面部识别系统&#xff08;6…

【torch】如何把给定mask按比例选取再次划分mask?

背景 在以torch为基础的很多框架下有一些集成的数据集&#xff0c;数据集往往自带已经划分好的mask。但是如何能够把框架给出的mask再次划分&#xff1f;比如按比例划分出来80%的train mask。 解决 新生成一个每个元素都是0-1分布的与mask2的true位置相同的矩阵&#xff0c;…

xss-labs/level4

首先还是输入我们最熟悉的payload <script>alert(xss)</script> 查看界面回显 发现表单中的尖括号都消失了 说明后台服务器将尖括号删除了 再去查看源代码 通过源代码我们可以知道存在两个有意义的输出点 第一个输出点被转义了 没办法利用了script标签去执行js代…

亲戚小孩月薪17k,而我只有4k+,好慌......

我们总是在悲观与乐观中反复折磨自己&#xff0c;感觉自己一事无成。总是眼高手低&#xff0c;总以为大运会砸到自己&#xff0c;遇到挫折就会感到很沮丧。 大学四年没考到英语六级证书&#xff0c;小学教资考了两次。现在想要考研&#xff0c;但总是觉得来不及&#xff0c;或…

SpringBoot概念、创建和运行

文章目录什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f;Spring Boot 优点Spring Boot 项目创建项目目录介绍和运行约定大于配置什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f; Spring 的诞生是为了简化 Java 程序的开发的&#xff0c…

外汇天眼:外汇市场为何在周末休市?为什么周末行情有波动?

虽然从理论上而言&#xff0c;货币市场从不休市&#xff0c;但您很难见到有人在周日交易。新手甚至会认为&#xff0c;交易活动的停止是因为外汇经纪商周末休息。但如下文所述&#xff0c;实际情况并非如此。 外汇市场中的主要参与者 货币交易主要是为了促进贸易和旅游业。而且…

助推专精特新企业数字化的低代码

近两年&#xff0c;“专精特新”成为行业的热门词。根据工信部的定义&#xff0c;“专精特新”中小企业&#xff0c;是指具有专业化、精细化、特色化、新颖化等特点的企业。它们多专注于产业链上某个环节&#xff0c;主营业务聚焦&#xff0c;同时具有较强大的创新能力、创新活…