boot and loader
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的更多相关文章
- 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 ...
- os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目
[0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...
- Linux内核配置解析 - Boot options
1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项. 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具 ...
- freebsd启动报错:My unqualified host name unkown...Sleeping for retry.
原文 http://blog.163.com/sujoe_2006/blog/static/335315120111158576591/ 病状:启动报"My unqualified host ...
- 操作系统开发系列—12.e.Makefile
先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, et ...
- 配置suse自动化安装
配置suse自动化安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 前言:不知道你习惯用那款虚拟器,我用的是VMware Workstation,别问我为什么,因 ...
- U盘安装SLES的方法
安装准备: 一个4G 或 大于4G的U盘 也同样适合移动硬盘, SLES-11-DVD-i586-GM-DVD1.iso 文件1) 将U盘格式化成FAT32格式; 2) 下载 syslinux工具 h ...
- libvirt命令行文档
Libvirt有两种控制方式,命令行和图形界面 图形界面: 通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚拟机,还可以直接控制虚拟机的桌 ...
- Android开发从GC root分析内存泄漏
我们常说的垃圾回收机制中会提到GC Roots这个词,也就是Java虚拟机中所有引用的根对象.我们都知道,垃圾回收器不会回收GC Roots以及那些被它们间接引用的对象.但是,对于GC Roots的定 ...
随机推荐
- Python函数式编程(把函数作为参数传入)
map:接受两个参数(函数,Iterable),map将传入的函数依次作用于Iterable的每个元素,并且返回新的Iterable def f(x): return x*x r = map(f,[1 ...
- Python-通过调用Nmap来进行端口扫描
首先要安装python-nmap库,还要安装配置好nmap 实验机器IP:192.168.220.139 端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = & ...
- C#使用NPOI读取电子表格Excel到DataGridView中
上篇博文中已经介绍了如何写入Excel文件.这篇再介绍一下 如何从Excel中读取数据并保存到DataGridView中. 从Excel中读取数据并保存至DataGridView中,Excel文件第一 ...
- Mysql ExcuteNonQuery
ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执 ...
- 仿QQ底部切换(Fragment + Radio)
第一步: activity_main.xml 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/ ...
- Linux Shell 脚本提示:sleep: 无效的时间间隔"1s\r"
问题:编写好的 Shell 脚本在 Linux 执行时提示报错:sleep: 无效的时间间隔"1s\r" : 原因:若再三确认脚本没有写错,可能是原脚本文件在 Win 下创建编写好 ...
- vmware克隆Centos网卡修改方法
vmware克隆Centos网卡修改方法 1,查看网卡信息,获得eth编号和MAC地址 # dmesg | grep eth e1000 0000:02:00.0:eth0:(PCI:66MHz:3 ...
- Luogu 4317 花神的数论题
披着数论题外衣的数位dp. 相当于数一数$[1,n]$范围内$1$的个数是$1,2,3,4,...log(n)$的数各有多少个,直接在二进制下数位dp. 然而我比较sb地把(1e7 + 7)当成了质数 ...
- ibatis知识点汇总
一个参数,返回Map <select id="getShopInfo" parameterClass="java.lang.String" resultC ...
- 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 ...