Tuesday, July 19, 2011

How linux function executed while OS boots?

■ Requirement : How linux calls happens while it starts
■ OS Environment : Linux[RHEL, Centos]
■ Application:linux OS
■ Resolution : 

We start the Linux kernel first from C code executed from ''startup_32:'' asm label:

|#if defined(CONFIG_SYSVIPC)

* startup_32 [arch/i386/kernel/head.S]
* start_kernel [init/main.c]
* lock_kernel [include/asm/smplock.h]
* trap_init [arch/i386/kernel/traps.c]
* init_IRQ [arch/i386/kernel/i8259.c]
* sched_init [kernel/sched.c]
* softirq_init [kernel/softirq.c]
* time_init [arch/i386/kernel/time.c]
* console_init [drivers/char/tty_io.c]
* init_modules [kernel/module.c]
* kmem_cache_init [mm/slab.c]
* sti [include/asm/system.h]
* calibrate_delay [init/main.c]
* mem_init [arch/i386/mm/init.c]
* kmem_cache_sizes_init [mm/slab.c]
* pgtable_cache_init [arch/i386/mm/init.c]
* fork_init [kernel/fork.c]
* proc_caches_init
* vfs_caches_init [fs/dcache.c]
* buffer_init [fs/buffer.c]
* page_cache_init [mm/filemap.c]
* signals_init [kernel/signal.c]
* proc_root_init [fs/proc/root.c]
* ipc_init [ipc/util.c]
* check_bugs [include/asm/bugs.h]
* smp_init [init/main.c]
* rest_init
* kernel_thread [arch/i386/kernel/process.c]
* unlock_kernel [include/asm/smplock.h]
* cpu_idle [arch/i386/kernel/process.c]

The last function ''rest_init'' does the following:

1. launches the kernel thread ''init''
2. calls unlock_kernel
3. makes the kernel run cpu_idle routine, that will be the idle loop executing when nothing is scheduled

In fact the start_kernel procedure never ends. It will execute cpu_idle routine endlessly.

Follows ''init'' description, which is the first Kernel Thread:

|(*call())-> kswapd_init

No comments:

Post a Comment