gpt4 book ai didi

组装键盘IO口

转载 作者:行者123 更新时间:2023-12-02 02:32:01 25 4
gpt4 key购买 nike

我看过以下topic .

我有兴趣通过 IN/OUT 指令联系键盘并设置各种模式,例如打开大写锁定 LED。到目前为止,我在这样做时遇到了问题。
以下link可能有帮助。

我尝试了各种组合,例如

mov al,0EDh           ;ED command - Send LED bits. The next byte written to port 60h updates the LEDs on the keyboard.
out 60h,al ;out on port 60h
mov al,00000111b ;led status - all leds on. bits 3-7 = reserved(zero)
out 60h,al ;out on port 60h

我将不胜感激任何帮助。
谢谢。

编辑:
正如我所说,使用端口 60h 不起作用
我在网上搜索了 0040:0017 的用法。
其中一个网站指出,第 5、6、7 位包含有关 LED 状态的数据

我尝试使用此代码:
mov al,es:[0017h]
or al,11100000b
mov es:[0017h],al

它也不起作用。

我可能做错了,所以任何人都可以帮助我或向我发送打开所有 3 个 LED 的工作代码吗?

EDIT2:我在安装在 VM 上的 MS-DOS 上运行我的应用程序,代码运行良好。

我的问题是:我怎样才能让它在 MS-DOS 之外工作?

最佳答案

要从在 VM86 模式或保护模式下运行的任务访问 I/O 端口,您需要特殊权限。可以通过以下方式获得此特权:

  • IOPL(仅用于保护模式任务):如果任务的当前权限级别<=任务的IOPL,则允许访问。
  • I/O 权限位图(用于 VM86 任务和 CPL 不足的保护模式任务):TSS 可能包含允许/拒绝 I/O 端口访问的位图。

  • 当访问被拒绝时,会生成一个 GPF。

    Linux 具有 iopl() 和 ioperm() 系统调用,它们允许具有 CAP_SYS_RAWIO 的进程获得这些权限。因此,可以像这样访问 Linux 上的键盘 LED:
    #include <stdio.h>
    #include <sys/io.h>

    int main()
    {
    int ret;

    ret = ioperm(0x60, 0xf, 1);
    if (ret < 0) {
    perror("ioperm");
    return 1;
    }
    while (inb(0x64) & 0x2);
    outb(0xed, 0x60);
    while (inb(0x64) & 0x2);
    outb(0x07, 0x60);
    ioperm(0x60, 0xf, 0);

    return 0;
    }

    Windows NTVDM 和 Linux dosmu 使用 VM86 模式运行实模式 DOS 程序。当尝试访问不允许的 I/O 端口时,会生成 GPF,这些系统可能会模拟(或不模拟)I/O 端口访问。 dosmu 有一个 -k 开关,它绕过通常的 tty 层并直接访问键盘。使用此开关,您的第一个示例有效。

    现在,在 Windows 上做同样的事情可能需要从在 ring 0 上运行的驱动程序来做。另一种可能是使用允许 ring 3 进程访问 I/O 端口的驱动程序(非常不安全):参见例如 ioperm for cygwin .

    关于组装键盘IO口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434827/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com