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. Python函数式编程(把函数作为参数传入)

    map:接受两个参数(函数,Iterable),map将传入的函数依次作用于Iterable的每个元素,并且返回新的Iterable def f(x): return x*x r = map(f,[1 ...

  2. Python-通过调用Nmap来进行端口扫描

    首先要安装python-nmap库,还要安装配置好nmap 实验机器IP:192.168.220.139 端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = & ...

  3. C#使用NPOI读取电子表格Excel到DataGridView中

    上篇博文中已经介绍了如何写入Excel文件.这篇再介绍一下 如何从Excel中读取数据并保存到DataGridView中. 从Excel中读取数据并保存至DataGridView中,Excel文件第一 ...

  4. Mysql ExcuteNonQuery

    ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete  语句 执 ...

  5. 仿QQ底部切换(Fragment + Radio)

     第一步: activity_main.xml  布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/ ...

  6. Linux Shell 脚本提示:sleep: 无效的时间间隔"1s\r"

    问题:编写好的 Shell 脚本在 Linux 执行时提示报错:sleep: 无效的时间间隔"1s\r" : 原因:若再三确认脚本没有写错,可能是原脚本文件在 Win 下创建编写好 ...

  7. vmware克隆Centos网卡修改方法

    vmware克隆Centos网卡修改方法 1,查看网卡信息,获得eth编号和MAC地址 # dmesg | grep eth  e1000 0000:02:00.0:eth0:(PCI:66MHz:3 ...

  8. Luogu 4317 花神的数论题

    披着数论题外衣的数位dp. 相当于数一数$[1,n]$范围内$1$的个数是$1,2,3,4,...log(n)$的数各有多少个,直接在二进制下数位dp. 然而我比较sb地把(1e7 + 7)当成了质数 ...

  9. ibatis知识点汇总

    一个参数,返回Map <select id="getShopInfo" parameterClass="java.lang.String" resultC ...

  10. LeetCode: 453 Minimum Moves to Equal Array Elements(easy)

    题目: Given a non-empty integer array of size n, find the minimum number of moves required to make all ...