sar*_*hak 2 x86 assembly operating-system
我试图了解操作系统的基础知识,并在OCW中找到了一门课程(名为6.828).我在课程的实验中找到了bootloader的代码,我试过但不理解代码的以下部分:
# Enable A20:
# For backwards compatibility with the earliest PCs, physical
# address line 20 is tied low, so that addresses higher than
# 1MB wrap around to zero by default. This code undoes this.
seta20.1:
inb $0x64,%al # Wait for not busy
testb $0x2,%al
jnz seta20.1
movb $0xd1,%al # 0xd1 -> port 0x64
outb %al,$0x64
seta20.2:
inb $0x64,%al # Wait for not busy
testb $0x2,%al
jnz seta20.2
movb $0xdf,%al # 0xdf -> port 0x60
outb %al,$0x60
Run Code Online (Sandbox Code Playgroud)
我们如何检查端口0x64是否忙,以及为什么该端口用于启用A20位?为了使芯片运行到32位模式,GDT的配置如下:
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
# Bootstrap GDT
.p2align 2 # force 4 byte alignment
gdt:
SEG_NULL # null seg
SEG(STA_X|STA_R, 0x0, 0xffffffff) # code seg
SEG(STA_W, 0x0, 0xffffffff) # data seg
gdtdesc:
.word 0x17 # sizeof(gdt) - 1
.long gdt # address gdt
Run Code Online (Sandbox Code Playgroud)
上面的代码是做什么的?以"."开头的行是什么意思?此外,汇编代码似乎有两种格式.S和.asm这两种格式有什么区别?
我们如何检查端口0x64是否忙?
它就在那里.如果设置bit #1(值2),则端口忙.
为什么这个端口用于启用A20位
历史原因.将此功能连接到键盘控制器很容易.就像cpu重置行一样.
上面的代码是做什么的?
树立GDT三个描述:null,code和data.我不会在这里解释GDT是什么以及保护模式分割如何工作.我希望它在本教程中介绍,或者咨询osdev.org.
以"."开头的行是什么意思?
这些是汇编程序的指令,它们指示它做事.例如.word指示它发出具有给定值的单词.有关详细信息,请参阅汇编器手册.
汇编代码.S和.asm似乎有两种格式
汇编文件有2个(或者更确切地说是3个,计数.s和.S单独的)公共扩展.这些.s版本通常用于gnu工具链,而.asm用于其他版本.有两种以上的格式,每个汇编器几乎就有一种格式.这些只是文件的常用扩展,它们并没有真正定义内容.
PS:看起来你是装配的初学者,这很好,但也许你不应该立即开始使用低级操作系统的东西,直到你积累了一些经验.