ハードウェアリソースマネージャは、 ハードウェアリソースを管理して、競合を防ぐために使用される。
対象とするハードウェアリソースは、I/O アドレス、 割り込み番号 ( IRQ 番号 ) などであり、特定のリソース ID により、 これらのハードウェアリソース登録、および管理を行う。
デバイスドライバは、このマネージャを使用して、 対応するデバイスのリソースを取り出して使用することになる。
また、PC カードマネージャは、 マップする I/O アドレスのチェック、 および管理を、このマネージャを使用して行う。
さらに、割り込み番号に共有に関する機能も提供している。
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)
ハードウェアリソースマネージャは、 以下のサービスを拡張システムコールとして提供する。
  | 
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);
  | 
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);
  | 
ERR rsvHwRes(UW rid, UW start, UW end)
rid     | リソース ID | 
start   | 開始アドレス / 番号 | 
end     | 終了アドレス / 番号 | 
| = 0 (ER_OK) | 正常終了 | 
| < 0 | エラー (エラーコード) | 
  rid で指定したリソース ID で、start 〜 end
  で指定した範囲のリソース (アドレス / 番号)を予約(登録)する。
  すでに登録済みの rid に対して、
  重複しないエントリを追加して予約 ( 登録 ) することができる。
  割り込み番号 ( HW_IRQ ) の予約 ( 登録 ) の場合、
  start、end で指定する割り込み番号に
  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);
  | 
ERR relHwRes(UW rid)
| rid | リソース ID | 
| = 0 (ER_OK) | 正常終了 | 
| < 0 | エラー (エラーコード) | 
  rid で指定したリソース ID により、登録したエントリをすべて解放する。
  対象のエントリが 1 つもない場合もエラーとはならない。
ER_PAR   | パラメータエラー ( rid のタイプが不正 ) | 
/* PC カードスロット 1 用に登録した IO リソースを解放する */ relHwRes(HW_IO(HW_PCSLT1));
  | 
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     | 割り込み番号は共有できない | 
ハードウェアリソースはシステム起動時に初期化される。
初期化の内容は、システムのハードウェアプラットホームや実装に依存する。 以下に PC/AT 版の標準システムでは、初期化内容を示す。
標準ハードウェアとして、以下が無条件に登録される。
| rid | start | end | 
|---|---|---|
| HW_IO(HW_SYSTEM) | 0x0000 | 0x00FF | 
| HW_IO(HW_IDE1) | 0x01F0 | 0x01F7 | 
| HW_IO(HW_VIDEO) | 0x03B0 | 0x03BB | 
| HW_IO(HW_VIDEO) | 0x03C0 | 0x03DF | 
| HW_IO(HW_FDC) | 0x03F0 | 0x03F5 | 
| HW_IO(HW_IDE1) | 0x03F6 | 0x03F6 | 
| HW_IO(HW_FDC) | 0x03F7 | 0x03F7 | 
| rid | start | end | 
|---|---|---|
| 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) | 12 | 12 | 
| HW_IRQ(HW_COP) | 13 | 13 | 
| HW_IRQ(HW_IDE1) | 14 | 14 | 
Secondary IDE コントローラの存在をチェックし、存在すれば登録される。
| rid | start | end | 
|---|---|---|
| HW_IO(HW_IDE2) | 0x0170 | 0x0177 | 
| HW_IO(HW_IDE2) | 0x0376 | 0x0376 | 
| HW_IRQ(HW_IDE2) | 15 | 15 | 
DEVCONF に以下のエントリがあるときは、そのまま登録される。
    LPT_PORT iob irq
  ないときは、BIOS 設定の LPT1 の iob と標準 irq が登録される。
| rid | start | end | 
|---|---|---|
| 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〜4 | iob1〜4 + 7 | 
| HW_IRQ(HW_COM1 〜 4) | irq1〜4 | irq1〜4 | 
DEVCONF に以下のエントリがあるときは、そのまま登録される。
| rid | ||
|---|---|---|
| RSV_PORT | ios ioe .... | (max 8 pairs) | 
| RSV_PORT1 | ios ioe .... | (max 8 pairs) | 
| :: | ||
| RSV_PORT9 | ios ioe .... | (max 8 pairs) | 
| RSV_IRQ | irq .... | (max 16 entry) | 
| HW_IO(HW_RSV) | ios | ioe | 
| HW_IRQ(HW_RSV) | irq | irq | 
PCI デバイスに IRQ が割り当ているときは、登録される。
| rid | start | end | 
|---|---|---|
| HW_IRQ(HW_PCIDEV) | irq | irq | 
DEVCONF に以下のエントリがあるときは、そのまま登録される。
    PCIC_PORT iob irq1 irq2
ないときは、PC カードコントーラの存在をチェックして、存在すれば 登録される。 irq は空いている番号が割り当てられる。
| rid | start | end | 
|---|---|---|
| HW_IO(HW_PCIC) | iob | iob + 1 | 
| HW_IRQ(HW_PCSLT1) | irq1 | irq1 | 
| HW_IRQ(HW_PCSLT2) | irq2 | irq2 |