vmlinux.lds.s文件分析

vmlinux.lds.S如何组织内核的每个函数存放在内核镜像文件的位置,我们知道你在编译内核生成内核文件的时候,其实这个过程分两步,一个是“编译”,另一个是“链接”的过程,vmlinux.lds.S要做的就是告诉编译器如何链接编译好的各个内核.o文件。

  1. 小知识:链接器中的entry 
  2. 链接器 按以下优先顺序设入口点,找到即停止 
  3. 1 -e 命令行选项 
  4. 2 脚本中的entry(symbol)命令 
  5. 3如定义了start的值,取其值为入口点 
  6. 4.text的第一个字节的地址 
  7. 5地址0
复制代码



所以你可以从vmlinux.lds.S下面的代码中看到:
  1. OUTPUT_ARCH(arm)
  2. ENTRY(stext)
复制代码



表明我们指定stext作为, 程序 的入口点。


上代码:

  1. SECTIONS
  2. {
  3. #ifdef CONFIG_XIP_KERNEL
  4.         . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
  5. #else
  6.         . = PAGE_OFFSET + TEXT_OFFSET;
  7. #endif

  8.         .init : {                        /* Init code and data                */
  9.                 _stext = .;
  10.                 _sinittext = .;
  11.                         HEAD_TEXT
  12.                         INIT_TEXT
  13.                         ARM_EXIT_KEEP(EXIT_TEXT)
  14.                 _einittext = .;
  15.                 ARM_CPU_DISCARD(PROC_INFO)
  16.                 __arch_info_begin = .;
  17.                         *(.arch.info.init)
  18.                 __arch_info_end = .;
  19.                 __tagtable_begin = .;
  20.                         *(.taglist.init)
  21.                 __tagtable_end = .;
  22. #ifdef CONFIG_SMP_ON_UP
  23.                 __smpalt_begin = .;
  24.                         *(.alt.smp.init)
  25.                 __smpalt_end = .;
  26. #endif

  27.                 __pv_table_begin = .;
  28.                         *(.pv_table)
  29.                 __pv_table_end = .;

  30.                 INIT_SETUP(16)

  31.                 INIT_CALLS
  32.                 CON_INITCALL
  33.                 SECURITY_INITCALL
  34.                 INIT_RAM_FS

  35. #ifndef CONFIG_XIP_KERNEL
  36.                 __init_begin = _stext;
  37.                 INIT_DATA
  38.                 ARM_EXIT_KEEP(EXIT_DATA)
  39. #endif
  40.         }

  41.         PERCPU_SECTION(32)

  42. #ifndef CONFIG_XIP_KERNEL
  43.         . = ALIGN(PAGE_SIZE);
  44.         __init_end = .;
  45. #endif

  46.         /*
  47.          * unwind exit sections must be discarded before the rest of the
  48.          * unwind sections get included.
  49.          */
  50.         /DISCARD/ : {
  51.                 *(.ARM.exidx.exit.text)
  52.                 *(.ARM.extab.exit.text)
  53.                 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
  54.                 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
  55. #ifndef CONFIG_HOTPLUG
  56.                 *(.ARM.exidx.devexit.text)
  57.                 *(.ARM.extab.devexit.text)
  58. #endif
  59. #ifndef CONFIG_MMU
  60.                 *(.fixup)
  61.                 *(__ex_table)
  62. #endif
  63.         }

  64.         .text : {                        /* Real text segment                */
  65.                 _text = .;                /* Text and read-only data        */
  66.                         __exception_text_start = .;
  67.                         *(.exception.text)
  68.                         __exception_text_end = .;
  69.                         IRQENTRY_TEXT
  70.                         TEXT_TEXT
  71.                         SCHED_TEXT
  72.                         LOCK_TEXT
  73.                         KPROBES_TEXT
  74. #ifdef CONFIG_MMU
  75.                         *(.fixup)
  76. #endif
  77.                         *(.gnu.warning)
  78.                         *(.rodata)
  79.                         *(.rodata.*)
  80.                         *(.glue_7)
  81.                         *(.glue_7t)
  82.                 . = ALIGN(4);
  83.                 *(.got)                        /* Global offset table                */
  84.                         ARM_CPU_KEEP(PROC_INFO)
  85.         }

  86.         RO_DATA(PAGE_SIZE)

  87. #ifdef CONFIG_ARM_UNWIND
  88.         /*
  89.          * Stack unwinding tables
  90.          */
  91.         . = ALIGN(8);
  92.         .ARM.unwind_idx : {
  93.                 __start_unwind_idx = .;
  94.                 *(.ARM.exidx*)
  95.                 __stop_unwind_idx = .;
  96.         }
  97.         .ARM.unwind_tab : {
  98.                 __start_unwind_tab = .;
  99.                 *(.ARM.extab*)
  100.                 __stop_unwind_tab = .;
  101.         }
  102. #endif

  103.         _etext = .;                        /* End of text and rodata section */

  104. #ifdef CONFIG_XIP_KERNEL
  105.         __data_loc = ALIGN(4);                /* location in binary */
  106.         . = PAGE_OFFSET + TEXT_OFFSET;
  107. #else
  108.         . = ALIGN(THREAD_SIZE);
  109.         __data_loc = .;
  110. #endif

  111.         .data : AT(__data_loc) {
  112.                 _data = .;                /* address in memory */
  113.                 _sdata = .;

  114.                 /*
  115.                  * first, the init task union, aligned
  116.                  * to an 8192 byte boundary.
  117.                  */
  118.                 INIT_TASK_DATA(THREAD_SIZE)

  119. #ifdef CONFIG_XIP_KERNEL
  120.                 . = ALIGN(PAGE_SIZE);
  121.                 __init_begin = .;
  122.                 INIT_DATA
  123.                 ARM_EXIT_KEEP(EXIT_DATA)
  124.                 . = ALIGN(PAGE_SIZE);
  125.                 __init_end = .;
  126. #endif

  127.                 NOSAVE_DATA
  128.                 CACHELINE_ALIGNED_DATA(32)
  129.                 READ_MOSTLY_DATA(32)

  130.                 /*
  131.                  * The exception fixup table (might need resorting at runtime)
  132.                  */
  133.                 . = ALIGN(32);
  134.                 __start___ex_table = .;
  135. #ifdef CONFIG_MMU
  136.                 *(__ex_table)
  137. #endif
  138.                 __stop___ex_table = .;

  139.                 /*
  140.                  * and the usual data section
  141.                  */
  142.                 DATA_DATA
  143.                 CONSTRUCTORS

  144.                 _edata = .;
  145.         }
  146.         _edata_loc = __data_loc + SIZEOF(.data);

  147. #ifdef CONFIG_HAVE_TCM
  148.         /*
  149.          * We align everything to a page boundary so we can
  150.          * free it after init has commenced and TCM contents have
  151.          * been copied to its destination.
  152.          */
  153.         .tcm_start : {
  154.                 . = ALIGN(PAGE_SIZE);
  155.                 __tcm_start = .;
  156.                 __itcm_start = .;
  157.         }

  158.         /*
  159.          * Link these to the ITCM RAM
  160.          * Put VMA to the TCM address and LMA to the common RAM
  161.          * and we'll upload the contents from RAM to TCM and free
  162.          * the used RAM after that.
  163.          */
  164.         .text_itcm ITCM_OFFSET : AT(__itcm_start)
  165.         {
  166.                 __sitcm_text = .;
  167.                 *(.tcm.text)
  168.                 *(.tcm.rodata)
  169.                 . = ALIGN(4);
  170.                 __eitcm_text = .;
  171.         }

  172.         /*
  173.          * Reset the dot pointer, this is needed to create the
  174.          * relative __dtcm_start below (to be used as extern in code).
  175.          */
  176.         . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);

  177.         .dtcm_start : {
  178.                 __dtcm_start = .;
  179.         }

  180.         /* TODO: add remainder of ITCM as well, that can be used for data! */
  181.         .data_dtcm DTCM_OFFSET : AT(__dtcm_start)
  182.         {
  183.                 . = ALIGN(4);
  184.                 __sdtcm_data = .;
  185.                 *(.tcm.data)
  186.                 . = ALIGN(4);
  187.                 __edtcm_data = .;
  188.         }

  189.         /* Reset the dot pointer or the linker gets confused */
  190.         . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);

  191.         /* End marker for freeing TCM copy in linked object */
  192.         .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
  193.                 . = ALIGN(PAGE_SIZE);
  194.                 __tcm_end = .;
  195.         }
  196. #endif

  197.         NOTES

  198.         BSS_SECTION(0, 0, 0)
  199.         _end = .;

  200.         STABS_DEBUG
  201.         .comment 0 : { *(.comment) }

  202.         /* Default discards */
  203.         DISCARDS

  204. #ifndef CONFIG_SMP_ON_UP
  205.         /DISCARD/ : {
  206.                 *(.alt.smp.init)
  207.         }
  208. #endif
  209. }
