linux为所有制造设备保留io端口号。
我有英特尔内置网卡之类的设备。或者是我从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);
}上面从0x110开始到0x200,内核可以在这个范围内将任何端口分配给驱动程序,并出现在/proc/ioports文件中,这意味着在从request_region成功返回时,驱动程序正在使用该io端口。
问题:那么我的问题是,linux是否为所有制造的设备分配了io端口,使用内核5.7或最新的内核版本?
问:如果我想为任何设备编写设备驱动程序,该怎么办?如何找到要请求的io端口号范围。我不期望我必须查看内核代码并找到更相似的驱动程序端口范围。那我怎么才能找到io端口号范围。如何实现写入设备驱动程序(任何设备)所需的第一步。无论是无线网络设备还是以太网设备)
发布于 2021-01-03 10:41:49
问题:那么我的问题是,linux是否为所有制造的设备分配了io端口,可以使用内核5.7或最新的内核版本?
不是的。
问题:如果我想为任何设备编写设备驱动程序,该怎么办?如何找到要请求的io端口号范围。
你向用户要它。毕竟,是用户使用ISA卡上的跳线来设置它们。
这是一张旧的声响卡片的照片(取自维基百科,我现在懒得在地下室里翻找)。我在图片中突出了一个特定的区域:

我突出显示的那个跳线头:那是端口配置跳转器。作为用户,您可以将两个引脚与一个跳线连接器连接起来,并将来自卡连接器的特定地址线连接到卡其余部分的电路上。此地址线是AT总线端口I/O方案的一部分。用户设置这个跳线器,写下号码,然后告诉驱动程序,它被设置为哪个号码。这就是AT风格的I/O端口。
或者驱动程序为特定的硬件(如网络控制器)使用了一个众所周知的端口号,这些硬件可以追溯到当时,当时ISA风格的端口仍然很重要。还有以前的ISA-P‘P,在操作系统启动之前,BIOS和外接程序卡会在开机时协商端口分配。您可以使用内核提供的ISA-P'n'P API读取这些端口号。
我们不再在实践中使用这种硬件!,除了用于遗留和复古计算的目的。
四分之一个多世纪前,旧的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 it来发现硬件,并将条形图信息告知它。然后,它可以执行内存读/写来与硬件对话。不涉及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根本不是你要处理的问题。
你显然很聪明,也很好奇,我对此表示赞赏。但我必须告诉你,你必须回溯很多,来澄清你的一些误解。
https://stackoverflow.com/questions/65541049
复制相似问题