web-dev-qa-db-ja.com

カーネルソースツリーを作成するにはどうすればよいですか?

Linuxでのドライバーの作成に関する本を読んでいます。Linuxの経験はあまりありません。以前にかなりの数のディストリビューションをインストールしましたが、メインのオペレーティングシステムとして常にWindowsを使用しています。

私はCを知っていますが、私は主にC#プログラマーです。

私は(楽しみのために)ドライバープログラミングを学びたいと思っています。そしてそれがLinuxについていくつかのことを教えてくれ、「それに入る」ことを願っています。

私の最初のハードルは、標準の2.6.xカーネルを備えたディストリビューションを見つけることです。見つけようとしましたが、すべて3.xを過ぎています。この種のタスクに適したものを知っている人はいますか?

また、この本には、kernel.orgから標準カーネルを取得して、ソースツリーを構築する必要があると書かれています。それが何を意味するのかわかりません。

これは本です: http://oreilly.com/openbook/linuxdrive3/book/

1
sprocket12

あなたはkernel.orgを知っています、そしてこれはあなたが古いか新しいかからバニラカーネルを得ることができるところです。最新のカーネルの場合は、gitを使用することもできます。

カーネルを入手したら、「ソースツリー」を作成するには、それを解凍するだけです。たとえば、.bz2アーカイブをダウンロードした場合は、コマンドtar -jxvf <kernel version>.bz2を使用して解凍できます。従来、このツリーは/usr/srcにあり、シンボリックリンク/usr/src/linuxは、使用している特定のカーネルディレクトリを指すように作成されています。

ソースツリーを解凍したら、それをビルドするには、最初にそれを構成する必要があります。 make menuconfig(ncursesベース)またはmake xconfig(Xベース)。 .configを別のカーネルバージョンから移行する場合は、他にもいくつかのconfigmakeターゲットがあります。最後に、カーネルとそのモジュールをビルドするには、makeを使用します。カーネルをインストールして起動するには、モジュールにmake modules_installを使用し、ブートローダーがカーネルを期待する場所にArch/<your Arch>/boot/bzImageをコピーして、そのカーネルを起動するように構成します。カーネルに対してビルドしたモジュールをロードする予定がある場合は、カーネルを起動する必要があります。

そうは言っても、モジュールの構築を実験したいだけの場合は、上記のプロセスを実行するのではなく、現在のディストリビューションカーネル(パッケージがあります)からソースを取得し、そのカーネルに対してモジュールを構築します。難しいことではありませんが、カーネルを初めて使用する場合は、少し圧倒されるかもしれません。

4
casey

カーネルドライバーで遊んでからしばらく経ちましたが、設定したものは次のとおりです。

  • 2つのディストリビューション用に少なくとも2つのパーティションを持つマルチブートマシン
  • 安定した状態を維持する最新のLinuxを備えた1つのパーティションで、そこからMBRが起動します。
  • 最新のLinuxで実行されている、ターゲット開発カーネルを備えた仮想マシン。
  • ターゲット開発カーネルを備えた2番目のパーティション。これは、安定した最新のLinuxのgrub構成を介して起動されます。

初期の開発とテストは、仮想マシン(VM)で実行され、動作中のドライバーのみがターゲット開発マシンにコピーされます。特にVMのカーネルに壊れている可能性のあるドライバーを挿入する前に、VMのスナップショットを定期的に作成します。そうすれば、開発システムの動作状態に簡単にロールバックできます。実際のハードウェアでドライバーをテストする必要がない場合は、2番目のパーティションはまったく必要ありません。

あなたの場合、私は buntu 10.04 のようなものをVM(および2番目のパーティション)にインストールします。2.6カーネルが付属しており、すべてがそこにあり、一緒に収まります( 2.6カーネルバージョンのその他のディストリビューション)。カーネルソースと開発ツールをダウンロードするだけです。

これにより、kernel.orgからチェックアウトされた新しいカーネルを最初から開始するよりも早く起動して実行できるようになると思います。少なくとも私のSuSE6日で戻ってきました。

2
Anthon

私のコメントによると、以前にこれと同様の質問を見たので、私は 正規バージョン を書くことにしました。これは、カーネルの構成、構築、およびインストールを開始するためのものだと思います。しかし、ここで私はあなたのケースに特有のいくつかのポイントに対処したいと思いました:

私は(楽しみのために)ドライバープログラミングを学びたいと思っています。そしてそれがLinuxについてのいくつかのことを教えてくれ、私が「それに入る」のに役立つことを願っています。

これは正当な理由ではないと思います。 Cでの開発にプラットフォームを使用するユーザーを含め、長期のパワーユーザーでさえ99.9%以上がドライバープログラミングに関与することはありません。類推すると、これまでMS Windowsを使用したことがない人が、「まあ、今インストールされているので、Windowsについて学ぶ良い方法は、Windows用のデバイスドライバーを書き始めることだと思いました...」、あなたはどう思いますか?

最初に、userspaceでプラットフォーム固有のこと(ファイルシステムやネットワークなど)を実行するCをいじり始めます。

私の最初のハードルは、標準の2.6.xカーネルを備えたディストリビューションを見つけることです。私は1つを見つけようとしましたが、それらはすべて3.xを過ぎています。

あなたはそれをする必要はありません。ほとんどの場合、2.6カーネルは現在のディストリビューションでも正常に動作します。もちろん、試すのは簡単です。しかし、それを超えて、LDD3(O'Reillyの本)を使用していることが理由である場合、3.xカーネルはそのほとんどまたはすべてと互換性があります。 3.xカーネルのドライバーコードの多く(おそらくほとんど)は2.6から変更されていない状態で存在し、カーネル開発者はこの下位互換性を維持することを優先すると確信しています。バニラソースは1600万LOCのようなものです。すべてを常に書き直すことはできません。

だから先に進んで、あなたが望むどんなバージョンでも試してみてください。

2
goldilocks