复制代码


先看第一个知识点:


(1). = PAGE_OFFSET + TEXT_OFFSET;


arch/arm/include/asm中的memory.h文件定义了:

  1. #define PAGE_OFFSET                UL(CONFIG_PAGE_OFFSET)
复制代码

CONFIG_PAGE_OFFSET是在内核配置里面配置的,比如拿ok6410来说,我的配置:

扫描二维码关注公众号,回复: 2380357 查看本文章
  1. #define CONFIG_PAGE_OFFSET 0xC0000000
复制代码

PAGE_OFFSET代表是的内核image的的起始虚拟地址。

在arch/arm/Makefile中有定义:

  1. textofs-y        := 0x00008000
  2. TEXT_OFFSET := $(textofs-y)
复制代码

TEXT_OFFSET代表的是内核的image存放在内存中地址,注意这个地址为相对于内存的起始地址的偏移量,是个相对的偏移量不是实际的存放内存物理地址。而且这个偏移量取得有讲究,必须为:0xXXXX8000,xxx为任意值。

所以:. = PAGE_OFFSET + TEXT_OFFSET就变成为:.=c0008000,这个地址就是内核存放在内存的虚拟的起始地址。从脚本来看,也就是.stext的地址就是:c0008000,那么我们如何验证我们的这个说法呢,你可以打开linux目录下的System.map文件查看:

  1. 00000020 A cpu_v6_suspend_size
  2. c0004000 A swapper_pg_dir
  3. c0008000 T __init_begin
  4. c0008000 T _stext  T _sinittext
  5. c0008000 T _stext
  6. c0008000 T stext
  7. c000804c t __create_page_tables
  8. c0008148 t __enable_mmu_loc
  9. c0008154 t __enable_mmu
  10. c0008180 t __turn_mmu_on
  11. c0008198 t __enable_mmu_end
  12. c0008198 t __vet_atags
  13. c00081e0 t __mmap_switched
  14. c0008228 t __mmap_switched_data
  15. c000824c T lookup_processor_type
  16. c0008260 t set_reset_devices
  17. c0008284 t debug_kernel
复制代码

从map文件可以知道_stext是内核的入口地址,这个地址就是c0008000,这也验证了我们在第一章讲搭建环境的时候,我为什么要用dnw c0008000,就是因为我们已经指定好了,内核的存放地址必须为c0008000,针对ok6410来说。

(二).init内核的初始化代码和数据

  1.                 _sinittext = .;
  2.                         HEAD_TEXT
  3.                         INIT_TEXT
  4.                         ARM_EXIT_KEEP(EXIT_TEXT)
  5.                 _einittext = .;
复制代码

从上面的链接脚本可以知道所有:_sinittext开头的,_einittext结尾的HEAD_TEXT, INIT_TEXT,ARM_EXIT_KEEP(EXIT_TEXT)段都是从起始地址c0008000开始存放的。这些宏定义在:include/asm-generic/vmlinux.lds.h中。

  1. __arch_info_begin = .;
  2.                         *(.arch.info.init)
  3.                 __arch_info_end = .;
  4.                 __tagtable_begin = .;
  5.                         *(.taglist.init)
  6.                 __tagtable_end = .;
  7. #ifdef CONFIG_SMP_ON_UP
  8.                 __smpalt_begin = .;
  9.                         *(.alt.smp.init)
  10.                 __smpalt_end = .;
  11. #endif

  12.                 __pv_table_begin = .;
  13.                         *(.pv_table)
  14.                 __pv_table_end = .;
复制代码

紧接着以此存放的是:*(.arch.info.init), *(.taglist.init),*(.alt.smp.init),*(.pv_table)段的代码,其中我们最熟悉的*(.arch.info.init)段的代码就是:

  1. #define MACHINE_START(_type,_name)                        \
  2. static const struct machine_desc __mach_desc_##_type        \
  3. __used                                                        \
  4. __attribute__((__section__(".arch.info.init"))) = {        \
  5.         .nr                = MACH_TYPE_##_type,                \
  6.         .name                = _name,

  7. #define MACHINE_END                                \
  8. };
