ch1 操作系统启动

news2024/10/6 6:01:46

lab1 实验准备

按照实验解压后进入oslab中,按照make编译。

cd /home/shiyanlou/oslab/
tar -zxvf hit-oslab-linux-20110823.tar.gz \
  -C /home/shiyanlou/
./run
cd ./linux-0.11/
make all
make clean
.....
make all

运行脚本即可启动内核

调试

汇编级调试和C语言级调试

汇编级调试

# 确认在 oslab 目录下
$ cd ~/oslab/

# 运行脚本前确定已经关闭刚刚运行的 Bochs
$ ./dbg-asm

C语言级调试

需要两个终端并发
第一个进程终端

$ cd ~/oslab
$ ./dbg-c

第二个进程终端

$ cd ~/oslab
$ ./rungdb

文件交换

关闭bochs进程

$ cd ~/oslab/

# 启动挂载脚本
$ sudo ./mount-hdc

在hdc目录即可看见一模一样的文件系统
在这里插入图片描述

# 进入挂载到 Ubuntu 上的目录
$ cd ~/oslab/hdc

# 查看内容
$ ls -al

读写完毕后卸载
通过 sudo ./mount-hdc 进行挂载。

然后在 Ubuntu 的 ~/oslab/hdc/usr/root 目录下创建一个 xxx.c 文件,

sudo gedit ~/oslab/hdc/usr/root/xxx.c

再卸载文件系统sudo umount hdc,启动run脚本,在bochs输入ls命令在这里插入图片描述

lab2 操作系统启动

bootsec.s改写

首先是显示要求的字符串

! 首先读入光标位置
    mov ah,#0x03
    xor bh,bh
    int 0x10  !->DH 列->DL
! 显示字符串 “YonglanOS is booting...! 要显示的字符串长度
    mov cx,#36  
    mov bx,#0x0007 !黑底白字
    mov bp,#msg1 ! 取msg地址给bp 
! es:bp 是显示字符串的地址
! 相比与 linux-0.11 中的代码,需要增加对 es 的处理,因为原代码中在输出之前已经处理了 es
    mov ax,#0x07c0
    mov es,ax   
    mov ax,#0x1301
    int 0x10

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

在这里插入图片描述
Ubuntu 上先从终端进入 ~/oslab/linux-0.11/boot/ 目录。

Windows 上则先双击快捷方式 “MinGW32.bat”,将打开一个命令行窗口,当前目录是 oslab,用 cd 命令进入 linux-0.11\boot。

无论那种系统,都执行下面两个命令编译和链接 bootsect.s:

 ~/oslab/linux-0.11/boot/
$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o

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

-rw--x--x    1  root  root  544  Jul  25  15:07   bootsect
-rw------    1  root  root  257  Jul  25  15:07   bootsect.o
-rw------    1  root  root  686  Jul  25  14:28   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”可以看到:

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 8e c0 b4  03 30 ff cd 10 b9 17 00  |.........0......|
00000030  bb 07 00 bd 3f 00 b8 01  13 cd 10 b8 00 90 8e c0  |....?...........|
00000040  ba 00 00 b9 02 00 bb 00  02 b8 04 02 cd 13 73 0a  |..............s.|
00000050  ba 00 00 b8 00 00 cd 13  eb e1 ea 00 00 20 90 0d  |............. ..|
00000060  0a 53 75 6e 69 78 20 69  73 20 72 75 6e 6e 69 6e  |.Sunix is runnin|
00000070  67 21 0d 0a 0d 0a 00 00  00 00 00 00 00 00 00 00  |g!..............|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000220

去掉这 32 个字节后,将生成的文件拷贝到 linux-0.11 目录下,并一定要命名为“Image”(注意大小写)。然后就“run”吧!
接下来干什么呢?是的,要去掉这 32 个字节的文件头部(tools/build.c 的功能之一就是这个)!随手编个小的文件读写程序都可以去掉它。不过,懒且聪明的人会在 Ubuntu 下用命令:

$ dd bs=1 if=bootsect of=Image skip=32

生成的 Image 就是去掉文件头的 bootsect。

Windows 下可以用 UltraEdit 直接删除(选中这 32 个字节,然后按 Ctrl+X)。

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

bootsec.s读入setup.s

显示字符的功能直接复制bootsec.s上的内容进行修改

