您能否给我提供一些在 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