どんな本を尋ねるのではなく(参考になるガイド/チュートリアルを知っていても)、カーネルプログラミングを始めるための最良の方法は何ですか?また、学習するのに最適な特定のディストリビューションはありますか?
私は主にデバイスドライバーの部分に興味がありますが、カーネルのセットアップ方法(モジュールなど)も学びたいと思っています。C/ C ++の経験が4〜5年ありますが、ほとんどは大学の知識です(したがって、私が何を意味しているのか知っていれば、4〜5年の実務経験ではありません)
どんな本を尋ねるのではなく(参考になるガイド/チュートリアルを知っていても)、カーネルプログラミングを始めるための最良の方法は何ですか?また、学習するのに最適な特定のディストリビューションはありますか?
私は主にデバイスドライバーの部分に興味がありますが、カーネルのセットアップ方法(モジュールなど)も学びたいと思っています。C/ C ++の経験が4〜5年ありますが、ほとんどは大学の知識です(したがって、私が何を意味しているのか知っていれば、4〜5年の実務経験ではありません)
回答:
まず:
ベビーステージでは、「hello world」モジュールのさまざまなバリエーションと仮想ハードウェアドライバーを作成することから始めるのが最良の方法です(実際のハードウェアは、自分が何をしているのかについてより多くの考えを持っているときに直面する現実世界の問題を引き起こします)。
"Linux Device Drivers"は優れた本であり、まずはhttp://lwn.net/Kernel/LDD3/から始める価値があります。
LDD(少なくとも使用されています)には、RAMディスクや仮想ネットワークデバイスなどの仮想ドライバを作成する演習があります。
第二に:
ハッキングするサブシステムのhttps://lkml.org/またはメーリングリストにサブスクライブします。少し待って、スレッドをスキャンし、コードレビュー(パッチへの返信)を読んで、人々がどんなことをしているかを確認しますつまずくか、拾う。
まだサポートされていない、またはまだ十分にサポートされていないデバイスのハードウェアを取得(安価)できるかどうかを確認します。有力な候補は、安価なUSB NICまたは同様の低コストUSB周辺機器です。古い、またはツリー外のドライバー、おそらくおそらく2.4.x向けにベンダーが作成したものを使用するのが理想的です。あなたが行くようにそれをテストします。私の最初のドライバーの試みは、Davicom DM9601 USB NICに対するものでした。2.4シリーズのベンダーが作成したカーネルドライバーがあり、2.6に徐々に適応させました。(注:メインラインのドライバーは私のドライバーではありません。結局、誰かがゼロから書いたものです)。
もう一つの良い方法は、カーネル初心者サイト、特に「カーネルの管理人」TODOを見ることである:http://kernelnewbies.org/KernelJanitors/Todo これは初心者が取り組むことができるはずというタスクのリストです。
多くのカーネルが存在しています。
Linux
唯一のゲームではありませんが、最も広く使用されています。一部の人々は、minix
オペレーティングシステムの概念を理解するためにカーネルを推奨します。Linux 2.6.xシリーズが最も一般的であり、誰も使用しない(ほとんど)ものでは無駄にならないので、私はLinux 2.6.xシリーズを使用します。Solaris、XNU(Mac)、FreeBSD、Dragonflyが注目に値します。1
非常にシンプルなもの(シリアルポート、USBなど)を見つけて、他のことを実行させます。追加の課題として、カーネルモジュールをまだ持っていないもの用に作成してみてください。(容疑者を最初にsudo lspci -nn
PCIまたはUSB IDでグーグルしてくださいsudo lsusb
。)
更新:プライマリシステムで直接これを行わないでください。前述のように仮想マシン(VM)(コンピューター内のコンピューター)を使用します。 VirtualBoxはこれを提供でき、無料です。また、私はそれが圧倒的に見えるようにしたくありませんが、何かがVM自体を破損した場合に戻ることができるように、VMスナップショットを試してください。
Update 2:Git(DVCSes inc。mercurial、fossil、bazaar、darcs)に関するメモは、主にコードと小さな重要なファイルに適しています。影響を知らない限り、Gitを使用して音楽やビデオなどをバックアップしないようにしてください。;)
変更するモジュールまたはドライバーを検索するか、null / hello worldタイプのモジュールで開始し、そこからビルドします。実行中のカーネルにコードをロード、アンロード、再コンパイル、および再ロードできるため、特にモジュールで動作します。後でコアビットに入ることができますが、基本的にモジュールにはすべての種類があり、好きなことをほとんど行うことができます。
次に、VMを使用します。VirtualBoxまたはVMを介してゲストマシンをセットアップし、しばらくカーネルテストを行います。そうすることで、何かを壊したときにメインシステムを強制終了せず、再起動、作業中のスナップショットへのバックトラックなどが本当に簡単です。
第三に、学ぶgit
。
誰かが「Linuxデバイスドライバー」という本をすでに言及しています-これは優れたリソースであり、私もそれを強くお勧めします。
質問者は本の作成者が特に本を求めているわけではないと述べていますが、本の最新版「Understanding the Linux Kernel」(http://oreilly.com/catalog/9780596005658/)は、一般的なLinuxカーネルについて学ぶ上で非常に貴重です。 、およびLinuxデバイスドライバーに関するセクションも含まれています。