博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux0.11---A20地址线
阅读量:6239 次
发布时间:2019-06-22

本文共 2089 字,大约阅读时间需要 6 分钟。

  大家都知道8086/8088处理器有20根地址线,能够访问1^20 = 1M内存,实模式访存采用seg x 4 + off(seg为段寄存器,off为段内偏移地址)的方式,访问范围是0(0x0000:0x0000)---10ffef(0xffff:0xffff),对于超过1M的寻址地址将自动环绕(wrap around)到0x0ffef,比如访问地址0x100001时将访问0x0ffef + 1 = 0xfff0物理地址。随后intel发明了80286,地址线有24位,访问地址空间是1^24=16M,并且有一个和8086/8088相互兼容的实模式,如果超过了1M的内存,80286不会回滚到1M内的地址,为了实现完全兼容,intel的工程师使用一个开关来标志是否回滚,打开开关则回滚,关闭则不回滚。当时在主板的8042键盘控制器上刚好有一个空闲的端口,于是就使用该端口来设置这一标志位。发送信号设置该标志位为0则地址线20位及以上的位全被设0,从而实现了回滚,该信号被称为A20,用于设置A20地址线。

   8042键盘控制器有4个8位的寄存器,它们是状态寄存器、输出缓冲器、输入缓冲器和控制寄存器。对8042键盘控制器操作使用60h 和 64h这两个端口,0x60是数据端口, 0x64 是命令端口。

  状态寄存器每一位作用如下:

    Bit7:从键盘获得的数据奇偶校验错误

    Bit6:接收超时,置1
    Bit5:发送超时,置1
    Bit4:为1,键盘没有被禁止。为0,键盘被禁止
    Bit3:为1,输入缓冲器中的内容为命令,为0,输入缓冲器中的内容为数据
    Bit2:系统标志,加电启动置0,自检通过后置1
    Bit1:输入缓冲器满置1,i8042 取走后置0
    Bit0:输出缓冲器满置1,CPU读取后置0

  控制寄存器各位定义如下:

    Bit7: 保留

    Bit6: 将第二套扫描码翻译为第一套

    Bit5: 置1,禁止鼠标
    Bit4: 置1,禁止键盘
    Bit3: 置1,忽略状态寄存器中的 Bit4
    Bit2: 设置状态寄存器中的 Bit2
    Bit1: 置1,enable 鼠标中断
    Bit0: 置1,enable 键盘中断

  Linux0.11中开启A20地址线是通过控制8042控制器完成的,类似的代码如下:

org 0x7c00    mov   ax,cs    mov   ds,ax    mov   es,ax    mov   ss,ax    mov   sp,0xffff    jmp   enable_a20    enable_a20:                          call  empty_8042    mov   al,0xd1    out   0x64,al    call  empty_8042    mov   al,0xdf    out   0x60,al    call  empty_8042    print_msg:    mov   cx,13                                        mov   dx,0x1004                                     mov   bx,0x000c                            mov   bp,msg_a20_enable                                       mov   ax,0x1301                                    int   0x10     loop:    jmp   loop                                      msg_a20_enable:    DB "A20 is enable"        empty_8042:    dw    00ebh,00ebh                in    al,64h                test  al,2    jnz   empty_8042    ret    times 510-($-$$) db 0 boot_flag:    DW 0xAA55

  运行结果如下:

  mov ss,ax和mov sp,0xffff设置堆栈,不然call xxx, ret这样的子程序调用不能使用,enable_a20子程序通过向0x60、0x64端口写入信号来开启A20地址线。empty_8042子程序判断控制器命令队列是否为空,来检查发出的信号是否被处理。

 

  参考资料:

    赵炯, 《linux内核完全注释》

转载于:https://www.cnblogs.com/islandscape/p/3463853.html

你可能感兴趣的文章
Linux Kernel Device Tree 配置框架
查看>>
笔记:Python进行数据库文件导出备份
查看>>
Android开发学习记录(2015-05-19 23:05:34更新)
查看>>
一封高三老师,写给进入大学的学生的信,看完沉思良久
查看>>
解决checkbox选中但是不显示打钩的问题
查看>>
大数据公司如何实现标准化服务输出?NO.410华量软件
查看>>
bias和variance
查看>>
SpringBoot基础教程2-1-1 搭建RESTful风格Web服务
查看>>
uniupload mapping
查看>>
问题(1)
查看>>
python发邮件
查看>>
Linux系统管理笔记
查看>>
Spring Cloud和聚合工程架构设计微服务框架
查看>>
Java 内部类
查看>>
java对list中对象的属性排序
查看>>
RabbitMQ的消息确认机制(事务+confirm)
查看>>
C Primer Plus 第4章 字符串和格式化输入输出4.4 printf()和scanf()
查看>>
第14章 结构和其他数据形式 14.6 指向结构的指针
查看>>
FLUSH PRIVILEGES
查看>>
CI3如何使用controller继承
查看>>