前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bootsect及setup

bootsect及setup

作者头像
李拜六不开鑫
发布2018-09-04 14:23:58
1K0
发布2018-09-04 14:23:58
举报
文章被收录于专栏:本立2道生本立2道生

BIOS和bootsect

CPU加电即进入16位实模式

硬件逻辑设计为加电瞬间强行设置:CS=0xF000,IP=0xFFF0,CS:IP=0xFFFF0

而BIOS程序的入口地址即0xFFFF0,是计算机上电后CPU执行的第一条指令的地址

BIOS程序在内存中加载中断向量表和中断服务程序

调用INT 0x19中断,将软盘第一扇区(0面0磁道1扇区)的512字节即bootsect.s加载到内存0x07C00处

bootsect.s将自身复制到0x90000~0x90200,ds:si -> es:di

rep指令重复256次,一次复制4字节即双字,复制结束后便跳过去,跳时指定了段和偏移(段内偏移实际没变)

调用INT 0x13中断,将setup.s对应的程序加载到0x90200处,共四个扇区2K

再通过INT 0x13中断,将system加载到0x10000

检查根设备

然后跳到setup.s的第一行指令

可见,bootsect主要完成的是搬运加载工作

setup

setup程序的第一件事是利用BIOS中断服务程序将机器系统数据加载在原bootsect的位置(覆盖),0x90000~0x901FD,在setup前只空了2个字节

关中断,将system从0x10000复制到0x00000

设置全局描述符表(将来存放LDT和TSS)以及中断描述符表,GDT -> GDTR,IDT -> IDTR,注:setup.s从0x92000开始,gdt段内偏移相对0x90000要加上512

打开A20,实现32位寻址

建立保护模式下的中断机制,设置中断控制器8259A,保留内部不可屏蔽中断0x00~0x1F,重新映射中断号,IRQ0为0x20

将控制寄存器CR0的第0位PE置1,打开保护模式(之后要根据GDT)

跳到GDT的1项指向的地址开始执行,即head.s

参考:《Linux内核设计的艺术》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-05-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BIOS和bootsect
  • setup
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档