现在的位置: 首页 > 综合 > 正文

小议计算机存储之四.软盘引导自已的操作系统

2013年10月26日 ⁄ 综合 ⁄ 共 6909字 ⁄ 字号 评论关闭

小议计算机存储之四.软盘引导自已的操作系统

草木瓜

20080420

一、前言

 前面我们文章曾提到0磁道的概念(《小议计算机存储之二.硬盘存储原理》)。我们也知道
以前的硬盘由于每磁道上最多有63个扇区,外圈疏内圈密,没有很好利用盘面的资源,现在
磁盘内外圈密度相同,磁道上也不再只有63个扇区,物理的CHS 3D寻址也更改为LBA逻辑
寻址方式(线性寻址)。传统意义上的零磁道,其实只是磁道上的一小段,不过有一点是肯定的,
一个硬盘必须有一个唯一的起点。而软盘的道理也是相同的,本节我们须要借助实际示例来
体会读取软盘内容的实际过程。可能有人想问,本来主要内容都是侧重硬盘方面,怎么突然
又扯到软盘这个早已淘汰的东西?
 这里只想提示一下:
 试过用软盘启动盘引导到DOS下吗?
 试过用光盘启动盘引导或安装操作系统吗?
 想过硬盘如何引导操作系统的吗?
 其中包含的思想和技术却是相通的。
 

 <更多相关内容:http://blog.csdn.net/liwei_cmg/archive/2008/03/06/2154833.aspx>
 

二、常用汇编开发工具简介

 MASM (Microsoft Assembler)
 
 是微软公司开发的汇编开发环境,拥有可视化界面。不过在非Windows平台上开发会有所
限制,使用MASM的开发人员必须在windows下进行开发。

 TASM (Turbo Assembler)
 
 是Borland公司开发的汇编开发环境,兼容MASM
 
 NASM (Netwide Assembler)
 
 一个基于GNU GPL的ASM编译器,开放源码的免费汇编开发环境,个人十分喜欢。
 下载地址:http://nasm.sourceforge.net/
 
三、汇编语言发展树(转贴自看雪论坛) 

原文地址,感谢原作者的辛勤劳动
http://blog.csdn.net/N_C_C/archive/2004/09/27/117858.aspx

=============================================================================================== 
1977 ASM86                                                           ||                         
1978 |                                                               ||                         
1979 |-CP/M-86 asm86                                                 ||                         
1980 |                                                               ||                         
1981 +-------------------------------------------------+             ||                         
1982 |-MASM---------+----+                             |             ||                         
1983 | |            |    |                             |             ||                         
1984 | |-NBASM      |    +-------------------+-Incra   |             ||                         
1985 | |            |    |                   |         |             ||                         
1986 | |-ARROWSOFT  |    |                   |         +--A86        ||                         
1987 | |            |    |                   +-WASM       |          || Terse                   
1988 | |            |    +-OptASM                         |          ||                         
1989 TASM-----------)----)----------+                     |          ||                         
1990 |              |    |          |                     |          ||                         
1991 |              |    |          |          GAS        |          ||                         
1992 |              |    |          |                     |          ||                         
1993 |              |    |          |                     |          ||                         
1994 |       +------+    |          |  GEMA, CrossFire    |          ||                         
1995 |       |           +----------)------------------+  +-A386     ||                         
1996 |-------NASM         /-Pass32  |                  |             ||                         
1997 |-TMA   |-------------------+  |                  |-ML          ||                         
1998 |       |-SpASM---+         |  |                  |             ||                         
1999 |       |-GASM    |         |-FASM                |             || HLA                     
2000 +-LZASM |         |         |                     |             ||                         
2001 |       +-GoASM   |         +---------------YASM  |  Osimplay   ||                         
2002 |                 |                               |             ||                         
2003 +-miASMa          +-RosASM                        +-CodeX       ||                         
2004                                           Octasm                ||                         
=============================================================================================== 

四、模拟环境准备

 VM WorkStation 6.0
 Nasm for Windows (nasm-2.02-win32.zip)
 Ultra Edit
 
五、开始模拟

 A. 准备工作

 用VM 创建虚拟机。

 在软驱镜象这里,可以试验下,创建个floppy image,然后用UE二进制打开,你会发现这一个
1440KB的文件,内容全是00。即镜象内容需要是计算机能够识别的二进制代码。

 B. 汇编代码(修改自网上):
 
org 07c00h 
    ; 7c00是BIOS加载bootloader到内存的固定地址,我们这个就是引导程序(bootloader),
    ; 则必须为org 7c00。加载内存完成后,CPU就跳到7c00处执行代码。
  mov ax, cs
  mov ds, ax
  mov es, ax 
    ; 上面三个mov使ds和es两个段寄存器指向与cs相同的段,以便在以后数据操作时能定
    ; 位到正确的位置。
  call DisplayString
    ; 调用显示字符串过程
  jmp $
    ; 无限循环
DisplayString:
  mov ax, ShowMessage
  mov bp, ax
    ; es:bp = 字符串地址
  mov ax, 1301h
    ; ax = 1301h, ah = 13h, al = 01h
  mov bx, 000fh
    ; bx = 00ch, bh = 00h, bl=0fh 即页号为0(值00) 并显示亮红字(值0f)
    ; 页就是将显存分成多份,每份为一页,是一种简化说法。事实上硬件不同略有区别。
    ; 它的产生是因为显存大于内存分配给显存的映射空间。一般在文本模式下只有一页,
    ; 因此这里用得是第0页。在图形模式下需要计算出屏幕上某个位置处在显存的第几页,
    ; 并进行换页操作才能写入指定位置。
  mov cx, 64
    ; cx = 64
  mov dx, 0505h
    ; dx = 0505h, dh =05h, dl = 05h
  int 10h
    ; BIOS 10h 号中断 上面使用了 ah13 功能,接受参数如下:
    ; ah = 13h
    ; al = 写入模式  参数列表见下文
    ; bh = 视频页(显存页)
    ; bl = 属性  参数列表见下文
    ; cx = 重复次数(字符串长度)
    ; dh = 字符串写入的行
    ; dl = 字符串写入的列
    ; es:bp = 指向串的指针
    ; 返回值 无
    ;
  ret
