我正在学习linux设备驱动程序。 我了解了端口。我很困惑,Linux中的端口是软件抽象,或者是真正的硬件端口。
在下面的设备驱动程序中,我编写了一个代码来分配端口并进行写入或读取。
即使没有连接新硬件,也会分配端口。可能是什么原因?
另一个问题是,当我使用oub()写入端口时,当我使用inb()从端口读取时,无论我写入端口的是什么,我总是得到值255。
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/ioport.h>
struct resource *p;
static int start(void)
{
printk("module registered\n");
p=request_region(0x0062, 1, "my_port");
if(p==NULL)
{
printk(KERN_ALERT "port allocation failed\n");
return 0;
}
outb(12, 0x0062);
return 0;
}
static void stop(void)
{
printk("module unregistered\n");
unsigned a;
a=inb(0x0062);
printk("%d\n", a);
release_region(0x0062, 1);
}
module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");
我在插入模块时分配端口并写入,并在取消注册模块时从中读取。
提前感谢您提供任何帮助
答案 0 :(得分:2)
不幸的是,在这些年中,CPU制造商并未就访问设备的单一机制达成一致。寄存器。因此,存在两种模式,并且单个硬件架构可以实现一种模式或另一种模式。
这两种模式Linux设备驱动程序第3版(freely available on-line)一书说明了这种差异以及如何从内核驱动程序访问每种I / O.