```c
! 首先读入光标位置
    mov ah,#0x03
    xor bh,bh
    int 0x10  !行->DH 列->DL
! 显示字符串 “"Hello OS world, my name is JYL"! 要显示的字符串长度
    mov cx,#36  
    mov bx,#0x0007 !黑底白字
    mov bp,#msg1 ! 取msg地址给bp 
! es:bp 是显示字符串的地址
! 相比与 linux-0.11 中的代码,需要增加对 es 的处理,因为原代码中在输出之前已经处理了 es
    mov ax,#0x07c0
    mov es,ax   
    mov ax,#0x1301
    int 0x10

接下来,读入setup.s

load_setup:
! 设置驱动器和磁头(drive 0, head 0): 软盘 0 磁头
    mov dx,#0x0000
! 设置扇区号和磁道(sector 2, track 0): 0 磁头、0 磁道、2 扇区
    mov cx,#0x0002
! 设置读入的内存地址:BOOTSEG+address = 512,偏移512字节
    mov bx,#0x0200
! 设置读入的扇区个数(service 2, nr of sectors)! SETUPLEN是读入的扇区个数,Linux 0.11 设置的是 4! 我们不需要那么多,我们设置为 2(因此还需要添加变量 SETUPLEN=2)
    mov ax,#0x0200+SETUPLEN
! 应用 0x13 号 BIOS 中断读入 2 个 setup.s扇区
    int 0x13
! 读入成功,跳转到 ok_load_setup: ok - continue,int 0x13出错会置位CF
    jnc ok_load_setup
! 软驱、软盘有问题才会执行到这里。我们的镜像文件比它们可靠多了
    mov dx,#0x0000
! 否则复位软驱 reset the diskette
    mov ax,#0x0000
    int 0x13
! 重新循环,再次尝试读取
    jmp load_setup
ok_load_setup:
! 接下来要干什么?当然是跳到 setup 执行。
! 要注意:我们没有将 bootsect 移到 0x9000,因此跳转后的段地址应该是 0x7ce0
! 即我们要设置 SETUPSEG=0x07e0

接下来是一些数据

msg1:
    .byte   13,10
    .ascii  "Hello OS world, my name is JYL"
    .byte   13,10,13,10
.org 510
boot_flag:
    .word   0xAA55

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

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

相关文章

贪心算法的题目

每一步都做出一个局部最优的选择,最终的结果就是全局最优 只有一部分问题才能用贪心算法(严格来讲,一个问题能不能用贪心算法需要证明的) 2022.8.30 蔚来笔试题: 有a个y,b个o,c个u,用这些字母拼成一个字符串&#xf…

Anaconda软件中的 Environments 及 Jupyter Lab使用方法介绍

来源:投稿 作者:助教-Frank 编辑:学姐 本篇是打造舒适的AI开发环境系列-软件篇1 上期内容:学人工智能电脑&主机八大件配置选择指南 本文的重点: (1)Environments使用中如何安装python包.; (2)Jupyter Lab如何在…

Kettle(6):表输入组件——mysql转mysql

1 需求 前面我们已经将Excel中数据抽取到了MySQL的t_user表中。 现在有了新需求,要将MySQL数据库中的 t_user 表中的数据抽取出来,装载到另外一张表 t_user1中。 2 构建Kettle数据流图 2.1 从核心对象的输入组件中,将「表输入」组件拖拽到中…

电脑下载软件用什么软件好?安卓手机下载软件用哪个软件好?IDM下载器说:在做的都是弟弟

大年初五,迎财神,先祝大家新的一年财源滚滚,接下来为大家分享超级经典的IDM下载器,电脑端毫无争议的下载工具,安卓平台idm也是力压群雄,下面就为大家详细分享下: 1:1DM下载器&#x…

微服务统一登陆认证怎么做

[微服务统一登陆认证怎么做}?JWT 无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session…

notepad++在行首行尾添加字符 | 选中列

目录 1、首行/尾行添加字符 1【使用快捷键 CtrlH】 2【^为行首、$为行尾】 3、查找模式选中正则表达式 2、Notepad中列选(竖选) 1、首行/尾行添加字符 1【使用快捷键 CtrlH】 或者鼠标 2【^为行首、$为行尾】 3、查找模式选中正则表达式 2、Notepad中列选(竖…

深度学习入门(一)感知机

该文将介绍感知机A(perceptron)这一算法。感知机是由美国学者Frank Rosenblatt在1957年提出来的。为何我们现在还要学习这一很久以前就有的 算 法 呢 ? 因 为 感 知 机 也 是 作 为 神 经 网 络(深 度 学 习)的起源的算…

详解Windows通过命令行查看电脑连接过的WIfI密码

CONTENT打开命令行进入命令行下的netsh工具查看连接过的WiFi名称指定WiFi名称查看密码在Windows操作系统中(PS:Windows Vista及以后的Windows系统)可以通过命令行工具netsh查看和更改电脑的无线连接设置,包括WiFi。本篇博客将详细…

C语言进阶——文件管理

每当我们写好一段代码运行结束之后,再次运行的时候就会发现,之前在终端上输入的数据都会消失,那么如何把之前输入的数据保存下来呢? 我们一般把数据持久化的方式有把数据存放在磁盘文件中、存放到数据库。打印等方式进行保存。 …

Java---微服务---elasticsearch安装部署

elasticsearch安装部署1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行2.部署kibana2.1.部署2.2.DevTools3.安装IK分词器3.1.在线安装ik插件(较慢)3.2.离线安装ik插件(推荐)1)查看数据卷目录2)下载并解压缩分…

RocketMQ源码本地搭建调试

1 GitHub源码 git clone https://github.com/apache/rocketmq.git导入IDEA,可在命令行执行mvn compile一下,保证源码能够正确编译。本次我使用的master分支的版本-4.8.0。下面我们开始准备启动Namesrv。 2 启动Namesrv 到namesrv模块找到NamesrvStart…

web游戏---canvas基础图形

基础 canvas标签 canvas是H5中新推出的标签,这个提供一块画布,可以在上面绘制图案,通过这种方式制作web游戏带来的性能消耗比操作DOM要小的多。 如果知做浏览器游戏,为了保证性能最好使用画布来制作。 坐标系 画布的坐标系和…

ThinkPadE540重装系统

过年这段时间,帮家里人重装了一下win10系统,在这里记录一下,方便今后还要使用。 先准备两个U盘,一个存储电脑的文件(以防文件丢失),一个空u盘(制作重装系统的) 一.下载镜…

【5-卷积神经网络】北京大学TensorFlow2.0

课程地址:【北京大学】Tensorflow2.0_哔哩哔哩_bilibiliPython3.7和TensorFlow2.1六讲:神经网络计算:神经网络的计算过程,搭建第一个神经网络模型神经网络优化:神经网络的优化方法,掌握学习率、激活函数、损…

Junit单元测试框架【基础篇】

Junit单元测试框架【基础篇】🍎一.Junit单元测试框架🍒1.1 注解🍒1.2 断言🍒1.3 用例执行顺序🍒1.4 测试套件🍉1.4.1 指定类🍉1.4.1 指定包🍒1.5 参数化🍉1.5.1 单参数&a…

VBA提高篇_07 Goto跳转 / Exit退出 /VBA错误处理

文章目录使用逻辑变量控制循环使用Goto语句任意跳转捷径:使用Exit语句跳出结构保险: 使用错误处理改善用户体验On Error Goto Lablex:On Error Resume Next使用逻辑变量控制循环 使用Goto语句任意跳转 经常在错误处理时使用 捷径:使用Exit语句跳出结构 注意: 避免使用while…w…

【C++】AVL树(插入)

文章目录AVL树的概念平衡化旋转右单旋转左单旋转先左后右双旋转先右后左双旋转AVL树的插入根据BST树规则进行节点插入平衡化处理重新连接节点完整的插入函数代码AVL树的验证AVL树的性能AVL树的概念 二叉搜索树虽然可以提高查找的效率,但是二叉搜索树有其自身的缺陷&…

Python与Matlab混合编程案例

前言因为项目需要,需要批处理很多Matlab的.m文件,从每个文件中提取结果合并到一个文件中。 很明显,如果手工统计,几百个文件会累死的。 因此立即想到了Python在批处理方面的优势,因此就在网上找了相关资料,…

C++初阶:vector

文章目录1 vector介绍2 实现vector2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3访问接口2.4 容量接口2.5 修改接口2.5.1 尾插尾删2.5.2 任意位置插入2.5.3 任意位置删除2.6 其他接口1 vector介绍 1 vector是表示可变大小数组的序…

10+编程语言实现云笔记

目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。 上述基本涵盖了当前编程开发所有主流语言。 左侧为前端版本:安卓、iOS、鸿蒙、Flutter、Vue、uni-app。 右侧为服务器端版本:Jav…