代码之家  ›  专栏  ›  技术社区  ›  Blank

x86程序集上的保护模式键盘访问

  •  16
  • Blank  · 技术社区  · 17 年前

    我正在为我正在开发的一个非常基本的内核开发键盘输入,我完全卡住了。我似乎在网上找不到任何可以向我展示我需要知道的信息的信息。

    我的内核现在正在保护模式下运行,所以如果不跳到真实模式并返回,我就无法使用真实模式键盘例程,我正试图避免这种情况。我希望能够从保护模式访问我的键盘。有人知道怎么做吗?到目前为止,我唯一发现的是,它涉及到直接使用输入/输出端口与控制器对话,但除此之外,我感到困惑。当然,这不是经常出现的事情。通常,组装教程假设您正在运行下面的操作系统。

    我对x86程序集非常陌生,所以我只是在寻找一些好的资源,以便在保护模式下使用标准硬件。我正在用NASM编译Assembly源代码,并将其链接到用DJGPP编译的C源代码。有什么建议吗?

    3 回复  |  直到 9 年前
        1
  •  15
  •   Adam Rosenfield    17 年前

    这个 MIT operating systems class 有很多很好的参考。特别是,看看 Adam Chapweske's resources 关于键盘和鼠标编程。

    简而言之,是的,您将使用原始输入/输出端口,这需要在内核模式下运行,或者在EFLAGS寄存器中设置I/O权限位(IOPL)。看见 this page 有关I/O权限的更多详细信息。

        2
  •  3
  •   CesarB    17 年前

    您可以在真实模式和保护模式下以相同的方式使用标准的传统硬件。在这种情况下,您想在I/O端口0x60到0x6f与8042通信,这反过来又会与线路另一端的键盘内的控制器通信。

    在谷歌上快速搜索后,我发现了一个有趣的资源 http://heim.ifi.uio.no/~stanisls/helppc/8042.html (8042)和 http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (用于键盘)。

    如果您不习惯它,您可以通过In(读取)和OUT(写入)操作码与I/O端口的组件进行通信,这些操作码接收I/O端口号(16位值)和要读取或写入的值(8、16或32位)。请注意,读取或写入的大小很重要!将16位写入预期为8位的内容(反之亦然)是灾难的根源。习惯这些操作码,因为您将经常使用它们(这是与某些外围设备(包括几个基本外围设备)通信的唯一方法;其他外围设备使用内存映射I/O(MMIO)或总线主控DMA)。

        3
  •  1
  •   Ciro Santilli OurBigBook.com    10 年前

    这个 8042 PS/2控制器 看起来是最简单的可能性。

    oszur11操作系统教程包含以下工作示例 https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

    只是:

    sudo apt-get install build-essential qemu
    sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
    git clone git://git.code.sf.net/p/oszur11/code oszur11
    cd oszur11/Chapter_06_Shell/04_Makepp
    make qemu
    

    在Ubuntu 14.04 AMD64上测试。

    我的GitHub镜像(上游不活动): https://github.com/cirosantilli/oszur11-operating-system-examples

    在这里不复制它,因为代码太长,如果我设法在一个最小的例子中隔离键盘部分,它就会更新。