实验1:操作系统的引导

实验的准备工作操作

  • 解压源码用tar -zxvf hit-oslab-linux-20110823.tar.gz 可以使用-C来指定解压路径,tar -zxvf hit-oslab-linux-20110823.tar.gz -C [path]
  • 编译linux-0.11的源码,在linux-0.11的文件夹下运行make all或者make
  • 在oslab文件目录下运行./run运行bochs 中的linux-0.11
  • 访问linux-0.11里面的文件,使用sudo ./mount-hdc来装载硬盘,然后在hdc中访问,卸载硬盘sudo umount hdc

实验内容

  1. 阅读《Linux 内核完全注释》的第 6 章,对计算机和 Linux 0.11 的引导过程进行初步的了解;
  2. 按照下面的要求改写 0.11 的引导程序 bootsect.s
  3. 有兴趣同学可以做做进入保护模式前的设置程序 setup.s。

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

  • bootsect.s 能在屏幕上打印一段提示信息“XXX is booting…”,其中 XXX 是你给自己的操作系统起的名字,也可以显示一个特色 logo,以表示自己操作系统的与众不同。

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

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

bootsect.s的修改

bootsect.s的功能是将自己从0x7c00处移动到了0x90000处。显示字符loding system ...,然后将磁盘上的setup.ssystem模块加载到内存中来,最后跳转到setup.s所在的位置,执行setup.s

实验内容:

  1. bootsect.s 能在屏幕上打印一段提示信息“XXX is booting…”;

  2. bootsect.s 能完成 setup.s 的载入,并跳转到 setup.s 开始地址执行。

1. bootsect.s 打印字符

首先使用BIOS0x10号中断的子功能0x03获得光标的位置,然后再利用BIOS0x10号中断的子功能0x13打印字符到屏幕上。代码如下:

entry start
start:  mov ah,#0x03    ! read cursor posxor    bh,bhint    0x10mov cx,#26mov bl,#07mov bp,#msg !寻址es:bpmov ax,#0x7c0 !因为bootsect的代码放在0x7c00处mov es,axmov ax,#0x1301int 0x10
msg:.byte 13,10     !回车和换行.ascii "HaoOS is loading ...".byte 13,10,13,10.org 510
boot_flag:.word 0xAA55

BIOS中断指令int前面的代码都是为中断设置一些参数。最后的三行是因为bootsect的大小必须为512字节,所以添加到后面使编译后的文件大小为512字节,最后两个字节为0xAA55

2. 载入setup并跳转

代码如下:

entry start
start:  mov ah,#0x03    ! read cursor posxor    bh,bhint    0x10mov cx,#26mov bl,#07mov bp,#msg !寻址es:bpmov ax,#0x7c0 !因为bootsect的代码放在0x7c00处mov es,axmov ax,#0x1301int 0x10load_setup:mov  dx,#0x0000      ! drive 0, head 0mov    cx,#0x0002      ! sector 2, track 0mov  bx,#0x0200      ! address = 512, in INITSEGmov ax,#0x0200+4    ! service 2, nr of sectorsint  0x13            ! read itjmpi 0,#0x07e0      ! jump to setup 0x07e0 = 0x07c0 + 0x0200! there is set cs to 0x07e0, in the setup the cs be used.msg:.byte 13,10     !回车和换行.ascii "HaoOS is loading ...".byte 13,10,13,10.org 510
boot_flag:.word 0xAA55

在第一部分的代码中添加了load_step的部分,这一部分利用BIOS0x13中断读入setup.s然后利用jmpi跳转到setup.s模块开始的地方。

注意

由于在bootsect中我们并没有移动bootsect的位置,所以在跳转的时候的地址是0x07c0 + 0x0200 = 0x07e0,而不是和linux-0.11中一样跳转到0x90200处。

setup的修改

setup的主要功能是使用BIOS中断读取系统参数,然后放到内存中的指定位置,同时将cpu从实模式转化到保护模式。

实验内容

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

1. setup向屏幕输出字符

这一部分代码和bootsect部分类似。有的部分需要修改,比如es寄存器的指向,还有打印的字符的长度。

2. 获取硬件参数并打印

这里如何获取硬件参数,既可以参考linux-0.11的源码,也可以自己查看BIOS中断的手册。我在这里比较迷惑的是如何将获得的参数打印到屏幕上?看了老师的实现后,发现还是比较简单的,主要问题是自己对汇编语言还是不够熟悉。老师的代码如下(大体的思路是先读参数,然后获取光标,打印,获取光标,打印…):

