boot and loader

boot 程序的所有作用

  • 清屏
  • 将光标移到屏幕左上角
  • 显示 Start Boot 提示信息
  • 加载 loader 程序的代码到 0x10000 物理内存地址
  • 将CPU的段地址设置为 0x1000, 偏移量为 0x0000

boot 程序(内置 FAT12 文件系统的引导扇区的信息)的编写

  • 注意boot不能实现FAT12文件系统, 因为boot的要求是512B, 但是使用FAT12文件系统的前提是有引导扇区的信息, 所以在boot定义好, 到时都我们要将我们的软盘格式化成FAT12文件系统
  • 第一行 org 0x7c00, 告诉CPU指令CS和IP的值
  • 初始化DS, ES, SS, SP, 其中SP为0x7c00
  • 填写 FAT12 的引导数据
  • 注意:
    • 写完一部分如果要测试的话需要加上jmp $让程序一直运行才行否则不会有任何的显示
    • 在汇编中有函数和标签两个概念, 我们一般这样规定, 函数使用call指令调用, 在该函数中我们要开辟一个新的栈, 如果要为cx等寄存器赋值的话, 需要将他们的值保存起来, 放到栈中, 在函数结束之前回复cx等寄存器中的值; 而标签使用jmp, jz等指令执行, 他们不需要必须保存cx等值, 而是视需求而定, 一般来说函数为模块, 而标签为流程
    • 每一个Label结束之后都应该添加一个跳转jmp指令, 使得程序执行的流程清晰
    • boot的大小只有512B, 所以要注意编程的时候注意代码量, 能把程序写的简单就程序写的短一点
    • 将软盘中的数据读取到内存中是查找filename和加载loader的前提, 并且除了loader都是加载到0000h:8000h, 约定俗称并且有很多书上都是这样写的, 可以参考, 毕竟汇编本来就很难了还难以调试
    • 在读取sector, 要回滚则使用and di, 0ffeh, 注意这里di的起始值为8000h, 看到8000h就应该觉得和读取到内存有关系了, 假如有一个循环, 每循环一次都会inc di, 但是到了一个条件之后, 我们需要跳出循环并且将di回到原来的8000h, 怎么办? 这时就是一个汇编技巧了, 也是一个数学技巧吧, 反正我打算把它记住的, and di, 0ffe0h, 则di的值就成为了8000h, 该技巧控制的范围是20h(十进制就是32), 如果di为8020h, 则and一下di的值还是8020h, 这个技巧在读取目录项的item很有用(item一个32b)
  • 读取sector取出数据判断是否匹配filename, 如果匹配则加载loader的数据, 最后将CS:IP设置成1000:0000地址(loader的内存地址)

loader 程序

作用
  • 通过BIOS的中断获取硬件信息, 加载内核到内存1MB以上内存地址空间, BIOS的功能调用需要在real mode下, 而内核运行在protected mode下, 所以使用需要在real mode将内核放到1MB地址空间以上的位置, 但是BIOS的寻址只有1MB, 也就是说BIOS读取数据会放到1MB之下, 所以要想将内核代码放到1MB之上, 我们需要一个临时的内核地址空间0x7e00, 现将数据放到0x7e00的内存地址, 再将数据复制到1MB之上

  • 通过A20快速门开启实模式下的4G物理内存寻址, 这个是为了兼容老式机器而遗留下来的历史问题, 默认计算机是不会开启A20快速门, 通过0x92端口获取数据到al, or al, 000000010b置位, out 0x92, al开启A20功能号

  • 完成 real mode --> protected mode --> IA-e32 mode(64位保护模式, IA表示Long Mode)

  • 关闭外部中断, 临时开启保护模式设置fs寄存器再关闭保护模式, 开启外中断即可在real mode下实现4G内存寻址, 称之为Big Real Mode

注意

1MB地址表示为100000h

boot and loader的更多相关文章

  1. Android -- java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

    使用Bundle 的getParcelableArray 出现了以下错误: Class not found when unmarshallingjava.lang.ClassNotFoundExcep ...

  2. os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

    [0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...

  3. Linux内核配置解析 - Boot options

    1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项. 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具 ...

  4. freebsd启动报错:My unqualified host name unkown...Sleeping for retry.

    原文 http://blog.163.com/sujoe_2006/blog/static/335315120111158576591/ 病状:启动报"My unqualified host ...

  5. 操作系统开发系列—12.e.Makefile

    先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, et ...

  6. 配置suse自动化安装

    配置suse自动化安装 作者:尹正杰   版权声明:原创作品,谢绝转载!否则将追究法律责任.       前言:不知道你习惯用那款虚拟器,我用的是VMware Workstation,别问我为什么,因 ...

  7. U盘安装SLES的方法

    安装准备: 一个4G 或 大于4G的U盘 也同样适合移动硬盘, SLES-11-DVD-i586-GM-DVD1.iso 文件1) 将U盘格式化成FAT32格式; 2) 下载 syslinux工具 h ...

  8. libvirt命令行文档

    Libvirt有两种控制方式,命令行和图形界面 图形界面: 通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚拟机,还可以直接控制虚拟机的桌 ...

  9. Android开发从GC root分析内存泄漏

    我们常说的垃圾回收机制中会提到GC Roots这个词,也就是Java虚拟机中所有引用的根对象.我们都知道,垃圾回收器不会回收GC Roots以及那些被它们间接引用的对象.但是,对于GC Roots的定 ...

随机推荐

  1. JSP标签和EL表达式

    1.jsp标签: sun原生的,直接jsp使用 <jsp:include> -- 实现页面包含,动态包含 <jsp:include page="/index.jsp&quo ...

  2. sql server 表索引碎片处理

    DBCC SHOWCONTIG (Transact-SQL) SQL Server 2005 其他版本 更新日期: 2007 年 9 月 15 日 显示指定的表或视图的数据和索引的碎片信息. 重要提示 ...

  3. C#动态给EXCEL列添加下拉选项

    Microsoft.Office.Interop.Excel.Application excel=new Microsoft.Office.Interop.Excel.Application(); M ...

  4. asp页面重定向

    asp页面重定向 1.当你点击某页面时(没有登录),而此页面需要登录,登录后页面需要定向到你之前操作的页面时 就用到了重定向. 2.login.aspx?redirUrl="重定向的页面地址 ...

  5. 拍照选择图片(Activity底部弹出)

    效果图如下: 第一步 : 显示出的布局文件:alert_dialog.xml <?xml version="1.0" encoding="utf-8"?& ...

  6. android activity生命周期的一张经典图片

    图片来自http://blog.csdn.net/android_tutor/article/details/5772285 onpause只有弹出的窗体是Activity的时候才会触发,并非是通过焦 ...

  7. ascII、iso、utf-8、Unicode的区别

    utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念,utf-8是unicode的实现方式. 要想先讲清楚他们的区别,首先 ...

  8. 32.我的wafBypass之道

    0x01 搞起 当我们遇到一个waf时,要确定是什么类型的?先来看看主流的这些waf,狗.盾.神. 锁.宝.卫士等等...(在测试时不要只在官网测试,因为存在版本差异导致规则库并不一致) 1.云waf ...

  9. hdu1081

    #include<iostream> using namespace std; int GetMaxNum(int a[],int n) //求最大字段和 { int i,sum=0,ma ...

  10. CSS概念 - 可视化格式模型(一) 盒模型与外边距叠加

    可以参考<精通CSS 高级WEB标准解决方案>第三章. 可视化格式模型 可视化格式模型要掌握的3个最重要的CSS概念是 浮动.定位.盒模型. 这些概念控制在页面上安排和显示元素的方式, 形 ...