GRUB2 分析 (二)
接上一篇
实际上在512字节的MBR中,真正可用的空间并不多。除了一开始的跳转指令外,起始部分是一个被称为BPB的区域,即BIOS参数块(BISO Parameter Block)。主要是FAT和NTFS文件系统会使用这块区域。所以GRUB在安装时会避开BPB,这也是为什么一开始就跳转到偏移量0x65处,这里才是真正的开始代码。而MBR被装载到内存中后,BPB对应的内存区域就被GRUB利用来存放DAP,即磁盘地址数据包(Disk Address Packet),用于提供参数给BIOS中断0x13来读取磁盘数据。
boot.S完成了对1号扇区的装载。而1号扇区安装的是bootdisk.img,也是正好512字节,由bootdisk.S编译生成。
bootdisk.S的任务是加载GRUB余下的所有映像到内存。通常情况下GRUB安装时除了0号、1号扇区外还会使用2-62号扇区。这些扇区不被硬盘分区和文件系统使用,应该来说是GRUB最佳的安装地点。但是有一些特殊的软件会在这里记录一些数据,如需要存放加密或授权信息的一些私有软件。所以并不能说完全安全。
GRUB使用的扇区号会记录在一系列列表里,每个列表12个字节记录了一段连续的扇区的起始号码和长度。这些列表在GRUB安装时会添加在bootdisk.img代码段的后面。在bootdisk.S中通过两个嵌套循环,来把这些扇区装载在地址0x70000开始的内存区域。然后同样使用copy_buffer复制这些数据到地址0x8200开始的内存区域。这里0x70000开始的内存区域是作为缓冲区来使用的。因为BIOS装载扇区时不能越过64K字节的边界,如果直接装载到0x8200就可能会超过0x10000。
装载完成后,执行跳转指令ljmp $0, $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200)跳转到地址0x8200执行下一条指令。
至此bootdisk.img的代码执行完毕。
GRUB2 分析 (二)的更多相关文章
- SNMP报文抓取与分析(二)
SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- yhd日志分析(二)
yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- MapReduce深度分析(二)
MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
- Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
随机推荐
- CentOS7.2编译配置LNMP环境(MySQL5.7.20,PHP7.0.24)
一, 查看系统版本及内核版本 二, 编译安装nginx 1, 新建nginx用户 useradd -s /sbin/nologin -M nginx 2, ...
- PAT 甲级 1025 PAT Ranking
1025. PAT Ranking (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Programmi ...
- (转载)移动Web开发技巧汇总
META相关 1. 添加到主屏后的标题(IOS) <meta name="apple-mobile-web-app-title" content="标题" ...
- Spark Standalone Mode 多机启动 -- 分布式计算系统spark学习(二)(更新一键启动slavers)
捣鼓了一下,先来个手动挡吧.自动挡要设置ssh无密码登陆啥的,后面开搞. 一.手动多台机链接master 手动链接master其实上篇已经用过. 这里有两台机器: 10.60.215.41 启动mas ...
- Python高级特性(3): Classes和Metaclasses(转)
原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...
- python 将日期戳(五位数时间)转换为标准时间
5位数日期戳 读取 .mat 文件处理里面数据时,发现里面的日期数据全部都是 “5位数” 数字,很不解: 后来查到可以在excel中通过设置单元格调回标准日期格式,如下: 选中日期戳,右键选择 “格式 ...
- 深入浅出地,彻彻底底地理解python中的编码
python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...
- 【我的Android进阶之旅】Android 7.0报异常:java.lang.SecurityException: COLUMN_LOCAL_FILENAME is deprecated;
之前开发的一个和第三方合作的apk,在之前公司的 Android 5.1 系统的手表上运行正常,今天在公司新开发的 Android 7.1系统的手表上运行的时候,使用 DownloadManager ...
- CanvasRenderingContext2D.lineDashOffset
https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/lineDashOffset CanvasRende ...
- [golang note] 内建类型
基础类型 √ golang内建基础类型有布尔类型.整数类型.浮点类型.复数类型.字符串类型.字符类型和错误类型. 复合类型 √ golang支持的复合类型有指针.数组.数组切片.字典.通道.结构体和接 ...