製造されたすべてのデバイス用に 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);
}
0x110
上記はtoで始まり0x200
、任意のポートをカーネルによってドライバーにこの範囲で割り当てることができ、/proc/ioports ファイルに表示されます。これは、ドライバーが からの成功リターンの時間までにその io ポートを使用していることを意味しrequest_region
ます。
質問 : 私の質問は、Linux がカーネル 5.7 または最新のカーネル バージョンで使用可能なすべての製造済みデバイスに io ポートを割り当てているということですか?
質問 : 任意のデバイスのデバイス ドライバーを作成したい場合はどうすればよいですか。要求する io ポート番号の範囲を見つけるにはどうすればよいですか。カーネルコードを調べて、より類似したドライバーのポート範囲を見つける必要があるとは思いません。そのioポート番号の範囲を見つけるにはどうすればよいですか。デバイスドライバーの作成に必要なこの最初のステップを達成する方法(任意のデバイス。wifiインターネットデバイスまたはイーサネットデバイス)