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装载到了0x1000064kb的位置)
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 - 彩色模


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部