8-3-応 デバイスドライバに関する知識
※
1. 科目の概要
Linux でのデバイスドライバ開発について、開発環境やデバッグ方法、実際の開発方法を 解説する。デバイスドライバを実際に開発することによって、様々なデバイスに対するデ バイスドライバの作成方法を説明する。2. 習得ポイント
本科目の学習により習得することが期待されるポイントは以下の通り。 習得ポイント 説 明 シラバスの対応コマ 8-3-応-1.デバイスドライバの概要 Linuxにおけるドライバの位置づけ、役割を解説する。Linuxカーネルの階層構造、Linuxデ バイスドライバの種類、ユーザ空間とカーネル空間の違いを説明し、カーネル空間のプログ ラミングでの注意点を紹介する。 1 8-3-応-2.デバイスドライバのビルド環境 デバイスドライバのコンパイルについて解説する。makeファイルの記述方法や、作成した実 行ファイルのロード方法を説明する。また、コンパイル時に気をつけることとしてアライメントを 紹介する。 2 8-3-応-3.デバイスドライバのデバッグ デバイスドライバでのデバッグ方法について解説する。デバッグ方法の種類とそれぞれの特徴を説明する。またシステムがハングアップした際のデバッグ方法にも言及する。 3 8-3-応-4.デバイスドライバ開発の環境 デバイスドライバの基本的な実装方法を説明する。実装方法の概要をはじめ、システムコールハンドラの登録方法やデータモデルについて説明する。 5 8-3-応-5.デバイスドライバの動作 デバイスドライバの実装に必要な機能を解説する。ioctlやprocファイルシステム、同期およ び非同期処理などデバイスドライバを取り巻く機能を紹介し、それぞれの使い方を説明す る。また64bitデバイスドライバについても言及する。 6,7 8-3-応-6.デバイスドライバからのハードウェア制御 デバイスドライバからハードウェアにアクセスする方法について解説する。I/Oレジスタの概要やメモリマップドI/Oについて紹介し、アクセスの方法や実装の際の注意点を説明する。 8,9 8-3-応-7.カーネルの構築 作成したデバイスドライバをリリースする際にはカーネルを再構築し、カーネルにデバイスド ライバを含める必要があることを解説する。また、組み込み環境ではリソースの制約上、カー ネルに含める機能を最小限にする必要があることも紹介し、その際にもカーネルの再構築を 行う必要があることを説明する。 4 8-3-応-8.キャラクタ型デバイスドライバ ファイル操作などに利用されるキャラクタ型デバイスドライバの実装方法を解説する。最も重要な機能の実装を説明し、メモリ空間の違いから専用のデータ移動方法を紹介する。 5,6,7 8-3-応-9.ブロック型デバイスドライバ(ホスト) ディスクなどで利用されるブロック型のデバイスドライバについて解説する。要求の処理方法やリムーバブルメディアに対する処理を説明する。 8,9,10 8-3-応-10.デバイスドライバの周辺知識 Linuxのデバイスドライバの周辺知識を解説する。並列処理、プロセス間排他、デッドロックについて説明する。また、OSのブートローダやDMAについても言及する。 11,12,133. IT 知識体系との対応関係
「8-3-応 デバイスドライバに関する知識」と IT 知識体系との対応関係は以下の通り。 1 2 3 4 5 6 7 8 9 10 11 12 13 8-3-応 デバイスド ライバ開発に関す る知識 デバイスドライ バ概要 デバイスドライ バのビルド デバイスドライ バのデバッグ Linuxカーネル の構築 キャラクタ型デ バイスドライバ の作成・1 キャラクタ型デ バイスドライバ の作成・2 キャラクタ型デ バイスドライバ の作成・3 ブロック型デバ イスドライバの 作成 ブロック型デバ イスドライバの 作成(ホスト)・ 2 ブロック型デバ イスドライバの 作成(ホスト)・ 3 ブート概要 並列処理とプロ セス間同期 DMAと電源 科目名 応用レベル <IT 知識体系上の関連部分> 科目名 1 2 3 4 5 6 7 8 9 10 11 12 13 1 IT-IAS 情報保証 と情報セキュリ ティ IT-IAS1.基礎的な 問題 IT-IAS2.情報セ キュリティの仕組 み(対策) IT-IAS3.運用上の 問題 IT-IAS4.ポリシー IT-IAS5.攻撃 IT-IAS6.情報セ キュリティ分野 IT-IAS7.フォレン ジック(情報証拠) IT-IAS8.情報の状 態 IT-IAS9.情報セ キュリティサービ ス IT-IAS10.脅威分 析モデル IT-IAS11.脆弱性 2 IT-SP 社会的な観 点とプロフェッ ショナルとしての 課題 IT-SP1.プロ フェッショナルと してのコミュニ ケーション IT-SP2.コン ピュータの歴史 IT-SP3.コン ピュータを取り巻 く社会環境 IT-SP4.チーム ワーク IT-SP5.知的財産 権 IT-SP6.コン ピュータの法的問 題 IT-SP7.組織の中 のIT IT-SP8.プロ フェッショナルと しての倫理的な問 題と責任 IT-SP9.プライバ シーと個人の自由 3 IT-IM 情報管理 IT-IM1.情報管理の概念と基礎 IT-IM2.データ ベース問合わせ言 語 IT-IM3.データ アーキテクチャ IT-IM4.データモ デリングとデータ ベース設計 IT-IM5.データと 情報の管理 IT-IM6.データ ベースの応用分野4 IT-WS Webシステムとその技術 IT-WS1.Web技術 [1-Ⅰ-7] IT-WS2.情報アー キテクチャ [1-Ⅰ-7] IT-WS3.デジタル メディア IT-WS4.Web開発 IT-WS5.脆弱性 IT-WS6.ソーシャ ルソフトウェア 5 IT-PF プログラミング基礎 IT-PF1.基本データ構造 IT-PF2.プログラ ミングの基本的構 成要素 IT-PF3.オブジェ クト指向プログラ ミング IT-PF4.アルゴリ ズムと問題解決 IT-PF5.イベント 駆動プログラミン グ IT-PF6.再帰 6 IT-IPT 技術を統 合するためのプロ グラミング IT-IPT1.システム 間通信 [1-Ⅰ-3] IT-IPT2.データ割 り当てと交換 IT-IPT3.統合的 コーディング IT-IPT4.スクリプ ティング手法 IT-IPT5.ソフト ウェアセキュリ ティの実現 IT-IPT6.種々の問 題 IT-IPT7.プログラ ミング言語の概要
7 CE-SWE ソフトウェア工学 CE-SWE0.歴史と概要 CE-SWE1.ソフトウェアプロセス CE-SWE2.ソフト ウェアの要求と仕 様 CE-SWE3.ソフト ウェアの設計 CE-SWE4.ソフト ウェアのテストと 検証 CE-SWE5.ソフト ウェアの保守 CE-SWE6.ソフト ウェア開発・保守 ツールと環境 [1-Ⅰ-4] CE-SWE7.ソフト ウェアプロジェク ト管理 CE-SWE8.言語翻訳 CE-SWE9.ソフト ウェアのフォール トトレランス CE-SWE10.ソフト ウェアの構成管理 CE-SWE11.ソフ トェアの標準化 [1-Ⅰ-6] 8 IT-SIA システム インテグレーショ ンとアーキテク チャ IT-SIA1.要求仕様IT-SIA2.調達/手配 IT-SIA3.インテグ レーション [1-Ⅰ-4] IT-SIA4.プロジェ クト管理 IT-SIA5.テストと 品質保証 IT-SIA6.組織の特 性 IT-SIA7.アーキテ クチャ 9 IT-NET ネットワーク IT-NET1.ネット ワークの基礎 IT-NET2.ルーティ ングとスイッチン グ IT-NET3.物理層 IT-NET4.セキュリティ IT-NET5.アプリ ケーション分野 [1-Ⅰ-5] IT-NET6.ネット ワーク管理 CE-NWK0.歴史と概 要 CE-NWK1. 通信 ネットワークの アーキテクチャ CE-NWK2.通信ネッ トワークのプロト コル CE-NWK3.LANとWAN CE-NWK4.クライア ントサーバコン ピューティング [1-Ⅰ-3] CE-NWK5.データの セキュリティと整 合性 CE-NWK6.ワイヤレ スコンピューティ ングとモバイルコ ンピューティング CE-NWK7.データ通 信 CE-NWK8.組込み機 器向けネットワー ク CE-NWK9.通信技術 とネットワーク概 要 CE-NWK10.性能評 価 CE-NWK11.ネット ワーク管理 CE-NWK12.圧縮と 伸張 CE-NWK13.クラス タシステム CE-NWK14.イン ターネットアプリ ケーション [1-Ⅰ-5,7] CE-NWK15.次世代 インターネット CE-NWK16.放送 11IT-PT プラットフォーム技術 IT-PT1.オペレー ティングシステム [1-Ⅰ-3] IT-PT2.アーキテ クチャと機構 IT-PT3.コン ピュータインフラ ストラクチャ IT-PT4.デプロイ メントソフトウェ ア [1-Ⅰ-4] IT-PT5.ファーム ウェア IT-PT6.ハード ウェア
12CE-OPS オペレーティングシステムCE-OPS0.歴史と概要 CE-OPS1.並行性 CE-OPS2.スケ ジューリングと ディスパッチ CE-OPS3.メモリ管 理 CE-OPS4.セキュリ ティと保護 CE-OPS5.ファイル 管理 CE-OPS6.リアルタ イムOS CE-OPS7.OSの概要 CE-OPS8.設計の原 則 CE-OPS9.デバイス 管理 CE-OPS10.システ ム性能評価 コ ン ピュ ー タ ハー ド ウェ ア と アー キ テ ク チャ 13 CE-CAO コン ピュータのアーキ テクチャと構成 CE-CAO0.歴史と概 要 CE-CAO1.コン ピュータアーキテ クチャの基礎 CE-CAO2.メモリシ ステムの構成と アーキテクチャ CE-CAO3.インタ フェースと通信 CE-CAO4.デバイス サブシステム CE-CAO5.CPUアー キテクチャ CE-CAO6.性能・コ スト評価 CE-CAO7.分散・並 列処理 CE-CAO8.コン ピュータによる計 算 CE-CAO9.性能向上 14IT-ITF IT基礎 IT-ITF1.ITの一般 的なテーマ [1-Ⅰ-4] IT-ITF2.組織の問 題 IT-ITF3.ITの歴史 IT-ITF4.IT分野 (学科)とそれに関 連のある分野(学 科) IT-ITF5.応用領域 IT-ITF6.IT分野に おける数学と統計 学の活用 CE-ESY0.歴史と概 要 CE-ESY1.低電力コ ンピューティング CE-ESY2.高信頼性 システムの設計 CE-ESY3.組込み用 アーキテクチャ CE-ESY4.開発環境 CE-ESY5.ライフサ
イクル CE-ESY6.要件分析 CE-ESY7.仕様定義 CE-ESY8.構造設計 CE-ESY9.テスト CE-ESY10.プロ ジェクト管理 CE-ESY11.並行設 計(ハードウェ ア、ソフトウェア CE-ESY12.実装 CE-ESY13.リアル タイムシステム設 計 CE-ESY14.組込み マイクロコント ローラ CE-ESY15.組込み プログラム CE-ESY16.設計手 法 CE-ESY17.ツール によるサポート CE-ESY18.ネット ワーク型組込みシ ステム CE-ESY19.インタ フェースシステム と混合信号システ ム CE-ESY20.センサ 技術 CE-ESY21.デバイ スドライバ CE-ESY22.メンテ ナンス CE-ESY23.専門シ ステム CE-ESY24.信頼性 とフォールトトレ ランス 複 数 領 域 に ま た が る も の 15CE-ESY 組込みシステム シ ス テ ム 基 盤 10CE-NWK テレコミュニケーション 分野 組 織 関 連 事 項 と 情 報 シ ス テ ム 応 用 技 術 ソ フ ト ウェ ア の 方 法 と 技 術
4. OSS モデルカリキュラム固有の知識
OSS モデルカリキュラム固有の知識として、Linux 環境におけるデバイスドライバ の開発がある。GNU 開発環境を Linux 上で利用して、デバイスドライバを開発する手法 を習得する。 科目名 第1回 第2回 第3回 第4回 第5回 第6回 第7回 (1) デバイスドラバと は (1) デバイスドライバ のビルド手順 (1) デバッグ環境の 種類 (1) Linuxカーネルを 構築する意義 (1) ドライバ作成の手 順 (1) procファイルシス テムとは (1) アプリケーション からドライバへの接続 (2) Linuxアーキテク チャの復習 (2) カーネルのコンパ イル (2) Linuxカーネルの 構築方法 (2) 割り込み (2) procファイルシス テム処理の実装 (2) ioctlによるドライ バへの命令 (3) カーネル関数の 復習 (3) デバイスドラバの コンパイル (3) ドライバの組み込 み (3) NULLドライバの作 成 (4) クロスアーキテク チャ (5) 疑似ファイルシス テム 第8回 第9回 第10回 第11回 第12回 第13回 (1) ブロック型デバイ スの種類 (1) requestハンドラ の実装 (1) プラグアンドプレイ (1) ブートローダーの 種類 (1) 並列処理 (1) DMA (2) RAMディスクを実 装する (2) システムハンドラ の実装 (2) ブート方法 (2) プロセス間同期 (2) 省電力 (2) プロセス間同期 8-3-応 デバイスドライ バ開発に関する知識 (網掛け部分はIT 知識体系で学習できる知識を示し、それ以外は OSS モデルカリキュラム固有の知識を示している)開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-1. デバイスドライバの概要 対応する コースウェア 第 1 回 デバイスドライバ概要
8-3-応-1. デバイスドライバの概要
Linux におけるドライバの位置づけ、役割を解説する。Linux カーネルの階層構造、Linux デバイスド ライバの種類、ユーザ空間とカーネル空間の違いを説明し、カーネル空間のプログラミングでの注 意点を紹介する。 【学習の要点】 * デバイスドライバとはハードウェアを制御するためのソフトウェアであり、Linux カーネルの最下層 で動作する。 * Linux デバイスドライバの種類は大きく、キャラクタ型、ブロック型、ネットワークの 3 種類に分ける ことができる。 * 一般的にLinuxはユーザ空間とカーネル空間があり、デバイスドライバはカーネル空間で動作 する。 * カーネル空間ではメモリが保護されていないので、メモリの扱いには十分注する必要がある。
1) デバイスドライバの概要 デバイスドライバとは OS の一部として動作し、コンピュータとハードウェアをつなぐソフトウェアであ る。デバイスドライバの中でも階層構造があり、最下層のハードウェア依存部分からファイルシステ ムやフィルタドライバといった、ハードウェアデバイスに直接アクセスしないドライバ等様々な種類が ある。 2) デバイスの種類 Linux におけるデバイスは大きく以下の3種類に分けることができ、デバイスドライバもそれの特徴に 合わせて作成する。 * キャラクタ型デバイス 1バイト単位のバイトストリームとして扱われるデバイス。シリアルポートやモデムなどのハードウ ェアが挙げられる。 * ブロック型デバイス デバイスへのデータアクセスをまとまった単位(ブロック)で扱われるデバイス。ハードディスクや CD ドライブなどが挙げられる。 * ネットワークインタフェース LAN カード等ネットワークを扱うデバイス。 3) デバイスドライバとアプリケーションの違い * プログラムが動作するメモリ空間 Linux のメモリ空間は大きく「ユーザ空間」と「カーネル空間」に分けられる。アプリケーションはユ ーザ空間で動作するのに対し、デバイスドライバはカーネル空間で動作する。 * プログラムのコンパイル方法 コンパイルにはカーネルのソースコードが必要。Makefile もデバイスドライバ用の書式で作成す る。 * プログラムの実行方法 実行ファイルをカーネルにロードさせて動作させるので、カーネルへのインストールおよびリム ーブのコマンドを使用する。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-2. デバイスドライバのビルド環境 対応する コースウェア 第 2 回 デバイスドライバのビルド
8-3-応-2. デバイスドライバのビルド環境
デバイスドライバのコンパイルについて解説する。make ファイルの記述方法や、作成した実行ファイ ルのロード方法を説明する。また、コンパイル時に気をつけることとしてアライメントを紹介する。 【学習の要点】 * デバイスドライバのコンパイルには make された実行環境のカーネルソースコードが必要である。 * その他はアプリケーションと同様の手順でのコンパイルとなる。 * 作成された実行ファイルは insmod/rmmod コマンドを利用することでカーネルにロードすることが 出来る。 * コンパイル時にはアライメントと呼ばれる構造体の境界調整に注意する必要がある。 図 8-3-応- 2 デバイスドライバのビルド手順1) デバイスドライバのビルド環境の構築 デバイスドライバのビルドには以下の環境が必要である * 実行環境のコンパイラ * make された実行環境のカーネルソース * コンパイル用 Makefile 2) デバイスドライバのビルド手順 デバイスドライバのビルドは Makefile を用意して make を行えばよい。 Makefile の例を示す。 # ターゲットモジュール TARGET=hello # コンパイラ CC=gcc # 実行カーネルのソースコードパス KDIR = /usr/src/linux-2.6.27.19-5 # make obj-m := $(TARGET).o all:
make -C $(KDIR) M=$(PWD) V=0 modules clean:
make -C $(KDIR) M=$(PWD) V=0 clean 3) デバイスドライバの実行手順 * ビルドされたデバイスドライバは「insmod ko ファイル名」でカーネルに組み込み実行することが できる。 * printk によって出力された文字列は○○で確認できる。 * デバイスドライバが不要になった場合は「rmmod ko ファイル名」で削除することができる。 4) アライメント コンパイル時には、アライメントと呼ばれる変数境界の調整が行われる。アライメントによって、構造 体の中の char 型や short 型のような小さい型を、int 型の単位に合わせて変数を割り充てる。これに より変数のオフセットが、意図しない場所に置かれる可能性があるため、注意が必要である。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-3. デバイスドライバのデバッグ 対応する コースウェア 第 3 回 デバイスドライバのデバッグ
8-3-応-3. デバイスドライバのデバッグ
デバイスドライバでのデバッグ方法について解説する。デバッグ方法の種類とそれぞれの特徴を説 明する。またシステムがハングアップした際のデバッグ方法にも言及する。 【学習の要点】 * デバイスドライバのデバッグには printk 関数でトレースする方法や gdb のようなデバッガソフトを 使用してデバッグする方法がある。 * printk 関数でのデバッグは手軽にできるが、速度が遅い、ハングアップの不具合には対応でき ないといった欠点もある。 * デバッガソフトを使用すると、ハングアップの不具合も含めて対応可能であるが、習得に時間が かかる欠点がある。 図 8-3-応- 3 デバイスドライバのデバッグ1) デバッグの方法 デバイスドライバのデバッグ方法は大きく分けてシリアル通信を利用したトレースデバッグとデバッ ガソフトを利用したデバッグがある。それぞれにメリットとデメリットがあるので、状況にあった選択を することが大切である。 2) シリアルデバッグ もっとも基本的なデバッグ手法。ソフトウェアに printk 関数で動作状況を出力し、それをシリアル通 信にてホスト PC で確認する。 シリアル出力はイーサネットや USB と比較して複雑なデバイスドライバを必要としないため、開発の 初期段階から利用できる。 ただし、シリアル出力処理に CPU を使用するため、速度の低下やトレース部分を除いたリリースコ ードで動作が変わってくるなどのデメリットもある。また、システムがハングアップするような不具合の 場合、シリアル出力が停止してしまうため利用することができない。 3) デバッガを利用したデバッグ デバッガを利用することでプログラムを任意の場所で停止、ステップ実行、変数の内容を確認など カーネルの内部動作を追うことができる。 * GDB 一般的な Linux デバッガ。コンソールからの利用が基本であるが、統合開発環境を用いることで UI デバッグを行うことも可能。フルスタックの GDB ではターゲットのリソース上大きすぎることが 多いため、後述する GDBServer や KGDB を利用する。 * GDBServer リソースの少ないターゲット用のデバッガ。GDBServer は GDB のリモートサーバであり、自身に はデバッグ機能は搭載していない。GDB からの接続を受けて GDB より各種デバッグコマンドを 受け取り実行する。フットプリントが小さいため、組み込みシステムのようなリソースの少ない環境 でも利用できる。 * KGDB Linux 2.6.26 からカーネル本体に統合されたカーネルデバッガで、機能としては GDBServer と 同等。 KGDB を有効にするためには、カーネルの構築(menuconfig)で該当項目を ON に設定後、カ ーネルをビルドすればよい。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-4. デバイスドライバ開発の環境 対応する コースウェア 第 5 回 キャラクタ型デバイスドライバの作成・1
8-3-応-4. デバイスドライバ開発の環境
デバイスドライバの基本的な実装方法を説明する。実装方法の概要をはじめ、システムコールハン ドラの登録方法やデータモデルについて説明する。 【学習の要点】 * デバイスドライバは実装する機能を記述した関数の集合である。 * カーネルへドライバを登録するためにオペレーションハンドラの登録構造体に実装した関数を 登録する。 図 8-3-応- 4 カーネルへのドライバ機能の登録1) デバイスドライバの実装概要 デバイスドライバで実装すべき機能はデバイスの種類ごとに決まっており、その特性によって提供 される構造体に定義されているシステムコールハンドラを実装する。 2) デバイスドライバの機能 * デバイスへの書き出しを行う ハードディスクに対してファイルのデータを書き込みたい場合や、シリアル通信でデータを送信 する場合には write システムコールを実装し、デバイスへの書き出し処理を行う。 * デバイスからの読み込みを行う ハードディスクからファイルのデータを読み込みたい場合や、シリアル通信でデータを受信する 場合には read システムコールを実装し、デバイスからの読み込み処理を行う。 * デバイスの設定を変更する シリアル通信で通信速度の変更を行いたい場合などには、ioctl システムコールと独自のコマン ドを実装し、デバイスへの設定変更を行う。また、デバイスの設定情報を読み込む場合にも利用 する。 * デバイスドライバの振る舞いを変更する デバイスドライバの振る舞いを変更したい場合は、read_proc システムコールを実装する。 read_proc システムコールで proc ファイルシステムでの読み込みとともに、proc ファイルシステム を利用した設定変更を行うこともできる。 3) デバイスドライバの初期化終了処理 * module_init デバイスドライバの初期化処理を記述する関数を登録する。 * module_exit デバイスドライバの終了処理を記述する関数を登録する。 4) カーネルへの登録方法 * キャラクタ型デバイスドライバ file_operations 構造体にシステムコールハンドラを設定し、module_init 内でカーネルへの登録 を行う。 * ブロック型デバイスドライバ block_device_operations 構造体にシステムコールハンドラを設定し、module_init 内でカーネル への登録を行う。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-5. デバイスドライバの動作 対応する コースウェア 第 6 回 キャラクタ型デバイスドライバの作成・2 第 7 回 キャラクタ型デバイスドライバの作成・3
8-3-応-5. デバイスドライバの動作
デバイスドライバの実装に必要な機能を解説する。ioctl や proc ファイルシステム、同期および非同 期処理などデバイスドライバを取り巻く機能を紹介し、それぞれの使い方を説明する。また 64bit デ バイスドライバについても言及する。 【学習の要点】 * 基本的な機能(Read/Write)の他に独自の機能を付加したい場合には ioctl を実装する。 * proc ファイルシステムはカーネル情報を外部に出力するために使用する。 * ハードウェアに対するアクセスに時間がかかる場合は同期的または非同期的にデバイスドライ バで完了を待つ必要がある。 * 64bit 環境ではデータ型のサイズが変わるので注意が必要。 図 8-3-応- 5 アプリケーションからデバイスドライバまでの流れ1) ioctl の実装 ioctl システムコールを実装することで、システムコールに存在しない機能や、デバイスドライバ自身 に送る命令を受け付ける処理を記述することができる。 2) proc ファイルシステムの対応 proc ファイルシステムに対する情報の提供は、read_proc システムコールを実装することで行う。実 装したシステムコールを create_proc_read_entry 関数にて/proc の階層にエントリを作成する。 3) 同期と非同期 デバイスへのアクセスの際に要求や応答に時間がかかる場合は、同期的または非同期的に完了 を待つ必要がある。 * 同期 wait 系の関数のように、その呼び出しで処理が一時的に中断し、wake_up 系の関数が別のプロ セスから呼ばれることで処理を再開する。処理の流れが一つだけになるため同期と呼ばれる。 * 非同期 select/signal のように待ち状態であっても、別の処理を行うことができる待ち方を非同期と呼ぶ。 4) 64bit での注意点 64bit 環境で各データ型のサイズは、コンパイラのデータモデルによって決められ、I(int)、L(long)、 P(pointer)によってあらわされる。
32bitCPU では ILP32 データモデルが採用され、int 型 32bti、long 型 32it、long long 型 64bit、ポイ ンタ型が 32bit となっている。
64bitCPU ではデータモデルによってデータ型の大きさが変わり、Linux 系の環境では、主に LP64 データモデルが利用され、int 型 32bit、long 型 64bit、long long 型 64bit、ポインタ型が 64bit となっ ている。
LLP64 データモデルは、Windows 系の 64bitOS で採用され、int 型 32bit、long 型 32bit、long long 型 64bit、ポインタ型が 64bit となっている。
ILP64 データモデルは、一部の Linux などで利用され、LP64 に加えて int 型も 64bit となっている。 データモデルの違いによる注意点として、以下のものが挙げられる。
* 構造体や共用体などのサイズ、オフセットが変わってしまうため、これらに依存するコードはデー タモデルによって正しく動作しない可能性がある。
* int 型、long 型、ポインタ型を相互にキャストする場合、データモデルによっては 64bit から 32bit になってしまい、データが欠ける可能性がある。
* 補数表現を利用した場合、符号付き 32bit で-1 を 0xFFFFFFFF としても、64bit 環境ではそのま ま 0xFFFFFFFF として扱われてしまう。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-6. デバイスドライバからのハードウェア制御 対応する コースウェア 第 8 回 ブロック型デバイスドライバの作成(ホスト)・1 第 9 回 ブロック型デバイスドライバの作成(ホスト)・2
8-3-応-6. デバイスドライバからのハードウェア制御
デバイスドライバからハードウェアにアクセスする方法について解説する。I/O レジスタの概要やメモ リマップド I/O について紹介し、アクセスの方法や実装の際の注意点を説明する。 【学習の要点】 * デバイスドライバからハードウェアにアクセスする際は I/O レジスタにアクセスする必要がある。 * I/O レジスタへのアクセスは CPU ごとに異なり、専用のアクセス命令があるものや、メモリにマッ ピングするメモリマップド I/O と呼ばれる機能を提供するものがある。 * I/O レジスタへのアクセスはコンパイラの最適化によって順序が入れ替わることを防ぐために、メ モリバリアや volatile といった機能を利用する。 図 8-3-応- 6 メモリと I/O レジスタ1) 論理アドレスからのデバイスアクセス
MMU(Memory Management Unit)を持つ CPU ではデバイスドライバは論理アドレス上で動作する ため、ハードウェアが接続されている物理アドレスに直接アクセスすることができない。そのため、物 理アドレスを論理アドレスに変換しアクセスする必要がある。 また、MMU を持たない CPU ではデバイスドライバは物理アドレス上で動作するが、ハードウェアの 接続によって、ポートへのアクセスが必要な場合、レジスタがメモリにマッピングされ直接アクセスで きる場合などハードウェアや構成によって様々に変わるので注意が必要である。 2) デバイスへのアクセス方法 * ioread/iowrite 関数 I/O ポートへのアクセスを提供する。アクセス幅によって ioread8(8bit)、ioread16(16bit)、 ioread32(32bit)を利用する(write も同様である)。 * ioremap 関数 物理アドレスを論理アドレスに変換する。 * メモリマップド I/O ハードウェアのレジスタがメモリ空間にマッピングされているので特別な命令を必要とせず、メモ リアクセスと同じようにハードウェアにアクセスできる。 3) ソフトウェアのデバイスアクセスにおける注意点 * メモリバリア ハードウェアレベルへのアクセス順序が変わらないことを保証する。ハードウェアは書き出す/読 み込むデータだけでなく、アクセスのタイミング、順序も重要な要素となるため、たとえ非効率で あったとしてもその順序を維持する必要がある。マルチコアやマルチスレッドなど、アクセスの一 意性を損なう可能性がある場合にメモリバリアを利用する。 * volatile コンパイラレベルの最適化を抑制する。ハードウェアアクセスにはソフトウェアからみた場合に、 ムダに見えるものもある。コンパイラはそれらのコードを削除したり、順序を入れ替えたりする最 適化を行う。メモリバリアの項にもあるが、ハードウェアアクセスは書き出す/読み込むデータで はなく、書き出す/読み込む行為自体が必要な場合があるのでソースコード上の命令、順序を 維持させたい。このような場合 volatile 識別子を該当変数に付加することでコンパイラの最適化 を抑制することができる。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-7. カーネルの構築 対応する コースウェア 第 4 回 Linux カーネルの構築
8-3-応-7. カーネルの構築
作成したデバイスドライバをリリースする際にはカーネルを再構築し、カーネルにデバイスドライバを 含める必要があることを解説する。また、組み込み環境ではリソースの制約上、カーネルに含める機 能を最小限にする必要があることも紹介し、その際にもカーネルの再構築を行う必要があることを説 明する。 【学習の要点】 * カーネルを新たに構築することで必要な環境を作成することができる。 * カーネル構築時に必要な機能のみを導入することで、実行ファイルや実行時のメモリ使用量を 削減することができる。 * デバイスドライバをカーネルに挿入することで、外部からデバイスドライバを導入する必要がなく なる。 図 8-3-応- 7 カーネルの構築1) カーネル構築の概要 組み込み開発ではターゲットハードウェアの環境によってカーネルに組み込むデバイスドライバや ミドルウェアを選択し、カーネルを構築(ビルド)する必要がある。 カーネルに組み込まれるデバイスドライバやミドルウェアなどは.config ファイルに記録され、この内 容を基に構築される。 2) カーネル構築の種類 カーネル構築の方法は.config ファイルを編集することが前提になるが、この編集方法にはいくつか の種類がある。 .config ファイルを編集したのち、カーネルのソースフォルダにて make コマンドを実 行することで新しいカーネルイメージが作成される。 作成されたカーネルはデスクトップ Linux では/boot/の下にイメージが置かれ、組み込み環境で ROM に書き出す場合には、導入したブートローダがサポートする形式に変換して書き出す。 * .config ファイルを直接編集する vi などのエディタで.config ファイルを直接編集する。 * make config を利用する コンソール にて選択項目を Yes/No で編集する。 * make menuconfig を利用する TUI(TextUserInterface)にて選択項目を編集する。 * make xconfig を利用する GUI にて選択項目を編集する。 3) デバイスドライバの組み込み デバイスドライバをリリースするときにはカーネルの起動と同時に動作可能になるよう、カーネルに 組み込んだ状態にする。 自作デバイスドライバのカーネルへの組み込みは、カーネルソースフォルダの指定された個所 (<Root>/drivers など)に組み込むデバイスドライバのソースコードを置き、そこにある kconfig と Makefile を編集し、カーネルに導入可能な状態にする。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-8. キャラクタ型デバイスドライバ 対応する コースウェア 第 5 回 キャラクタ型デバイスドライバの作成・1 第 6 回 キャラクタ型デバイスドライバの作成・2 第 7 回 キャラクタ型デバイスドライバの作成・3
8-3-応-8. キャラクタ型デバイスドライバ
ファイル操作などに利用されるキャラクタ型デバイスドライバの実装方法を解説する。最も重要な機 能の実装を説明し、メモリ空間の違いから専用のデータ移動方法を紹介する。 【学習の要点】 * キャラクタ型のデバイスドライバはモデムやファイルなど1バイト単位での読み書きをする必要が ある場合に利用する。 * キャラクタ型で実装できる機能は file_operators 構造体に定義されている。 図 8-3-応- 8 キャラクタ型デバイスドライバ1) キャラクタ型デバイスドライバの実装 キャラクタ型デバイスドライバはデバイスに対して 1 バイト単位でのアクセスが必要な場合に利用す る。キャラクタ型デバイスの例として下記に示すデバイスがある。 * シリアル * モデム 2) システムコールハンドラの種類 デバイスドライバで利用できるシステムコールには様々なものがあるが、必要なハンドラのみ実装す ればよい。主なシステムコールハンドラを挙げる。 * open アプリケーションやユーザープログラムがデバイスの使用を開始する際に呼び出される。デバイ スへのアクセスリソースの取得やデバイスアクセスのための初期化処理を行う。 * release アプリケーションやユーザープログラムがデバイスの使用を終了する際に呼び出される。デバイ スへのアクセスリソースの解放やデバイスアクセスの終了処理を行う。 * read アプリケーションやユーザープログラムがデバイスから読み込みを行う場合に呼び出される。 * write アプリケーションやユーザープログラムがデバイスから書き出しを行う場合に呼び出される。 * llseek アプリケーションやユーザープログラムがデバイスの読み書き位置を変更したい場合に呼び出 される。 * ioctl アプリケーションやユーザープログラムがデバイスの設定を変更したい場合に呼び出される。 * read_proc アプリケーションやユーザープログラムがデバイスドライバ自体の設定を確認/変更したい場合 に呼び出される。
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-9. ブロック型デバイスドライバ(ホスト) 対応する コースウェア 第 8 回 ブロック型デバイスドライバの作成(ホスト)・1 第 9 回 ブロック型デバイスドライバの作成(ホスト)・2 第 10 回 ブロック型デバイスドライバの作成(ホスト)・3
8-3-応-9. ブロック型デバイスドライバ(ホスト)
ディスクなどで利用されるブロック型のデバイスドライバについて解説する。要求の処理方法やリム ーバブルメディアに対する処理を説明する。 【学習の要点】 * ブロック型のデバイスドライバは、HDD や CD-R などデータをブロック単位で扱う必要がある場 合に利用する。 * ブロック型で実装できる機能は block_device_operatiorns 構造体で定義されており、読み書きの 要求は request 関数ですべて行う。 * リムーバブルメディアに対する処理は、media_changed と revalidate 関数で行う。 図 8-3-応- 9 ブロック型デバイスドライバ1) ブロック型デバイスドライバの実装 ブロック型のデバイスはデータをデバイスの指定するデータ量(ブロック)の単位で書き込みおよび 読み込みを行うデバイスのことである。ブロック型デバイスの例として下記に示すものがある。 * ハードディスク * CD-ROM 2) 要求の処理 ブロック型デバイスのデバイスドライバとキャラクタ型デバイスのドライバの違いは、ブロック型では read や write、デバイス操作を request システムコールで一手に行う。
* request_queue
初期化時に blk_init_queue 関数によって、ブロック I/O 要求を受け付ける RequestQueue を作成 する。RequestQueue には I/O スケジューラの実体である Elevator が関連づけられ、ブロック I/O の要求は一旦 Elevator に入れられて、スケジューリングされた後にディスパッチされる。 3) リムーバブルディスクへの対応 * media_changed メディアが変更されたことを確認するために呼び出されるシステムコールで、デバイスの状態を 判別し、状態の変更を真偽値で返す。 * reinvalidate メディアの状態が変更されたときに呼び出されるシステムコールで、新しいメディアを使用する 準備処理を行う。 4) I/O スケジューラ ブロック型デバイスドライバの作成において重要な項目の一つに I/O スケジューラがある。I/O スケ ジューラは、ブロック型のデバイスに対して書き出しおよび読み込みを効率的に行うために、要求さ れた順序を入れ替えるなどの処理を行う。I/O スケジューラには下記の 4 種類がある。
* CFQ(Complete Fair Queuing)
I/O 要求に優先度を設け、優先度に応じて処理を行っていく方式。 * Anticipatory 名前の元となった Anticipation とは予測の意味があり、I/O 要求があった場合にそのデバイスに 対してセクタなどを加味し、最も効率の良いアクセスができるものを予測し、効率のよい I/O から 順に処理を行っていく方式。 * Deadline 処理時間の期限を設ける方式で、一定時間が経過した I/O 要求を優先的に処理することにより 処理遅延を防ぐことができる。 * NOOP
開発体系分野 8-3-応 デバイスドライバ開発に関する知識 応用 習得ポイント 8-3-応-10. デバイスドライバの周辺知識 対応する コースウェア 第 11 回 ブート概要 第 12 回 並列処理とプロセス間同期 第 13 回 DMA と電源
8-3-応-10. デバイスドライバの周辺知識
Linux のデバイスドライバの周辺知識を解説する。並列処理、プロセス間排他、デッドロックについて 説明する。また、OS のブートローダや DMA についても言及する。 【学習の要点】 * デバイスドライバは並列で実行されることを念頭において設計、実装を行う。 * 並列処理の排他のためにセマフォやスピンロックを利用する。 * CPU のアーキテクチャによってブートローダを選択する必要がある。 * DMA を利用することで CPU を利用することなくメモリのデータ転送を行うことができる。 図 8-3-応- 10 並列処理でのデータ破壊1) 非同期処理の概要 デバイスドライバは複数のプロセスから同時に呼ばれる可能性があるため、非同期処理を念頭に 置いた設計、実装を行う必要がある。 例えばデバイスに対するアクセスは一意にしなければならず、この間は他の処理が入ってはならな いので、排他処理を行いアクセスの一貫性を保証する。 またグローバル変数など、デバイスドライバ全体で利用可能なデータについてもアクセスが重なると データの保証ができなくなるので、排他処理を行い確実なアクセスを保証する必要がある。このよう な場合にはリエントラント(再入可能)と呼ばれる実装を意識するとよい。 2) 排他処理とデッドロック 排他処理ではデッドロックと呼ばれる不具合に細心の注意を払う必要がある。デッドロックは複数の プロセスがお互いの排他区間(クリティカルセクション)の終了を待ち、すべてのプロセスが実行で きなくなる状態を指す。 デッドロックは主に排他オブジェクトを複数使用した場合に起こる可能性があるため、排他区間で 他の排他オブジェクトを取得しようとしない、排他区間を一つにまとめるなど考慮する必要がある。 3) ブートローダ ブートローダとはハードウェアの電源投入後、最初に起動するプログラムで、OS を起動させるため に必要なソフトウェアである。Linux を実装する CPU やハードウェア環境によって適切なブートロー ダを選択する。 * GRUB シェルの実装や数多くのファイルシステムに対応しており、多くの PC Linux に採用されているブ ートローダ。 * LILO PC Linux に採用されているブートローダ。GRUB と同様に多くの環境に実装されている。シェル やファイルシステムをサポートしていないため設定は難しいがその分シンプルである。 * RedBoot
PowerPC や ARM、SH など多くの CPU に対応したブートローダ。ROM モニタ機能を搭載し、リ モートでの FlashROM アクセスが可能であり、組み込み環境に向いている。
* U-Boot
PowerPC や ARM といった組み込み CPU に対応したブートローダ。FlashROM からの起動のほ かハードディスクやネットワークなど様々な起動方法をサポートしている。
4) DMA
DMA とは DirectMemoryAccess の略で、CPU を使用せず DMAC(DMA Controller)と呼ばれるハ ードウェアがメモリアクセスを専用に受け持つ。このため、メモリ転送のための CPU 時間を空けるこ とができるので、効率的に CPU を利用することができる。