INITSEG  = 0x9000
entry _start
_start:
! Print "NOW we are in SETUP"mov ah,#0x03xor bh,bhint 0x10mov cx,#25mov bx,#0x0007mov bp,#msg2mov ax,csmov es,axmov ax,#0x1301int 0x10mov ax,csmov es,ax
! init ss:spmov ax,#INITSEGmov ss,axmov sp,#0xFF00! Get Paramsmov ax,#INITSEGmov ds,axmov ah,#0x03xor bh,bhint 0x10mov [0],dxmov ah,#0x88int 0x15mov [2],ax! 这里是如何把参数保存到数据段里面的mov ax,#0x0000mov ds,axlds si,[4*0x41]mov ax,#INITSEGmov es,axmov di,#0x0004mov cx,#0x10repmovsb! Be Ready to Printmov ax,csmov es,axmov ax,#INITSEGmov ds,ax! Cursor Positionmov ah,#0x03xor bh,bhint 0x10mov cx,#18mov bx,#0x0007mov bp,#msg_cursormov ax,#0x1301int 0x10mov dx,[0]call    print_hex
! Memory Sizemov ah,#0x03xor bh,bhint 0x10mov cx,#14mov bx,#0x0007mov bp,#msg_memorymov ax,#0x1301int 0x10mov dx,[2]call    print_hex
! Add KBmov ah,#0x03xor bh,bhint 0x10mov cx,#2mov bx,#0x0007mov bp,#msg_kbmov ax,#0x1301int 0x10
! Cylesmov ah,#0x03xor bh,bhint 0x10mov cx,#7mov bx,#0x0007mov bp,#msg_cylesmov ax,#0x1301int 0x10mov dx,[4]call    print_hex
! Headsmov ah,#0x03xor bh,bhint 0x10mov cx,#8mov bx,#0x0007mov bp,#msg_headsmov ax,#0x1301int 0x10mov dx,[6]call    print_hex
! Secotrsmov ah,#0x03xor bh,bhint 0x10mov cx,#10mov bx,#0x0007mov bp,#msg_sectorsmov ax,#0x1301int 0x10mov dx,[12]call    print_hexinf_loop:jmp inf_loopprint_hex:mov    cx,#4
print_digit:rol    dx,#4mov    ax,#0xe0fand    al,dladd    al,#0x30cmp    al,#0x3ajl     outpadd    al,#0x07
outp:int    0x10loop   print_digitret
print_nl:mov    ax,#0xe0d     ! CRint    0x10mov    al,#0xa     ! LFint    0x10retmsg2:.byte 13,10.ascii "NOW we are in SETUP".byte 13,10,13,10
msg_cursor:.byte 13,10.ascii "Cursor position:"
msg_memory:.byte 13,10.ascii "Memory Size:"
msg_cyles:.byte 13,10.ascii "Cyls:"
msg_heads:.byte 13,10.ascii "Heads:"
msg_sectors:.byte 13,10.ascii "Sectors:"
msg_kb:.ascii "KB".org 510
boot_flag:.word 0xAA55

这里如何使用的bootsect还是上个实验的代码的话,需要把前面的INITSEG改成0x07e0

疑问:

在上面代码的获取参数部分,不明白是如何把数据保存到特定位置的?如何循环的?

mov ax,#0x0000
mov ds,ax
lds si,[4*0x41]
mov ax,#INITSEG
mov es,ax
mov di,#0x0004
mov cx,#0x10
rep
movsb

试着解释:在这里是从原地址到目的地址移动1字节的内容,这里设置cs=16,意思是移动16次,共16字节。

