bootsect及setup

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内核设计的艺术》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员同行者

Python程序的打包-上传到pypi

1431
来自专栏沃趣科技

ASM 翻译系列第三十六弹:ACFS磁盘组的重平衡操作

原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

36711
来自专栏哎_小羊

国内使用 kubeadm 在 Centos 7 搭建 Kubernetes 集群

目录 Kubeadm 介绍 环境、软件准备 软件安装配置 镜像准备 安装 Docker 安装并配置 Kubernetes 组件 初始化 Master 安装 F...

1.8K9
来自专栏行者常至

数据库连接池简单连接

模型      -----     Model 视图      -----     View 控制器  -----     Controller

983
来自专栏沃趣科技

ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

3636
来自专栏

后端开源软件集合

缓存系统:memcached(group cache)、redis、mongodb、Couchbase(CouchDB、Membase、CouchOne) ht...

2589
来自专栏Netkiller

PHP高级编程之守护进程

PHP高级编程之守护进程 http://netkiller.github.io/journal/php.daemon.html 摘要 2014-09-01 发表...

3947
来自专栏bboysoul

如何黑入安卓手机(ezsploit)

安装很简单clone git clone https://github.com/rand0m1ze/ezsploit.git cd ezsploit ch...

1532
来自专栏Samego开发资源

如何搭建私密云存储之ownCloud

7414
来自专栏乐沙弥的世界

配置共享服务器模式

两者完成相同的任务,即处理所有指定的SQL操作。假定从客户端提交一个任意查询(DQL)到数据库服务器不论是专用模式还是共享

2503

扫码关注云+社区

领取腾讯云代金券