`
uin952dg
  • 浏览: 9659 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

[原创]操作系统编写详解<二>

阅读更多

[原创]操作系统编写详解
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~~~
分享到:
评论

相关推荐

    网管教程:从入门到精通(软件篇)

    &lt;br&gt;十二:注册表备份和恢复 &lt;br&gt;十三:详细的xp修复控制台命令 &lt;br&gt;十四:3721如何彻底关闭 &lt;br&gt;十五:讲解Windows XP无人值守自动安装 &lt;br&gt;十六:多操作系统共存技巧 &lt;br&gt;十七:计算机启动过程详解 &lt;br&gt;十八:...

    跟我学习注册表

    注册表常用操作 &lt;br&gt;修改及备份注册表&lt;br&gt; 如何远程编辑注册表 &lt;br&gt;注册表被破坏的现象及原因 使用VB读取和修改注册表 &lt;br&gt;用VB函数轻松访问系统注册表 &lt;br&gt;剖析恶意网页修改注册表的十二种现象 &lt;br&gt; &lt;br&gt;注册表-...

    TCP-IP技术大全

    TCP/IP和Internet 8&lt;br&gt;2.1 一段历史 8&lt;br&gt;2.1.1 ARPANET 8&lt;br&gt;2.1.2 TCP/IP 9&lt;br&gt;2.1.3 国家科学基金会(NSF) 9&lt;br&gt;2.1.4 当今的Internet 12&lt;br&gt;2.2 RFC和标准化过程 12&lt;br&gt;2.2.1 获得RFC 13&lt;br&gt;2.2.2 RFC索引 13&lt;br...

    petshop 4详解

    项目名称及描述(这是我从网上下载并整理的,非原创)&lt;br&gt;petshop4.0 详解之一(系统架构设计&lt;br&gt;petshop4.0 详解之二(数据访问层之数据库访问设计&lt;br&gt;petshop4.0 详解之三(PetShop数据访问层之消息处理)&lt;br&gt;petshop...

    IPv6详解

    IPv6选路 62&lt;br&gt;8.1 地址对IP网络的影响 62&lt;br&gt;8.1.1 标识符和定位符 62&lt;br&gt;8.1.2 地址分配、无缝互操作和网络&lt;br&gt; 拓扑 64&lt;br&gt;8.2 选路问题 65&lt;br&gt;第9章 IPv6身份验证和安全性 69&lt;br&gt;9.1 为IP增加安全性 69&lt;br&gt;...

    图书管理系统(vb+access实现)

    4&lt;br&gt;3.3数据库逻辑设计 4&lt;br&gt;3.4数据库物理设计 4&lt;br&gt;3.4.1系统基本表概述 4&lt;br&gt;3.4.2各表设计详解 5&lt;br&gt;第4章 软件体系结构设计说明书 7&lt;br&gt;4.1系统概述 7&lt;br&gt;4.2设计约束 7&lt;br&gt;4.3系统概要设计说明书 7&lt;br&gt;4.3.1...

    vivi命令详解

    本文件为vivi的命令详解&lt;br&gt;13.6G嵌入式LINUX 视频教程免费下载&lt;br&gt;&lt;br&gt;http://www.verycd.com/topics/250252/&lt;br&gt;&lt;br&gt;以上为该视频教程的下载地址,希望对想学嵌入式的朋友能有用&lt;br&gt;&lt;br&gt;顺便借这个机会也做下广告...

    SQL技术文摘

    &lt;br&gt;使用联接来查询多个表&lt;br&gt;SET NOCOUNT { ON | OFF } 说明&lt;br&gt;用sp_lock诊断SQL Sever的性能问题 &lt;br&gt;sql server临时表&lt;br&gt;如何保存数据库连接参数代码及步骤详解 &lt;br&gt;用数据源访问数据库&lt;br&gt;GDI+ 在Delphi程序的...

    Delphi7 编程 100 实例

    ToolBar工具栏控件的使用&lt;br&gt;动态建立主菜单选项&lt;br&gt;窗口界面的动态分隔...系统级菜单&lt;br&gt;实现透明窗体效果&lt;br&gt;爆破特技窗体&lt;br&gt;只允许建立一次子窗体的MDI程序&lt;br&gt;从外部DLL中调用子窗口&lt;br&gt;新颖的资源管理器界面&lt;br&gt;...

    批处理详细教程

    命令 1&lt;br&gt;1.3. Goto 命令 2&lt;br&gt;1.4. Rem 命令 2&lt;br&gt;1.5. Pause 命令 3&lt;br&gt;1.6. Call 命令 3&lt;br&gt;1.7. start 命令 4&lt;br&gt;1.8. choice 命令 4&lt;br&gt;1.9. If 命令 5&lt;br&gt;1.9.1. 第一种格式 5&lt;br&gt;1.9.2. 第二种格式 6&lt;br&gt;...

    NS By Example

    目录:&lt;br&gt;Overview ,&lt;br&gt;Basics ,&lt;br&gt;OTcl: The User Language &lt;br&gt;Simple Simulation Example &lt;br&gt;Event Scheduler &lt;br&gt;Network Components &lt;br&gt;Packet &lt;br&gt;Post Simulation ,&lt;br&gt;Trace Analysis Example &lt;br&gt;...

    硬件工程师手册(全)

    硬件开发规范化管理 5&lt;br&gt;第一节 硬件开发流程 5&lt;br&gt;§3.1.1 硬件开发流程文件介绍 5&lt;br&gt;§3.2.2 硬件开发流程详解 6&lt;br&gt;第二节 硬件开发文档规范 9&lt;br&gt;§2.2.1 硬件开发文档规范文件介绍 9&lt;br&gt;§2.2.2 硬件开发文档...

    mapx原理及使用+项目实例

    录&lt;br&gt;第一章 GIS开发方式选择 3&lt;br&gt;一、 应用型GIS开发的三种实现方式 3&lt;br...系统的特点 7&lt;br&gt;3、 组件式GIS开发平台的结构 7&lt;br&gt;4、 GIS组件的构成 8&lt;br&gt;5、 GIS组件产品 8&lt;br&gt;6、 应用及评价 9&lt;br&gt;三、 MAPINFO相关...

    备份还原系统工具v2.0 (GhostShellv2.0)

    &lt;br&gt;&lt;br&gt;二、特点详解:&lt;br&gt;&lt;br&gt;1、默认核心是 Ghost 11,自动以最高压缩进行备份,减少镜像体积&lt;br&gt;&lt;br&gt;2、程序默认对当前系统所在分区进行备份/还原操作,可选择其他分区&lt;br&gt;&lt;br&gt;3、选择“备份系统”时,所创建的...

    DOS学习手册大全(入门-进阶+软件)

    DOS系统概述&lt;br&gt; DOS系统启动&lt;br&gt; DOS文件名称&lt;br&gt; 目录与盘符&lt;br&gt;二、DOS常用命令&lt;br&gt; 目录操作命令……&lt;br&gt; 文件操作命令……&lt;br&gt; 功能操作命令……&lt;br&gt; 磁盘操作命令……&lt;br&gt;&lt;br&gt;2.fdisk分区详解.chm&lt;br&gt; ...

    开放源码的计算机图形学几何算法包

    计算机图形学几何算法源码包,如下:&lt;br&gt;&lt;br&gt; 目录 &lt;br&gt;&lt;br&gt;㈠ 点的基本运算 &lt;br&gt;1. 平面上两点之间距离 1 &lt;br&gt;2. 判断两点是否重合 1 &lt;br&gt;3. 矢量叉乘 1 &lt;br&gt;4. 矢量点乘 2 &lt;br&gt;5. 判断点是否在线段上 2 &lt;br&gt;6. 求...

    C-C++语言趣味程序设计编程百例精解

    由两个平方三位数获得三个平方二位数 &lt;br&gt;24.阿姆斯特朗数 &lt;br&gt;25.完全数 &lt;br&gt;26.亲密数 &lt;br&gt;27.自守数 &lt;br&gt;28.回文数 &lt;br&gt;29.求具有abcd=(ab+cd)2性质的四位数 &lt;br&gt;30.求素数 &lt;br&gt;&lt;br&gt;C/C++语言经典实用趣味程序...

    delphi超级实例偏hacker

    是我从http://www.xwind.cn/default.asp...(二进制十进制十六进制).txt&lt;br&gt;软件加密及相关代码.txt&lt;br&gt;进程隐藏的Delphi代码(操作 PhysicalMemory.txt&lt;br&gt;遥控下载者3.0 服务端代码.txt&lt;br&gt;遥控下载者3.0服务端代码.txt

Global site tag (gtag.js) - Google Analytics