タイトルが示唆しているように、Linuxカーネルを理解するのに必要な体系的な知識を持つソースはありますか?Linuxカーネル(または任意のカーネル)を理解するために必要なハードウェア知識
このようなものがない場合は、ハードウェアのトピックは何ですか(私はそれがコンピュータの周りにあると思います)。どの深さまで(私は、回路設計レベルではなく、理解するのに十分な深さに傾けたい)?
タイトルが示唆しているように、Linuxカーネルを理解するのに必要な体系的な知識を持つソースはありますか?Linuxカーネル(または任意のカーネル)を理解するために必要なハードウェア知識
このようなものがない場合は、ハードウェアのトピックは何ですか(私はそれがコンピュータの周りにあると思います)。どの深さまで(私は、回路設計レベルではなく、理解するのに十分な深さに傾けたい)?
Beagleboardのような埋め込みボードを購入することをお勧めします。彼らは、使用されているチップセット(この場合はTI ARM Cortex A8)の必要なドキュメントを提供します。このチップセットのマニュアルの読込みを開始してください。また、Beagleboardに実装されている多くのAndroid、Ubuntuプロジェクトがあります。参照としてそれらを取って、あなたの特定のボードなどにドライバを書いた方法を見てください。これは、カーネル/ドライバがH/Wとどのように相互作用するかのアイデアを提供します。
カーネルのS/W部分には、一般的にgood book on Operating systemsとLinux/Unix OSをお読みになることをお勧めします。これは、カーネルとそれがどのように物事を管理するかについての公正なアイデアを与えるでしょう。その後、デスクトップのLinuxでwriting small kernel modulesで遊んで、それを挿入したり取り外したり、デバッグしたりすることができます。
また、kernel sourceの便利なリファレンスを用意して、インターネットをあなたの親友にしてください。
カーネル本体は、CPUアーキテクチャの基本を超えてハードウェアの知識はほとんど必要ありません。主に、カーネルはメモリ、ファイル、ページング、スワッピング、タスクスケジューリングなどのリソースを管理します。カーネルとロード可能なデバイスドライバ間のインタフェースは、純粋なコンピュータ科学です。ドライバーはハードウェア固有のコードの95%のようなものを持っていますが、ハードウェア固有の仮想メモリーをより深いレベルで管理するのは複雑です。
より簡単なシステムコール(例えば、gettimeofday()
またはsysinfo()
)をトレースして、カーネルがどのように構築されているかを知ることから始めます。次に、あなたの興味に応じて、read()
、write()
、sbrk()
、mmap()
という論理に従ってください。 fork()
は面白くて楽しいものですが、かなり心地よくなるかもしれません。スケジューラーはまた、把握する価値のある課題ですが、努力の価値があります。がんばろう!
ありがとうございます。しかし、私は基本的なレベルを超えて、つまりプロセスがtask_structの概念であり、カーネルがタスク構造体をどのように切り替えるかを知っているという概念のほとんどを得ています。しかし、明らかに、カーネル開発者は、ハードウェアを制御するコードを書くためにハードウェアについて十分に知っていなければならないので、APIを学ぶのではなく、もっと深く学びたいと思っています。 – Amumu
ボードを使用してチップセットのマニュアルを読む前に、ハードウェアの知識に関する前提条件は何ですか?私は基本的なPCアーキテクチャ(コンポーネントにはどのようなものがあるのか、CPUやメモリなどのコンポーネントのやり取りなど)と基本的なカーネルの使用方法(コンパイル、カーネルモジュールの作成、OSの動作方法。))、しかしハードウェアと直接対話することは、私にとってはまだ神話です。 – Amumu
RAM、フラッシュ、チップセットの概要に関する基礎知識は十分です。私はあなたが水泳を学ぶために泳ぐことを勧めます。私はアナログ・デバイセズのようなH/Wベースの企業で働くほど幸運でした。しかし、あなたが十分に幸運でないなら、あなたは基本的なボードから始めなければなりません。 –