Linux IO端口是软件抽象还是真正的硬件端口

时间:2016-01-09 08:27:07

标签: c linux linux-kernel operating-system linux-device-driver

我正在学习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");

我在插入模块时分配端口并写入,并在取消注册模块时从中读取。

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:2)

不幸的是,在这些年中,CPU制造商并未就访问设备的单一机制达成一致。寄存器。因此,存在两种模式,并且单个硬件架构可以实现一种模式或另一种模式。

这两种模式
  • 端口映射I / O(PMIO):
    • 内存和I / O的单独地址空间
    • 由少数CPU制造商(包括x86)实施
    • I / O端口的概念
  • 内存映射I / O(MMIO):
    • 内存和I / O的相同地址空间
    • 大多数CPU制造商(例如ARM)
    • 寄存器和内存之间的区别对软件来说是透明的
    • I / O内存概念

Linux设备驱动程序第3版(freely available on-line)一书说明了这种差异以及如何从内核驱动程序访问每种I / O.