freshtree 1 linux內核啟動過程分析 嵌入式linux系統從軟件角度來看可分為四部分:bootloader,linux內核,文件系統和應用程序。在這里我選取的內核版本是linux2.6.28,硬件平臺選擇smdk6410。 Bootloader是系統啟動或復位后首先被執行的代碼,它的主要作用是初始化處理器,初始化ram,初始化相應的外設(uart,usb等等),下載內核映像(或文件系統)到ram相應的位置,然后跳轉到內核下載地址 c0008000,將控制權交給linux內核。 Linux內核下載到ram中的映像一般是zImage。這是壓縮版本的內核,首先要進行解壓操作。調用decompress_kernel()(位于arch/arm/boot/compressed/misc.c)進行解壓縮操作,然后再次跳到c0008000,進行真正的內核初始化操作。 我們重點放在講解內核映像解壓之后linux內核的啟動過程。內核初始化啟動過程如下: 1) __lookup_processor_type(),查找處理器類型。 2) __lookup_machine_type(),查找機器類型。 3) __vet_atags()。 4) __create_page_tables(),創建頁表。 5) __enable_mmu(),使能MMU。 6) __mmap_switched(),拷貝數據,清BBS。 7) start_kernel(),進入真正的內核初始化函數。 8) smp_setup_processor_id(); 9) unwind_init(); 10)lockdep_init(); 11) debug_objects_early_init(); 12) cgroup_init_early(); 13) local_irq_disable(); 14) early_boot_irqs_off(); 15) early_init_irq_lock_class(); 16) lock_kernel(); 17) tick_init(); 18) boot_cpu_init(); 19) page_address_init(); 20) setup_arch(&command_line); 21) mm_init_owner(&init_mm, &init_task); 22) setup_command_line(command_line); 23) unwind_setup(); 24) setup_per_cpu_areas(); 25) setup_nr_cpu_ids(); 26) smp_prepare_boot_cpu(); 27) sched_init(); 28) preempt_disable(); 29) build_all_zonelists(); 30) page_alloc_init(); 31) parse_early_param(); 32) sort_main_extable(); 33) trap_init(); 34) rcu_init(); 35) init_IRQ(); 36) pidhash_init(); 37) init_timers(); 38) hrtimers_init(); 39) softirq_init(); 40) timekeeping_init(); 41) time_init(); 42) sched_clock_init(); 43) profile_init(); 44) early_boot_irqs_on(); 45) local_irq_enable(); 46) console_init(); 47) lockdep_info(); 48) locking_selftest(); 49) vmalloc_init(); 50) vfs_caches_init_early(); 51) cpuset_init_early(); 52) page_cgroup_init(); 53) mem_init(); 54) enable_debug_pagealloc(); 55) cpu_hotplug_init(); 56) kmem_cache_init(); 57) debug_objects_mem_init(); 58) idr_init_cache(); 59) setup_per_cpu_pageset(); 60) numa_policy_init(); 61) if (late_time_init) 62) late_time_init(); 63) calibrate_delay(); 64) pidmap_init(); 65) pgtable_cache_init(); 66) prio_tree_init(); 67) anon_vma_init(); 68) thread_info_cache_init(); 69) fork_init(num_physpages); 70) proc_caches_init(); 71) buffer_init(); 72) key_init(); 73) security_init(); 74) vfs_caches_init(num_physpages); 75) radix_tree_init(); 76) signals_init(); 77) page_writeback_init(); 78) proc_root_init(); 79) cgroup_init(); 80) cpuset_init(); 81) taskstats_init_early(); 82) delayacct_init(); 83) check_bugs(); 84) acpi_early_init(); 85) ftrace_init(); 86) rest_init(); |