小议计算机存储之四.软盘引导自已的操作系统
来源:互联网 发布:sql语句实例 编辑:程序博客网 时间:2024/05/04 03:01
小议计算机存储之四.软盘引导自已的操作系统
草木瓜
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引导后,上述我们测试的代码就接管了计算机的控制权,只不过我们的代码
十分原始和简陋,不过道理最阐述的十分明了。
有了软盘启动系统的基础,后续的文章将着重讨论硬盘的启动过程。
- 小议计算机存储之四.软盘引导自已的操作系统
- 小议计算机存储之五.硬盘引导区与分区表
- 小议计算机存储之六.操作系统启动过程
- 从软盘引导操作系统
- 小议计算机存储之三.硬盘的寻址方式
- 小议计算机存储之二.硬盘存储原理
- 专注于操作系统26之从软盘引导boot,并加载loader
- 计算机操作系统之存储管理
- 小议计算机存储之一.存储技术
- 制作可引导的启动软盘
- 硬盘和软盘的引导扇区结构
- 硬盘和软盘的引导扇区结构
- 计算机操作系统之线程(四)
- 小议操作系统里的锁
- 操作系统之引导
- FAT12格式引导软盘
- 计算机操作系统之四:进程的互斥同步与通信
- 制作带有 GRUB 引导功能的软盘镜像文件
- 用免费的SQL Prompt提高开发能力
- 小议计算机存储之三.硬盘的寻址方式
- 朋友
- c#中用windows api函数修改内存数据
- 用SQLServer处理数据层错误
- 小议计算机存储之四.软盘引导自已的操作系统
- 郁闷啊。。
- 了解DML:SQL Server 2005中的新OUTPUT特性
- 在SQL Server中用范围连接查找值
- 网页色彩搭配技巧
- 今天发现自己的array类太慢
- 应用SQL Server 2005内置工具建立审查系统
- 把xls格式数据导入到oracle中
- 微软升级SQL Server 2005