操作系统开发之——打开A20

我们在上一篇文章提到,如何制作Bootsect,当然,人总是贪婪的,制作完Bootsect又想着做Setup了,Setup主要工作是打开A20,进入保护模式,等等。

一、介绍A20

这是一个历史性问题,在intel处理器8086中,“段:偏移”最大能表示的内存地址是FFFF:FFFF,即10FFEFh,可是8086只有20位寻址地址总线,只能寻址到1MB,如果试图访问1MB以上的内存地址,并不会发生错误,而是回卷,即又回到0000:0000地址,又从零开始寻址,可是到了80286时,真的可以访问到1MB以上的内存了,如果遇到同样的情况,系统不会再回卷寻址,这就造成了向上不兼容,为了保证100%兼容,IBM想出了一个办法,使用8042键盘控制器来控制第20个地址位,这就是A20地址线。

二、实践操作

直接贴代码,又恐吓读者呵呵:

;打开A20地址线
	IN	AL,0x92	;进入南桥芯片
	OR	AL,00000010b ;打开南桥芯片的第2位(A20控制位)
	OUT 0x92,AL ;将修改过的配置送回南桥芯片

这里用的另一种方法,并非使用8042键盘控制器,注释里面已经说了,还有,这段代码要在Ring0的特权级下运行,如果还要往后继续操作,需要JMP指令以及进入保护模式,我们在下一篇文章再介绍进入保护模式。

如果还有问题可以联系我:Email:[email protected]

如果读者朋友也有开发操作系统的想法,可以联系我。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 14:03:01

操作系统开发之——打开A20的相关文章

Linux内核系列—操作系统开发之进入32位保护模式

源码如下: ; ========================================== ; pmtest1.asm ; 编译方法:nasm pmtest1.asm -o pmtest1.bin ; ========================================== %include "pm.inc" ; 常量, 宏, 以及一些说明 org 07c00h jmp LABEL_BEGIN [SECTION .gdt] ; GDT ; 段基址, 段界限 , 属

操作系统开发之——一个简单的Bootsect

先吓唬一下读者朋友呵呵,直接发代码:(这是UOS操作系统的Bootsect)(有兴趣的朋友能够增加我们,联系方式在最后) ;------------------------------ ;文件名称:Bootsect.asm ;文件创建者:@Imcjy ;文件參与编辑者:@Imcjy ;文件编码:UTF-8 ;状态:O ;Build:3 ;文件创建日期:2015年7月24日 ;文件最后改动日期:2015年8月12日 ;备注:本文件为Nasm ;凝视等级:LV2 ;-----------------

Linux内核系列—13.c.操作系统开发之进程之中断重入

现在又出现了另外一个的问题,在中断处理过程中是否应该允许下一个中断发生? 让我们修改一下代码,以便让系统可以在时钟中断的处理过程中接受下一个时钟中断.这听起来不是个很好的主意,但是可以借此来做个试验. 首先,因为CPU在响应中断的过程中会自动关闭中断,我们需要人为地打开中断,加入sti指令:然后,为保证中断处理过程足够长,以至于在它完成之前就会有下一个中断产生,我们在中断处理例程中调用一个延迟函数.代码如下: extern delay hwint00: ; Interrupt routine f

Linux内核系列—8.操作系统开发之时钟中断

外部中断的情况复杂一些,因为需要建立硬件中断与向量号之间的对应关系.外部中断分为不可屏蔽中断(NMI)和可屏蔽中断两种,分别由CPU的两根引脚NMI和INTR来接收.如下图所示: 可屏蔽中断与CPU的关系是通过对可编程中断控制器8259A建立起来的.8259A可以认为它是中断机制中所有外围设备的一个代理.在BIOS初始化它的时候,IRQ0~IRQ7被设置为对应向量号08h~0Fh,在保护模式下向量号08h~0Fh已经被占用了,所以我们不得不重新设置主从8259A. 对8259A的设置并不复杂,通

Linux内核系列—11.操作系统开发之ELF格式

ELF文件的结构如下图所示: ELF文件由4部分组成,分别是ELF头(ELF header).程序头表(Program header table).节(Sections)和节头表(Section header table). 实际上,一个文件中不一定包含全部这些内容,而且它们的位置也未必如上图所示这样安排,只有ELF头的位置是固定的,其余各部分的位置.大小等信息由ELF头中的各项值来决定. ELF header的格式如下代码所示: #define EI_NIDENT 16 typedef str

操作系统开发之——最简单的Bootsect(可直接在里面加代码)

ORG 0x7c00 ;装载此程序至0x7c00处,因为BIOS默认会从内存0x7c00处开始执行 JMP OS_Entry [bits 16] OS_Entry: //在这里加代码 TIMES 510 - ($ - $$) DB 0 ;填充剩下的空间,使生成的二进制代码恰好为512字节 DB 0x55,0xAA ;BIOS认可的结束标志 代码就是这样,注释已经说得很清楚了.如果还有不懂的地方可以联系我. 如果还有问题可以联系我:Email:[email protected] 如果读者朋友也有开

Linux内核系列—12.e.操作系统开发之Makefile

先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, etc. ASM = nasm ASMFLAGS = -I include/ # This Program TARGET = boot.bin loader.bin # All Phony Targets .PHONY : everything clean all # Default starting

操作系统开发之——进入保护模式

依然直接贴代码: %macro Descriptor 3 dw %2 & 0FFFFh ; 段界限 1 (2 字节) dw %1 & 0FFFFh ; 段基址 1 (2 字节) db (%1 >> 16) & 0FFh ; 段基址 2 (1 字节) dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性 1 + 段界限 2 + 属性 2 (2 字节) db (%1 >> 24) & 0FFh

Linux内核系列—10.操作系统开发之内核HelloWorld

a.我们先来体验一下在Linux下用汇编编程的感觉,见代码 [section .data] ; 数据在此 strHello db "Hello, world!", 0Ah STRLEN equ $ - strHello [section .text] ; 代码在此 global _start ; 我们必须导出 _start 这个入口,以便让链接器识别 _start: mov edx, STRLEN mov ecx, strHello mov ebx, 1 mov eax, 4 ; sy