1 linux内核启动过程分析

来源:互联网 发布:健身运动软件app 编辑:程序博客网 时间:2024/05/21 21:58
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();
0 0
原创粉丝点击