この章の目次にもどる
前頁:第2章 PC (PCMCIA) カードマネージャにもどる
次頁:第4章 時計にすすむ

第3章 ハードウェアリソースマネージャ

3.1 概要

ハードウェアリソースマネージャは、 ハードウェアリソースを管理して、競合を防ぐために使用される。

対象とするハードウェアリソースは、I/O アドレス、 割り込み番号 ( IRQ 番号 ) などであり、特定のリソース ID により、 これらのハードウェアリソース登録、および管理を行う。

デバイスドライバは、このマネージャを使用して、 対応するデバイスのリソースを取り出して使用することになる。

また、PC カードマネージャは、 マップする I/O アドレスのチェック、 および管理を、このマネージャを使用して行う。

さらに、割り込み番号に共有に関する機能も提供している。

3.2 データ定義 ( hwres.h )

/*
    ハードウェアリソースリスト
*/
typedef struct {
    UW  rid;            /* リソース ID */
    UW  start;          /* 開始アドレス / 番号 */
    UW  end;            /* 終了アドレス / 番号 */
} HwResList;

/*
    ハードウェアリソース ID
        0xTTTTKKKK   T: タイプ、K: 種別
*/
#define HW_TYPEMASK (0xFFFF0000)
#define HW_IO(k)    (0x10000 | (k))   /* I/O アドレス */
#define HW_IRQ(k)   (0x20000 | (k))   /* 割り込み番号 */

#define HW_SYSTEM   (0x0001)    /* システム */
#define HW_KBD      (0x0002)    /* キーボード */
#define HW_MOUSE    (0x0003)    /* マウス */
#define HW_TIMER    (0x0004)    /* システムタイマー */
#define HW_RTC      (0x0005)    /* RTC */
#define HW_PIC      (0x0006)    /* 割り込みコントローラ */
#define HW_DMA      (0x0007)    /* DMA コントローラ */
#define HW_COP      (0x0008)    /* コプロセッサ */

#define HW_VIDEO    (0x0010)    /* ビデオ */

#define HW_FDC      (0x0020)    /* フロッピーディスク */

#define HW_IDE1     (0x0030)    /* IDE コントローラ 1 */
#define HW_IDE2     (0x0031)    /* IDE コントローラ 2 */

#define HW_LPT1     (0x0040)    /* プリンタポート 1 */
#define HW_LPT2     (0x0041)    /* プリンタポート 2 */
#define HW_LPT3     (0x0042)    /* プリンタポート 3 */

#define HW_COM1     (0x0050)    /* シリアルポート 1 */
#define HW_COM2     (0x0051)    /* シリアルポート 2 */
#define HW_COM3     (0x0052)    /* シリアルポート 3 */
#define HW_COM4     (0x0053)    /* シリアルポート 4 */

#define HW_PCIC     (0x0060)    /* PC カードコントローラ */

#define HW_NET      (0x0070)    /* ネットワークアダプタ */

#define HW_SOUND    (0x0080)    /* サウンドデバイス */

#define HW_USB1     (0x0090)    /* USB ホストコンローラ 1 */
#define HW_USB2     (0x0091)    /* USB ホストコンローラ 2 */

#define HW_PCSLT1   (0x0100)    /* PC カードスロット 1 */
#define HW_PCSLT2   (0x0101)    /* PC カードスロット 2 */

#define HW_PCIDEV   (0x8000)    /* PCI デバイス(その他) */

#define HW_RSV      (0xFFFF)    /* 予約 (使用不可) */

/*
        共有割り込み指定
*/
#define SHARED_IRQ  (0x100)

3.3 ハードウェアリソースマネージャシステムコール

ハードウェアリソースマネージャは、 以下のサービスを拡張システムコールとして提供する。

lstHwRes
 
登録されているハードウェアリソース一覧の取り出し

【形式】

WERR	lstHwRes(UW rid, HwResList *lst, W cnt)

【パラメータ】

rid リソース ID
lst リソース一覧の格納領域
cnt 取り出すエントリ数

【リターン値】

>= 0 正常終了 ( 登録エントリ数 )
< 0 エラー ( エラーコード )

【解説】

rid で指定したリソースタイプで登録されているエントリを取り出す。 rid はタイプ ( HW_TYPEMASK ) のみ有効で、種別は無視される。

lst == NULL または cnt == 0 の時は、登録エントリ数を関数値として戻す。 cnt < 登録エントリ数 のときは、cnt 個のエントリのみを取り出す。

取り出したエントリは、アドレス順などになっていることは保証されない。

【エラーコード】

