news 2026/5/13 22:30:37

linux0.11 - setup.s第一阶段(获取系统信息)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux0.11 - setup.s第一阶段(获取系统信息)

通过BIOS中断功能获取各类信息,并将这些数据存储在内存地址0x90000起始的区域。

一、获取参数

1.1 设置data segment

将数据段设置为0x9000,后续参数从0x90000地址开始依次存储。

INITSEG = 0x9000 ... # set data segment mov $INITSEG,%ax mov %ax,%ds

1.2 获取游标位置

通过BIOS的0x10中断的0x03号功能获取游标位置,结果存储在[0x90000,0x90002)

# get cursor position mov $0x03,%ah mov $0x00,%bh int $0x10 # save cursor position mov %dx,[0]

从图中可以手动数出来,row(0,1,2,…,19),col(0,1,2,…,22)和获取的结果一致

1.3 获取内存大小

通过BIOS的0x15中断的0x88号功能获取内存大小,结果存储在[0x90002,0x90004)

# get memory size (extended mem, kB) mov $0x88,%ah int $0x15 # save memory size mov %ax,[2]

具体调用方式:
https://www.ctyme.com/intr/rb-1529.htm

AH = 88h Return: CF clear if successful AX = number of contiguous KB starting at absolute address 100000h CF set on error AH = status 80h invalid command (PC,PCjr) 86h unsupported function (XT,PS30)

从结果看0x7c00KB=>31MB,而通过此功能获取的大小是0x100000(1MB)以外的大小,加上则刚好32MB,而bochsrc配置如下,正好32MB的内存。

megs: 32

1.4 获取视频卡数据

通过BIOS的0x10中断的0x0f号功能获取视频卡数据,存储在[0x90004,0x90008)

# get video-card data mov $0x0f,%ah int $0x10 # save video-card data mov %bx,[4] mov %ax,[6]

具体使用方式:
https://www.ctyme.com/intr/rb-0108.htm

