使用inb、inl、inw从用户空间访问内核空间

使用inb、inl、inw从用户空间访问内核空间

您能否给我提供一些在 ubuntu 中使用 inb、inl、inw 访问内核空间的用户空间示例?

/卡努

答案1

这些函数(或宏)在 中定义<asm/io.h>。您需要告诉 gcc-O优化代码,以便将它们内联(我认为)。

对于它们的用法,请输入

man inw

Makelinux.net 也有一个指导如何使用它们。

我无法给你举一个例子,因为这取决于你使用的硬件,但这应该可以帮助你入门。

如果有人对此感兴趣,还有一个Python 模块,portio,提供相同的功能。

答案2

要使用 IO 端口命令(输入/输出),您需要以 root 身份运行并通过 ioperm() 调用保留访问权限:http://manpages.ubuntu.com/ioperm

如果这是beep.c

/* Copyright 2011, Kees Cook <[email protected]>, License: GPLv2 */
#include <unistd.h>
#include <stdio.h>
#include <sys/io.h>

int main()
{
   unsigned char orig, bits;

   /* gain access to speaker control port */
   if (ioperm(0x61, 0x61, 1) < 0) {
       perror("0x61");
       return 1;
   }
   /* gain access to speaker frequency port */
   if (ioperm(0x42, 0x42, 1) < 0) {
       perror("0x42");
       return 2;
   }

   /* turn on speaker */
   orig = bits = inb(0x61);
   bits |= 3;
   outb(bits, 0x61);

   /* set 1000 Hz frequency */
   bits = 0xA9;
   outb(bits, 0x42);
   bits = 0x04;
   outb(bits, 0x42);

   /* listen to the beep */
   sleep(1);

   /* restore speaker bits to turn off speaker */
   outb(orig, 0x61);

   return 0;
}

$ 发出哔哔声

$ sudo ./beep

相关内容