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();
该系列文章列表:
用户1379505 2013-4-3 17:28
用户1654514 2012-5-15 23:13
用户1631309 2012-5-2 19:41
用户1504873 2012-4-17 11:22
用户1617991 2012-4-14 13:54
用户1056013 2012-4-14 12:54
用户1562029 2012-4-14 12:43
用户1379505 2012-4-6 10:25
用户1259038 2012-4-5 14:18
用户1458475 2012-4-4 23:14