Linux 0.11 代码解读(二)setup.s
最近在研究赵炯老师的《Linux 内核 0.11 详细注释》,将自己的粗浅理解做个简单的注记,以供有相同兴趣爱好的朋友查阅。
文章目录
- 一、程序说明
- 二、代码注释
一、程序说明
setup 程序的作用是利用 ROM BIOS 中断读取机器系统数据,并将这些数据保存到 0x90000 开始的
位置(覆盖掉了 bootsect 程序所在的地方),加载中断描述符表到中断描述符表寄存器(IDTR),加载全局描述符表到全局描述符表寄存器(GDTR)寄存器,将system从0x10000的位置移动到0x0000覆盖掉中断向量表、BIOS数据及中断服务程序,并开启A20地址线,设置PE为为1,开启保护模式,跳转至system代码段(选择子为0x0008)偏移地址为0x0000的地方开始执行。
二、代码注释
INITSEG = 0x9000 ! 将bootsect程序移动到了0x9000段地址
SYSSEG = 0x1000 ! system装载到了0x10000(64kb的位置)
SETUPSEG = 0x9020 ! setup所在的代码段地址.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.textentry start
start:! 设置ss sp寄存器的值mov ax, #INITSEG !0x9000mov ss, axmov sp, #0xFF00! 输出字符串mov ax, #SETUPSEG !0x1000mov es, axcall read_cursormov cx, #14 !长度为14mov bx, #0x0007 ! 黑底白字 (7 normal, white color)mov bp, #msgmov ax, #0x1301 ! 写字符串并移动光标int 0x10call read_cursormov cx, #5mov bx, #0x000a ! 黑底绿字(10 bright green)mov bp, #msg+14mov ax, #0x1301int 0x10call print_nlcall print_nlmov ax,#INITSEG ! 将 ds 置成#INITSEG(0x9000)mov ds,axmov ah,#0x03 ! 读取光标位置xor bh,bhint 0x10 ! 光标位置信息存放在 0x90000 处,控制台初始化时会来取mov [0],dx ! dh = 行号(0x00 是顶端),dl = 列号(0x00 是左边)。存储在 0x90000.
! 调用中断 0x15,功能号 ah = 0x88
! 返回:ax = 从 0x100000(1M)处开始的扩展内存大小(KB)。
! 若出错则 CF 置位,ax = 出错码。
mov ax, #INITSEG !0x9000 mov ds, axmov ah,#0x88int 0x15mov [2],ax
! 取显示卡当前显示模式。
! 调用 BIOS 中断 0x10,功能号 ah = 0x0f
! 返回:ah = 字符列数,al = 显示模式,bh = 当前显示页。
! 0x90004(1 字)存放当前页,0x90006 显示模式,0x90007 字符列数。
mov ah,#0x0fint 0x10mov [4],bx mov [6],ax
! 检查显示方式(EGA/VGA)并取参数。
! 调用 BIOS 中断 0x10,附加功能选择 -取方式信息
! 功能号:ah = 0x12,bl = 0x10
! 返回:bh = 显示状态
! (0x00 - 彩色模
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
