Kernel

ええと、読まねば、なソースファイルは以下。

  • arch/i386/kernel/setup.c の setup_arch 手続き
  • arch/i386/mm/init.c の mem_init 手続き

順に確認してみます。
ってメモを取りつつ、だったのですが見てたバージョンが 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 クリアという事ですね。