linux内核启动解析(一)
发布时间:2012-4-1 09:54
发布者:李宽
关键词:
linux
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(); |
网友评论