Linuxカーネルのどの部分を楽しく読むことができますか? [閉まっている]
-
06-07-2019 - |
質問
プログラミングは私の主な仕事ではありませんが、私はそれを楽しんでおり、時には報酬を得ています。何年もの間、私はLinuxについて聞いていて、Mac OSにこだわっていますが、友人たちは多くの* nix(または* nici?)を見せてくれました。
Linuxカーネルのどの部分を見て楽しむことができると思いますか。それは全体の内容を理解するのに役立ちますか?たとえば、LinuxはDarwinとどう違うのですか?
私はアセンブラーとDOSで育ったので、割り込みや低レベルのCなどは理解の障害にはなりません。しかし、最終的には、スレッドやネットワークスタックなどの高レベルの概念に興味があります。オペレーティングシステムが異なれば、動作も異なります。そして、深夜の読書のような、楽しく、簡単で楽しいものを探しています。
(注:念のためCWを作成しました)
更新:いくつかのドキュメントを探して読み始めました:
解決
LXR をご覧になることをお勧めします。コードの流れをたどりやすくなります(&#8212と呼ばれる各関数を検索する必要はありませんが、そうではありますが、サイトがあなたのためにそれを行います)。
現在のバージョン(2.6.30)のいくつかの出発点:
-
start_kernel()
—main()
と同等のカーネルと考えてください。この関数は、ほぼすべてのカーネルサブシステムを初期化します。それに従って、ブート中に画面上でスクロールするものをコードで確認してください。 - entry_32.S &#8212 ;システムコールと割り込み(x86-32バージョン。これはあなたが知っているものに近いはずです。慣れているIntel方言の代わりにAT& Tアセンブリ方言の使用に注意してください。)
- head_32.S &#8212 ;カーネルエントリポイント。これは、保護モードに切り替えた後にカーネルが開始する場所です。最後に、
start_kernel()
を呼び出します。 - arch / x86 / boot —リアルモードブートストラップコード。アセンブリで開始します( boot / header.S )、ただしすぐにCコードにジャンプします( bootから開始) /main.c )。リアルモードの初期化を行います(ほとんどの場合、プロテクトモードに切り替える前に行う必要があるBIOS呼び出し)。奇妙なGCCトリック(
.code16gcc
)を使用してコンパイルされているため、32ビットのリアルモードコードを生成できます。 - arch / x86 / boot / compressed — 「Decompressing Linux ...」がどこで行われるのか疑問に思ったことがありますか?メッセージはここから来ています。
他のヒント
私自身は、タスクスケジューリングコードが少し気になっていることをいつも見つけました:-/
業界外で趣味を習得するために必要な考え。または人生:-)
カーネル内のコメントはかなりおかしい場合があります。 kerneltrapには、最適なものを見つけるためのヒントがあります。
arch / sparc / lib / checksum.S- / *太陽、あなたは私を打ち負かすことができない、あなたはただできない。試してみて、 arch / sparc / lib / checksum.S:*あきらめます。私は真剣です、私は生きているたわごとを蹴るつもりです arch / sparc / lib / checksum.S- *アウトアウト、ゲームオーバー、消灯。* /
linux-0.01.tar.gz は歴史的なカーネルであり、スタートに最適
シンプルで小さく、読み始めるのに適しています
(start_kernel()の代わりにvoid main(void)もありますlol:D)
Linuxカーネルを詳しく調べる前に、Linuxカーネルについて説明している本を読んだり、読んだりすることをお勧めします。
頭に浮かぶ本は:
OS理論に関する本を読むことで、より多くのことが得られるでしょう。ソースコードに関する限り:私にはわかりませんが、 Linuxカーネルソースを簡単にダウンロードできます。魅力的なものを見つけることができるかどうかを確認してください。
srcディレクトリで実行すると、興味深いコードが表示されます:
grep -ir "fixme" *
他のコミカルな用語、がらくた、たわごと、f ***、ペンギンなども試してください
コンテキストで「楽しい」という言葉を再定義する必要があります。 :)
それは言ったが、Linuxカーネルはあまりにも多くのモンスターに対応できないかもしれない。まず、アカデミックカーネルまたはより原始的なカーネルから始めて、何が起こっているのかを把握することをお勧めします。 Jolix 本。
v0.0.1のlinuxが最も理解しやすいとかなりの人に勧められています。
しかし、読むのに良いカーネルソースを探しているなら、私はLinuxには行きません、それはハックの獣です(GCCソースが「楽しい」と言っているような)代わりに、Minixを試してみてくださいまたはBSD(Darwinは基本的にNetBSD iircのブランチ)または他のすべてが少し怖すぎる場合は、多くの無料DOSクローンのいずれかです。.
これらのキャラクターデバイスを実装するコードを読んでみてください: / dev / zero / dev / null / dev / full
そして、もしあなたが傾いているなら、おそらく乱数ジェネレーター。コードはハードウェアに触れないため、他のすべてのデバイスドライバーよりも簡単でシンプルです。
drivers / char / mem。*から開始
学習できるいくつかの簡単なトリック、たとえば
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
...
#define min(x, y) ...
...
#define container_of
おもしろいことに、Minixを見ることができると思います。正確にはlinuxではありませんが、tenenbaumのModern Operating systemsは良い読み物です。