web-dev-qa-db-ja.com

カーネルプログラミングを始める最良の方法は?

どの本を尋ねるのはそれほど多くありませんが(役立つガイドやチュートリアルを知っている場合でも)、カーネルプログラミングを開始するための最良の方法は何ですか?また、学ぶのに最適な特定のディストリビューションはありますか?

私は主にデバイスドライバーの部分に興味がありますが、カーネルの設定方法(モジュールなど)も知りたいです。C/ C++の経験は約4〜5年ですが、ほとんどは大学の知識です(つまり、私が何を意味するか知っているなら、4-5年の実務経験は好きではありません)

8
user4877

まず:

赤ちゃんの段階では、「hello world」モジュールと仮想ハードウェアドライバーにさまざまなバリエーションを書くことが、開始するための最良の方法です(実際のハードウェアは、自分が何をしているのかをよりよく理解しているときに直面する現実世界の問題をもたらします)。

「LinuxDeviceDrivers」は優れた本であり、始める価値があります: http://lwn.net/Kernel/LDD3/

LDD(少なくとも以前は)には、仮想ドライバーを作成する演習があります。 RAMディスク、および仮想ネットワークデバイス。

第二に:

サブスクライブ https://lkml.org/ またはハッキングするサブシステムのメーリングリストにサブスクライブします。少し潜んで、スレッドをスキャンし、コードレビューを読みます(パッチへの返信)人々がつまずいたり、拾ったりするものを確認するために。

まだサポートされていない、またはまだ十分にサポートされていないデバイス用の(安価な)ハードウェアを入手できるかどうかを確認してください。良い候補は、安価なUSBNICまたは同様の低コストのUSB周辺機器です。おそらく2.4.x用にベンダーが作成した、古い、またはツリー外のドライバーを備えたものが理想的です。これは、機能するもの(一種)から始めて、徐々に適応/書き換えることができるためです。それ、あなたが行くようにテストします。私の最初のドライバーの試みは、Davicom DM9601 USBNICでした。私がゆっくりと2.6に適応させた2.4シリーズのベンダー作成カーネルドライバーがありました。 (注:メインラインのドライバーはnot私のドライバーであり、最終的には他の誰かが最初からドライバーを作成しました)。

もう1つの良い方法は、Kernel Newbiesサイト、特に「kerneljanitors」todoを確認することです。 http://kernelnewbies.org/KernelJanitors/Todo これは初心者がすべきタスクのリストです。取り組むことができます。

11
jmtd

多くのカーネルが存在します。

Linuxだけがゲームではありませんが、最も広く使用されています。オペレーティングシステムの概念を理解するために、minixカーネルを推奨する人もいます。 Linux 2.6.xシリーズが最も一般的であり、(ほとんど)誰も使用しないものに無駄にならないので、私はLinux2.6.xシリーズを使用します。 Solaris、XNU(Mac)、FreeBSD、Dragonflyが注目に値します。 1

非常に単純なもの(シリアルポート、USBなど)を見つけて、他のことを実行させます。追加の課題として、まだカーネルモジュールがないもののためにカーネルモジュールを書いてみてください。 (最初にpci Sudo lspci -nnおよび/またはusbid Sudo lsusbで容疑者をグーグルで検索してください。)

更新:プライマリシステムでこれを直接行わないでください。前述のように、仮想マシン(VM)(コンピューター内のコンピューター)を使用してください。 VirtualBox これを提供でき、無料です。また、私はそれが圧倒的に見えることを望まないが、何かがVM自体を壊した場合に戻ることができるように、VMスナップショットを試してください。

アップデート2:Git(DVCSesinc。Mercurial、Fossil、Bazaar、darcs)に関するメモは、主にコードと小さくて重要なファイルに適しています。 。影響がわからない限り、Gitを使用して音楽やビデオなどをバックアップしないようにしてください。 ;)

8
dhchdhd

変更するモジュールまたはドライバーを見つけるか、null/hello worldタイプのモジュールから開始して、そこからビルドします。特にモジュールを操作するのは、実行中のカーネルにコードをロード、アンロード、再コンパイル、およびリロードできるためです。後でコアビットに入ることができますが、基本的にモジュールにはすべての種類があり、好きなことをほとんど行うことができます。

次に、VMを使用します。 VirtualBoxまたはそれ以上の下にゲストマシンをセットアップし、VM)しばらくの間、そこでカーネルテストを実行します。そうすれば、何かを壊して再起動したときにメインシステムを強制終了することはありません。作業スナップショットなどは本当に簡単です。

第三に、gitを学びます。

6
Caleb

誰かがすでに「Linuxデバイスドライバー」という本について言及しています。これは優れたリソースであり、私も強くお勧めします。

質問では、創始者が特に本を求めているわけではないと述べていますが、本の最新版「Linuxカーネルを理解する」( http://oreilly.com/catalog/9780596005658/ )は非常に貴重です。 Linuxカーネル全般について学習し、Linuxデバイスドライバーに関するセクションも含まれています。

1