1

製造されたすべてのデバイス用に 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インターネットデバイスまたはイーサネットデバイス)

4

1 に答える 1