原创 linux内核启动解析(一)

2012-3-31 16:09 7219 13 27 分类: 消费电子

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();                                                                      


 

该系列文章列表:

linux内核启动解析(一)

linux内核启动解析(二)

linux内核启动解析(三)

linux内核启动解析(四)

linux内核启动解析(五)

 

PARTNER CONTENT

文章评论14条评论)

登录后参与讨论

用户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

GOOD,学习了!
相关推荐阅读
用户1181832 2012-03-31 16:15
linux内核启动解析(五)
1.5 __enable_mmu()        在建好一页表之后,后面有几句这样的代码:        ldr   r13, __switch_data        @ addres...
用户1181832 2012-03-31 16:14
linux内核启动解析(四)
1.4 __create_page_tables()        __create_page_tables()函数同样也是位于arch/arm/kernel/head.S中,代码如下: ...
用户1181832 2012-03-31 16:13
linux内核启动解析(三)
  1.2 __lookup_machine_type() 机器类型的查找代码如下: __lookup_machine_type:        adr   r3, 3b   ...
用户1181832 2012-03-31 16:12
linux内核启动解析(二)
1.1 __lookup_processor_type() 话说内核映像解压后,又跳到c0008000这个地址。这个地址指向内核代码的什么地方,我们肯定很想知道。在arch/arm/kerne...
用户1181832 2012-03-16 11:22
起帆
       我的主要关注点是linux内核和驱动和bootloader。在将来的一段日子里,我会不定期的就以上几点写一些东西,以和大家共同探讨。         linux的真谛在于开放和共...
EE直播间
更多
我要评论
14
13
关闭 站长推荐上一条 /3 下一条