ShowMessage: db "000001111122222333334444455555666667777788888"
times 510-($-$$) db 0
    ; 以0填充剩下的空间,使生成的二进制代码文件大小为512字节
    ; 510-($-$$) 表示一个数值,即times重复的次数
    ; $表示当前行汇编后的地址 $$ 一个节(section)开始处汇编后的地址,本代码只有一个节
    ; ($-$$) 即表示到本代码行,所占用的字节数
dw 0xaa55
    ; 结束标志

;bl = 属性 列表

;HEX    BIN        COLOR
;0      0000      black
;1      0001      blue
;2      0010      green
;3      0011      cyan
;4      0100      red
;5      0101      magenta
;6      0110      brown
;7      0111      light gray
;8      1000      dark gray
;9      1001      light blue
;A      1010      light green
;B      1011      light cyan
;C      1100      light red
;D      1101      light magenta
;E      1110      yellow
;F      1111      white

;al = write mode:
;    bit 0: update cursor after writing;
;    bit 1: string contains attributes.

 上面代码复制保存为first.asm
 
 C. 编译
 
 在所以目录,DOS下执行编译操作:
 G:/Liwei/Disk/tools/nasm>nasm first.asm -o boot.img
 
 D. 模拟运行
 
 VM 在floppy use floppy image 选项,选择boot.img文件,设置自软盘启动。
 显示屏幕白字:000001111122222333334444455555666667777788888,不足64位以空格
填充,注意此时CPU利用率为100%。我们引导的“操作系统”成功了。

六、补充说明

 我们知道,当打开计算机电源时,先进行加电自检(POST),然后寻找启动盘,如果选择从软盘
启动,计算机则会检查软盘的0面0磁道1扇区,如果发现此扇区以0xaa55结束。则BIOS认为此
扇区是一个可引导扇区,即Boot Sector。(当然正确的Boot Sector除了以0xaa55结束外还应该包
含512字节以内的执行代码。)
 BIOS如发现Boot Sector,会将512字节内容加载到内存0000:7c00处,然后跳转0000:7c00处将
控制权交给这段引导代码。至此计算机不再由BIOS中固有程序来控制,而软盘上的这段内容开始
接管计算机的控制权了。
 我们用UltraEdit打开刚才的boot.img文件,清晰可见最后文件内容如下:
 000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ; ..............U 
 即为Boot Sector的标志内容。总大小01f0h+16(每行16个字节)=512。
 
七、机器加电引导过程(整理自网络《操作系统引导过程》原创:monkeyfu)

 1.加电
 
 2.电源供电稳定后,电源会传给8284A时钟生成器“Power Good”低电位信号,随后8284A会输出
 有效的RESET信号,使CPU复位,CS:IP = FFFF:0000。CPU此时执行一条jmp far addr类似指令,
 跳转到实际BIOS映射代码的位置,开始执行BIOS代码。
 
 3.BIOS关闭中断开始自检,检测计算机基本设备(CPU内部寄存器,BIOS芯片字节检查,8237
 DMA控制器,基本RMA(0到32K)等),这些基本设备都是十分重要的,一旦自检发现问题,即会
 停机。
 
 4.BIOS基本自检完成后,初始化8259可编程中断控制器并设置BIOS的8个主要中断向量
 (INT 10H - INT 17H)。初始化并测试CRT视频接口以及显存,正常后执行其内部的显卡驱动,
 这段代码存放于c0000h,主要是初始化显卡,完成后在显示器打印显卡相关信息。接着BIOS
 检查其他设备:8259中断控制器,8253定时器,键盘(复位和卡键),扩展I/O。设置硬件中断
 向量和扩展RAM测试(0到32K以外的整个RAM空间),然后BIOS会查找其他设备的ROM并
 执行。接着进行ROM-BASIC的字节检查,测试磁盘驱动器,测试打印机端口和RS-232,并设
 置地址。最后打开NMI(不可屏蔽中断),再调用INT 19H进行自举。
 这一阶段自检如果发生错误,系统会判断其为一般性错误,并提示相关信息。其间,BIOS会
 将检测收集到的数据保存在内存低(1K到2K)区域,并将BIOS中断向量表及BIOS程序运行所需
 要堆栈(stack)保存在内存低(0K到1K)区域。
 
 5.系统调用INT 19H进行自举,寻找启动设备(如:软驱,硬盘,光驱等)。找到后系统读取
 启动设备的0号逻辑扇区(如软盘是0面0道1扇区整个内容),并将读取的内容放到内存地址为
 0000:7C00的地方。当然,如找不到,BIOS就会调用INT 18H,给出相应的提示信息,然后进
 入ROM-BASIC。
 至此,BIOS引导程序结束,CPU开始执行0000:7C00处的代码。
 
 也就是完成BIOS引导后,上述我们测试的代码就接管了计算机的控制权,只不过我们的代码
 十分原始和简陋,不过道理最阐述的十分明了。
 
 有了软盘启动系统的基础,后续的文章将着重讨论硬盘的启动过程。

 

【上篇】
【下篇】

抱歉!评论已关闭.