ER_ADRアドレスエラー ( lst )
ER_PARパラメータエラー ( rid, cnt )

【使用例】

HwResList	lst[50];

/* I/O アドレス一覧を取り出す */
lstHwRes(HW_IO(0), lst, 50);

/* IRQ 一覧を取り出す */
lstHwRes(HW_IRQ(0), lst, 50);
getHwRes
 
登録されているハードウェアリソースの取り出し

【形式】

WERR	getHwRes(UW rid, UW *start, UW *end, W cnt)

【パラメータ】

rid リソース ID
start 開始アドレス / 番号の格納領域
end 終了アドレス / 番号の格納領域
cnt 取り出すエントリ数

【リターン値】

>= 0 正常終了 (登録エントリ数)
< 0 エラー (エラーコード)

【解説】

rid で指定したリソース ID で登録されているエントリの開始アドレス / 番号、および終了アドレス / 番号を取り出し、 登録エントリ数を関数値として戻す。

cnt = 0 の時は、単に登録エントリ数を関数値として戻す。

1 つの rid に対してエントリは 1 つであることが多いが、 rid によっては、複数のエントリがある場合もある。

【エラーコード】

ER_ADR アドレスエラー ( start, end )
ER_PAR パラメータエラー ( rid, cnt )

【使用例】

UW	s_io[2], e_io[2], s_irq, e_irq;

/* IDE1 の I/O アドレスを取り出す : 標準のシステムでは以下の値となる
	s_io[0] = 0x1F0, e_io[0] = 0x1F7
	s_io[1] = 0x3F6, e_io[1] = 0x3F6
	s_irq = e_irq = 14
*/

getHwRes(HW_IO(HW_IDE1), s_io, e_io, 2);
getHwRes(HW_IRQ(HW_IDE1), &s_irq, &e_irq, 1);
rsvHwRes
 
ハードウェアリソースの予約

【形式】

ERR	rsvHwRes(UW rid, UW start, UW end)

【パラメータ】

rid リソース ID
start 開始アドレス / 番号
end 終了アドレス / 番号

【リターン値】

= 0 (ER_OK) 正常終了
< 0 エラー (エラーコード)

【解説】

rid で指定したリソース ID で、startend で指定した範囲のリソース (アドレス / 番号)を予約(登録)する。

すでに登録済みの rid に対して、 重複しないエントリを追加して予約 ( 登録 ) することができる。

割り込み番号 ( HW_IRQ ) の予約 ( 登録 ) の場合、 startend で指定する割り込み番号に SHARED_IRQ を OR 指定することにより、すでに予約 ( 登録 ) 済み の割り込み番号に対して重複した予約 ( 登録 ) を行うことができ、割り込み番号 を共有する場合に使用する。

【エラーコード】

ER_PAR パラメータエラー ( rid, start, end )
ER_EXS すでに登録済みのエントリと重複している。
ER_LIMIT 登録数がシステムの制限を超えた。

【使用例】

/* IDE1 に対して、標準のシステムでは以下の予約が行われている */

rsvHwRes(HW_IO(HW_IDE1), 0x1F0, 0x1F7);
rsvHwRes(HW_IO(HW_IDE1), 0x3F6, 0x3F6);
rsvHwRes(HW_IRQ(HW_IDE1), 14, 14);

/* 割り込み番号 9 に対して共有の割り込みを予約する */
rsvHwRes(HW_IRQ(HW_NET), 9 | SHARED_IRQ, 9 | SHARED_IRQ);
relHwRes
 
登録されているハードウェアリソースの解放

【形式】

ERR	relHwRes(UW rid)

【パラメータ】

rid リソース ID

【リターン値】

= 0 (ER_OK) 正常終了
< 0 エラー (エラーコード)

【解説】

rid で指定したリソース ID により、登録したエントリをすべて解放する。 対象のエントリが 1 つもない場合もエラーとはならない。

【エラーコード】

ER_PAR パラメータエラー ( rid のタイプが不正 )

【使用例】

/* PC カードスロット 1 用に登録した IO リソースを解放する */

relHwRes(HW_IO(HW_PCSLT1));
defIntHdr
 
( 共有 ) 割り込みハンドラの登録

【形式】

ERR	defIntHdr(W intno, FP inthdr, UW par)

【パラメータ】

intno 割り込み番号 (IRQ)
inthdr 割り込みハンドラ
par 割り込みハンドラに渡す任意のパラメータ

【リターン値】

= 0 正常終了)
< 0 エラー (エラーコード)

【解説】

intno で指定した割り込み番号に対する割り込みハンドラ inthdr を登録する。その割り込み番号に対する最初の割り込みハンドラの登録のときは、その割り込みを許可する。