AH = 0Fh Return: AH = number of character columns AL = display mode (see #00010 at AH=00h) BH = active page (see AH=05h) Notes: If mode was set with bit 7 set ("no blanking"), the returned mode will also have bit 7 set. EGA, VGA, and UltraVision return either AL=03h (color) or AL=07h (monochrome) in all extended-row text modes. HP 200LX returns AL=07h (monochrome) if mode was set to AL=21h and always 80 resp. 40 columns in all text modes regardless of current zoom setting (see AH=D0h).

从结果看

寄存器说明
al0x03彩色显示
ah0x50每行80字符
bh0x00page0 激活
bl0x00

1.5 获取EGA信息

通过BIOS的0x10中断的AH12h/BL10h功能号获取EGA信息,结果存储在[0x90008,0x9000e)

# get EGA info mov $0x12,%ah mov $0x10,%bl int $0x10 # save EGA info mov %ax,[8] mov %bx,[10] mov %cx,[12]

具体使用方式:
https://www.ctyme.com/intr/rb-0162.htm

AH = 12h BL = 10h Return: BH = video state 00h color mode in effect (I/O port 3Dxh) 01h mono mode in effect (I/O port 3Bxh) BL = installed memory (00h = 64K, 01h = 128K, 02h = 192K, 03h = 256K) CH = feature connector bits (see #00022) CL = switch settings (see #00023,#00024) AH destroyed (at least by Tseng ET4000 BIOS v8.00n)

从结果看,

寄存器说明
bh0x00彩色模式
bl0x03256K显示内存
ch0x00
cl0x09
ah0x12
al0x03

1.6 获取磁盘参数

获取第一块磁盘参数

直接读取BIOS中断向量表中的第0x41项对应的16字节内容,即为第一块磁盘参数,并存储在[0x90080,0x90090)

中断向量表实际上是从0x00000开始的一个索引,每个索引为4字节的地址(2字节段基址+2字节偏移),LDS [4*0x41] %si通过LDS指令将对应的ds:0x104的内容加载到ds:si中,当前已经将ds设置为0x0000,因此加载的是0x00104的值到ds:si,然后读取16字节到es:di(0x9000:0x0080)

# get hd0 data mov $0x0000,%ax mov %ax,%ds lds [4*0x41],%si mov $INITSEG,%ax mov %ax,%es mov $0x0080,%di mov $0x10,%cx cld rep movsb

获取第二块磁盘参数

直接读取BIOS中断向量表中的第0x46项对应的16字节内容,即为第一块磁盘参数,并存储在[0x90090,0x900a0)

# get hd1 data mov $0x0000,%ax mov %ax,%ds lds [4*0x46],%si mov $INITSEG,%ax mov %ax,%es mov $0x0090,%di mov $0x10,%cx cld rep movsb

1.7 判断是否是第一块磁盘

# check that there is a hd1 mov $0x1500,%ax mov $0x81,%dl int $0x13 jc no_disk1 cmp $3,%ah je is_disk1 no_disk1: mov $INITSEG,%ax mov %ax,%es mov $0x0090,%di mov $0x10,%cx mov $0x00,%ax cld rep stosb is_disk1:

判断当前是否是第一个磁盘,当前dl设置0x81(10000001b), bit7设置1表示硬盘,0~6位表示硬盘编号,表示硬盘1,当没有disk1时将清空[0x90090,0x900a0)的空间。

具体使用方式:
https://www.ctyme.com/intr/rb-0639.htm

AH = 15h DL = drive number (bit 7 set for hard disk) (AL = FFh, CX = FFFFh, see Note) Return: CF clear if successful AH = type code 00h no such drive (SpeedStor) AL = 03h hard disk CX:DX = number of 512-byte sectors 01h floppy without change-line support 02h floppy (or other removable drive) with change-line support 03h hard disk CX:DX = number of 512-byte sectors CF set on error AH = status (see #00234 at AH=01h) Note: SyQuest can report type 01h or 02h for 'hard disks', since its media is removable

1.8 小结

setup.s第一阶段通过BIOS获取游标位置,内存大小,视频卡信息,EGA信息,磁盘参数等,并将这些内容在原bootsect地址0x90000依次存储,接下来将进行保护模式的准备以及切换。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 22:29:04

终极指南:用ContextMenuManager彻底解决Windows右键菜单混乱问题

终极指南:用ContextMenuManager彻底解决Windows右键菜单混乱问题 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单过于臃肿…

作者头像 李华
网站建设 2026/5/13 22:28:27

暗黑破坏神2存档编辑神器:d2s-editor完全指南

暗黑破坏神2存档编辑神器:d2s-editor完全指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的重复刷装备而苦恼吗?想快速体验不同职业build却不想花费数百小时从头练级?今…

作者头像 李华
网站建设 2026/5/13 22:27:28

微信视频号直播数据采集终极指南:解锁实时弹幕与礼物监控能力

微信视频号直播数据采集终极指南:解锁实时弹幕与礼物监控能力 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 在直播电商和内容创作蓬勃发展的今天,微信视频号直播数据采集…

作者头像 李华
网站建设 2026/5/13 22:23:19

终极指南:如何用BG3ModManager彻底解决博德之门3模组兼容性问题

终极指南:如何用BG3ModManager彻底解决博德之门3模组兼容性问题 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 博德之门3模组管理器&am…

作者头像 李华
网站建设 2026/5/13 22:22:09

AI 学习日志:继续构建我的 AI / Agent学习路线

一、今天学习内容简要分析 今天的学习重点依然围绕 AI 应用开发展开。 我现在的基础是Java,因此学习 AI 时不能只停留在“会用工具”这个层面,而是要逐步理解: AI 模型如何被调用、如何接入业务系统、如何和工具/数据库/知识库结合&#xf…

作者头像 李华