[HAIKU] ブートからカーネル起動までの流れ

error,debug,smp関係等は省略してあります。
説明は少しずつ書いて行く予定。(解析はある程度進んでるんだけど、書くのって面倒ですねぇ)


とりあえず、ブートイメージの説明
boot-floppyでは、zbeos のみ。
boot-cd では 1st-volume (biosがboot時にロードする部分)に、zbeos と、tar-fs が含まれている。
この tar-fs には、kernel_x86 と、必要最小限のドライバ がパッケージされている。


ここから zbeos
"system/boot/platform/bios_ia32/stage1.S"
"system/boot/platform/bios_ia32/start.c" void _start(void)
stage2_args args;
clear_bss();
call_ctors();
console_init();
cpu_init();
mmu_init();
apm_init();
main(&args);
"system/boot/loader/main.cpp" int main(stage2_args *args)
heap_init(args)
platform_init_video();
vfs_init(args)
Directory *volume = get_boot_file_system(args);
if((volume==NULL)||platform_boot_options()){
mount_file_systems(args)
user_menu(&volume)
}
load_kernel(args, volume)
mount_file_systems(args)
register_boot_file_system(volume);
platform_switch_to_logo();
load_modules(args, volume);
load_driver_settings(args, volume);
platform_start_kernel();
"system/boot/platform/bios_ia32/start.c" void platform_start_kernel(void)
static struct kernel_args *args = &gKernelArgs;
addr_t stackTop = gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size;
mmu_init_for_kernel();
==inline_asm==
[esp]=stackTop
push 0
push args
jmp gKernelArgs.kernel_image.elf_header.e_entry
ここまで zbeos ここから kernel_x86
"system/kernel/main.c" int _start(kernel_args *bootKernelArgs, int currentCPU)
cpu_preboot_init_percpu(&sKernelArgs, currentCPU);
thread_preboot_init_percpu(&sKernelArgs, currentCPU);
arch_platform_init(&sKernelArgs);
cpu_init(&sKernelArgs);
cpu_init_percpu(&sKernelArgs, currentCPU);
int_init(&sKernelArgs);
vm_init(&sKernelArgs);
arch_platform_init_post_vm(&sKernelArgs);
boot_item_init();
driver_settings_init(&sKernelArgs);
debug_init_post_vm(&sKernelArgs);
int_init_post_vm(&sKernelArgs);
cpu_init_post_vm(&sKernelArgs);
system_info_init(&sKernelArgs);
timer_init(&sKernelArgs);
rtc_init(&sKernelArgs);
sem_init(&sKernelArgs);
vm_init_post_sem(&sKernelArgs);
driver_settings_init_post_sem(&sKernelArgs);
generic_syscall_init();
cbuf_init();
team_init(&sKernelArgs);
thread_init(&sKernelArgs);
port_init(&sKernelArgs);
kernel_daemon_init();
arch_platform_init_post_thread(&sKernelArgs);
vm_init_post_thread(&sKernelArgs);
elf_init(&sKernelArgs);
scheduler_init();
vfs_init(&sKernelArgs);
enable_interrupts();
scheduler_start();
thread = spawn_kernel_thread(&main2, "main2", B_NORMAL_PRIORITY, NULL);
resume_thread(thread);
arch_cpu_idle();
"system/kernel/main.c" static int32 main2(void *unused)
module_init(&sKernelArgs);
init_messaging_service();
vfs_bootstrap_file_systems();
device_manager_init(&sKernelArgs);
int_init_post_device_manager(&sKernelArgs);
vfs_mount_boot_file_system(&sKernelArgs);
cpu_init_post_modules(&sKernelArgs);
vm_init_post_modules(&sKernelArgs);
device_manager_init_post_modules(&sKernelArgs);
"Bootscript" があれば、
const char args={"/bin/sh", "/boot/beos/system/boot/Bootscript", NULL}; int32 argc=2;
なければ、
const char args={"/bin/init", NULL}; int32 argc=1;
thread = load_image(argc, args, NULL);
resume_thread(thread);
ここまで kernel_x86