Kernel
ええと、読まねば、なソースファイルは以下。
順に確認してみます。
ってメモを取りつつ、だったのですが見てたバージョンが 2.2 系だったことが判明。一応メモは残しておくことにして、これから 2.6.35 を解凍して gtags -v して再度確認します。
setup_arch 手続き
手続き定義の最初らへんが以下。
__initfunc(void setup_arch(char **cmdline_p,
unsigned long * memory_start_p, unsigned long * memory_end_p))
{
unsigned long memory_start, memory_end;で、memory_start は結構簡単に決まってて
memory_start = (unsigned long) &_end;
が唯一の代入式だったりしてますね。bss な領域の末端というかカーネルデータの末端と言えば良いでしょうか。0x1000 から 0x9f000 までの部分はスルーなのかなぁ。
あと、memory_end については ifdef なナニはスルーで確認してみると
memory_end = (1<<20) + (EXT_MEM_K<<10);
ええと、EXT_MEM_K は
#define EXT_MEM_K (*(unsigned short *)0x90002)
となってますね。0x90002 というのはなんとなくどこかで見たような見ないような。その後、PAGE_MASK と & 取ってますね。
memory_end &= PAGE_MASK;
PAGE_MASK の定義は include/asm-i386/page/h で以下。
/* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1))
お尻 12 bits は 0 クリアという事ですね。