最終更新:2016-09-17 (土) 02:31:39 (2770d)
I/Oポート
CPUの入出力端子
概要
- 1本の端子に0か1(具体的には0Vか5Vなどの電圧)を選択して出力することができる回路、および1本の端子の電圧に応じて0か1を判別しその状態を読み取ることができる回路のことをI/Oポートと呼ぶ。
- 多くの場合入力と出力の両方が行える回路構成になっており、レジスタの設定により入力か出力を切り替えて使うことができる。
- 8本単位で構成される場面が多く、パラレルI/Oとも呼ばれる。
I/Oレジスタ?
- 値を書き込むと、内蔵されたさまざまな装置に何らかの動作を行わせたり、内蔵された様々な装置に外部から与えられた情報を読み取ることができる仕掛けがなされた特殊なレジスタ
- I/Oポートとも呼ばれる。8ビット幅とか。
- 入出力ポートはそれぞれ固有のI/Oポートアドレスを持ち、識別されています。
例
アドレス 0~3 4~7 8~B C~F 0x000x DMAコントローラ 0x001x 予約済み 0x002x 割り込みコントローラ#1 (0x20~0x21) 0x003x 予約済み 0x004x システムタイマー 予約済み 0x005x 予約済み 0x006x キーボードとPS/2マウス(0x60)、システムコントロールポート?B(0x61) キーボードとPS/2マウス(0x64) 0x007x RTC/CMOS、NMI 予約済み 0x008x 0x009x 予約済み 0x00Ax 割り込みコントローラ#2 (0xA0~0xA1) 予約済み 0x00Bx 予約済み 0x00Cx 0x00Dx 0x00Ex 予約済み 0x017x 0x01Fx 0x02Fx COM2 0x037x LPT1 0x03Fx COM1
アクセス方法
- プロセッサからI/O ポートにアクセスするには、次の2 つの方法がある。
メモリマップドI/O
- 割り当てはBIOSがコンピュータの立ち上げ次に行う
- MMIO領域は通常4GB直下の1GB領域に割り当てられる
I/OマップドI/O
I/Oアドレス空間
Linux
関数
ポート割り当て (linux/ioport.h)
- メモリマップドI/O
- I/OマップドI/O
- check_region? - 既に割り当てられていないか確認
- request_region
- 複数のドライバ化やカーネルから同時にI/Oポートアドレスを使用されるとハードウェアが誤動作するかもしれないので使用するアドレス範囲を予約
- release_region?
読み書き (asm/io.h)
- _pってのは高速なCPU性能にデバイスの処理が間に合わないことを考慮してウェイトを加味した関数