intno < 0 のときは、- intno を割り込み番号とする登録済みの割り込みハンドラ inthdr の登録を削除する。その割り込み番号に対する割り込みハンドラが 1 つのなくなったときは、その割り込みを禁止する。

指定した割り込み番号が共有可能な場合、複数の割り込みハンドラを同一の割り込み番号に対して登録することができる。

すでに登録済みの割り込みハンドラに対して、再度登録を行うことにより、par の変更を行うことができる。

割り込みハンドラは以下の形式であり、parで指定した任意のパラメータが割り込みハンドラにパラメータとして渡される。

    VOID    inthdr(UW par)

割り込み番号を共有する場合、割り込みを扱うドライバでは以下の注意が必要となる。

【エラーコード】

ER_PAR パラメータエラー ( intno, inthdr )
ER_NOEXS 割り込みハンドラは登録されていない( intno < 0 のとき )
ER_LIMIT 割り込みハンドラの登録の制限を超えた
ER_EXS 割り込み番号は共有できない

3.4 ハードウェアリソースの初期化

ハードウェアリソースはシステム起動時に初期化される。

初期化の内容は、システムのハードウェアプラットホームや実装に依存する。 以下に PC/AT 版の標準システムでは、初期化内容を示す。

標準ハードウェア

標準ハードウェアとして、以下が無条件に登録される。

rid startend
HW_IO(HW_SYSTEM)0x00000x00FF
HW_IO(HW_IDE1) 0x01F00x01F7
HW_IO(HW_VIDEO) 0x03B00x03BB
HW_IO(HW_VIDEO) 0x03C00x03DF
HW_IO(HW_FDC) 0x03F00x03F5
HW_IO(HW_IDE1) 0x03F60x03F6
HW_IO(HW_FDC) 0x03F70x03F7
rid startend
HW_IRQ(HW_TIMER)0 0
HW_IRQ(HW_KBD) 1 1
HW_IRQ(HW_PIC) 2 2
HW_IRQ(HW_FDC) 6 6
HW_IRQ(HW_RTC) 8 8
HW_IRQ(HW_MOUSE)1212
HW_IRQ(HW_COP) 1313
HW_IRQ(HW_IDE1) 1414

Secondary IDE

Secondary IDE コントローラの存在をチェックし、存在すれば登録される。

rid start end
HW_IO(HW_IDE2) 0x01700x0177
HW_IO(HW_IDE2) 0x03760x0376
HW_IRQ(HW_IDE2)15 15

パラレルポート

DEVCONF に以下のエントリがあるときは、そのまま登録される。

    LPT_PORT iob irq

ないときは、BIOS 設定の LPT1 の iob と標準 irq が登録される。

rid startend
HW_IO(HW_LPT1) iob iob + 2
HW_IRQ(HW_LPT1)irq irq

シリアルポート

DEVCONF に以下のエントリがあるときは、そのまま登録される。

    COM_PORT iob1 irq1 iob2 irq2 iob3 irq3 iob4 irq4

ないときは、BIOS 設定の COM1〜4 の iob と標準 irq が登録される。

rid start end
HW_IO(HW_COM1 〜 4) iob1〜4iob1〜4 + 7
HW_IRQ(HW_COM1 〜 4)irq1〜4irq1〜4

予約 IO アドレス / IRQ 番号

DEVCONF に以下のエントリがあるときは、そのまま登録される。

rid   
RSV_PORT ios ioe ....(max 8 pairs)
RSV_PORT1ios ioe ....(max 8 pairs)
::
RSV_PORT9ios ioe ....(max 8 pairs)
RSV_IRQ irq .... (max 16 entry)
HW_IO(HW_RSV) iosioe
HW_IRQ(HW_RSV)irqirq

PCI デバイス (その他)

PCI デバイスに IRQ が割り当ているときは、登録される。

rid startend
HW_IRQ(HW_PCIDEV)irqirq

PC カードコントーラ

DEVCONF に以下のエントリがあるときは、そのまま登録される。

    PCIC_PORT iob irq1 irq2

ないときは、PC カードコントーラの存在をチェックして、存在すれば 登録される。 irq は空いている番号が割り当てられる。

rid startend
HW_IO(HW_PCIC) iob iob + 1
HW_IRQ(HW_PCSLT1)irq1 irq1
HW_IRQ(HW_PCSLT2)irq2 irq2

この章の目次にもどる
前頁:第2章 PC (PCMCIA) カードマネージャにもどる
次頁:第4章 時計にすすむ