Linuxカーネルデバイスドライバーのプログラミングを学びたいです。だから誰でもここに良いチュートリアルページまたはリンクを投稿してください。 Linuxカーネル環境は初めてです。私はそれを検索しましたが、基本を理解しやすくするために、どのように始めるべきか、またどれを読むべきかわかりません。前もって感謝します。
現在のスキルに依存します。 Linuxを初めて使用する場合、おそらく Advanced Linux Programming でユーザー空間システムプログラミングを開始する必要があります。この無料のリソースを使用すると、Unixシステムコールや、信号、プロセス/スレッドなどの他の概念に関する十分な知識が得られます。カーネルの役割は安全な方法でユーザーにサービスを提供しているため、カーネル側で開発している場合、これは必須です(ユーザー空間APIを理解する)。
そうでなければ、よく引用される本の1つは Linux Device Drivers、Third Edition (LDD3)です。このエディションはLinux 2.6.10の時点で作成されたものであり、それ以降いくつかの点が変更されたことに留意してください。 この記事 は、2.6が進化するにつれて(2.6.31まで、つまりあまり役に立たない)違いを示しています。 martinezjavier/ldd に言及する必要があります。これには、最新のカーネル用に更新されたLDD3のサンプルドライバーが含まれています(指摘してくれた42n4に感謝します)。
あまり頻繁に引用されていない別の興味深い本は、 Essential Linux Device Drivers です。このバージョンの無料版はありませんが、興味深いアプローチがまだあります。この点で私が気に入っているのは、さまざまな種類のデバイスをカバーしており、2.6.24の時点で最新であり、LDDよりも少し優れていることです。
最後に、カーネル自体に関する(ドライバー用ではない)1つの素晴らしい本が nderstanding the Linux Kernel、3rd Edition です。これには、詳細なカーネル機能と内部メカニズムが含まれます。 2.6.11の時点で最新です。
オンラインチュートリアルについては、 Peteのブログのこの投稿 は本当に素晴らしい例だとわかりました。キャラクターデバイス(最も簡単なカーネルドライバータイプ、つまり最初から使用する必要があるもの)の作成方法を示すだけでなく、次のような最新のLinuxカーネル機能をわかりやすい方法で使用します。
insmod
のモジュールオプションさらに、Linux 3.0を対象としているため、他のリソースと比較してより最新の状態になっています。
この投稿 Sysfsエントリを手動で作成する方法についてもお勧めしますが、追加のノードや属性が必要ない場合は、LinuxデバイスモデルがデバイスをSysfsエントリとして登録します。
Edit:Linuxデバイスドライバーの実際のプログラミングを学ぶ最良の方法は、実際のドライバーを調べることです。 drivers
には数千のドライバーがあります。 drivers/leds
のような単純なものの概念を読んで理解すると、これがいかにやりがいがあるかがわかります。
非常に重要なリンクがあるサイト: http://elinux.org/Device_drivers
実際の例を含む素晴らしいチュートリアル(独自のファイルシステムでフォーマットされたusbpenで終わります-著者のさらなる記事を検索してください):
最新のカーネルに移植された有名なLDD3本のソースコード: https://github.com/martinezjavier/ldd3/
ビデオ:
たぶん他のコース:
いくつかの例:
書籍(このスレッドLDD3には記載なし):
KernelHacking: http://kernelnewbies.org/KernelHacking
Linuxカーネルのビジュアルマップ: http://www.makelinux.net/kernel_map/
初心者向けのLinuxおよびカーネルの本:
新しくリリースされた Linux Driver Templates に興味があるかもしれません。名前が示すように、テンプレートを提供し、頻繁に使用されるLinux機能を示して、すぐに開始できるようにします。
私はそれが遅れた応答であることを理解しています!!
任意の本を選ぶことができますが、それらは上で提案した本当に素晴らしい本です。
しかし、実際に実際に作業する必要があります。できるだけカーネルに関与するようにしてください。
ほとんどの場合、カーネルソースコード自体を調べる必要があります。
そして、最も興味深いドキュメントは、カーネルツリーの下のドキュメントフォルダにあります。
最良のソースはLinuxのマニュアルページですが、初心者にとって理解するのに多少重要です。デバイスドライバーを直接プログラミングすることは簡単な作業ではありません。私はあなたが次の本を通してポインタと構造を通過することをお勧めします
基本的なCブック1.プログラミングC-Byron gottfried 2. Cプログラミング言語-Dennis Ritchie
中級の書籍1. Cケネスリークのポインター2.エキスパートCプログラミングの深い秘密-Linden
デバイスドライバについては、カーネルソースドキュメントをPDF形式でアップロードしました https://drive.google.com/folderview?id=0B7iRyndFhHldR3hjOHpOZTdKTjA&usp=sharing このリンクからダウンロードできます。
デバイスドライバーの基本(ユーザーモードプログラミング)
Linuxプログラミングインターフェース-Michael Kerrisk Linuxプログラミングの開始Wrox Publishersデバイスドライバー(カーネル開発)1. Linuxカーネル開発-Robert Love 2. Linuxカーネル内部-m beck
デバイスドライバー(ドライバープログラミング)1. Linuxデバイスドライバー-第3版(2.6カーネルの無料ダウンロードが利用可能)2.必須のLinuxデバイスドライバー-Venkateswaran
ドライバーの基本知識については、このサイトをフォローしてください http://www.tldp.org/LDP/khg/HyperNews/get/devices/devices.html
私の経験は何よりもまず、ドライバープログラミングを行う前にCプログラミング、主に構造体とポインターに関する適切な知識を得る必要があります。そうしないと、ドライバープログラミングを理解するのが少し面倒になります。
スタートアップに来て:-
ユーザー空間のプログラミングgccコマンドを使用したプロプロセス、アセンブラ、オブジェクトファイルの生成の基本、さまざまなオブジェクトツールを使用したオブジェクトファイルの分析、Linuxでの基本プログラミング、スレッド(ロック、同期技術)、信号、プロセス(fork、exec)、タイマー)。これは、カーネルの概念を理解する上で非常に役立ちます。
カーネルプログラミングカーネルソースツリー、さまざまなブランチ、およびそれらの重要性を理解し、ctagsとcscopeを使用してカーネルソースコードを参照すると、カーネルソースの参照に役立ちます。
ドライバーのプログラミングまず、さまざまなドライバークラス、文字、ブロックなどを学習し、次にデバイスプロトコル、送信と受信を学習します。製品マニュアルはこれを理解するための最良のソースです。次に、RTC(ポートにマップされたデバイス)、IOAPIC(メモリにマップされたデバイス)などの単純な文字ドライバーの作成を開始し、USB、PCI、ネットワーク、I2C、SPIなど。ヘルプが必要な場合は、カーネルソースツリーでこのすべてのスケルトンコードを見つけることができます。
Professional Linux Kernel Architectureも読んでください。
デバイスドライバープログラミングの学習に最適な本は
"LDD"