JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
デバイスドライバの記述     Oracle Solaris 10 8/11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Solaris プラットフォーム用デバイスドライバの設計

1.  Solaris デバイスドライバの概要

2.  Solaris カーネルとデバイスツリー

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動設定

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

9.  ダイレクトメモリーアクセス (DMA)

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

17.  SCSI ターゲットドライバ

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

パート III デバイスドライバの構築

21.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

22.  デバイスドライバのデバッグ、テスト、およびチューニング

23.  推奨されるコーティング方法

パート IV 付録

A.  ハードウェアの概要

B.  Solaris DDI/DKI サービスの概要

C.  64 ビットデバイスドライバの準備

64 ビットドライバの設計の紹介

一般的な変換手順

固定幅型をハードウェアレジスタに使用する

固定幅の共通アクセス関数を使用する

派生型の使用を確認および拡張する

DDI データ構造体内の変更されたフィールドを確認する

buf 構造体の変更内容

ddi_dma_attr

ddi_dma_cookie 構造体の変更内容

csi_arq_status 構造体の変更内容

scsi_pkt 構造体の変更内容

DDI 関数の変更された引数を確認する

getrbuf() 引数の変更内容

drv_getparm() 引数の変更内容

delay() および timeout() 引数の変更内容

rmallocmap() および rmallocmap_wait() 引数の変更内容

scsi_alloc_consistent_buf() 引数の変更内容

uiomove() 引数の変更内容

cv_timedwait() および cv_timedwait_sig() 引数の変更内容

ddi_device_copy() 引数の変更内容

ddi_device_zero() 引数の変更内容

ddi_dma_mem_alloc() 引数の変更内容

データ共有を処理するルーチンを変更する

ioctl() でのデータ共有

devmap() でのデータ共有

mmap() でのデータ共有

x86 ベースのプラットフォームで 64 ビット Long データ型の構造体を確認する

よく知られている ioctl インタフェース

デバイスのサイズ

D.  コンソールフレームバッファードライバ

索引

64 ビットドライバの設計の紹介

32 ビットカーネルだけをサポートすればよいドライバの場合、既存の 32 ビットのデバイスドライバは再コンパイルなしで引き続き動作します。ただし、ほとんどのデバイスドライバでは、64 ビットカーネルで正しく動作するためにはいくらかの変更が必要です。また、すべてのデバイスドライバで、再コンパイルして 64 ビットのドライバモジュールを作成する必要があります。この付録の情報は、32 ビット環境用と 64 ビット環境用のドライバを共通のソースコードから生成して、コードの移植性を高め、保守の手間を減らすのに役立ちます。

64 ビット環境用にデバイスドライバの変更を開始する前に、32 ビット環境と 64 ビット環境の違いを理解するようにしてください。特に、C 言語のデータ型モデルの ILP32 と LP64 に精通する必要があります。次の表を参照してください。

表 C-1 ILP32 と LP64 のデータ型の比較

C データ型
ILP32
LP64
char
8
8
short
16
16
int
32
32
long
32
64
long long
64
64
float
32
32
double
64
64
long double
96
128
pointer
32
64

この付録のテーマは、ILP32 と LP64 の違いによるドライバ固有の問題です。一般的な内容については、『Solaris 64 ビット 開発ガイド』を参照してください。

ドライバの作成者は、LP64 用のデータモデル変更をサポートするための一般的なコードクリーンアップに加えて、32 ビットと 64 ビットの両方のアプリケーションのサポートを提供する必要があります。

ioctl(9E)、devmap(9E)、および mmap(9E) の各エントリポイントによって、アプリケーションとデバイスドライバの間で直接データ構造体を共有できます。それらのデータ構造体のサイズが 32 ビット環境と 64 ビット環境の間で変化する場合は、アプリケーションのデータモデルがカーネルのデータモデルと同じかどうかをドライバが判定できるように、エントリポイントを変更する必要があります。データモデルが異なる場合は、データ構造体を調整できます。「64 ビットに対応したデバイスドライバに対する入出力制御のサポート」「32 ビットと 64 ビットのデータ構造体マクロ」、および「ユーザーマッピングへのカーネルメモリーの関連付け」を参照してください。

多くのドライバで、この種の処理が必要な ioctls は少数です。その他の ioctls は、ioctls がサイズの変化しないデータ構造体を渡すかぎり、変更なしで動作します。