[原创]操作系统编写详解<二>
- 博客分类:
- 技术杂绘
[原创]操作系统编写详解
2010年08月09日
前一篇文章中我们学习了写引导程序,可是,引导程序大小不能超过512B,将运行代码写到引导程序里并不是不行,但是大小限制会让你的操作系统异常的"精简"
所以一般的操作系统(包括Linux)都是使用一种叫二次加载的方法,也就是写一个及其简单的Boot引导程序,它只做两件事:一是初始化段寄存器(mov ds,ax....),二是从软盘第二扇区读入真正的内核加载到内存指定位置并用1个Jmp跳转到指定位置并执行内核
到回来看看Linux,Linux0.11的Boot文件夹里有Boot.s与Head.s,boot.s的作用就是引导,并跳转至Head,Head才开始进入保护模式,最后跳转至Main.c(init/main.c,当然以编译为.o,并以链接到Tool/System)的,下面是一部分的Linux0.11 Makefile代码
Image: boot/boot tools/system tools/build
tools/build boot/boot tools/system > Image
sync
boot/head.o: boot/head.s
tools/system:boot/head.o init/main.o \
$(ARCHIVES) $(LIBS)
$(LD) $(LDFLAGS) boot/head.o init/main.o \
$(ARCHIVES) \
$(LIBS) \
-o tools/system > System.map
boot/boot:boot/boot.s tools/system
(echo -n "SYSSIZE = (";ls -l tools/system | grep system \
| cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s
cat boot/boot.s >> tmp.s
$(AS86) -o boot/boot.o tmp.s
rm -f tmp.s
$(LD86) -s -o boot/boot boot/boot.o
可以看到head.o与main.o被链接到tool/system,而boot只是负责引导,经过一连的Jmp之后,main函数开始初始化并运行Kernel,这就是二次加载
考虑下面的程序代码
;boot.asm
[ORG 0]
jmp 07c0h:start
start:
;设置段寄存器
mov ax,cs
mov ds,ax
mov es,ax
reset: ;重置软盘驱动器
mov ax,0
mov dl,0 ;Driver=0(=A)
int 31h
jc reset ;if error reset again
read:
mov ax,1000h ;ES:BX=1000:0000
mov es,ax
mov bx,0
mov ah,2 ;读取磁盘数据到地址ES:BX
mov al,5 ;读取5个扇区
mov ch,0 ;柱面0
mov cl,2 ;第二扇区,即为读入文件所在扇区
mov dh,0 ;Head=0
mov dl,0 ;Driver=0
int 13h ;开始读
jc read ;if error try again
jmp 1000h:0000 ;跳转到装载的程序处开始执行
times 510-($-$$) db 0
dw 0AA55h ;结束标志
;Kernel.asm
[ORG 0]
jmp start2
msg db 'Here is Xue s Operating System!OK,Here we go',$0 ;打印字符串定义
start2:
;设置段寄存器
mov ax,cs
mov ds,ax
mov es,ax
mov si,msg
print:
lodsb
cmp al,0 ;al为0?
je hang ;if al=0 then 挂起
mov ah,0Eh ;打印
mov bx,7
int 10h
jmp print ;打印下一字符
hang:
jmp hang ;挂起,即无限循环
times 510-($-$$) db 0
dw 0AA55h ;结束标志
编译
nasm boot.asm -o boot.bin
nasm kernel.asm -o kernel.bin
可以发现,boot.bin在引导后,就从软盘第二扇区将Kernel.bin读取并装入内存,接下来跳转并执行Kernel.bin,而Kernel.bin便在屏幕上打印一字符串
在这里要用到一个特殊工具:Partcopy 它能将文件写入软盘映像指定位置
available at:http://newworklife.spaces.live.com/blog/cns!27EB11C0372B9EB1!348.entry
编译好两个bin后,就要将它们写入磁盘
用法
partcopy boot.bin 0 200 floppy.img 0
partcopy kernel.bin 0 200 floppy.img 200
运行后,会发现当前目录多了个floppy.img,那正是我们需要的软盘映像文件
我们还需要一个软件:Bochs
这是个虚拟机,不用Vitrual Box是因为它引导软盘映像的成功率低
available at:http://sourceforge.net/projects/bochs/
它需要一个Bochsrc.bxrc文件作为配置
在floppy.img同目录下创建一个Bochsrc.bxrc
右键->编辑,写入
###############################################################
# bochsrc.bxrc file for Xue's OS
#(c)copyright xuejin 2010
#All right reserved
###############################################################
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
floppya: 1_44=C:\FLOPPY.IMG, status=inserted
boot: a
log: bochsout.txt
mouse: enabled=0
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
保存,然后运行,
我们会发现Here is Xue s Operating System!OK,Here we go已被打印出来,说明二次装载成功了,ye~~~
发表评论
-
QTP录制Delphi客户端
2012-01-20 01:35 737QTP录制Delphi客户端 2010 ... -
服务器的w3wp.exe进程占用cpu和内存过多的问题
2012-01-20 01:34 570服务器的w3wp.exe进程占用cpu和内存过多的问题 20 ... -
2010年6月PHP面试题
2012-01-20 01:34 7222010年6月PHP面试题 2010 ... -
笑到肚子疼
2012-01-19 09:24 549笑到肚子疼 2011年11月02日 1 -
剪色坊北京直营店(呼市)--死人的一次烫发经历----剪色坊北京直营店(呼市)
2012-01-19 09:24 635剪色坊北京直营店(呼市)--死人的一次烫发经历----剪色坊北 ... -
最真的爱(转)
2012-01-19 09:24 481最真的爱(转) 2011年11月25日 -
如何做好日用品的直销?
2012-01-19 09:24 526如何做好日用品的直销? 2011年11月22日 濡 -
delphi经典技艺
2012-01-17 01:59 564delphi经典技艺 2012年01月10日 http: ... -
请列出你在从事DBA生涯中,最难以忘怀的一次误操作(1)
2012-01-17 01:59 608请列出你在从事DBA生涯中,最难以忘怀的一次误操作(1) 2 ... -
config配置中文解释
2012-01-17 01:59 820config配置中文解释 2011年04月02日 con ... -
探索C++的秘密之一详解extern "C"
2012-01-15 21:15 498探索C++的秘密之一详解extern "C" ... -
库文件和系统调用的区别
2012-01-15 21:15 517库文件和系统调用的区 ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-15 21:15 55110] 建立C帝国(GDAL编译安 ... -
HK-2000数据采集仪WEB服务器BOA的移植方法
2012-01-15 21:15 628HK-2000数据采集仪WEB服务器BOA的移植方法 200 ... -
如何为linux嵌入式开发建立交叉编译环境(2.4内核)
2012-01-15 21:15 539如何为linux嵌入式开发建立交叉编译环境(2.4内核) 2 ...
相关推荐
<br>十二:注册表备份和恢复 <br>十三:详细的xp修复控制台命令 <br>十四:3721如何彻底关闭 <br>十五:讲解Windows XP无人值守自动安装 <br>十六:多操作系统共存技巧 <br>十七:计算机启动过程详解 <br>十八:...
注册表常用操作 <br>修改及备份注册表<br> 如何远程编辑注册表 <br>注册表被破坏的现象及原因 使用VB读取和修改注册表 <br>用VB函数轻松访问系统注册表 <br>剖析恶意网页修改注册表的十二种现象 <br> <br>注册表-...
TCP/IP和Internet 8<br>2.1 一段历史 8<br>2.1.1 ARPANET 8<br>2.1.2 TCP/IP 9<br>2.1.3 国家科学基金会(NSF) 9<br>2.1.4 当今的Internet 12<br>2.2 RFC和标准化过程 12<br>2.2.1 获得RFC 13<br>2.2.2 RFC索引 13<br...
项目名称及描述(这是我从网上下载并整理的,非原创)<br>petshop4.0 详解之一(系统架构设计<br>petshop4.0 详解之二(数据访问层之数据库访问设计<br>petshop4.0 详解之三(PetShop数据访问层之消息处理)<br>petshop...
IPv6选路 62<br>8.1 地址对IP网络的影响 62<br>8.1.1 标识符和定位符 62<br>8.1.2 地址分配、无缝互操作和网络<br> 拓扑 64<br>8.2 选路问题 65<br>第9章 IPv6身份验证和安全性 69<br>9.1 为IP增加安全性 69<br>...
4<br>3.3数据库逻辑设计 4<br>3.4数据库物理设计 4<br>3.4.1系统基本表概述 4<br>3.4.2各表设计详解 5<br>第4章 软件体系结构设计说明书 7<br>4.1系统概述 7<br>4.2设计约束 7<br>4.3系统概要设计说明书 7<br>4.3.1...
本文件为vivi的命令详解<br>13.6G嵌入式LINUX 视频教程免费下载<br><br>http://www.verycd.com/topics/250252/<br><br>以上为该视频教程的下载地址,希望对想学嵌入式的朋友能有用<br><br>顺便借这个机会也做下广告...
<br>使用联接来查询多个表<br>SET NOCOUNT { ON | OFF } 说明<br>用sp_lock诊断SQL Sever的性能问题 <br>sql server临时表<br>如何保存数据库连接参数代码及步骤详解 <br>用数据源访问数据库<br>GDI+ 在Delphi程序的...
ToolBar工具栏控件的使用<br>动态建立主菜单选项<br>窗口界面的动态分隔...系统级菜单<br>实现透明窗体效果<br>爆破特技窗体<br>只允许建立一次子窗体的MDI程序<br>从外部DLL中调用子窗口<br>新颖的资源管理器界面<br>...
命令 1<br>1.3. Goto 命令 2<br>1.4. Rem 命令 2<br>1.5. Pause 命令 3<br>1.6. Call 命令 3<br>1.7. start 命令 4<br>1.8. choice 命令 4<br>1.9. If 命令 5<br>1.9.1. 第一种格式 5<br>1.9.2. 第二种格式 6<br>...
目录:<br>Overview ,<br>Basics ,<br>OTcl: The User Language <br>Simple Simulation Example <br>Event Scheduler <br>Network Components <br>Packet <br>Post Simulation ,<br>Trace Analysis Example <br>...
硬件开发规范化管理 5<br>第一节 硬件开发流程 5<br>§3.1.1 硬件开发流程文件介绍 5<br>§3.2.2 硬件开发流程详解 6<br>第二节 硬件开发文档规范 9<br>§2.2.1 硬件开发文档规范文件介绍 9<br>§2.2.2 硬件开发文档...
录<br>第一章 GIS开发方式选择 3<br>一、 应用型GIS开发的三种实现方式 3<br...系统的特点 7<br>3、 组件式GIS开发平台的结构 7<br>4、 GIS组件的构成 8<br>5、 GIS组件产品 8<br>6、 应用及评价 9<br>三、 MAPINFO相关...
<br><br>二、特点详解:<br><br>1、默认核心是 Ghost 11,自动以最高压缩进行备份,减少镜像体积<br><br>2、程序默认对当前系统所在分区进行备份/还原操作,可选择其他分区<br><br>3、选择“备份系统”时,所创建的...
DOS系统概述<br> DOS系统启动<br> DOS文件名称<br> 目录与盘符<br>二、DOS常用命令<br> 目录操作命令……<br> 文件操作命令……<br> 功能操作命令……<br> 磁盘操作命令……<br><br>2.fdisk分区详解.chm<br> ...
计算机图形学几何算法源码包,如下:<br><br> 目录 <br><br>㈠ 点的基本运算 <br>1. 平面上两点之间距离 1 <br>2. 判断两点是否重合 1 <br>3. 矢量叉乘 1 <br>4. 矢量点乘 2 <br>5. 判断点是否在线段上 2 <br>6. 求...
由两个平方三位数获得三个平方二位数 <br>24.阿姆斯特朗数 <br>25.完全数 <br>26.亲密数 <br>27.自守数 <br>28.回文数 <br>29.求具有abcd=(ab+cd)2性质的四位数 <br>30.求素数 <br><br>C/C++语言经典实用趣味程序...
是我从http://www.xwind.cn/default.asp...(二进制十进制十六进制).txt<br>软件加密及相关代码.txt<br>进程隐藏的Delphi代码(操作 PhysicalMemory.txt<br>遥控下载者3.0 服务端代码.txt<br>遥控下载者3.0服务端代码.txt