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. shell 自动删除n天前备份

    Linux自动删除n天前备份Linux是一个很能自动产生文件的系统,日志.邮件.备份等.因此需要设置让系统定时清理一些不需要的文件.语句写法:     find 对应目录 -mtime +天数 -na ...

  2. 17_点击事件第四种写法_布局文件添加onclick属性

    尽量不要用第四种点击事件的写法.在一万多行代码中发现了一个没被调用的代码 public void call(View v){//第四种写法参数一定是View v //public void call( ...

  3. 1.3 xss原理分析与剖析(4)

    0×01 URL编码 URL只允许用US-ASCII字符集中可打印的字符(0×20—0x7x),其中某些字符在HTTP协议里有特殊的意义,所以有些也不能使用.这里有个需要注意的,+加号代表URL编码的 ...

  4. Ubuntu14跑DSO

    按照https://github.com/JakobEngel/dso上的说明,make -j4的时候出现一下错误: /home/zhao/dso/src/FullSystem/CoarseIniti ...

  5. spark svm

    首先spark上的svm只能处理线性的,不能处理非线性的.其次spark上的svm求解过程与普通的不同.普通的是通过拉格朗日对偶,然后通过SMO方法求. 但是在spark上,则没有通过拉格朗日,而是直 ...

  6. 51nod 1154【DP】

    区间DP大暴力吧?GG. dp[ i ] 为字符至 i 的最少数量. 如果[Left , Right]是回文串, dp[Right] = min(dp[ Right ] , dp[Left-1] + ...

  7. Ocelot - .Net Core开源网关

    Ocelot - .Net Core开源网关 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html 源码地 ...

  8. 一个MySQL中两表联合update的例子(并带有group by分组)

    内容简介 本文主要展示了在MySQL中,使用两表联合的方式来更新其中一个表字段值的SQL语句. 也就是update table1 join table2 on table1.col_name1=tab ...

  9. 《OD学spark》20161022

    一.Spark Core 1. 什么是Spark Shuffle Wide Dependencies *ByKey: groupByKey,reduceByKey 关联操作:join,cogroup ...

  10. ICP备案接入商

    1. 什么是ICP备案中的接入商 ICP备案系统中所说的接入商:是指为您提供虚拟主机.服务器托管或者专线接入的公司. 现在ICP备案的原则是“谁接入谁负责”,接入商一般都有自己的电子平台和工信部对接, ...