2009年8月14日金曜日

lockdep_init

解凍したカーネルのジャンプ先をソースや諸々の設定ファイルから読み取るのは断念中なのですが、とにもかくにも解凍しおえたカーネルのジャンプ先はarch/x86/kernel/head_32.Sの「startup_32」になります。※
同名ファイルの同名関数を過去に見ていますが、それとは別物です。この辺りのアセンブラは勉強して再チャレンジということにして、ここではパスします。このstartup_32ではページテーブルに関して設定しています。そしてここからジャンプする先がinit/main.cにある「start_kernel」です。
今後はここを起点にソースを見て行くことにしましょう。

Inside the Linux boot process

「start_kernel」はとても長いので少しずつ見て行きましょう。
======
asmlinkage void __init start_kernel(void)
======

「__init」キーワードは一度実行したらメモリから消すように指示します。「asmlinkage」というキーワードはこれがシステムコールであることをコンパイラに
伝えるためのものです。
詳細は以下が参考になります。

はじめてのカーネルソース
ITpro 第3回 ソース内のシステム・コールを確認する

======
char * command_line;
extern struct kernel_param __start___param[], __stop___param[];

smp_setup_processor_id();
======

ローカル変数宣言のあと、smp_setup_processor_idをコールしますがSMP向けなのでパス。

======
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
debug_objects_early_init();
cgroup_init_early();
======

まずはここ「lockdep_init」から。
lockdep_initの実体はkernel/lockdep.cにあります。
=====
void lockdep_init(void)
{
int i;

/*
* Some architectures have their own start_kernel()
* code which calls lockdep_init(), while we also
* call lockdep_init() from the start_kernel() itself,
* and we want to initialize the hashes only once:
*/
if (lockdep_initialized)
return;

for (i = 0; i < CLASSHASH_SIZE; i++)
INIT_LIST_HEAD(classhash_table + i);

for (i = 0; i < CHAINHASH_SIZE; i++)
INIT_LIST_HEAD(chainhash_table + i);

lockdep_initialized = 1;
}

=====

ハッシュテーブルを初期化しているようですが、このハッシュテーブルは何者でしょうか。調べてみるとlockdepというのはカーネル内のロックが正しく使われているか実行時に検証する仕組みのようです。カーネルソースに含まれているDocumentation/lockdep-design.txtに詳細があります。
※JFではまだ日本語化されていないようです

0 件のコメント:

コメントを投稿