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

how to find out which ioports be assigned to my devices

已 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 端口成功时间 return 来自 request_region.

问题:所以我的问题是 linux 已将 io 端口分配给可与内核 5.7 或最新内核版本一起使用的所有制造设备?

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

Question : So my question is has linux assigned io ports to all manufactured devices usable with kernel 5.7 or latest kernel version?

没有

Question : What if I want to write device driver for any device. How can I find the io ports number range to request to.

你向用户索取。毕竟是用户通过ISA卡上的跳线设置的。

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

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

或者 driver 为特定硬件(如网络控制器)使用众所周知的端口号之一,该端口号可以追溯到 ISA 样式端口仍然存在的时代。还有旧的 ISA-P'n'P,其中 BIOS 和 add-in 卡会在通电时协商端口分配,甚至在 OS 开始之前。您可以使用内核提供的 ISA-P'n'P API 读取这些端口号。

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

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

对于 ISA,您拥有 8 条数据线和 16 条地址线,外加两条 read/write 启用线,一条用于内存映射 I/O,另一条用于端口 I/O。您可以在此处找到详细信息 https://archive.is/3jjZj. But what happens when you're reading from say, port 0x0104, it would physically set the bit pattern of 0x0104 to the address lines on the ISA bus, pull low the read enable line, and then read the voltage level on the data lines. And all of that is implemented as an actual set of instructions of the x86: https://c9x.me/x86/html/file_module_x86_id_139.html

现在看看 PCI 总线:不再有单独的数据线和地址线。相反 read/write 命令将被发送,一切都通过内存映射发生。 PCI 设备有一个叫做 BAR 的东西:一个 基地址寄存器 。这是由 PCI 根联合体配置的,并为硬件分配它出现的实际物理总线地址区域。 OS 必须从 PCI 根复合体中获取那些 BAR 信息。 driver 使用 PCI ID 来发现硬件并将 BAR 信息告知它。然后它可以做 memory reads/writes 来与硬件对话。不涉及 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 甚至不是你首先要处理的问题。

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