复制代码

也就是说所有平台的下面这段代码都放到了*(.arch.info.init)段中:

  1. MACHINE_START(MCUOS6410, "MCUOS6410")
  2.         /* Maintainer: Ben Dooks <[email protected]> */
  3.         .boot_params        = S3C64XX_PA_SDRAM + 0x100,

  4.         .init_irq        = s3c6410_init_irq,
  5.         .map_io                = mcuos6410_map_io,
  6.         .init_machine        = mcuos6410_machine_init,
  7.         .timer                = &s3c24xx_timer,
  8. MACHINE_END
复制代码

紧接着存放的是初始化数据段:

  1. #ifndef CONFIG_XIP_KERNEL
  2.                 __init_begin = _stext;
  3.                 INIT_DATA
  4.                 ARM_EXIT_KEEP(EXIT_DATA)
  5. #endif
  6.         }

  7.         PERCPU_SECTION(32)

  8. #ifndef CONFIG_XIP_KERNEL
  9.         . = ALIGN(PAGE_SIZE);
  10.         __init_end = .;
  11. #endif
复制代码

这个段存放的是所有*(.init.data),*(.init.rodata)段中的代码。


.init段中的代码段和数据段,在Linux初始化完成之后,这个段的内存都会被请空,被释放。因为他们只需要在初始化的时候使用一次,没有必要再驻留在内存中,浪费空间。为了验证我们以上的分析,我们可以查看system.map这个文件,下面我们看到的从_sinittext开头的,_einittext结尾的所有函数,都会在初始化完成之后被释放:

  1. c0008000 T _sinittext
  2. c0008000 T _stext
  3. c0008000 T stext
  4. c000804c t __create_page_tables
  5. c0008148 t __enable_mmu_loc
  6. c0008154 t __enable_mmu
  7. c0008180 t __turn_mmu_on
  8. c0008198 t __enable_mmu_end
  9. c0008198 t __vet_atags
  10. c00081e0 t __mmap_switched
  11. c0008228 t __mmap_switched_data
  12. c000824c T lookup_processor_type
  13. c0008260 t set_reset_devices
  14. c0008284 t debug_kernel
  15. c00082a8 t quiet_kernel
  16. c00082cc t init_setup
  17. c0008308 t rdinit_setup
  18. c0008344 W smp_setup_processor_id
  19. c0008354 W thread_info_cache_init
  20. c0008364 t loglevel
  21. c0008398 T parse_early_options
  22. c00083d4 t unknown_bootoption
  23. c00085f8 T parse_early_param
  24. c0008648 t do_early_param
  25. c0008724 t kernel_init
  26. c0008850 T start_kernel
  27. c0008b9c t readonly
  28. c0008bd0 t readwrite
  29. c0008c04 t rootwait_setup
  30. c0008c34 t root_data_setup
  31. c0008c54 t fs_names_setup
  32. c0008c74 t load_ramdisk
  33. c0008ca4 t root_dev_setup
  34. c0008ccc t root_delay_setup
  35. c0008cf8 T change_floppy
  36. c0008e20 T mount_block_root
  37. c0009108 T mount_root
  38. c0009174 T prepare_namespace
  39. c0009364 t ramdisk_start_setup
  40. c0009390 t prompt_ramdisk
  41. c00093c0 t error
  42. c00093fc t compr_fill
  43. c0009464 t compr_flush
  44. c00094d4 T rd_load_image
  45. c0009b5c T rd_load_disk
  46. c0009c10 t no_initrd
  47. c0009c34 T initrd_load
  48. c0009f74 t do_linuxrc
  49. c0009fc8 t error
  50. c0009fec t read_into
  51. c000a0a8 t do_start
  52. c000a0d4 t write_buffer
  53. c000a12c t flush_buffer
  54. c000a1d8 t retain_initrd_param
  55. c000a208 t clean_path
  56. c000a268 t do_utime
  57. c000a2ac t do_symlink
  58. c000a378 t unpack_to_rootfs
  59. c000a6d4 t maybe_link
  60. c000a840 t do_name
  61. c000aad8 t do_header
  62. c000adf0 t free_initrd
  63. c000aed0 t populate_rootfs
  64. c000b124 t do_collect
  65. c000b1ec t do_skip
  66. c000b2c0 t do_reset
  67. c000b38c t do_copy
  68. c000b4b8 t lpj_setup
  69. c000b500 T __kuser_helper_start
  70. c000b500 t __kuser_memory_barrier
  71. c000b520 t __kuser_cmpxchg
  72. c000b540 t __kuser_get_tls
  73. c000b55c t __kuser_helper_version
  74. c000b560 T __kuser_helper_end
  75. c000b560 T __stubs_start
  76. c000b560 t vector_irq
  77. c000b5e0 t vector_dabt
  78. c000b660 t vector_pabt
  79. c000b6e0 t vector_und
  80. c000b760 t vector_fiq
  81. c000b764 t vector_addrexcptn
  82. c000b784 T __stubs_end
  83. c000b784 T __vectors_start
  84. c000b7a4 T __vectors_end
  85. c000b7c0 T init_IRQ
  86. c000b7e4 T arch_probe_nr_irqs
  87. c000b818 t nohlt_setup
  88. c000b83c t hlt_setup
  89. c000b860 T reboot_setup
  90. c000b884 t ptrace_break_init
  91. c000b8bc t parse_tag_core
  92. c000b914 t parse_tag_videotext
  93. c000b994 t parse_tag_ramdisk
  94. c000b9fc t parse_tag_serialnr
  95. c000ba30 t parse_tag_revision
  96. c000ba54 t customize_machine
  97. c000ba84 t parse_tag_cmdline
  98. c000baac t topology_init
  99. c000badc t proc_cpu_init
  100. c000bb08 T arm_add_memory
  101. c000bba0 t parse_tag_mem32
  102. c000bbbc t early_mem
  103. c000bc38 T early_print
  104. c000bcb0 T dump_machine_table
  105. c000bd10 T setup_arch
  106. c000c5fc T time_init
  107. c000c630 t timer_init_syscore_ops
  108. c000c650 T trap_init
  109. c000c660 t user_debug_setup
  110. c000c694 T early_trap_init
  111. c000c7a8 T arch_init_kprobes
  112. c000c7cc T arm_kprobe_decode_init
  113. c000c800 T save_atags
  114. c000c824 t init_atags_procfs
  115. c000c934 T unwind_init
  116. c000c97c t arch_hw_breakpoint_init
  117. c000cb8c t register_pmu_driver
  118. c000cba8 t armpmu_reset
  119. c000cbf4 t init_hw_perf_events
  120. c000cd3c t setup_early_printk
  121. c000cd5c t dma_debug_do_init
  122. c000cd70 t consistent_init
  123. c000ce64 T hook_ifault_code
  124. c000ceb8 T hook_fault_code
  125. c000cf10 t exceptions_init
  126. c000cfac t parse_tag_initrd2
  127. c000cfe0 t meminfo_cmp
  128. c000d014 t keepinitrd_setup
  129. c000d038 t early_initrd
  130. c000d09c t parse_tag_initrd
  131. c000d0e8 T mem_init
  132. c000d7cc T bootmem_init
  133. c000da94 T arm_memblock_init
  134. c000dc1c T check_writebuffer_bugs
  135. c000dd64 t early_ecc
  136. c000ddd0 t early_cachepolicy
  137. c000ded0 t early_nowrite
  138. c000df08 t early_nocache
  139. c000df40 t early_vmalloc
  140. c000dfc4 t early_alloc
  141. c000dffc t early_pte_alloc
  142. c000e08c t create_mapping
  143. c000e3e8 T paging_init
  144. c000eabc T iotable_init
  145. c000eaf8 T arm_mm_memblock_reserve
  146. c000eb18 T sanity_check_meminfo
  147. c000ed58 t noalign_setup
  148. c000eda0 t alignment_init
  149. c000ee90 t v6_userpage_init
  150. c000eed4 T v6wbi_tlb_fns
  151. c000eee0 t vic_disable
  152. c000ef28 t vic_clear_interrupts
  153. c000ef6c t vic_set_irq_sources
  154. c000eff0 T vic_init
  155. c000f12c t s3c64xx_sysdev_init
  156. c000f154 T s3c64xx_init_io
  157. c000f1b0 T s3c6400_common_init_uarts
  158. c000f1dc T s3c64xx_register_clocks
  159. c000f264 T s3c6400_setup_clocks
  160. c000f4ec t s3c64xx_gpiolib_add_2bit
  161. c000f504 t s3c64xx_gpiolib_add
  162. c000f54c t s3c64xx_gpiolib_init
  163. c000f5a8 T s3c6410_map_io
  164. c000f5e0 t s3c6410_core_init
  165. c000f5fc T s3c6410_init
  166. c000f624 T s3c6410_init_irq
  167. c000f640 T s3c6410_init_clocks
  168. c000f67c T s3c64xx_init_irq
  169. c000f6f0 t s3c64xx_init_irq_eint
  170. c000f7dc t s3c64xx_dma_init
  171. c000f8c0 t mcuos6410_machine_init
  172. c000f8e0 t mcuos6410_map_io
  173. c000f91c T s3c64xx_ac97_setup_gpio
  174. c000f954 T s3c24xx_init_clocks
  175. c000f9b0 t s3c_arch_init
  176. c000fa08 T s3c24xx_init_uarts
  177. c000fa4c T s3c_init_cpu
  178. c000fb1c T s3c24xx_init_uartdevs
  179. c000fbb4 t s3c2410_timer_init
  180. c000fc94 T s3c_disable_clocks
  181. c000fccc T s3c24xx_register_baseclocks
  182. c000fe08 T s3c_register_clocks
  183. c000fe64 T s3c_pwmclk_init
  184. c000ffd4 T s3c_gpiolib_add
  185. c00100f4 T s3c_set_clksrc
  186. c00101cc T s3c_register_clksrc
  187. c00102d0 T s3c_init_uart_irqs
  188. c00103d4 T s3c_init_vic_timer_irq
  189. c001052c t adc_init
  190. c001056c T s3c_set_platdata
  191. c00105c8 T s3c_i2c0_set_platdata
  192. c0010638 T s3c_nand_set_platdata
  193. c0010784 t sched_init_debug
  194. c00107c4 t init_sched_debug_procfs
  195. c001080c T sched_init_smp
  196. c0010878 T sched_init
  197. c0010ab0 t proc_schedstat_init
  198. c0010af0 t coredump_filter_setup
  199. c0010b24 T fork_init
  200. c0010bc0 T proc_caches_init
  201. c0010cdc t proc_execdomains_init
  202. c0010d1c t oops_setup
  203. c0010d5c t console_suspend_disable
  204. c0010d80 t log_buf_len_setup
  205. c0010de0 t console_setup
  206. c0010f1c t printk_late_init
  207. c0010f9c t keep_bootcon_setup
  208. c0010fcc t ignore_loglevel_setup
  209. c0010ffc T setup_log_buf
  210. c0011184 T softirq_init
  211. c0011214 W arch_early_irq_init
  212. c0011228 t spawn_ksoftirqd
  213. c001127c t reserve_setup
  214. c0011370 t strict_iomem
  215. c00113cc t __reserve_region_with_split
  216. c00114ac T reserve_region_with_split
  217. c00114c0 t ioresources_init
  218. c0011520 t sysctl_init
  219. c0011564 t file_caps_disable
  220. c0011588 T init_timers
  221. c00115e4 t uid_cache_init
  222. c0011670 t setup_print_fatal_signals
  223. c00116a4 T signals_init
  224. c00116e8 T usermodehelper_init
  225. c0011748 t init_workqueues
  226. c00119d8 T pidmap_init
  227. c0011ad8 T pidhash_init
  228. c0011b5c T sort_main_extable
  229. c0011b80 t locate_module_kobject
  230. c0011c80 t param_sysfs_init
  231. c0011ea0 t init_posix_timers
  232. c0012098 t init_posix_cpu_timers
  233. c00121a0 T hrtimers_init
  234. c00121c4 t nsproxy_cache_init
  235. c001220c t ksysfs_init
  236. c00122ac t pm_qos_power_init
  237. c001233c T cred_init
  238. c0012380 t timekeeping_init_ops
  239. c00123a0 T timekeeping_init
  240. c00124b0 t ntp_tick_adj_setup
  241. c00124e4 T ntp_init
  242. c0012520 t init_clocksource_sysfs
  243. c0012580 t boot_override_clocksource
  244. c00125cc t boot_override_clock
  245. c0012628 t clocksource_done_booting
  246. c0012690 W clocksource_default_clock
  247. c00126a8 t init_jiffies_clocksource
  248. c00126c4 t init_timer_list_procfs
  249. c001270c t alarmtimer_init
  250. c0012850 T init_timer_stats
  251. c0012860 t init_tstats_procfs
  252. c00128a8 t futex_init
  253. c0012920 t proc_modules_init
  254. c0012960 t kallsyms_init
  255. c00129a0 t crash_notes_memory_init
  256. c00129e4 t crash_save_vmcoreinfo_init
  257. c0012dac T parse_crashkernel
  258. c0013114 t pid_namespaces_init
  259. c001315c t audit_enable
  260. c0013244 t audit_init
  261. c001338c T audit_register_class
  262. c001345c t init_kprobes
  263. c00135a0 t hung_task_panic_setup
  264. c00135cc t hung_task_init
  265. c0013630 T early_irq_init
  266. c0013708 t irqpoll_setup
  267. c0013744 t irqfixup_setup
  268. c0013784 t irq_gc_init_ops
  269. c00137a4 t rcu_spawn_kthreads
  270. c001380c t relay_init
  271. c0013820 t utsname_sysctl_init
  272. c0013840 t init_lstats_procfs
  273. c0013880 t rb_init_debugfs
  274. c00138c8 t set_cmdline_ftrace
  275. c0013910 t set_ftrace_dump_on_oops
  276. c0013978 t set_buf_size
  277. c00139c8 t clear_boot_tracer
  278. c0013a08 t tracer_init_debugfs
  279. c0013d48 t set_tracing_thresh
  280. c0013da8 t tracer_alloc_buffers
  281. c0013f1c t init_events
  282. c0013fb0 t init_trace_printk_function_export
  283. c0013ffc t init_trace_printk
  284. c0014018 t setup_trace_event
  285. c0014058 t event_trace_init
  286. c001435c t init_kprobe_trace
  287. c00143fc t perf_event_sysfs_init
  288. c00144c0 T perf_event_init
  289. c00145d8 T init_hw_breakpoint
  290. c0014680 T set_dma_reserve
  291. c001469c T page_alloc_init
  292. c00146ac T free_area_init_node
  293. c0014a38 T free_area_init
  294. c0014a5c T setup_per_cpu_pageset
  295. c0014af8 T alloc_large_system_hash
  296. c0014d6c T page_writeback_init
  297. c0014dac T swap_setup
  298. c0014e00 t kswapd_init
  299. c0014e20 T init_tmpfs
  300. c0014f0c t setup_vmstat
  301. c0014fac t bdi_class_init
  302. c0015018 t default_bdi_init
  303. c00150e0 t set_mminit_loglevel
  304. c0015114 t mm_sysfs_init
  305. c0015158 T mminit_verify_pageflags_layout
  306. c001526c T percpu_init_late
  307. c0015304 T pcpu_setup_first_chunk
  308. c0015b78 T pcpu_free_alloc_info
  309. c0015b98 T pcpu_alloc_alloc_info
  310. c0015c2c T setup_per_cpu_areas
  311. c0015cc4 T page_address_init
  312. c0015d68 t disable_randmaps
  313. c0015d8c t init_zero_pfn
  314. c0015dd0 T mmap_init
  315. c0015df4 T anon_vma_init
  316. c0015e68 T vm_area_register_early
  317. c0015ee8 t proc_vmalloc_init
  318. c0015f28 T vmalloc_init
  319. c0015fd8 t bootmem_debug_setup
  320. c0015ffc t bootmap_bytes
  321. c001601c T bootmem_bootmap_pages
  322. c001603c t align_idx
  323. c0016068 t alloc_arch_preferred_bootmem
  324. c00160c8 t __free
  325. c001618c t __reserve
  326. c0016288 t alloc_bootmem_core
  327. c0016618 t ___alloc_bootmem_nopanic
  328. c00166e4 T __alloc_bootmem_nopanic
  329. c00166fc t mark_bootmem_node
  330. c00167dc T reserve_bootmem_node
  331. c0016818 t mark_bootmem
  332. c0016934 T reserve_bootmem
  333. c0016964 W reserve_bootmem_generic
  334. c0016978 T free_bootmem
  335. c00169a8 t ___alloc_bootmem
  336. c00169e4 T __alloc_bootmem_low
  337. c00169fc t ___alloc_bootmem_node
  338. c0016a70 T __alloc_bootmem_low_node
  339. c0016b04 T __alloc_bootmem_node
  340. c0016b90 T __alloc_bootmem_node_high
  341. c0016ba4 T __alloc_bootmem
  342. c0016bbc t free_all_bootmem_core
  343. c0016e10 T free_all_bootmem
  344. c0016e64 T free_all_bootmem_node
  345. c0016e7c t init_bootmem_core
  346. c0016f8c T init_bootmem
  347. c0016fd8 T init_bootmem_node
  348. c0016ff0 T free_bootmem_late
  349. c0017064 T free_bootmem_node
  350. c00170a4 T __alloc_bootmem_node_nopanic
  351. c0017174 W memblock_nid_range
  352. c0017190 T memblock_phys_mem_size
  353. c00171ac T memblock_enforce_memory_limit
  354. c00172bc T memblock_is_reserved
  355. c00172e4 T memblock_init
  356. c001736c t early_memblock
  357. c00173a8 t memblock_init_debugfs
  358. c0017428 T memblock_analyze
  359. c00174f0 T memblock_alloc_nid
  360. c0017610 T __memblock_alloc_base
  361. c001766c T memblock_alloc_base
  362. c00176b4 T memblock_alloc_try_nid
  363. c00176e8 T memblock_alloc
  364. c0017700 t init_emergency_pool
  365. c00177b4 t max_swapfiles_check
  366. c00177c8 t procswaps_init
  367. c0017808 t setup_slub_nomerge
  368. c001782c t kmem_cache_bootstrap_fixup
  369. c00178c0 T kmem_cache_init_late
  370. c00178d0 t setup_slub_min_objects
  371. c0017904 t setup_slub_max_order
  372. c001794c t setup_slub_min_order
  373. c0017980 t slab_proc_init
  374. c00179c0 t setup_slub_debug
  375. c0017b80 t slab_sysfs_init
  376. c0017cd8 t create_kmalloc_cache
  377. c0017d6c T kmem_cache_init
  378. c001801c T files_init
  379. c00180a8 T chrdev_init
  380. c00180e4 t init_pipe_fs
  381. c0018140 t fcntl_init
  382. c0018188 t set_dhash_entries
  383. c00181d0 T vfs_caches_init
  384. c0018324 T vfs_caches_init_early
  385. c00183d0 t set_ihash_entries
  386. c0018418 T inode_init
  387. c0018508 T inode_init_early
  388. c00185b0 T files_defer_init
  389. c0018600 t proc_filesystems_init
  390. c0018640 T get_filesystem_list
  391. c00186bc T mnt_init
  392. c0018894 T buffer_init
  393. c0018908 t init_bio
  394. c0018a74 T bdev_cache_init
  395. c0018b10 T bio_integrity_init
  396. c0018bec t fsnotify_init
  397. c0018c18 T fsnotify_notification_init
  398. c0018ccc t fsnotify_mark_init
  399. c0018d14 t dnotify_init
  400. c0018db0 t inotify_user_setup
  401. c0018e50 t eventpoll_init
  402. c0018f50 t anon_inode_init
  403. c001908c t aio_setup
  404. c001913c t proc_locks_init
  405. c001917c t filelock_init
  406. c00191c8 t init_script_binfmt
  407. c00191e8 t init_elf_binfmt
  408. c0019208 t init_mbcache
  409. c0019228 T proc_init_inodecache
  410. c0019270 T proc_root_init
  411. c001933c T proc_tty_init
  412. c00193ec t proc_cmdline_init
  413. c001942c t proc_consoles_init
  414. c001946c t proc_cpuinfo_init
  415. c00194ac t proc_devices_init
  416. c00194ec t proc_interrupts_init
  417. c001952c t proc_loadavg_init
  418. c001956c t proc_meminfo_init
  419. c00195ac t proc_stat_init
  420. c00195ec t proc_uptime_init
  421. c001962c t proc_version_init
  422. c001966c t proc_softirqs_init
  423. c00196ac T proc_sys_init
  424. c00196f0 T proc_net_init
  425. c0019724 t proc_net_ns_init
  426. c00197d8 t proc_kmsg_init
  427. c0019818 t proc_page_init
  428. c0019878 T sysfs_inode_init
  429. c0019894 T sysfs_init
  430. c001995c t init_devpts_fs
  431. c00199b8 t init_ext3_fs
  432. c0019a3c T init_ext3_xattr
  433. c0019a78 T journal_init_revoke_caches
  434. c0019b38 t journal_init
  435. c0019c0c t init_cramfs_fs
  436. c0019c50 t init_ramfs_fs
  437. c0019c6c T init_rootfs
  438. c0019cbc T fat_cache_init
  439. c0019d14 t init_fat_fs
  440. c0019d80 t init_vfat_fs
  441. c0019d9c t init_msdos_fs
  442. c0019db8 t init_nls_cp437
  443. c0019dd4 t init_nls_cp936
  444. c0019df0 t init_nls_ascii
  445. c0019e0c t init_nls_iso8859_1
  446. c0019e28 t init_nls_utf8
  447. c0019e68 t debugfs_init
  448. c0019ee0 t ipc_init
  449. c0019f0c T ipc_init_proc_interface
  450. c0019fa4 T msg_init
  451. c0019ff8 T sem_init
  452. c001a034 T shm_init
  453. c001a070 t ipc_sysctl_init
  454. c001a090 T key_init
  455. c001a14c t key_proc_init
  456. c001a1a0 t init_mmap_min_addr
  457. c001a1b8 t crypto_wq_init
  458. c001a20c t crypto_algapi_init
  459. c001a224 T crypto_init_proc
  460. c001a260 t skcipher_module_init
  461. c001a288 t chainiv_module_init
  462. c001a2a4 t eseqiv_module_init
  463. c001a2c0 t cryptomgr_init
  464. c001a2dc t hmac_module_init
  465. c001a2f8 t md5_mod_init
  466. c001a314 t sha1_generic_mod_init
  467. c001a330 t crypto_ecb_module_init
  468. c001a34c t crypto_cbc_module_init
  469. c001a368 t des_generic_mod_init
  470. c001a3b8 t aes_init
  471. c001a3d4 t arc4_init
  472. c001a3f0 t michael_mic_init
  473. c001a40c t crc32c_mod_init
  474. c001a428 t crypto_authenc_module_init
  475. c001a444 t crypto_authenc_esn_module_init
  476. c001a460 t krng_mod_init
  477. c001a47c t elevator_setup
  478. c001a4a4 T blk_dev_init
  479. c001a550 t blk_settings_init
  480. c001a59c t blk_ioc_init
  481. c001a5e4 t blk_softirq_init
  482. c001a618 t blk_iopoll_setup
  483. c001a64c t genhd_device_init
  484. c001a6fc T printk_all_partitions
  485. c001a950 t proc_genhd_init
  486. c001a9b0 t blk_scsi_ioctl_init
  487. c001aaa4 t bsg_init
  488. c001ac00 t noop_init
  489. c001ac20 t deadline_init
  490. c001ac40 t cfq_init
  491. c001ad14 t blk_dev_integrity_init
  492. c001ad5c t get_bits
  493. c001ae74 t nofill
  494. c001ae88 T bunzip2
  495. c001bca8 t nofill
  496. c001bcbc T gunzip
  497. c001c068 t read_int
  498. c001c0c4 t nofill
  499. c001c0d8 t rc_read
  500. c001c148 t rc_do_normalize
  501. c001c198 t rc_get_bit
  502. c001c244 T unlzma
  503. c001d2f0 T parse_header
  504. c001d3b4 T unlzo
  505. c001d8e8 T unxz
  506. c001dc00 T idr_init_cache
  507. c001dc44 t kobject_uevent_init
  508. c001dc6c T prio_tree_init
  509. c001dcc0 T radix_tree_init
  510. c001dd88 t random32_init
  511. c001de3c t random32_reseed
  512. c001dea4 t libcrc32c_mod_init
  513. c001dee4 t audit_classes_init
  514. c001df48 t gpiolib_debugfs_init
  515. c001df8c T gpiochip_reserve
  516. c001e060 T samsung_gpiolib_add_4bit
  517. c001e090 T samsung_gpiolib_add_4bit2
  518. c001e0c0 T samsung_gpiolib_add_2bit_chips
  519. c001e0f0 T samsung_gpiolib_add_4bit2_chips
  520. c001e128 T samsung_gpiolib_add_4bit_chips
  521. c001e160 T tty_init
  522. c001e2bc T console_init
  523. c001e2fc t tty_class_init
  524. c001e34c t pty_init
  525. c001e5cc t sysrq_always_enabled_setup
  526. c001e600 t sysrq_init
  527. c001e69c T vcs_init
  528. c001e758 T kbd_init
  529. c001e864 T console_map_init
  530. c001e8cc T vty_init
  531. c001eaa0 t vtconsole_class_init
  532. c001eb9c t con_init
  533. c001ee70 T uart_get_console
  534. c001ef6c t s3c24xx_serial_modinit
  535. c001efa4 t s3c24xx_serial_console_setup
  536. c001f164 t s3c_serial_console_init
  537. c001f1a4 t s3c6400_serial_init
  538. c001f1c8 t chr_dev_init
  539. c001f2b8 t random_int_secret_init
  540. c001f2dc t misc_init
  541. c001f3b0 t cn_proc_init
  542. c001f3f8 t sysfs_deprecated_setup
  543. c001f418 T devices_init
  544. c001f4e8 T system_bus_init
  545. c001f534 T buses_init
  546. c001f578 T classes_init
  547. c001f5b8 T early_platform_add_devices
  548. c001f620 T early_platform_cleanup
  549. c001f698 T early_platform_driver_probe
  550. c001f930 T early_platform_driver_register_all
  551. c001f944 T platform_bus_init
  552. c001f998 T early_platform_driver_register
  553. c001fb34 T cpu_dev_init
  554. c001fb50 T firmware_init
  555. c001fb8c T driver_init
  556. c001fbbc t mount_param
  557. c001fbe8 T devtmpfs_init
  558. c001fcb8 t firmware_class_init
  559. c001fcdc t ramdisk_size
  560. c001fd08 t brd_init
  561. c001fee4 t loop_init
  562. c00200a0 t max_loop_setup
  563. c00200cc t init_scsi
  564. c0020170 T scsi_init_queue
  565. c00202c8 T scsi_init_devinfo
  566. c00203a4 T scsi_init_sysctl
  567. c00203dc T scsi_init_procfs
  568. c0020460 t init_sd
  569. c00205ac t init_sg
  570. c0020704 t vcan_init_module
  571. c002074c t slcan_init
  572. c00207fc t can_dev_init
  573. c0020834 t probe_list2
  574. c00208a8 t net_olddevs_init
  575. c002097c t loopback_net_init
  576. c00209f0 t input_init
  577. c0020b14 t mousedev_init
  578. c0020b80 t sock_init
  579. c0020c28 T sk_init
  580. c0020ca4 t proto_init
  581. c0020cc0 t proto_init_net
  582. c0020cf4 T skb_init
  583. c0020d60 t net_ns_init
  584. c0020eac t net_secret_init
  585. c0020ed0 t sysctl_core_init
  586. c0020f18 t sysctl_core_net_init
  587. c0020f5c t dev_proc_net_init
  588. c0021018 t initialize_hashrnd
  589. c002103c T netdev_boot_setup
  590. c0021140 t netdev_init
  591. c0021198 t net_dev_init
  592. c0021308 T dev_mcast_init
  593. c0021324 t dev_mc_net_init
  594. c0021358 T dst_init
  595. c0021374 t neigh_init
  596. c0021400 t rtnetlink_net_init
  597. c0021458 T rtnetlink_init
  598. c0021590 t flow_cache_init_global
  599. c0021690 t netlink_net_init
  600. c00216c4 t netlink_proto_init
  601. c00218b0 t genl_pernet_init
  602. c0021910 t genl_init
  603. c00219ac T netfilter_init
  604. c0021a70 T netfilter_log_init
  605. c0021b78 T netfilter_queue_init
  606. c0021bc8 t set_rhash_entries
  607. c0021c10 T ip_static_sysctl_init
  608. c0021c34 t rt_genid_init
  609. c0021c68 t sysctl_route_net_init
  610. c0021cac t ip_rt_do_proc_init
  611. c0021d2c T ip_rt_init
  612. c0021f0c T inet_initpeers
  613. c0021ffc t ipv4_frags_init_net
  614. c0022064 T ipfrag_init
  615. c00220fc T ip_init
  616. c0022114 t set_thash_entries
  617. c002215c T tcp_init
  618. c0022458 T tcp4_proc_init
  619. c0022474 T tcp_v4_init
  620. c00224ac t tcp_sk_init
  621. c00224e0 t tcp4_proc_init_net
  622. c00224fc t tcp_congestion_default
  623. c0022518 T raw_proc_exit
  624. c0022534 t raw_init_net
  625. c0022568 T raw_proc_init
  626. c0022584 t set_uhash_entries
  627. c00225dc T udp_table_init
  628. c002271c T udp_init
  629. c0022790 T udp4_proc_init
  630. c00227ac t udp4_proc_init_net
  631. c00227c8 T udplite4_register
  632. c002286c t udplite4_proc_init_net
  633. c0022888 T arp_init
  634. c00228e8 t arp_net_init
  635. c002291c T icmp_init
  636. c0022938 t icmp_sk_init
  637. c0022a34 T devinet_init
  638. c0022aec t devinet_init_net
  639. c0022b94 t ipv4_mib_init_net
  640. c0022cf0 t inet_init
  641. c0022f5c T igmp_mc_proc_init
  642. c0022f78 t igmp_net_init
  643. c0022fec T ip_fib_init
  644. c002306c t fib_net_init
  645. c0023190 T fib_proc_init
  646. c0023234 T fib_trie_init
  647. c00232a0 T ping_init
  648. c00232dc t ping_proc_init_net
  649. c0023310 T ping_proc_init
  650. c002332c t sysctl_ipv4_init
  651. c00233dc t ipv4_sysctl_init_net
  652. c0023430 T ip_misc_proc_init
  653. c002344c t ip_proc_init_net
  654. c00234f0 t xfrm4_beet_init
  655. c0023510 t xfrm4_transport_init
  656. c0023530 t xfrm4_mode_tunnel_init
  657. c0023550 t ic_proto_name
  658. c002369c t ic_is_init_dev
  659. c0023704 t ic_bootp_string
  660. c0023744 t ic_close_devs
  661. c00237b0 t ic_devinet_ioctl
  662. c0023838 t vendor_class_identifier_setup
  663. c0023878 t ip_auto_config_setup
  664. c0023aac t nfsaddrs_config_setup
  665. c0023ac0 T root_nfs_parse_addr
  666. c0023ba4 t ip_auto_config
  667. c0024df8 t ic_rarp_recv
  668. c0024ffc t ic_bootp_recv
  669. c00256fc t inet_diag_init
  670. c00257b0 t tcp_diag_init
  671. c00257cc t cubictcp_register
  672. c0025880 T xfrm4_init
  673. c00258e8 T xfrm4_state_init
  674. c0025904 T xfrm_init
  675. c0025924 t xfrm_net_init
  676. c0025acc T xfrm_state_init
  677. c0025bb0 T xfrm_input_init
  678. c0025bf4 T xfrm_sysctl_init
  679. c0025c98 t af_unix_init
  680. c0025cfc t unix_net_init
  681. c0025d5c T unix_sysctl_register
  682. c0025dc8 t packet_init
  683. c0025e1c t packet_net_init
  684. c0025e54 t can_init
  685. c0025f58 t raw_module_init
  686. c0025fa4 t bcm_module_init
  687. c0026018 t cfg80211_init
  688. c00260f0 T regulatory_init
  689. c00261dc t lib80211_init
  690. c0026204 t wext_pernet_init
  691. c002622c t wireless_nlevent_init
  692. c0026248 T wext_proc_init
  693. c002627c t ieee80211_init
  694. c00262c8 T rc80211_minstrel_init
  695. c00262e4 T rc80211_minstrel_ht_init
  696. c00263b4 t sysctl_init
  697. c002640c t sysctl_net_init
  698. c0026438 t init_dns_resolver
  699. c0026580 t __lookup_processor_type
  700. c00265b8 t __lookup_processor_type_data
  701. c00265c4 t __error_p
  702. c00265e0 t str_p1
  703. c0026617 t str_p2
  704. c002661c t __error
  705. c0026624 T calibrate_delay
  706. c002681c t dbg_reset_notify
  707. c0026858 t __v6_setup
  708. c0026898 t v6_crval
  709. c00268a0 T init_idle_bootup_task
  710. c00268bc T init_idle
  711. c0026918 W idle_regs
  712. c002693c T fork_idle
  713. c00269cc t cpu_callback
  714. c0026abc t timer_cpu_notify
  715. c0026c50 t hrtimer_cpu_notify
  716. c0026cac t perf_cpu_notify
  717. c0026d68 t ratelimit_handler
  718. c0026d80 T register_cpu
  719. c0026ddc t flow_cache_cpu_prepare
  720. c0026e64 t flow_cache_cpu
  721. c0026f10 T init_currently_empty_zone
  722. c0027040 T memmap_init_zone
  723. c0027164 T init_per_zone_wmark_min
  724. c0027214 T __free_pages_bootmem
  725. c00272c8 T mminit_verify_page_links
  726. c0027334 T __proc_info_begin
  727. c0027334 t __v6_proc_info
  728. c0027334 T _einittext
