打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux内核x86架构引导协议2(翻译)

实模式内核头

        在接下来内容中,在该文档的所有地方,提到的扇区(sector)都等于512个字节。这是一个与实际扇区大小无关的一个基本单位(该文档并不关心实际扇区还有4K大小的情况,这个情况应该由引导程序自己解决)。

        最早被加载的是内核的实模式部分((内核的)引导扇区和setup)。然后,内核加载程序需要处理偏移为0x01f1的内核头。内核的实模式部分最大可以为32K,但是实际的大小并不确定。通常的做法是先加载最前面的两个扇区(1K大),然后通过对这部分数据的分析得出内核实模式的实际大小。

内核头的具体定义如下:

偏移/大小

协议

名称

含义

01F1/1

ALL(1)

setup_sects

setup的大小(单位:扇区)

01F2/2

ALL

root_flags

如果置位,以只读方式挂载根(文件系统)。

01F4/4

2.04+(2)

syssize

32位部分的大小。(即保护模式部分)

单位是:16个字节

01F8/2

ALL

ram_size

已经不再使用。仅仅用于bootsect.S(bootsect.S仅仅在老内核里面存在)

01FA/2

ALL

vid_mode

显示模式

01FC/2

ALL

root_dev

默认的根设备号

01FE/2

ALL

boot_flag

引导扇区标志:0xAA55

0200/2

2.00+

jump

跳转指令

0202/4

2.00+

header

新版的setup标志:“HdrS”

0206/2

2.00+

version

支持的引导协议版本号

0208/4

2.00+

realmode_swtch

内核引导程序钩子(见下面的解释)

020C/2

2.00+

start_sys_seg

系统的段地址(0x1000)(已废弃)

020E/2

2.00+

kernel_version

指向内核版本字符串的指针

0210/1

2.00+

type_of_loader

内核加载程序的ID号

0211/1

2.00+

loadflags

引导协议标志

0212/2

2.00+

setup_move_size

移到到高内存的大小(用于钩子)

0214/4

2.00+

code32_start

内核引导程序钩子(见下面的解释)

0218/4

2.00+

ramdisk_image

initrd被加载的地址(由内核加载程序设置)

021C/4

2.00+

ramdisk_size

Initrd的大小(由内核加载程序设置)

0220/4

2.00+

bootsect_kludge

已经不再使用。仅仅用于bootsect.S(bootsect.S仅仅在老内核里面存在)

0224/2

2.01+

heap_end_ptr

在内存中setup后面可用内存的大小

0226/1

2.02+(3)

ext_loader_ver      

扩展加载程序的版本

0227/1

2.02+(3)

ext_loader_type

扩展加载程序的ID

0228/4

2.02+

cmd_line_ptr

执行内核命令行参数的32位指针

022C/4

2.03+

ramdisk_max

initrd可以被加载的最大位置

0230/4

2.05+

kernel_alignment

内核需要的物理地址对齐要求

0234/1

2.05+

relocatable_kernel

内核是否是可以重定位的

0235/1

2.10+

min_alignment

Minimum alignment, as a power of two

0236/2

N/A

pad3

未使用

0238/4

2.06+

cmdline_size

内核命令行的最大大小

023C/4

2.07+

hardware_subarch

硬件架构信息

0240/8

2.07+

hardware_subarch_data

硬件架构特有数据

0248/4

2.08+

payload_offset

内核payload的偏移值

024C/4

2.08+

payload_length

内核payload的长度

0250/8

2.09+

setup_data

指向结构体 setup_data的64位指针

0258/8

2.10+

pref_address

内核的(保护模式部分)首选加载位置

0260/4

2.10+

init_size

初始化过程中所需要的内存大小

 

(1) 为了兼容老版本,如果setup_sects为0,意味着它的值是4

(2) 由于2.04版之前的引导协议中,syssize字段的高两个字节并不使用,所以在这些协议中bzImage类型的内核大小是无法确定的。

(3) 在2.02-2.09中被忽略,但是为了安全考虑,依然被设置

 

如果在偏移0x202出 没有发现“HdrS” (0x53726448)标志,就意味着引导协议是“古老内核版 ”的。在加载这类内核时,就可以做以下断定:

  1. Image类型为zImage
  2. 不支持initrd
  3. 内核的实模式部分必须加载到0x90000处。
除此之外,在字段version中包含引导协议的版本号。例如2.01版引导协议会是0x201。当更改数据头的字段时,必须确保该字段在引导的内核中是被支持的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
linux 启动协议分析--由boot.txt翻译而来
Linux内核分析方法谈(上)
linux 0.11 内核学习
构建嵌入式Linux系统
我们按下电脑开机键的背后发生了什么?
Linux 2.6 内核引导过程分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服