如何找出分配给我的设备的 ioports

问题描述

为所有制造的设备提供 linux 保留的 io 端口号。

我有像 intel 内置网卡这样的设备。或我从 realtek 获得的用于 wifi (usb) 的其他设备。 在 github 上的 linux 存储库上,设备驱动程序使用特定的 io 端口进行注册。内核将这些端口分配给设备驱动程序。设备驱动程序通常使用对 request_region 函数调用来请求端口。所以对于某些以太网设备,它请求如下

    for (id_port = 0x110 ; id_port < 0x200; id_port += 0x10)
     {
    if (!request_region(id_port,1,"3c509-control")) 
    continue;
    outb(0x00,id_port);
    outb(0xff,id_port);
    if (inb(id_port) & 0x01)
    break;
    else
    release_region(id_port,1);
    }

上面以0x1100x200开头,这个范围内的任何端口都可以由内核分配给驱动程序,出现在/proc/ioports文件中,表示驱动程序成功时正在使用该io端口从request_region返回。

问题:所以我的问题是 linux 是否为所有可用于内核 5.7 或最新内核版本的制造设备分配了 io 端口?

问题:如果我想为任何设备编写设备驱动程序怎么办。如何找到要请求的 io 端口号范围。我不希望我必须查看内核代码并找到类似的驱动程序端口范围。那么我怎样才能找到那个 io 端口号范围。如何实现编写设备驱动程序所需的第一步(任何设备。无论是 wifi 互联网设备还是以太网设备)

解决方法

问题:所以我的问题是 linux 是否为所有可用于内核 5.7 或最新内核版本的制造设备分配了 io 端口?

没有

问题:如果我想为任何设备编写设备驱动程序怎么办。如何找到要请求的 io 端口号范围。

你向用户索要。毕竟是用户使用 ISA 卡上的跳线设置它们。

这是一张旧的 Sound Blaster 卡的图片(取自维基百科,我现在懒得在地下室翻找了)。我在图片中突出显示了特定区域:

Sound Blaster card with port jumper highlighted

我突出显示的那个跳线头:那是端口配置跳线。作为用户,您实际上将两个引脚与跳线连接器连接起来,并将来自卡连接器的特定地址线连接到卡其余部分的电路。该地址线是 AT 总线端口 I/O 方案的一部分。用户设置这个跳线,记下号码,然后告诉司机它被设置为哪个号码。这就是 AT 风格的 I/O 端口。

或者驱动程序使用众所周知的端口号之一用于特定硬件(如网络控制器),其历史可以追溯到 ISA 风格端口仍然存在的时代。还有旧的 ISA-P'n'P,其中 BIOS 和附加卡会在加电时协商端口分配,甚至在操作系统启动之前。您可以使用内核提供的 ISA-P'n'P API 读取这些端口号。

我们在实践中不再使用这种硬件!除了传统和复古计算目的。

25 年前,旧的 AT/ISA 总线被 PCI 取代。今天我们使用PCIe,从软件的角度来看,它仍然像PCI。关于 PCI 的重要事情之一是,它完全放弃了端口的整个概念。

使用 ISA 时,您拥有 8 条数据线和 16 条地址线,以及两条读/写使能线,一条用于内存映射 I/O,另一条用于端口 I/O。您可以在此处找到详细信息 https://archive.is/3jjZj。但是当你从端口 0x0104 读取时会发生什么,它会将 0x0104 的位模式物理设置为 ISA 总线上的地址线,拉低读取使能线,然后读取数据线上的电压电平。所有这些都作为 x86 的实际指令集实现:https://c9x.me/x86/html/file_module_x86_id_139.html

现在看看 PCI 总线:不再有单独的数据线和地址线。相反,读/写命令将被发送,一切都通过内存映射发生。 PCI 设备有一个叫做 BAR 的东西:基地址寄存器。这由 PCI 根联合体配置,并为硬件分配它出现的实际物理总线地址区域。操作系统必须从 PCI 根联合体获取这些 BAR 信息。驱动程序使用 PCI ID 来发现硬件并将 BAR 信息告知它。然后它可以进行内存读/写以与硬件对话。不涉及 I/O 端口。而这只是最低水平。 USB 和以太网发生得更远。 USB 非常抽象,以太网也是如此。

您的另一个问题 Looking for driver developer datasheet of Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz 表明您对实际发生的事情有一些严重的误解。您问的是 USB 设备和以太网端口。两者都不以任何方式直接与计算机的这一部分交互。

你的问题本身很有趣。但是我们在这里也遇到了一个巨大的 XYZ 问题;它比 XY 问题更糟糕;你问的是 X,虽然你想解决 Y。但 Y 甚至不是你首先要处理的问题。

你显然很聪明,也很好奇,我对此表示赞赏。但我必须告诉你,你必须回溯很多,以消除你的一些误解。