出力は次のようになりますcat proc/ioports
:
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0071 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:0f.1
0170-0177 : pata_via
01f0-01f7 : 0000:00:0f.1
01f0-01f7 : pata_via
0290-0297 : pnp 00:07
02f8-02ff : serial
0376-0376 : 0000:00:0f.1
0376-0376 : pata_via
0378-037a : parport0
037b-037f : parport0
03e0-03e7 : pnp 00:08
03f2-03f2 : floppy
03f4-03f5 : floppy
03f6-03f6 : 0000:00:0f.1
03f6-03f6 : pata_via
03f7-03f7 : floppy
0400-041f : pnp 00:08
0400-0407 : vt596_smbus
04d0-04d1 : pnp 00:08
0778-077a : parport0
0800-087f : pnp 00:08
0800-0803 : ACPI PM1a_EVT_BLK
0804-0805 : ACPI PM1a_CNT_BLK
0808-080b : ACPI PM_TMR
0810-0815 : ACPI CPU throttle
0820-0823 : ACPI GPE0_BLK
0cf8-0cff : PCI conf1
d000-d0ff : 0000:00:11.5
d000-d0ff : VIA8237
d400-d41f : 0000:00:10.3
d400-d41f : uhci_hcd
d480-d49f : 0000:00:10.2
d480-d49f : uhci_hcd
d800-d81f : 0000:00:10.1
d800-d81f : uhci_hcd
d880-d89f : 0000:00:10.0
そして出力は次のようになりますcat /proc/iomem
。
00000000-0000ffff : reserved
00010000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000cf7ff : Video ROM
000e0000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-bffbffff : System RAM
01000000-01538f03 : Kernel code
01538f04-017c217f : Kernel data
01877000-0194dfff : Kernel bss
bffc0000-bffcdfff : ACPI Tables
bffce000-bffeffff : ACPI Non-volatile Storage
bfff0000-bfffffff : reserved
cff00000-dfefffff : PCI Bus 0000:01
d0000000-d7ffffff : 0000:01:00.0
e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]
e0000000-efffffff : pnp 00:0d
f0000000-f7ffffff : 0000:00:00.0
fca00000-feafffff : PCI Bus 0000:01
fd000000-fdffffff : 0000:01:00.0
feae0000-feafffff : 0000:01:00.0
febc0000-febdffff : 0000:00:0d.0
febc0000-febdffff : e1000
febf0000-febf7fff : 0000:00:0a.0
febf0000-febf7fff : 0000:00:0a.0
febfbc00-febfbcff : 0000:00:10.4
febfbc00-febfbcff : ehci_hcd
fec00000-fec00fff : reserved
fec00000-fec003ff : IOAPIC 0
fecc0000-fecc03ff : IOAPIC 1
fee00000-fee00fff : Local APIC
fee00000-fee00fff : pnp 00:09
ff7c0000-ffffffff : reserved
fff80000-ffffffff : pnp 00:0e
ここでどのメモリ アドレスが参照されているのかわかりません。仮想メモリですか? ユーザー プログラムからこれらのメモリ アドレスにアクセスして、たとえばシリアル ポートに書き込むことは可能でしょうか? アセンブラを使用すれば可能でしょうか?
答え1
ここで参照されているのはどのメモリ アドレスですか。仮想メモリですか?
最初のIBM PCの設計の一部は、実際のメモリ(プログラムやデータによって使用されるもの)以外のものにメモリアドレスを使用することでした。
最初の IBM PC では、最大 640 KB の RAM を搭載できましたが、チップは最大 1024 KB のメモリをアドレス指定できました。ただし、640 より大きい (1024 より小さい) メモリ アドレスへの書き込みは、実際には RAM ではなく、プラグイン グラフィック アダプタなどのデバイスとの通信に使用されました。
この概念は、メモリマップ IO またはメモリマップ ハードウェア デバイスと呼ばれることもあります。
IO ポートは、IBM PC アーキテクチャの別の種類のアドレス指定可能なリソースです。初期の頃は、ボード上のアドレス指定ピンを接続するために「ジャンパー」を使用して、プラグイン (ISA) カード上でこのようなアドレスを物理的に設定していました。また、一致する IO アドレスを使用するようにソフトウェアを設定することもできました。
カードの左側にある白い文字は、どのジャンパー位置がどの IO ポート アドレスを指定するかなどを示します。
現在では、システムの起動時に、アドレスの詳細はカードとホスト コンピュータによって動的にネゴシエートされ、割り当てられるため、設定する必要がなくなりました。
たとえば、シリアル ポートに書き込むために、ユーザー プログラムからこれらのメモリ アドレスにアクセスすることは可能でしょうか? アセンブラを使用すれば可能でしょうか?
それを許可するオペレーティング システム (PC-DOS、リアル モード OS など) を使用している場合は、そうだと思います。対照的に、最近のプロテクト モード OS では、ユーザー プログラムからのこのような操作は実行されません。
答え2
/proc/ioports
I/O ポート アドレスの範囲を一覧表示します。
/proc/iomem
物理メモリ アドレスの範囲を一覧表示します。
をマッピングすることで、ユーザー プログラムから物理メモリ アドレスに直接アクセスできます/dev/mem
が、おそらくその必要はないでしょう。 を使用して、ユーザー プログラムから I/O ポートに直接アクセスできますioperm
が、おそらくその必要はないでしょう。一般に、割り込みを無効にするなどの操作を行う必要があるため、このような操作を行うにはカーネル モードを使用する必要があります。
答え3
物理的なものですが、一部は仮想メモリに線形にマッピングされます。