loader的实现(2)

切换至保护模式

x86 CPU的两种工作模式

实模式

x86在上电启动后自动进入实模式,即16位工作模式,这种模式是最早期的8086芯片所使用的工作模式。早期的芯片设计得较简单、工作模式也较简单,所以有诸多限制:

1最大只能访问1MB的内存:采用段值:偏移的方式访问,内核寄存器最大为16位宽。如段寄存器CS, DS, ES, FS, GS, SS均为16位宽,AX, BX, CX DX, SI, DI, SP等也均为16位宽

2所有的操作数最大为16位宽,出栈入栈也以16位为单位

3没有任何保护机制,意味着应用程序可以读写内存中的任意位置

4没有特权级支持,意味着应用程序可以随意执行任何指令,例如停机指令、关中断指令

5没有分页机制和虚拟内存的支持

有接触过单片机开发的同学,可以将其与单片机进行类比。可以将这种模式理解为一种比较原始、粗暴、简单的工作模式。

虽然其有这些限制,但是这种模式下可以使用BIOS提供的服务,方便我们显示字符、读取磁盘等。

保护模式

在后续的芯片设计中,intel为处理器增加了一些新的功能,可以实现某些保护功能,即保护模式。具体的特点如下:

●寄存器位宽扩展至32位,例如AX扩展至32位的EAX,最大可访问4GB内存

●所有操作数最大为32位宽,出入栈也为32位

●提供4种特权级。操作系统可以运行在最高特权级,可执行任意指令;应用程序可运行于最低特权级,避免其执行某些特权指令,例如停机指令、关中断指令

●支持虚拟内存,可以开启分页机制,以隔离不同的应用程序

切换至保护模式

要切换至保护模式,需要遵循以下流程。

●禁用中断:防止中途发生中断,程序运行出现异常

●打开A20 地址线:为保兼容,默认A20地址线不开启,无法访问4GB内存

●加载GDT表:某种重要的配置数据

●设置CR0:开启保护模式使能位

●远跳转:清空原来的流水线,取消掉原16位的指令

开启A20地址线

开启的方法参考了:https://wiki.osdev.org/A20#Fast_A20_Gate。我们采用以下的简单的方法:

in al, 0x92
or al, 2
out 0x92, al

开启保护位

此项需要设置CR0寄存器的PE位为1。CR0无法直接读写,必须先读取到某个中间寄存器,修改值后,再将值回写到CR0中。
请添加图片描述

使用LBA读取磁盘

本课时简要介绍磁盘的另一种读取方法:LBA模式。具体来说,采用的是LBA48模式。进入保护模式后,无法使用BIOS中断的磁盘读取服务。由于读取的磁盘数据会放在1MB以上的内存区域,所以也不便于在进入保护模式前使用BIOS的磁盘读取服务来读取。

LBA48模式

LBA48模式将硬盘上所有的扇区看成线性排列,没有磁盘、柱面等概念,因此访问起来更加简单,扇区序号从0开始。其访问序列如下:

outb(0x1F6, 0x40 | (slavebit << 4)) 选择硬盘:主盘或从盘

outb (0x1F2, sectorcount high byte)
outb (0x1F3, LBA4)
outb (0x1F4, LBA5)
outb (0x1F5, LBA6)

outb (0x1F2, sectorcount low byte)
outb (0x1F3, LBA1)
outb (0x1F4, LBA2)
outb (0x1F5, LBA3)

Send the "READ SECTORS EXT" command (0x24) to port 0x1F7: outb(0x1F7, 0x24)

各寄存器说明如下:(仅列出与课程程序相关的说明)

寄存器偏移读写功能
0R/W数据寄存器
1R错误寄存器
1W特性寄存器
2R/W扇区数量寄存器
3R/WSector Number Register (LBAlo)
4R/WCylinder Low Register / (LBAmid)
5R/WCylinder High Register / (LBAhi)
6R/WDrive / Head Register
7R状态寄存器
7W命令寄存器

其中0x1F6寄存器(Drive / Head)对应的位如下:

名称功能
0 - 3在, bits 24 to 27 of the block number.
4DRV驱动器号
51
6LBA对LBA模式,总为1
71
Status Register (I/O base + 7)
名称功能
0ERR发生错误
1IDX
2CORR
3DRQ就绪,可以写数据或者读取数据
4SRV
5DF
6RDY
7BSY
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值