计算机的启动过程

参考书籍:《操作系统 真象还原》
环境的搭建:bochs的安装和配置02


1、地址总线和内存的关系

在正式谈启动流程之前,有一个概念必须清楚:地址总线和内存的关系。
假如地址总线是20根,那么内存是 2 20 = 1 M 2^{20}=1M 。这样的描述不准确。
假如地址总线是20根,那么最多可以访问1M的内存。这样的描述才准确。
我们可以将内存想象成一个个格格,每个格格便是一个大小。20根地址线通过不同的排列组合便能映射到不同的内存格格上。但是不能将地址线所有的排列组合用完,因为,我还需要一些映射到寄存器,外设等。地址总线和内存是两个东西,地址总线映射到内存上,便能访存了。同样,地址线还要映射到其他地方
在这里插入图片描述

2、启动流程

在这里插入图片描述上面最后写的不对。
看到第三章的时候,MBR要加载loader,loader加载内核。

上面这张图,显示了开机流程。具体的文字描述我就不敲出来了。
买个平板除了玩,主要是用来学习的嘛~
上面是硬盘里只用一个系统。如果有两个系统,那又是什么情况??

《鸟哥私房菜》中,对这部分有介绍。
同样,还是将MBR导入内存。但是这个MBR有菜单选择功能。选择不同,便能进入不同的系统。
我们可以去 /boot/grub 下去看一看,虽然,不一定能看懂。
启动流程:http://linux.vbird.org/linux_basic/0510osloader.php
在这里插入图片描述
B站中启动流程介绍:https://www.bilibili.com/video/av18156598/?p=103
里面有一个很详细的流程图。但是我没有B站的会员,便不截图了。
这里面有一个很有趣的问题:linux中没有硬盘的驱动。但是硬盘的驱动存储在硬盘中。即“没有硬盘驱动,便读不了硬盘。要读硬盘,但硬盘的驱动在在硬盘中”。这就像要用钥匙才能打开门,但是要是又在门内。系统采用的办法是,虚拟文件系统。具体的细节我不知道。也不清楚为啥不把硬盘的驱动放入内核。

3、有趣的实验

我们在硬盘的最开始位置(MBR)写入一个显示程序。
这样,在没有操作系统的情况下,计算机启动的时候,BIOS加载MBR,便在屏幕上有所显示。
汇编语言方面,建议先阅读练习王爽的《汇编语言》。
代码在github上有,下面有两个链接:
《操作系统真象还原》一书实现的系统代码 :https://github.com/seaswalker/tiny-os
《操作系统真象还原 》book上所有code / 操作系统真相还原 :https://github.com/fuujiro/OS_lab
代码

;主引导程序 
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs      
   mov ds,ax
   mov es,ax
   mov ss,ax
   mov fs,ax
   mov sp,0x7c00

; 清屏 利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10   功能号:0x06	   功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
   mov     ax, 0x600
   mov     bx, 0x700
   mov     cx, 0           ; 左上角: (0, 0)
   mov     dx, 0x184f	   ; 右下角: (80,25),
			   ; VGA文本模式中,一行只能容纳80个字符,共25行。
			   ; 下标从0开始,所以0x18=24,0x4f=79
   int     0x10            ; int 0x10

;;;;;;;;;    下面这三行代码是获取光标位置    ;;;;;;;;;
;.get_cursor获取当前光标位置,在光标位置处打印字符.
   mov ah, 3		; 输入: 3号子功能是获取光标位置,需要存入ah寄存器
   mov bh, 0		; bh寄存器存储的是待获取光标的页号

   int 0x10		; 输出: ch=光标开始行,cl=光标结束行
			; dh=光标所在行号,dl=光标所在列号

;;;;;;;;;    获取光标位置结束    ;;;;;;;;;;;;;;;;

;;;;;;;;;     打印字符串    ;;;;;;;;;;;
   ;还是用10h中断,不过这次是调用13号子功能打印字符串
   mov ax, message 
   mov bp, ax		; es:bp 为串首地址, es此时同cs一致,
			; 开头时已经为sreg初始化

   ; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略
   mov cx, 5		; cx 为串长度,不包括结束符0的字符个数
   mov ax, 0x1301	; 子功能号13是显示字符及属性,要存入ah寄存器,
			; al设置写字符方式 ah=01: 显示字符串,光标跟随移动
   mov bx, 0x2		; bh存储要显示的页号,此处是第0页,
			; bl中是字符属性, 属性黑底绿字(bl = 02h)
   int 0x10		; 执行BIOS 0x10 号中断
;;;;;;;;;      打字字符串结束	 ;;;;;;;;;;;;;;;

   jmp $		; 使程序悬停在此

   message db "1 MBR"
   times 510-($-$$) db 0
db 0x55,0xaa

然后编译,放入硬盘

nasm -o mbr.bin mbr.S
#ls -alh mbr.bin #-rw-r--r-- 1 dacao dacao 512 7月   7 15:22 mbr.bin
#file mbr.bin #查看文件类型:mbr.bin: DOS/MBR boot sector。有意思funny
dd if=/your__path/mbr.bin of=/your__path/bochs/hd60M.img bs=512 count=l
conv=notrunc

启动bochs测试一下,欧了。
在这里插入图片描述


介绍结束了。我去洗衣服。
能找个媳妇帮我洗衣服就好了~
说不定我还要洗两个人的衣服,算了算了。。。

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/95031961