
Hi~朋友,关注置顶防止错过消息
接下来几篇我都会写一下在实现操作系统相关功能涉及到的知识点,最后会实现一个mini的OS,如果感兴趣可以关注公众号置顶一波,一起成为有深度的Coder。
cli指令特点?
cli禁止中断,cli只能在内核模式下运行,不可以在用户模式下执行。
cld指令特点?
cld用来将标志寄存器的DF位置0,DF为的作用用来控制内存的方向,DF为0表示内存向高地址增加,DF为1表示内存向低地址减小。
在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。
例如,以下三条指令执行后,SI自动加1,更新为0001H,此处为Intel的语法。
CLD
MOV SI, 0000H
LODSB ;将字串中的SI指针所指的一个字节装入AL
b、w、l的区别?
在AT&T语法中有以下写法指令:
movb %bl, %al   # 将BL寄存器的8位内容转移到AL寄存器
movw %bx, %ax   # 将BX寄存器的16位内容转移到AX寄存器
movl %ebx, %eax # 将EBX寄存器的32位内容转移到EAX寄存器
b表示字节(8位),w表示字(16位),l表示长整数(32位)。
0x64端口有啥作用?
通过0x64端口(保存了键盘的一些状态)我们可以检测键盘输入缓冲器上是否还有数据,如果第1位为1,表示缓冲器还有数据,如果为0,表示缓冲器没有数据。
开启A20 Gate的方式有哪几种?
如何通过键盘控制器开启A20 Gate?
这里只假设键盘缓冲器里没有数据,首先向0x64端口写入一个0xd1,表示开始向P2端口写入数据,紧接着向键盘输入缓冲器0x60端口写入0xdf(具体写向P2输出端口的数据),其二进制表示0b11011111,其中第1位(从0开始)则为A20选通位,这时A20 Gate开启。
seta20.1:
    # 20.1的逻辑当键盘输入缓冲器没有数据的时候向0x64端口写入0xd1指令
    inb $0x64, %al  # 等待键盘空闲
    testb $0x2, %al # 如果%al第低2位为0,则ZF = 1, 则不跳转
    jnz seta20.1    # 如果%al第低2位为1,则ZF = 0, 则跳转,继续检查
    movb $0xd1, %al  
    outb %al, $0x64  # 向0x64端口写入0xd1指令
seta20.2:
    #  20.1的逻辑当键盘输入缓冲器没有数据的时候向0x60端口写入0xdf指令,开启A20 Gate
    inb $0x64, %al  # 等待键盘空闲
    testb $0x2, %al
    jnz seta20.2
    movb $0xdf, %al     
    outb %al, $0x60 # 向0x64端口写入0xdf指令
如何通过BIOS开启A20 Gate?
INT 15的以下命令可以用来开启、关闭、返回A20 Gate:
# BIOS 开启A20 Gate
movw %ax, 0x2401
int 0x15
使用系统端口开启A20 Gate
使用系统端口0x92也可以开启A20 Gate,0x92端口的第1 Bit为(从第0开始算起)为1表示开启A20 Gate。
movb $0x2, %al
outb %al, $0x92
系统端口0x92的方式不推荐使用,因为它可以导致和其他硬件冲突并强制关机。