Linux内核完全注释:第三章 内核引导启动程序-setup.s讲解

续上一篇 bootsect.s讲解

功能描述

  • setup程序的主要作用是利用ROM BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置
  • 为什么保存在0x90000开始的位置呢?因为0x90000之前保存的bootsect程序已经执行完毕,可以覆盖掉了
    在这里插入图片描述
  • 将system模块从0x10000-0x8ffff(512KB)整体向下移动到内存绝对地址0x00000处。
  • 加载中断描述符表寄存器idtr和全局描述符表寄存器gdtr,开启A20地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20 - 0x2f。
  • 最后设置CPU的控制寄存器CR0,从而进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s继续运行。

代码分析

  1. 首先是数据声明部分
    INITSEG  = 0x9000	! we move boot here - out of the way
    SYSSEG   = 0x1000	! system loaded at 0x10000 (65536).
    SETUPSEG = 0x9020	! this is the current segment
    
    .globl begtext, begdata, begbss, endtext, enddata, endbss
    .text
    begtext:
    .data
    begdata:
    .bss
    begbss:
    .text
    
  2. 先读取当前坐标,保存起来以备后续使用
    entry start
    start:
    
    ! ok, the read went well so we get current cursor position and save it for
    ! posterity.
    
    	mov	ax,#INITSEG	! this is done in bootsect already, but...
    	mov	ds,ax
    	mov	ah,#0x03	! read cursor pos
    	xor	bh,bh
    	int	0x10		! save it in known place, con_init fetches
    	mov	[0],dx		! 返回结果保存在dx寄存器中,然后将结果保存到0x90000处。it from 0x90000.
    
  3. 获取从0x10000开始的扩展内存大小(KB)
    ! Get memory size (extended mem, kB)
    
    	mov	ah,#0x88
    	int	0x15
    	mov	[2],ax		! 返回值保存在ax中,ax=从0x100000开始的扩展内存大小(KB)
    
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值