打造操作系统(1.1)引导扇区
来源:互联网 发布:java在线培训系统源码 编辑:程序博客网 时间:2024/05/12 23:33
操作系统,看起来是一个十分高大上的话题。其实,我们自己也可以尝试着捣鼓一个,这其实不是想象的那么困难,只是自己不知道怎么做而已。
相比你已经知道了从计算机上电之后,操作系统加载直至出现鼠标,登录,显示出桌面这个过程。如果不知道,那也没关系,笔者为你简单介绍一下这个过程。
上电之后,计算机主板的BIOS会进行一系列的检查(包括检查内存、硬盘等等),假设一切检查正常通过,那么,接下来BIOS会在内存中设定一些程序(一些简单的驱动程序),然后,BIOS读取启动设备的引导扇区,加载引导程序,执行。然后,引导程序负责了后面加载操作系统的内核(或者是一个loader,再由loader加载内核)。之后,内核开始运行。。。后面暂不涉及。我们现在关注第一个程序——引导扇区部分。
引导扇区,简单来说(在这里)就是启动驱动器的第一个扇区(512字节大小)并且其最后两个字节分别是 0x55,0xAA,这样,BIOS就会认为它是一个引导扇区并尝试加载运行。那么,我们只要将我们的程序写入到第一个扇区,并以 0x55,0xAA两个字节结尾,那么就可以用来启动我们的计算机了。
不过,这里还有一个问题,就是我们的引导扇区会被加载到哪里。在BIOS加载引导扇区的时候,会将其加载到内存的0x7c00处,然后开始执行该处代码。那么,我们在写代码的时候,也应该假设我们的程序会被加载到0x7c00方可得出正确的结果。
好了,我们开始写一个引导扇区吧。
首先准备一些工具:nasm(汇编语言编译器),bochs(模拟器,可以理解为虚拟机。笔者使用的是2.1版本),以及floppywriter(笔者自己写的一个将引导扇区写入软盘镜像的程序)
以上文件可以在http://pan.baidu.com/s/1qWLjhqW下载(本文所对应的一个压缩文件为01a.zip,其中包含文中所有代码)。
好了。我们先编写代码吧。
org0x7c00jmp entrydb0x90entry:mov ax,0;设置段寄存器mov ss,axmov ds,axmov es,axmov sp,0x7c00;设置栈顶指针mov si,msg;要打印的字符串所在地址putloop:mov al,[si];取出一个字符addsi,1;字符串指针后移cmp al,0;取出的字符是否为'\0'jehalt;如果是,则挂起系统;不是则打印字符mov ah,0x0e;黑底白字mov bx,15int 0x10;调用已有的中断程序打印字符jmpputloop;继续打印halt:hltjmphaltmsg:db"hello os world!"db0times510-($-$$)db0db0x55,0xaa
以上代码就是一个十分简单的引导扇区。代码。可能你已经迫不及待想运行看看效果了。好吧,先试试吧,把上面的代码另存为boot.asm,然后在命令行下跳到其所在目录,输入命令
nasm boot.asm -o boot.bin如果没有任何以外的话,你能够看到生成的boot.bin文件,大小为512字节,0x55,0xAA结尾,刚好符合引导扇区标准。然后将其写入软盘镜像。
floppywriter boot.bin helloos.img其中floppywriter是笔者写的一个程序,能将boot.bin写入到helloos.img这个软盘镜像的第一个扇区。好了,准备就绪。我们来运行一下。在本文的附件(01a.zip)中有一个这样的文件:
在你装好bochs后便会被自动关联,双击启动模拟器,接下来就是见证奇迹的时刻,我们的引导扇区在模拟器中成功引导。
好了。今天就到此为止吧,也许你对上面的代码一知半解,也许你还不知道bochs怎么配置,也许你还不知道bochsrc.bxrc那个文件是什么,那你就打开看看吧,探索一下吧,或许你有新的收获。笔者也会在接下来的文章中一一揭秘。敬请期待。
欲知后事如何,请看下回分解。(汇编代码到底是什么意思?floppywriter是怎么写的?我不想用模拟器,我想用它启动真实电脑,我想用U盘启动。。。)敬请期待。
谢谢,如有疑惑,可在评论中说明,如有疏漏,还请不吝赐教。
- 打造操作系统(1.1)引导扇区
- 打造操作系统(1.2)引导扇区中的疑问
- 打造操作系统(1.3)如何写入引导扇区
- 打造操作系统(1.4)将引导扇区写入U盘
- 操作系统引导扇区
- 操作系统:实现引导扇区
- 操作系统编写之引导扇区
- 自己动手写操作系统-编写引导扇区
- 操作系统:使用AT&T实现引导扇区
- DBR(分区引导扇区)
- 1.1_30天自制操作系统笔记_第一天_引导扇区
- 开发操作系统实践(三)——LinDos引导扇区内容及运行环境搭建
- 开发操作系统实践(五)——新的引导扇区代码
- 自己动手写操作系统(一)linux下安装bochs,编译引导扇区并启动bochs虚拟机
- 引导扇区
- 引导扇区
- 把自己的操作系统写入U盘(FAT32)引导扇区
- 操作系统1——引导扇区的理解
- mapreduce shuffle分析
- JavaBean
- 一些Python脚本
- VC中菜单的相关知识
- java 判断string数组中是否有某个字符串
- 打造操作系统(1.1)引导扇区
- 基于DM642的MPEG-2视频压缩编码(三)
- Servlet和jsp的区别
- 保存图片
- Android里Service的bindService()和startService()混合使用深入分析
- 数字三角形问题(DP)
- Android中SQLite应用详解
- Head First PHP &MySQL学习笔记
- SQLite数据库简介