我试图了解操作系统的基本知识,并在开放式课程(命名为6.828)中找到了一门关于操作系统的课程。我在本课程的实验室中找到了引导加载程序的代码,我尝试了,但没有理解代码的以下部分:
# 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我们如何检查端口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上面的代码是做什么的?从".“开始的行的含义是什么?而且,组装代码.S和.asm似乎有两种格式,两者之间有什么区别呢?
发布于 2015-01-30 19:19:04
我们如何检查端口0x64是否繁忙?
就在那儿。如果设置了bit #1 (值2),则端口正处于繁忙状态。
为什么使用此端口启用A20位?
历史原因。将此功能连接到键盘控制器很容易。就像cpu重置线一样。
上面的代码是做什么的?
用三个描述符设置GDT:null、code和data。我不会在这里解释什么是GDT和如何保护模式分割工作。我希望在本教程中介绍它,否则请参考osdev.org。
从".“开始的行的含义是什么?
这些是汇编程序的指令,它们指示汇编程序做一些事情。例如,.word指示它发出一个具有给定值的单词。有关细节,请参阅汇编程序手册。
程序集代码.S和.asm似乎有两种格式
程序集文件有2个(或者更确切地说是3个,将.s和.S作为单独的)公共扩展名。.s版本通常用于gnu,而.asm版本则适用于其他版本。有两种以上的格式,几乎每个汇编程序一种。这些只是文件的常用扩展名,它们并不真正定义内容。
PS:看起来你是一个组装的初学者,这是很好的,但也许你不应该开始从低水平的操作系统的东西,立即,直到你收集了一些经验。
发布于 2015-01-30 19:19:50
我们如何检查端口0x64是否繁忙,以及为什么使用该端口启用A20位?
你从那个端口检查第三位。更详细的是:
inb $0x64,%al ; read byte from port 0x64
testb $0x2,%al ; check 3rd bit
jnz seta20.1 ; if not 0, check again为什么这个港口而不是另一个港口只是一个决定的问题。可能是任何数字。其实不相关。有关更多细节,您可以查看这。
上面的代码是做什么的?
准备从真实模式切换到保护模式模式。
从".“开始的行的含义是什么?
这些是汇编程序指令。它们不生成代码,但可以用于其他事情。例如,.p2align用于将数据/代码对齐到某些字节倍数,.word声明一个单词(在本例中值为0x0017),等等.
程序集代码.S和.asm似乎有两种格式,两者之间有什么区别?
它们只是扩展名(不要与文件格式混淆)。它们实际上毫无意义。代码文件是文本文件。
https://stackoverflow.com/questions/28242830
复制相似问题