实验1:操作系统的引导相关推荐

  1. 实验2 操作系统的引导

    操作系统的引导 实验目的 熟悉hit-oslab实验环境: 建立对操作系统引导过程的深入认识: 掌握操作系统的基本开发过程: 能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱. 实验内容 此次实 ...

  2. HIT oslab之实验2 操作系统的引导(bootsect.s + setup.s)

    零.实验1 实验环境搭建 1.参考教程 2.遇到的问题 (1)dokg: 错误:另外一个进程已经为 dpkg fronted lock 加锁 解决办法:重启,解释 3.补充:查看ubuntu 位数 u ...

  3. 哈工大操作系统实验一——操作系统的引导

    写在前面 哈尔滨工业大学李治军老师的<操作系统>课程实验,相关资源: 哈工大操作系统实验手册 实验资源与参考 不配环境懒人福利:实验楼 在线课程:操作系统,李治军,哈工大(网易云课堂) 参 ...

  4. Liunx操作系统的引导过程(系统操作引导过程,模拟MBR,GRUB故障,root密码遗忘解决,优化启动过程 ,运行级别的分类)

    文章目录 Liunx操作系统的引导过程 引导过程 Blos自检 MBR 引导 grub引导菜单(Boot Loader) 内核启动 启动init进程,依据inittab文件设定运行级别 系统初始化进程 ...

  5. 哈工大-操作系统的引导

    操作系统的引导 1. 课程说明 本实验是 操作系统之基础 - 网易云课堂 课程的配套实验,推荐大家进行实验之前先学习相关课程: L2 开始揭开钢琴的盖子 L3 操作系统启动 Tips:点击上方文字中的 ...

  6. 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作

    3月13日上午,陈春生副校长来到实验中间调研引导工作.实验中间主任方向明.副主任黄冬久.分析测试中间主任詹寿发以及各职能科室副科级以上干部参加了调研座谈会. 座谈会上,方向明主任先介绍了实验中间重要职 ...

  7. 在Linux系统下初始化COM组件,Linux操作系统的引导和初始化.doc

    Linux操作系统的引导和初始化 系统引导和初始化概述 相关代码(引导扇区的程序及其辅助程序,以x86体系为例): \linux-2.4.22\arch\i386\boot\bootsect.S:Li ...

  8. 计算机病毒引导实验,《计算机病毒》实验一:引导型病毒实验

    <计算机病毒与防护技术>课程必做实验的实验报告,内涵完整程序代码.实验一:引导型病毒实验. 实验报告 题目:引导型病毒实验 姓名:王宇航 学号:09283020 实验环境:VMWare W ...

  9. linux操作系统的引导过程,深入了解linux操作系统引导过程详解

    Linux操作系统的引导过程:开机自检.mbr引导.grub菜单.加载linux内核.init进程初始化. 1.开机自检,检测硬件后根据启动顺序将控制权交给本机硬盘 2.mbr引导,根据硬盘的主引导记 ...

最新文章

  1. kylin源码调试_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)
  2. 经典的JAVA面试题
  3. 快来学习怎么可视化监控你的Python爬虫
  4. cnn 回归 坐标 特征图_论文笔记 | CNN 是怎么学到图片绝对位置信息的
  5. 基于matlab移位寄存器,基于Matlab产生m序列(DOC X页).doc
  6. Windows Server 2012 将资源发布到 AD DS
  7. Tricks(二十七)—— 如何在不使用 np.argsort 的情况下获得排序后元素的下标
  8. wemall app商城源码Android中ViewHolder详细解释
  9. 金属网材质贴图素材推荐 精品 小众
  10. 风格迁移篇----艺术风格转换的内容与风格解构
  11. win7下ApmServ启动失败问题
  12. 搜索引擎优化(step-by-step)
  13. 不忘初心,勇攀高峰!低代码公司流辰信息紧抓机遇,努力超前冲!
  14. EM期望最大化算法实现二项混合分布与高斯混合分布
  15. python基础知识补充
  16. 华为交换机导入配置_将一个华为交换机的配置导入另一个已有配置的交换机中...
  17. 多元统计分析及R语言建模
  18. 如何给小朋友解释单摆运动_单摆运动
  19. weblogic10.3.6补丁升级
  20. 发现一款不错的快速开发平台

热门文章

  1. java 递归查找,Java程序使用递归查找自然数之和
  2. Zepto的基础使用
  3. 【181114】VC++制作木质相框源代码
  4. C语言编程题:话费套餐问题
  5. 软件 | Markdown更改图片默认大小
  6. Oracle基础知识总结
  7. 战地一服务器性能唱,流畅度爆表!PC《战地5》服务器TickRate为主机版2倍
  8. 喜欢玩游戏的发烧友不要错过了,五款高续航低延迟蓝牙耳机为你量身打造
  9. java reactor模式例子_回顾 Reactor 模式
  10. 测试开发需要学习的知识结构