复制代码

(3)真正的驻留在内存中的内核内代码段

从脚本上来看,所有.text开始,.etext结束区间的段都是内核代码段:

  1.         .text : {                        /* Real text segment                */
  2.                 _text = .;                /* Text and read-only data        */
  3.                         __exception_text_start = .;
  4.                         *(.exception.text)
  5.                         __exception_text_end = .;
  6.                         IRQENTRY_TEXT
  7.                         TEXT_TEXT
  8.                         SCHED_TEXT
  9.                         LOCK_TEXT
  10.                         KPROBES_TEXT
  11. #ifdef CONFIG_MMU
  12.                         *(.fixup)
  13. #endif
  14.                         *(.gnu.warning)
  15.                         *(.rodata)
  16.                         *(.rodata.*)
  17.                         *(.glue_7)
  18.                         *(.glue_7t)
  19.                 . = ALIGN(4);
  20.                 *(.got)                        /* Global offset table                */
  21.                         ARM_CPU_KEEP(PROC_INFO)
  22.         }

  23.         RO_DATA(PAGE_SIZE)

  24. #ifdef CONFIG_ARM_UNWIND
  25.         /*
  26.          * Stack unwinding tables
  27.          */
  28.         . = ALIGN(8);
  29.         .ARM.unwind_idx : {
  30.                 __start_unwind_idx = .;
  31.                 *(.ARM.exidx*)
  32.                 __stop_unwind_idx = .;
  33.         }
  34.         .ARM.unwind_tab : {
  35.                 __start_unwind_tab = .;
  36.                 *(.ARM.extab*)
  37.                 __stop_unwind_tab = .;
  38.         }
  39. #endif

  40.         _etext = .;                        /* End of text and rodata section */
复制代码


这些段中的代码都是事实在在的内核函数。

(4)已经初始化的data数据段:

  1. .data : AT(__data_loc) {
  2.                 _data = .;                /* address in memory */
  3.                 _sdata = .;

  4.                 /*
  5.                  * first, the init task union, aligned
  6.                  * to an 8192 byte boundary.
  7.                  */
  8.                 INIT_TASK_DATA(THREAD_SIZE)

  9. #ifdef CONFIG_XIP_KERNEL
  10.                 . = ALIGN(PAGE_SIZE);
  11.                 __init_begin = .;
  12.                 INIT_DATA
  13.                 ARM_EXIT_KEEP(EXIT_DATA)
  14.                 . = ALIGN(PAGE_SIZE);
  15.                 __init_end = .;
  16. #endif

  17.                 NOSAVE_DATA
  18.                 CACHELINE_ALIGNED_DATA(32)
  19.                 READ_MOSTLY_DATA(32)

  20.                 /*
  21.                  * The exception fixup table (might need resorting at runtime)
  22.                  */
  23.                 . = ALIGN(32);
  24.                 __start___ex_table = .;
  25. #ifdef CONFIG_MMU
  26.                 *(__ex_table)
  27. #endif
  28.                 __stop___ex_table = .;

  29.                 /*
  30.                  * and the usual data section
  31.                  */
  32.                 DATA_DATA
  33.                 CONSTRUCTORS

  34.                 _edata = .;
复制代码


(5)紧接着以初始化的.data段的是.bss,未经初始化的内核数据段。

  1.         BSS_SECTION(0, 0, 0)
  2.         _end = .;
复制代码


最后我给出这些段的大致位置图,请参考我们上面所讲的来看:

猜你喜欢

转载自blog.csdn.net/guojunjunjun2006/article/details/23557645