内核的链接脚本文件vmlinux.lds.S
2014-03-14 14:09
337 查看
跟我学系列-移植内核必备知识-对linux的early
printk的探讨
嵌入式开发联盟
www.mcuos.com
Osboy 站长原创
QQ:82475491
Mcuos.com@gmail.com
vmlinux.lds.S是如何组织内核的每个函数存放在内核镜像文件的位置,我们知道你在编译内核生成内核文件的时候,其实这个过程分两步,一个是“编译”,另一个是“链接”的过程,vmlinux.lds.S要做的就是告诉编译器如何链接编译好的各个内核.o文件。
小知识:链接器中的entry
链接器 按以下优先顺序设入口点,找到即停止
1 -e 命令行选项
2 脚本中的entry(symbol)命令
3如定义了start的值,取其值为入口点
4.text的第一个字节的地址
5地址0
复制代码
所以你可以从vmlinux.lds.S下面的代码中看到:
OUTPUT_ARCH(arm)
ENTRY(stext)
复制代码
表明我们指定stext作为,程序的入口点。
上代码:
SECTIONS
{
#ifdef CONFIG_XIP_KERNEL
. = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
#else
. = PAGE_OFFSET + TEXT_OFFSET;
#endif
.init : { /* Init code and data */
_stext = .;
_sinittext = .;
HEAD_TEXT
INIT_TEXT
ARM_EXIT_KEEP(EXIT_TEXT)
_einittext = .;
ARM_CPU_DISCARD(PROC_INFO)
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
#ifdef CONFIG_SMP_ON_UP
__smpalt_begin = .;
*(.alt.smp.init)
__smpalt_end = .;
#endif
__pv_table_begin = .;
*(.pv_table)
__pv_table_end = .;
INIT_SETUP(16)
INIT_CALLS
CON_INITCALL
SECURITY_INITCALL
INIT_RAM_FS
#ifndef CONFIG_XIP_KERNEL
__init_begin = _stext;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
#endif
}
PERCPU_SECTION(32)
#ifndef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
/*
* unwind exit sections must be discarded before the rest of the
* unwind sections get included.
*/
/DISCARD/ : {
*(.ARM.exidx.exit.text)
*(.ARM.extab.exit.text)
ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
#ifndef CONFIG_HOTPLUG
*(.ARM.exidx.devexit.text)
*(.ARM.extab.devexit.text)
#endif
#ifndef CONFIG_MMU
*(.fixup)
*(__ex_table)
#endif
}
.text : { /* Real text segment */
_text = .; /* Text and read-only data */
__exception_text_start = .;
*(.exception.text)
__exception_text_end = .;
IRQENTRY_TEXT
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
*(.gnu.warning)
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
*(.got) /* Global offset table */
ARM_CPU_KEEP(PROC_INFO)
}
RO_DATA(PAGE_SIZE)
#ifdef CONFIG_ARM_UNWIND
/*
* Stack unwinding tables
*/
. = ALIGN(8);
.ARM.unwind_idx : {
__start_unwind_idx = .;
*(.ARM.exidx*)
__stop_unwind_idx = .;
}
.ARM.unwind_tab : {
__start_unwind_tab = .;
*(.ARM.extab*)
__stop_unwind_tab = .;
}
#endif
_etext = .; /* End of text and rodata section */
#ifdef CONFIG_XIP_KERNEL
__data_loc = ALIGN(4); /* location in binary */
. = PAGE_OFFSET + TEXT_OFFSET;
#else
. = ALIGN(THREAD_SIZE);
__data_loc = .;
#endif
.data : AT(__data_loc) {
_data = .; /* address in memory */
_sdata = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
INIT_TASK_DATA(THREAD_SIZE)
#ifdef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_begin = .;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
NOSAVE_DATA
CACHELINE_ALIGNED_DATA(32)
READ_MOSTLY_DATA(32)
/*
* The exception fixup table (might need resorting at runtime)
*/
. = ALIGN(32);
__start___ex_table = .;
#ifdef CONFIG_MMU
*(__ex_table)
#endif
__stop___ex_table = .;
/*
* and the usual data section
*/
DATA_DATA
CONSTRUCTORS
_edata = .;
}
_edata_loc = __data_loc + SIZEOF(.data);
#ifdef CONFIG_HAVE_TCM
/*
* We align everything to a page boundary so we can
* free it after init has commenced and TCM contents have
* been copied to its destination.
*/
.tcm_start : {
. = ALIGN(PAGE_SIZE);
__tcm_start = .;
__itcm_start = .;
}
/*
* Link these to the ITCM RAM
* Put VMA to the TCM address and LMA to the common RAM
* and we'll upload the contents from RAM to TCM and free
* the used RAM after that.
*/
.text_itcm ITCM_OFFSET : AT(__itcm_start)
{
__sitcm_text = .;
*(.tcm.text)
*(.tcm.rodata)
. = ALIGN(4);
__eitcm_text = .;
}
/*
* Reset the dot pointer, this is needed to create the
* relative __dtcm_start below (to be used as extern in code).
*/
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
.dtcm_start : {
__dtcm_start = .;
}
/* TODO: add remainder of ITCM as well, that can be used for data! */
.data_dtcm DTCM_OFFSET : AT(__dtcm_start)
{
. = ALIGN(4);
__sdtcm_data = .;
*(.tcm.data)
. = ALIGN(4);
__edtcm_data = .;
}
/* Reset the dot pointer or the linker gets confused */
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
/* End marker for freeing TCM copy in linked object */
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
. = ALIGN(PAGE_SIZE);
__tcm_end = .;
}
#endif
NOTES
BSS_SECTION(0, 0, 0)
_end = .;
STABS_DEBUG
.comment 0 : { *(.comment) }
/* Default discards */
DISCARDS
#ifndef CONFIG_SMP_ON_UP
/DISCARD/ : {
*(.alt.smp.init)
}
#endif
}
复制代码
先看第一个知识点:
(1). = PAGE_OFFSET + TEXT_OFFSET;
arch/arm/include/asm中的memory.h文件定义了:
#define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)
复制代码
CONFIG_PAGE_OFFSET是在内核配置里面配置的,比如拿ok6410来说,我的配置:
#define CONFIG_PAGE_OFFSET 0xC0000000
复制代码
PAGE_OFFSET代表是的内核image的的起始虚拟地址。
在arch/arm/Makefile中有定义:
textofs-y := 0x00008000
TEXT_OFFSET := $(textofs-y)
复制代码
TEXT_OFFSET代表的是内核的image存放在内存中地址,注意这个地址为相对于内存的起始地址的偏移量,是个相对的偏移量不是实际的存放内存物理地址。而且这个偏移量取得有讲究,必须为:0xXXXX8000,xxx为任意值。
所以:. = PAGE_OFFSET + TEXT_OFFSET就变成为:.=c0008000,这个地址就是内核存放在内存的虚拟的起始地址。从脚本来看,也就是.stext的地址就是:c0008000,那么我们如何验证我们的这个说法呢,你可以打开linux目录下的System.map文件查看:
00000020 A cpu_v6_suspend_size
c0004000 A swapper_pg_dir
c0008000 T __init_begin
c0008000 T _stext T _sinittext
c0008000 T _stext
c0008000 T stext
c000804c t __create_page_tables
c0008148 t __enable_mmu_loc
c0008154 t __enable_mmu
c0008180 t __turn_mmu_on
c0008198 t __enable_mmu_end
c0008198 t __vet_atags
c00081e0 t __mmap_switched
c0008228 t __mmap_switched_data
c000824c T lookup_processor_type
c0008260 t set_reset_devices
c0008284 t debug_kernel
复制代码
从map文件可以知道_stext是内核的入口地址,这个地址就是c0008000,这也验证了我们在第一章讲搭建环境的时候,我为什么要用dnw
c0008000,就是因为我们已经指定好了,内核的存放地址必须为c0008000,针对ok6410来说。
(二).init内核的初始化代码和数据段
_sinittext = .;
HEAD_TEXT
INIT_TEXT
ARM_EXIT_KEEP(EXIT_TEXT)
_einittext = .;
复制代码
从上面的链接脚本可以知道所有:_sinittext开头的,_einittext结尾的HEAD_TEXT, INIT_TEXT,ARM_EXIT_KEEP(EXIT_TEXT)段都是从起始地址c0008000开始存放的。这些宏定义在:include/asm-generic/vmlinux.lds.h中。
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
#ifdef CONFIG_SMP_ON_UP
__smpalt_begin = .;
*(.alt.smp.init)
__smpalt_end = .;
#endif
__pv_table_begin = .;
*(.pv_table)
__pv_table_end = .;
复制代码
紧接着以此存放的是:*(.arch.info.init), *(.taglist.init),*(.alt.smp.init),*(.pv_table)段的代码,其中我们最熟悉的*(.arch.info.init)段的代码就是:
#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type \
__used \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};
复制代码
也就是说所有平台的下面这段代码都放到了*(.arch.info.init)段中:
MACHINE_START(MCUOS6410, "MCUOS6410")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
.boot_params = S3C64XX_PA_SDRAM + 0x100,
.init_irq = s3c6410_init_irq,
.map_io = mcuos6410_map_io,
.init_machine = mcuos6410_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
复制代码
紧接着存放的是初始化数据段:
#ifndef CONFIG_XIP_KERNEL
__init_begin = _stext;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
#endif
}
PERCPU_SECTION(32)
#ifndef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
复制代码
这个段存放的是所有*(.init.data),*(.init.rodata)段中的代码。
.init段中的代码段和数据段,在Linux初始化完成之后,这个段的内存都会被请空,被释放。因为他们只需要在初始化的时候使用一次,没有必要再驻留在内存中,浪费空间。为了验证我们以上的分析,我们可以查看system.map这个文件,下面我们看到的从_sinittext开头的,_einittext结尾的所有函数,都会在初始化完成之后被释放:
c0008000 T _sinittext
c0008000 T _stext
c0008000 T stext
c000804c t __create_page_tables
c0008148 t __enable_mmu_loc
c0008154 t __enable_mmu
c0008180 t __turn_mmu_on
c0008198 t __enable_mmu_end
c0008198 t __vet_atags
c00081e0 t __mmap_switched
c0008228 t __mmap_switched_data
c000824c T lookup_processor_type
c0008260 t set_reset_devices
c0008284 t debug_kernel
c00082a8 t quiet_kernel
c00082cc t init_setup
c0008308 t rdinit_setup
c0008344 W smp_setup_processor_id
c0008354 W thread_info_cache_init
c0008364 t loglevel
c0008398 T parse_early_options
c00083d4 t unknown_bootoption
c00085f8 T parse_early_param
c0008648 t do_early_param
c0008724 t kernel_init
c0008850 T start_kernel
c0008b9c t readonly
c0008bd0 t readwrite
c0008c04 t rootwait_setup
c0008c34 t root_data_setup
c0008c54 t fs_names_setup
c0008c74 t load_ramdisk
c0008ca4 t root_dev_setup
c0008ccc t root_delay_setup
c0008cf8 T change_floppy
c0008e20 T mount_block_root
c0009108 T mount_root
c0009174 T prepare_namespace
c0009364 t ramdisk_start_setup
c0009390 t prompt_ramdisk
c00093c0 t error
c00093fc t compr_fill
c0009464 t compr_flush
c00094d4 T rd_load_image
c0009b5c T rd_load_disk
c0009c10 t no_initrd
c0009c34 T initrd_load
c0009f74 t do_linuxrc
c0009fc8 t error
c0009fec t read_into
c000a0a8 t do_start
c000a0d4 t write_buffer
c000a12c t flush_buffer
c000a1d8 t retain_initrd_param
c000a208 t clean_path
c000a268 t do_utime
c000a2ac t do_symlink
c000a378 t unpack_to_rootfs
c000a6d4 t maybe_link
c000a840 t do_name
c000aad8 t do_header
c000adf0 t free_initrd
c000aed0 t populate_rootfs
c000b124 t do_collect
c000b1ec t do_skip
c000b2c0 t do_reset
c000b38c t do_copy
c000b4b8 t lpj_setup
c000b500 T __kuser_helper_start
c000b500 t __kuser_memory_barrier
c000b520 t __kuser_cmpxchg
c000b540 t __kuser_get_tls
c000b55c t __kuser_helper_version
c000b560 T __kuser_helper_end
c000b560 T __stubs_start
c000b560 t vector_irq
c000b5e0 t vector_dabt
c000b660 t vector_pabt
c000b6e0 t vector_und
c000b760 t vector_fiq
c000b764 t vector_addrexcptn
c000b784 T __stubs_end
c000b784 T __vectors_start
c000b7a4 T __vectors_end
c000b7c0 T init_IRQ
c000b7e4 T arch_probe_nr_irqs
c000b818 t nohlt_setup
c000b83c t hlt_setup
c000b860 T reboot_setup
c000b884 t ptrace_break_init
c000b8bc t parse_tag_core
c000b914 t parse_tag_videotext
c000b994 t parse_tag_ramdisk
c000b9fc t parse_tag_serialnr
c000ba30 t parse_tag_revision
c000ba54 t customize_machine
c000ba84 t parse_tag_cmdline
c000baac t topology_init
c000badc t proc_cpu_init
c000bb08 T arm_add_memory
c000bba0 t parse_tag_mem32
c000bbbc t early_mem
c000bc38 T early_print
c000bcb0 T dump_machine_table
c000bd10 T setup_arch
c000c5fc T time_init
c000c630 t timer_init_syscore_ops
c000c650 T trap_init
c000c660 t user_debug_setup
c000c694 T early_trap_init
c000c7a8 T arch_init_kprobes
c000c7cc T arm_kprobe_decode_init
c000c800 T save_atags
c000c824 t init_atags_procfs
c000c934 T unwind_init
c000c97c t arch_hw_breakpoint_init
c000cb8c t register_pmu_driver
c000cba8 t armpmu_reset
c000cbf4 t init_hw_perf_events
c000cd3c t setup_early_printk
c000cd5c t dma_debug_do_init
c000cd70 t consistent_init
c000ce64 T hook_ifault_code
c000ceb8 T hook_fault_code
c000cf10 t exceptions_init
c000cfac t parse_tag_initrd2
c000cfe0 t meminfo_cmp
c000d014 t keepinitrd_setup
c000d038 t early_initrd
c000d09c t parse_tag_initrd
c000d0e8 T mem_init
c000d7cc T bootmem_init
c000da94 T arm_memblock_init
c000dc1c T check_writebuffer_bugs
c000dd64 t early_ecc
c000ddd0 t early_cachepolicy
c000ded0 t early_nowrite
c000df08 t early_nocache
c000df40 t early_vmalloc
c000dfc4 t early_alloc
c000dffc t early_pte_alloc
c000e08c t create_mapping
c000e3e8 T paging_init
c000eabc T iotable_init
c000eaf8 T arm_mm_memblock_reserve
c000eb18 T sanity_check_meminfo
c000ed58 t noalign_setup
c000eda0 t alignment_init
c000ee90 t v6_userpage_init
c000eed4 T v6wbi_tlb_fns
c000eee0 t vic_disable
c000ef28 t vic_clear_interrupts
c000ef6c t vic_set_irq_sources
c000eff0 T vic_init
c000f12c t s3c64xx_sysdev_init
c000f154 T s3c64xx_init_io
c000f1b0 T s3c6400_common_init_uarts
c000f1dc T s3c64xx_register_clocks
c000f264 T s3c6400_setup_clocks
c000f4ec t s3c64xx_gpiolib_add_2bit
c000f504 t s3c64xx_gpiolib_add
c000f54c t s3c64xx_gpiolib_init
c000f5a8 T s3c6410_map_io
c000f5e0 t s3c6410_core_init
c000f5fc T s3c6410_init
c000f624 T s3c6410_init_irq
c000f640 T s3c6410_init_clocks
c000f67c T s3c64xx_init_irq
c000f6f0 t s3c64xx_init_irq_eint
c000f7dc t s3c64xx_dma_init
c000f8c0 t mcuos6410_machine_init
c000f8e0 t mcuos6410_map_io
c000f91c T s3c64xx_ac97_setup_gpio
c000f954 T s3c24xx_init_clocks
c000f9b0 t s3c_arch_init
c000fa08 T s3c24xx_init_uarts
c000fa4c T s3c_init_cpu
c000fb1c T s3c24xx_init_uartdevs
c000fbb4 t s3c2410_timer_init
c000fc94 T s3c_disable_clocks
c000fccc T s3c24xx_register_baseclocks
c000fe08 T s3c_register_clocks
c000fe64 T s3c_pwmclk_init
c000ffd4 T s3c_gpiolib_add
c00100f4 T s3c_set_clksrc
c00101cc T s3c_register_clksrc
c00102d0 T s3c_init_uart_irqs
c00103d4 T s3c_init_vic_timer_irq
c001052c t adc_init
c001056c T s3c_set_platdata
c00105c8 T s3c_i2c0_set_platdata
c0010638 T s3c_nand_set_platdata
c0010784 t sched_init_debug
c00107c4 t init_sched_debug_procfs
c001080c T sched_init_smp
c0010878 T sched_init
c0010ab0 t proc_schedstat_init
c0010af0 t coredump_filter_setup
c0010b24 T fork_init
c0010bc0 T proc_caches_init
c0010cdc t proc_execdomains_init
c0010d1c t oops_setup
c0010d5c t console_suspend_disable
c0010d80 t log_buf_len_setup
c0010de0 t console_setup
c0010f1c t printk_late_init
c0010f9c t keep_bootcon_setup
c0010fcc t ignore_loglevel_setup
c0010ffc T setup_log_buf
c0011184 T softirq_init
c0011214 W arch_early_irq_init
c0011228 t spawn_ksoftirqd
c001127c t reserve_setup
c0011370 t strict_iomem
c00113cc t __reserve_region_with_split
c00114ac T reserve_region_with_split
c00114c0 t ioresources_init
c0011520 t sysctl_init
c0011564 t file_caps_disable
c0011588 T init_timers
c00115e4 t uid_cache_init
c0011670 t setup_print_fatal_signals
c00116a4 T signals_init
c00116e8 T usermodehelper_init
c0011748 t init_workqueues
c00119d8 T pidmap_init
c0011ad8 T pidhash_init
c0011b5c T sort_main_extable
c0011b80 t locate_module_kobject
c0011c80 t param_sysfs_init
c0011ea0 t init_posix_timers
c0012098 t init_posix_cpu_timers
c00121a0 T hrtimers_init
c00121c4 t nsproxy_cache_init
c001220c t ksysfs_init
c00122ac t pm_qos_power_init
c001233c T cred_init
c0012380 t timekeeping_init_ops
c00123a0 T timekeeping_init
c00124b0 t ntp_tick_adj_setup
c00124e4 T ntp_init
c0012520 t init_clocksource_sysfs
c0012580 t boot_override_clocksource
c00125cc t boot_override_clock
c0012628 t clocksource_done_booting
c0012690 W clocksource_default_clock
c00126a8 t init_jiffies_clocksource
c00126c4 t init_timer_list_procfs
c001270c t alarmtimer_init
c0012850 T init_timer_stats
c0012860 t init_tstats_procfs
c00128a8 t futex_init
c0012920 t proc_modules_init
c0012960 t kallsyms_init
c00129a0 t crash_notes_memory_init
c00129e4 t crash_save_vmcoreinfo_init
c0012dac T parse_crashkernel
c0013114 t pid_namespaces_init
c001315c t audit_enable
c0013244 t audit_init
c001338c T audit_register_class
c001345c t init_kprobes
c00135a0 t hung_task_panic_setup
c00135cc t hung_task_init
c0013630 T early_irq_init
c0013708 t irqpoll_setup
c0013744 t irqfixup_setup
c0013784 t irq_gc_init_ops
c00137a4 t rcu_spawn_kthreads
c001380c t relay_init
c0013820 t utsname_sysctl_init
c0013840 t init_lstats_procfs
c0013880 t rb_init_debugfs
c00138c8 t set_cmdline_ftrace
c0013910 t set_ftrace_dump_on_oops
c0013978 t set_buf_size
c00139c8 t clear_boot_tracer
c0013a08 t tracer_init_debugfs
c0013d48 t set_tracing_thresh
c0013da8 t tracer_alloc_buffers
c0013f1c t init_events
c0013fb0 t init_trace_printk_function_export
c0013ffc t init_trace_printk
c0014018 t setup_trace_event
c0014058 t event_trace_init
c001435c t init_kprobe_trace
c00143fc t perf_event_sysfs_init
c00144c0 T perf_event_init
c00145d8 T init_hw_breakpoint
c0014680 T set_dma_reserve
c001469c T page_alloc_init
c00146ac T free_area_init_node
c0014a38 T free_area_init
c0014a5c T setup_per_cpu_pageset
c0014af8 T alloc_large_system_hash
c0014d6c T page_writeback_init
c0014dac T swap_setup
c0014e00 t kswapd_init
c0014e20 T init_tmpfs
c0014f0c t setup_vmstat
c0014fac t bdi_class_init
c0015018 t default_bdi_init
c00150e0 t set_mminit_loglevel
c0015114 t mm_sysfs_init
c0015158 T mminit_verify_pageflags_layout
c001526c T percpu_init_late
c0015304 T pcpu_setup_first_chunk
c0015b78 T pcpu_free_alloc_info
c0015b98 T pcpu_alloc_alloc_info
c0015c2c T setup_per_cpu_areas
c0015cc4 T page_address_init
c0015d68 t disable_randmaps
c0015d8c t init_zero_pfn
c0015dd0 T mmap_init
c0015df4 T anon_vma_init
c0015e68 T vm_area_register_early
c0015ee8 t proc_vmalloc_init
c0015f28 T vmalloc_init
c0015fd8 t bootmem_debug_setup
c0015ffc t bootmap_bytes
c001601c T bootmem_bootmap_pages
c001603c t align_idx
c0016068 t alloc_arch_preferred_bootmem
c00160c8 t __free
c001618c t __reserve
c0016288 t alloc_bootmem_core
c0016618 t ___alloc_bootmem_nopanic
c00166e4 T __alloc_bootmem_nopanic
c00166fc t mark_bootmem_node
c00167dc T reserve_bootmem_node
c0016818 t mark_bootmem
c0016934 T reserve_bootmem
c0016964 W reserve_bootmem_generic
c0016978 T free_bootmem
c00169a8 t ___alloc_bootmem
c00169e4 T __alloc_bootmem_low
c00169fc t ___alloc_bootmem_node
c0016a70 T __alloc_bootmem_low_node
c0016b04 T __alloc_bootmem_node
c0016b90 T __alloc_bootmem_node_high
c0016ba4 T __alloc_bootmem
c0016bbc t free_all_bootmem_core
c0016e10 T free_all_bootmem
c0016e64 T free_all_bootmem_node
c0016e7c t init_bootmem_core
c0016f8c T init_bootmem
c0016fd8 T init_bootmem_node
c0016ff0 T free_bootmem_late
c0017064 T free_bootmem_node
c00170a4 T __alloc_bootmem_node_nopanic
c0017174 W memblock_nid_range
c0017190 T memblock_phys_mem_size
c00171ac T memblock_enforce_memory_limit
c00172bc T memblock_is_reserved
c00172e4 T memblock_init
c001736c t early_memblock
c00173a8 t memblock_init_debugfs
c0017428 T memblock_analyze
c00174f0 T memblock_alloc_nid
c0017610 T __memblock_alloc_base
c001766c T memblock_alloc_base
c00176b4 T memblock_alloc_try_nid
c00176e8 T memblock_alloc
c0017700 t init_emergency_pool
c00177b4 t max_swapfiles_check
c00177c8 t procswaps_init
c0017808 t setup_slub_nomerge
c001782c t kmem_cache_bootstrap_fixup
c00178c0 T kmem_cache_init_late
c00178d0 t setup_slub_min_objects
c0017904 t setup_slub_max_order
c001794c t setup_slub_min_order
c0017980 t slab_proc_init
c00179c0 t setup_slub_debug
c0017b80 t slab_sysfs_init
c0017cd8 t create_kmalloc_cache
c0017d6c T kmem_cache_init
c001801c T files_init
c00180a8 T chrdev_init
c00180e4 t init_pipe_fs
c0018140 t fcntl_init
c0018188 t set_dhash_entries
c00181d0 T vfs_caches_init
c0018324 T vfs_caches_init_early
c00183d0 t set_ihash_entries
c0018418 T inode_init
c0018508 T inode_init_early
c00185b0 T files_defer_init
c0018600 t proc_filesystems_init
c0018640 T get_filesystem_list
c00186bc T mnt_init
c0018894 T buffer_init
c0018908 t init_bio
c0018a74 T bdev_cache_init
c0018b10 T bio_integrity_init
c0018bec t fsnotify_init
c0018c18 T fsnotify_notification_init
c0018ccc t fsnotify_mark_init
c0018d14 t dnotify_init
c0018db0 t inotify_user_setup
c0018e50 t eventpoll_init
c0018f50 t anon_inode_init
c001908c t aio_setup
c001913c t proc_locks_init
c001917c t filelock_init
c00191c8 t init_script_binfmt
c00191e8 t init_elf_binfmt
c0019208 t init_mbcache
c0019228 T proc_init_inodecache
c0019270 T proc_root_init
c001933c T proc_tty_init
c00193ec t proc_cmdline_init
c001942c t proc_consoles_init
c001946c t proc_cpuinfo_init
c00194ac t proc_devices_init
c00194ec t proc_interrupts_init
c001952c t proc_loadavg_init
c001956c t proc_meminfo_init
c00195ac t proc_stat_init
c00195ec t proc_uptime_init
c001962c t proc_version_init
c001966c t proc_softirqs_init
c00196ac T proc_sys_init
c00196f0 T proc_net_init
c0019724 t proc_net_ns_init
c00197d8 t proc_kmsg_init
c0019818 t proc_page_init
c0019878 T sysfs_inode_init
c0019894 T sysfs_init
c001995c t init_devpts_fs
c00199b8 t init_ext3_fs
c0019a3c T init_ext3_xattr
c0019a78 T journal_init_revoke_caches
c0019b38 t journal_init
c0019c0c t init_cramfs_fs
c0019c50 t init_ramfs_fs
c0019c6c T init_rootfs
c0019cbc T fat_cache_init
c0019d14 t init_fat_fs
c0019d80 t init_vfat_fs
c0019d9c t init_msdos_fs
c0019db8 t init_nls_cp437
c0019dd4 t init_nls_cp936
c0019df0 t init_nls_ascii
c0019e0c t init_nls_iso8859_1
c0019e28 t init_nls_utf8
c0019e68 t debugfs_init
c0019ee0 t ipc_init
c0019f0c T ipc_init_proc_interface
c0019fa4 T msg_init
c0019ff8 T sem_init
c001a034 T shm_init
c001a070 t ipc_sysctl_init
c001a090 T key_init
c001a14c t key_proc_init
c001a1a0 t init_mmap_min_addr
c001a1b8 t crypto_wq_init
c001a20c t crypto_algapi_init
c001a224 T crypto_init_proc
c001a260 t skcipher_module_init
c001a288 t chainiv_module_init
c001a2a4 t eseqiv_module_init
c001a2c0 t cryptomgr_init
c001a2dc t hmac_module_init
c001a2f8 t md5_mod_init
c001a314 t sha1_generic_mod_init
c001a330 t crypto_ecb_module_init
c001a34c t crypto_cbc_module_init
c001a368 t des_generic_mod_init
c001a3b8 t aes_init
c001a3d4 t arc4_init
c001a3f0 t michael_mic_init
c001a40c t crc32c_mod_init
c001a428 t crypto_authenc_module_init
c001a444 t crypto_authenc_esn_module_init
c001a460 t krng_mod_init
c001a47c t elevator_setup
c001a4a4 T blk_dev_init
c001a550 t blk_settings_init
c001a59c t blk_ioc_init
c001a5e4 t blk_softirq_init
c001a618 t blk_iopoll_setup
c001a64c t genhd_device_init
c001a6fc T printk_all_partitions
c001a950 t proc_genhd_init
c001a9b0 t blk_scsi_ioctl_init
c001aaa4 t bsg_init
c001ac00 t noop_init
c001ac20 t deadline_init
c001ac40 t cfq_init
c001ad14 t blk_dev_integrity_init
c001ad5c t get_bits
c001ae74 t nofill
c001ae88 T bunzip2
c001bca8 t nofill
c001bcbc T gunzip
c001c068 t read_int
c001c0c4 t nofill
c001c0d8 t rc_read
c001c148 t rc_do_normalize
c001c198 t rc_get_bit
c001c244 T unlzma
c001d2f0 T parse_header
c001d3b4 T unlzo
c001d8e8 T unxz
c001dc00 T idr_init_cache
c001dc44 t kobject_uevent_init
c001dc6c T prio_tree_init
c001dcc0 T radix_tree_init
c001dd88 t random32_init
c001de3c t random32_reseed
c001dea4 t libcrc32c_mod_init
c001dee4 t audit_classes_init
c001df48 t gpiolib_debugfs_init
c001df8c T gpiochip_reserve
c001e060 T samsung_gpiolib_add_4bit
c001e090 T samsung_gpiolib_add_4bit2
c001e0c0 T samsung_gpiolib_add_2bit_chips
c001e0f0 T samsung_gpiolib_add_4bit2_chips
c001e128 T samsung_gpiolib_add_4bit_chips
c001e160 T tty_init
c001e2bc T console_init
c001e2fc t tty_class_init
c001e34c t pty_init
c001e5cc t sysrq_always_enabled_setup
c001e600 t sysrq_init
c001e69c T vcs_init
c001e758 T kbd_init
c001e864 T console_map_init
c001e8cc T vty_init
c001eaa0 t vtconsole_class_init
c001eb9c t con_init
c001ee70 T uart_get_console
c001ef6c t s3c24xx_serial_modinit
c001efa4 t s3c24xx_serial_console_setup
c001f164 t s3c_serial_console_init
c001f1a4 t s3c6400_serial_init
c001f1c8 t chr_dev_init
c001f2b8 t random_int_secret_init
c001f2dc t misc_init
c001f3b0 t cn_proc_init
c001f3f8 t sysfs_deprecated_setup
c001f418 T devices_init
c001f4e8 T system_bus_init
c001f534 T buses_init
c001f578 T classes_init
c001f5b8 T early_platform_add_devices
c001f620 T early_platform_cleanup
c001f698 T early_platform_driver_probe
c001f930 T early_platform_driver_register_all
c001f944 T platform_bus_init
c001f998 T early_platform_driver_register
c001fb34 T cpu_dev_init
c001fb50 T firmware_init
c001fb8c T driver_init
c001fbbc t mount_param
c001fbe8 T devtmpfs_init
c001fcb8 t firmware_class_init
c001fcdc t ramdisk_size
c001fd08 t brd_init
c001fee4 t loop_init
c00200a0 t max_loop_setup
c00200cc t init_scsi
c0020170 T scsi_init_queue
c00202c8 T scsi_init_devinfo
c00203a4 T scsi_init_sysctl
c00203dc T scsi_init_procfs
c0020460 t init_sd
c00205ac t init_sg
c0020704 t vcan_init_module
c002074c t slcan_init
c00207fc t can_dev_init
c0020834 t probe_list2
c00208a8 t net_olddevs_init
c002097c t loopback_net_init
c00209f0 t input_init
c0020b14 t mousedev_init
c0020b80 t sock_init
c0020c28 T sk_init
c0020ca4 t proto_init
c0020cc0 t proto_init_net
c0020cf4 T skb_init
c0020d60 t net_ns_init
c0020eac t net_secret_init
c0020ed0 t sysctl_core_init
c0020f18 t sysctl_core_net_init
c0020f5c t dev_proc_net_init
c0021018 t initialize_hashrnd
c002103c T netdev_boot_setup
c0021140 t netdev_init
c0021198 t net_dev_init
c0021308 T dev_mcast_init
c0021324 t dev_mc_net_init
c0021358 T dst_init
c0021374 t neigh_init
c0021400 t rtnetlink_net_init
c0021458 T rtnetlink_init
c0021590 t flow_cache_init_global
c0021690 t netlink_net_init
c00216c4 t netlink_proto_init
c00218b0 t genl_pernet_init
c0021910 t genl_init
c00219ac T netfilter_init
c0021a70 T netfilter_log_init
c0021b78 T netfilter_queue_init
c0021bc8 t set_rhash_entries
c0021c10 T ip_static_sysctl_init
c0021c34 t rt_genid_init
c0021c68 t sysctl_route_net_init
c0021cac t ip_rt_do_proc_init
c0021d2c T ip_rt_init
c0021f0c T inet_initpeers
c0021ffc t ipv4_frags_init_net
c0022064 T ipfrag_init
c00220fc T ip_init
c0022114 t set_thash_entries
c002215c T tcp_init
c0022458 T tcp4_proc_init
c0022474 T tcp_v4_init
c00224ac t tcp_sk_init
c00224e0 t tcp4_proc_init_net
c00224fc t tcp_congestion_default
c0022518 T raw_proc_exit
c0022534 t raw_init_net
c0022568 T raw_proc_init
c0022584 t set_uhash_entries
c00225dc T udp_table_init
c002271c T udp_init
c0022790 T udp4_proc_init
c00227ac t udp4_proc_init_net
c00227c8 T udplite4_register
c002286c t udplite4_proc_init_net
c0022888 T arp_init
c00228e8 t arp_net_init
c002291c T icmp_init
c0022938 t icmp_sk_init
c0022a34 T devinet_init
c0022aec t devinet_init_net
c0022b94 t ipv4_mib_init_net
c0022cf0 t inet_init
c0022f5c T igmp_mc_proc_init
c0022f78 t igmp_net_init
c0022fec T ip_fib_init
c002306c t fib_net_init
c0023190 T fib_proc_init
c0023234 T fib_trie_init
c00232a0 T ping_init
c00232dc t ping_proc_init_net
c0023310 T ping_proc_init
c002332c t sysctl_ipv4_init
c00233dc t ipv4_sysctl_init_net
c0023430 T ip_misc_proc_init
c002344c t ip_proc_init_net
c00234f0 t xfrm4_beet_init
c0023510 t xfrm4_transport_init
c0023530 t xfrm4_mode_tunnel_init
c0023550 t ic_proto_name
c002369c t ic_is_init_dev
c0023704 t ic_bootp_string
c0023744 t ic_close_devs
c00237b0 t ic_devinet_ioctl
c0023838 t vendor_class_identifier_setup
c0023878 t ip_auto_config_setup
c0023aac t nfsaddrs_config_setup
c0023ac0 T root_nfs_parse_addr
c0023ba4 t ip_auto_config
c0024df8 t ic_rarp_recv
c0024ffc t ic_bootp_recv
c00256fc t inet_diag_init
c00257b0 t tcp_diag_init
c00257cc t cubictcp_register
c0025880 T xfrm4_init
c00258e8 T xfrm4_state_init
c0025904 T xfrm_init
c0025924 t xfrm_net_init
c0025acc T xfrm_state_init
c0025bb0 T xfrm_input_init
c0025bf4 T xfrm_sysctl_init
c0025c98 t af_unix_init
c0025cfc t unix_net_init
c0025d5c T unix_sysctl_register
c0025dc8 t packet_init
c0025e1c t packet_net_init
c0025e54 t can_init
c0025f58 t raw_module_init
c0025fa4 t bcm_module_init
c0026018 t cfg80211_init
c00260f0 T regulatory_init
c00261dc t lib80211_init
c0026204 t wext_pernet_init
c002622c t wireless_nlevent_init
c0026248 T wext_proc_init
c002627c t ieee80211_init
c00262c8 T rc80211_minstrel_init
c00262e4 T rc80211_minstrel_ht_init
c00263b4 t sysctl_init
c002640c t sysctl_net_init
c0026438 t init_dns_resolver
c0026580 t __lookup_processor_type
c00265b8 t __lookup_processor_type_data
c00265c4 t __error_p
c00265e0 t str_p1
c0026617 t str_p2
c002661c t __error
c0026624 T calibrate_delay
c002681c t dbg_reset_notify
c0026858 t __v6_setup
c0026898 t v6_crval
c00268a0 T init_idle_bootup_task
c00268bc T init_idle
c0026918 W idle_regs
c002693c T fork_idle
c00269cc t cpu_callback
c0026abc t timer_cpu_notify
c0026c50 t hrtimer_cpu_notify
c0026cac t perf_cpu_notify
c0026d68 t ratelimit_handler
c0026d80 T register_cpu
c0026ddc t flow_cache_cpu_prepare
c0026e64 t flow_cache_cpu
c0026f10 T init_currently_empty_zone
c0027040 T memmap_init_zone
c0027164 T init_per_zone_wmark_min
c0027214 T __free_pages_bootmem
c00272c8 T mminit_verify_page_links
c0027334 T __proc_info_begin
c0027334 t __v6_proc_info
c0027334 T _einittext
复制代码
(3)真正的驻留在内存中的内核内代码段
从脚本上来看,所有.text开始,.etext结束区间的段都是内核代码段:
.text : { /* Real text segment */
_text = .; /* Text and read-only data */
__exception_text_start = .;
*(.exception.text)
__exception_text_end = .;
IRQENTRY_TEXT
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
*(.gnu.warning)
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
*(.got) /* Global offset table */
ARM_CPU_KEEP(PROC_INFO)
}
RO_DATA(PAGE_SIZE)
#ifdef CONFIG_ARM_UNWIND
/*
* Stack unwinding tables
*/
. = ALIGN(8);
.ARM.unwind_idx : {
__start_unwind_idx = .;
*(.ARM.exidx*)
__stop_unwind_idx = .;
}
.ARM.unwind_tab : {
__start_unwind_tab = .;
*(.ARM.extab*)
__stop_unwind_tab = .;
}
#endif
_etext = .; /* End of text and rodata section */
复制代码
这些段中的代码都是事实在在的内核函数。
(4)已经初始化的data数据段:
.data : AT(__data_loc) {
_data = .; /* address in memory */
_sdata = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
INIT_TASK_DATA(THREAD_SIZE)
#ifdef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_begin = .;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
NOSAVE_DATA
CACHELINE_ALIGNED_DATA(32)
READ_MOSTLY_DATA(32)
/*
* The exception fixup table (might need resorting at runtime)
*/
. = ALIGN(32);
__start___ex_table = .;
#ifdef CONFIG_MMU
*(__ex_table)
#endif
__stop___ex_table = .;
/*
* and the usual data section
*/
DATA_DATA
CONSTRUCTORS
_edata = .;
复制代码
(5)紧接着以初始化的.data段的是.bss,未经初始化的内核数据段。
BSS_SECTION(0, 0, 0)
_end = .;
复制代码
printk的探讨
嵌入式开发联盟
www.mcuos.com
Osboy 站长原创
QQ:82475491
Mcuos.com@gmail.com
vmlinux.lds.S是如何组织内核的每个函数存放在内核镜像文件的位置,我们知道你在编译内核生成内核文件的时候,其实这个过程分两步,一个是“编译”,另一个是“链接”的过程,vmlinux.lds.S要做的就是告诉编译器如何链接编译好的各个内核.o文件。
小知识:链接器中的entry
链接器 按以下优先顺序设入口点,找到即停止
1 -e 命令行选项
2 脚本中的entry(symbol)命令
3如定义了start的值,取其值为入口点
4.text的第一个字节的地址
5地址0
复制代码
所以你可以从vmlinux.lds.S下面的代码中看到:
OUTPUT_ARCH(arm)
ENTRY(stext)
复制代码
表明我们指定stext作为,程序的入口点。
上代码:
SECTIONS
{
#ifdef CONFIG_XIP_KERNEL
. = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
#else
. = PAGE_OFFSET + TEXT_OFFSET;
#endif
.init : { /* Init code and data */
_stext = .;
_sinittext = .;
HEAD_TEXT
INIT_TEXT
ARM_EXIT_KEEP(EXIT_TEXT)
_einittext = .;
ARM_CPU_DISCARD(PROC_INFO)
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
#ifdef CONFIG_SMP_ON_UP
__smpalt_begin = .;
*(.alt.smp.init)
__smpalt_end = .;
#endif
__pv_table_begin = .;
*(.pv_table)
__pv_table_end = .;
INIT_SETUP(16)
INIT_CALLS
CON_INITCALL
SECURITY_INITCALL
INIT_RAM_FS
#ifndef CONFIG_XIP_KERNEL
__init_begin = _stext;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
#endif
}
PERCPU_SECTION(32)
#ifndef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
/*
* unwind exit sections must be discarded before the rest of the
* unwind sections get included.
*/
/DISCARD/ : {
*(.ARM.exidx.exit.text)
*(.ARM.extab.exit.text)
ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
#ifndef CONFIG_HOTPLUG
*(.ARM.exidx.devexit.text)
*(.ARM.extab.devexit.text)
#endif
#ifndef CONFIG_MMU
*(.fixup)
*(__ex_table)
#endif
}
.text : { /* Real text segment */
_text = .; /* Text and read-only data */
__exception_text_start = .;
*(.exception.text)
__exception_text_end = .;
IRQENTRY_TEXT
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
*(.gnu.warning)
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
*(.got) /* Global offset table */
ARM_CPU_KEEP(PROC_INFO)
}
RO_DATA(PAGE_SIZE)
#ifdef CONFIG_ARM_UNWIND
/*
* Stack unwinding tables
*/
. = ALIGN(8);
.ARM.unwind_idx : {
__start_unwind_idx = .;
*(.ARM.exidx*)
__stop_unwind_idx = .;
}
.ARM.unwind_tab : {
__start_unwind_tab = .;
*(.ARM.extab*)
__stop_unwind_tab = .;
}
#endif
_etext = .; /* End of text and rodata section */
#ifdef CONFIG_XIP_KERNEL
__data_loc = ALIGN(4); /* location in binary */
. = PAGE_OFFSET + TEXT_OFFSET;
#else
. = ALIGN(THREAD_SIZE);
__data_loc = .;
#endif
.data : AT(__data_loc) {
_data = .; /* address in memory */
_sdata = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
INIT_TASK_DATA(THREAD_SIZE)
#ifdef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_begin = .;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
NOSAVE_DATA
CACHELINE_ALIGNED_DATA(32)
READ_MOSTLY_DATA(32)
/*
* The exception fixup table (might need resorting at runtime)
*/
. = ALIGN(32);
__start___ex_table = .;
#ifdef CONFIG_MMU
*(__ex_table)
#endif
__stop___ex_table = .;
/*
* and the usual data section
*/
DATA_DATA
CONSTRUCTORS
_edata = .;
}
_edata_loc = __data_loc + SIZEOF(.data);
#ifdef CONFIG_HAVE_TCM
/*
* We align everything to a page boundary so we can
* free it after init has commenced and TCM contents have
* been copied to its destination.
*/
.tcm_start : {
. = ALIGN(PAGE_SIZE);
__tcm_start = .;
__itcm_start = .;
}
/*
* Link these to the ITCM RAM
* Put VMA to the TCM address and LMA to the common RAM
* and we'll upload the contents from RAM to TCM and free
* the used RAM after that.
*/
.text_itcm ITCM_OFFSET : AT(__itcm_start)
{
__sitcm_text = .;
*(.tcm.text)
*(.tcm.rodata)
. = ALIGN(4);
__eitcm_text = .;
}
/*
* Reset the dot pointer, this is needed to create the
* relative __dtcm_start below (to be used as extern in code).
*/
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
.dtcm_start : {
__dtcm_start = .;
}
/* TODO: add remainder of ITCM as well, that can be used for data! */
.data_dtcm DTCM_OFFSET : AT(__dtcm_start)
{
. = ALIGN(4);
__sdtcm_data = .;
*(.tcm.data)
. = ALIGN(4);
__edtcm_data = .;
}
/* Reset the dot pointer or the linker gets confused */
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
/* End marker for freeing TCM copy in linked object */
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
. = ALIGN(PAGE_SIZE);
__tcm_end = .;
}
#endif
NOTES
BSS_SECTION(0, 0, 0)
_end = .;
STABS_DEBUG
.comment 0 : { *(.comment) }
/* Default discards */
DISCARDS
#ifndef CONFIG_SMP_ON_UP
/DISCARD/ : {
*(.alt.smp.init)
}
#endif
}
复制代码
先看第一个知识点:
(1). = PAGE_OFFSET + TEXT_OFFSET;
arch/arm/include/asm中的memory.h文件定义了:
#define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)
复制代码
CONFIG_PAGE_OFFSET是在内核配置里面配置的,比如拿ok6410来说,我的配置:
#define CONFIG_PAGE_OFFSET 0xC0000000
复制代码
PAGE_OFFSET代表是的内核image的的起始虚拟地址。
在arch/arm/Makefile中有定义:
textofs-y := 0x00008000
TEXT_OFFSET := $(textofs-y)
复制代码
TEXT_OFFSET代表的是内核的image存放在内存中地址,注意这个地址为相对于内存的起始地址的偏移量,是个相对的偏移量不是实际的存放内存物理地址。而且这个偏移量取得有讲究,必须为:0xXXXX8000,xxx为任意值。
所以:. = PAGE_OFFSET + TEXT_OFFSET就变成为:.=c0008000,这个地址就是内核存放在内存的虚拟的起始地址。从脚本来看,也就是.stext的地址就是:c0008000,那么我们如何验证我们的这个说法呢,你可以打开linux目录下的System.map文件查看:
00000020 A cpu_v6_suspend_size
c0004000 A swapper_pg_dir
c0008000 T __init_begin
c0008000 T _stext T _sinittext
c0008000 T _stext
c0008000 T stext
c000804c t __create_page_tables
c0008148 t __enable_mmu_loc
c0008154 t __enable_mmu
c0008180 t __turn_mmu_on
c0008198 t __enable_mmu_end
c0008198 t __vet_atags
c00081e0 t __mmap_switched
c0008228 t __mmap_switched_data
c000824c T lookup_processor_type
c0008260 t set_reset_devices
c0008284 t debug_kernel
复制代码
从map文件可以知道_stext是内核的入口地址,这个地址就是c0008000,这也验证了我们在第一章讲搭建环境的时候,我为什么要用dnw
c0008000,就是因为我们已经指定好了,内核的存放地址必须为c0008000,针对ok6410来说。
(二).init内核的初始化代码和数据段
_sinittext = .;
HEAD_TEXT
INIT_TEXT
ARM_EXIT_KEEP(EXIT_TEXT)
_einittext = .;
复制代码
从上面的链接脚本可以知道所有:_sinittext开头的,_einittext结尾的HEAD_TEXT, INIT_TEXT,ARM_EXIT_KEEP(EXIT_TEXT)段都是从起始地址c0008000开始存放的。这些宏定义在:include/asm-generic/vmlinux.lds.h中。
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
#ifdef CONFIG_SMP_ON_UP
__smpalt_begin = .;
*(.alt.smp.init)
__smpalt_end = .;
#endif
__pv_table_begin = .;
*(.pv_table)
__pv_table_end = .;
复制代码
紧接着以此存放的是:*(.arch.info.init), *(.taglist.init),*(.alt.smp.init),*(.pv_table)段的代码,其中我们最熟悉的*(.arch.info.init)段的代码就是:
#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type \
__used \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};
复制代码
也就是说所有平台的下面这段代码都放到了*(.arch.info.init)段中:
MACHINE_START(MCUOS6410, "MCUOS6410")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
.boot_params = S3C64XX_PA_SDRAM + 0x100,
.init_irq = s3c6410_init_irq,
.map_io = mcuos6410_map_io,
.init_machine = mcuos6410_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
复制代码
紧接着存放的是初始化数据段:
#ifndef CONFIG_XIP_KERNEL
__init_begin = _stext;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
#endif
}
PERCPU_SECTION(32)
#ifndef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
复制代码
这个段存放的是所有*(.init.data),*(.init.rodata)段中的代码。
.init段中的代码段和数据段,在Linux初始化完成之后,这个段的内存都会被请空,被释放。因为他们只需要在初始化的时候使用一次,没有必要再驻留在内存中,浪费空间。为了验证我们以上的分析,我们可以查看system.map这个文件,下面我们看到的从_sinittext开头的,_einittext结尾的所有函数,都会在初始化完成之后被释放:
c0008000 T _sinittext
c0008000 T _stext
c0008000 T stext
c000804c t __create_page_tables
c0008148 t __enable_mmu_loc
c0008154 t __enable_mmu
c0008180 t __turn_mmu_on
c0008198 t __enable_mmu_end
c0008198 t __vet_atags
c00081e0 t __mmap_switched
c0008228 t __mmap_switched_data
c000824c T lookup_processor_type
c0008260 t set_reset_devices
c0008284 t debug_kernel
c00082a8 t quiet_kernel
c00082cc t init_setup
c0008308 t rdinit_setup
c0008344 W smp_setup_processor_id
c0008354 W thread_info_cache_init
c0008364 t loglevel
c0008398 T parse_early_options
c00083d4 t unknown_bootoption
c00085f8 T parse_early_param
c0008648 t do_early_param
c0008724 t kernel_init
c0008850 T start_kernel
c0008b9c t readonly
c0008bd0 t readwrite
c0008c04 t rootwait_setup
c0008c34 t root_data_setup
c0008c54 t fs_names_setup
c0008c74 t load_ramdisk
c0008ca4 t root_dev_setup
c0008ccc t root_delay_setup
c0008cf8 T change_floppy
c0008e20 T mount_block_root
c0009108 T mount_root
c0009174 T prepare_namespace
c0009364 t ramdisk_start_setup
c0009390 t prompt_ramdisk
c00093c0 t error
c00093fc t compr_fill
c0009464 t compr_flush
c00094d4 T rd_load_image
c0009b5c T rd_load_disk
c0009c10 t no_initrd
c0009c34 T initrd_load
c0009f74 t do_linuxrc
c0009fc8 t error
c0009fec t read_into
c000a0a8 t do_start
c000a0d4 t write_buffer
c000a12c t flush_buffer
c000a1d8 t retain_initrd_param
c000a208 t clean_path
c000a268 t do_utime
c000a2ac t do_symlink
c000a378 t unpack_to_rootfs
c000a6d4 t maybe_link
c000a840 t do_name
c000aad8 t do_header
c000adf0 t free_initrd
c000aed0 t populate_rootfs
c000b124 t do_collect
c000b1ec t do_skip
c000b2c0 t do_reset
c000b38c t do_copy
c000b4b8 t lpj_setup
c000b500 T __kuser_helper_start
c000b500 t __kuser_memory_barrier
c000b520 t __kuser_cmpxchg
c000b540 t __kuser_get_tls
c000b55c t __kuser_helper_version
c000b560 T __kuser_helper_end
c000b560 T __stubs_start
c000b560 t vector_irq
c000b5e0 t vector_dabt
c000b660 t vector_pabt
c000b6e0 t vector_und
c000b760 t vector_fiq
c000b764 t vector_addrexcptn
c000b784 T __stubs_end
c000b784 T __vectors_start
c000b7a4 T __vectors_end
c000b7c0 T init_IRQ
c000b7e4 T arch_probe_nr_irqs
c000b818 t nohlt_setup
c000b83c t hlt_setup
c000b860 T reboot_setup
c000b884 t ptrace_break_init
c000b8bc t parse_tag_core
c000b914 t parse_tag_videotext
c000b994 t parse_tag_ramdisk
c000b9fc t parse_tag_serialnr
c000ba30 t parse_tag_revision
c000ba54 t customize_machine
c000ba84 t parse_tag_cmdline
c000baac t topology_init
c000badc t proc_cpu_init
c000bb08 T arm_add_memory
c000bba0 t parse_tag_mem32
c000bbbc t early_mem
c000bc38 T early_print
c000bcb0 T dump_machine_table
c000bd10 T setup_arch
c000c5fc T time_init
c000c630 t timer_init_syscore_ops
c000c650 T trap_init
c000c660 t user_debug_setup
c000c694 T early_trap_init
c000c7a8 T arch_init_kprobes
c000c7cc T arm_kprobe_decode_init
c000c800 T save_atags
c000c824 t init_atags_procfs
c000c934 T unwind_init
c000c97c t arch_hw_breakpoint_init
c000cb8c t register_pmu_driver
c000cba8 t armpmu_reset
c000cbf4 t init_hw_perf_events
c000cd3c t setup_early_printk
c000cd5c t dma_debug_do_init
c000cd70 t consistent_init
c000ce64 T hook_ifault_code
c000ceb8 T hook_fault_code
c000cf10 t exceptions_init
c000cfac t parse_tag_initrd2
c000cfe0 t meminfo_cmp
c000d014 t keepinitrd_setup
c000d038 t early_initrd
c000d09c t parse_tag_initrd
c000d0e8 T mem_init
c000d7cc T bootmem_init
c000da94 T arm_memblock_init
c000dc1c T check_writebuffer_bugs
c000dd64 t early_ecc
c000ddd0 t early_cachepolicy
c000ded0 t early_nowrite
c000df08 t early_nocache
c000df40 t early_vmalloc
c000dfc4 t early_alloc
c000dffc t early_pte_alloc
c000e08c t create_mapping
c000e3e8 T paging_init
c000eabc T iotable_init
c000eaf8 T arm_mm_memblock_reserve
c000eb18 T sanity_check_meminfo
c000ed58 t noalign_setup
c000eda0 t alignment_init
c000ee90 t v6_userpage_init
c000eed4 T v6wbi_tlb_fns
c000eee0 t vic_disable
c000ef28 t vic_clear_interrupts
c000ef6c t vic_set_irq_sources
c000eff0 T vic_init
c000f12c t s3c64xx_sysdev_init
c000f154 T s3c64xx_init_io
c000f1b0 T s3c6400_common_init_uarts
c000f1dc T s3c64xx_register_clocks
c000f264 T s3c6400_setup_clocks
c000f4ec t s3c64xx_gpiolib_add_2bit
c000f504 t s3c64xx_gpiolib_add
c000f54c t s3c64xx_gpiolib_init
c000f5a8 T s3c6410_map_io
c000f5e0 t s3c6410_core_init
c000f5fc T s3c6410_init
c000f624 T s3c6410_init_irq
c000f640 T s3c6410_init_clocks
c000f67c T s3c64xx_init_irq
c000f6f0 t s3c64xx_init_irq_eint
c000f7dc t s3c64xx_dma_init
c000f8c0 t mcuos6410_machine_init
c000f8e0 t mcuos6410_map_io
c000f91c T s3c64xx_ac97_setup_gpio
c000f954 T s3c24xx_init_clocks
c000f9b0 t s3c_arch_init
c000fa08 T s3c24xx_init_uarts
c000fa4c T s3c_init_cpu
c000fb1c T s3c24xx_init_uartdevs
c000fbb4 t s3c2410_timer_init
c000fc94 T s3c_disable_clocks
c000fccc T s3c24xx_register_baseclocks
c000fe08 T s3c_register_clocks
c000fe64 T s3c_pwmclk_init
c000ffd4 T s3c_gpiolib_add
c00100f4 T s3c_set_clksrc
c00101cc T s3c_register_clksrc
c00102d0 T s3c_init_uart_irqs
c00103d4 T s3c_init_vic_timer_irq
c001052c t adc_init
c001056c T s3c_set_platdata
c00105c8 T s3c_i2c0_set_platdata
c0010638 T s3c_nand_set_platdata
c0010784 t sched_init_debug
c00107c4 t init_sched_debug_procfs
c001080c T sched_init_smp
c0010878 T sched_init
c0010ab0 t proc_schedstat_init
c0010af0 t coredump_filter_setup
c0010b24 T fork_init
c0010bc0 T proc_caches_init
c0010cdc t proc_execdomains_init
c0010d1c t oops_setup
c0010d5c t console_suspend_disable
c0010d80 t log_buf_len_setup
c0010de0 t console_setup
c0010f1c t printk_late_init
c0010f9c t keep_bootcon_setup
c0010fcc t ignore_loglevel_setup
c0010ffc T setup_log_buf
c0011184 T softirq_init
c0011214 W arch_early_irq_init
c0011228 t spawn_ksoftirqd
c001127c t reserve_setup
c0011370 t strict_iomem
c00113cc t __reserve_region_with_split
c00114ac T reserve_region_with_split
c00114c0 t ioresources_init
c0011520 t sysctl_init
c0011564 t file_caps_disable
c0011588 T init_timers
c00115e4 t uid_cache_init
c0011670 t setup_print_fatal_signals
c00116a4 T signals_init
c00116e8 T usermodehelper_init
c0011748 t init_workqueues
c00119d8 T pidmap_init
c0011ad8 T pidhash_init
c0011b5c T sort_main_extable
c0011b80 t locate_module_kobject
c0011c80 t param_sysfs_init
c0011ea0 t init_posix_timers
c0012098 t init_posix_cpu_timers
c00121a0 T hrtimers_init
c00121c4 t nsproxy_cache_init
c001220c t ksysfs_init
c00122ac t pm_qos_power_init
c001233c T cred_init
c0012380 t timekeeping_init_ops
c00123a0 T timekeeping_init
c00124b0 t ntp_tick_adj_setup
c00124e4 T ntp_init
c0012520 t init_clocksource_sysfs
c0012580 t boot_override_clocksource
c00125cc t boot_override_clock
c0012628 t clocksource_done_booting
c0012690 W clocksource_default_clock
c00126a8 t init_jiffies_clocksource
c00126c4 t init_timer_list_procfs
c001270c t alarmtimer_init
c0012850 T init_timer_stats
c0012860 t init_tstats_procfs
c00128a8 t futex_init
c0012920 t proc_modules_init
c0012960 t kallsyms_init
c00129a0 t crash_notes_memory_init
c00129e4 t crash_save_vmcoreinfo_init
c0012dac T parse_crashkernel
c0013114 t pid_namespaces_init
c001315c t audit_enable
c0013244 t audit_init
c001338c T audit_register_class
c001345c t init_kprobes
c00135a0 t hung_task_panic_setup
c00135cc t hung_task_init
c0013630 T early_irq_init
c0013708 t irqpoll_setup
c0013744 t irqfixup_setup
c0013784 t irq_gc_init_ops
c00137a4 t rcu_spawn_kthreads
c001380c t relay_init
c0013820 t utsname_sysctl_init
c0013840 t init_lstats_procfs
c0013880 t rb_init_debugfs
c00138c8 t set_cmdline_ftrace
c0013910 t set_ftrace_dump_on_oops
c0013978 t set_buf_size
c00139c8 t clear_boot_tracer
c0013a08 t tracer_init_debugfs
c0013d48 t set_tracing_thresh
c0013da8 t tracer_alloc_buffers
c0013f1c t init_events
c0013fb0 t init_trace_printk_function_export
c0013ffc t init_trace_printk
c0014018 t setup_trace_event
c0014058 t event_trace_init
c001435c t init_kprobe_trace
c00143fc t perf_event_sysfs_init
c00144c0 T perf_event_init
c00145d8 T init_hw_breakpoint
c0014680 T set_dma_reserve
c001469c T page_alloc_init
c00146ac T free_area_init_node
c0014a38 T free_area_init
c0014a5c T setup_per_cpu_pageset
c0014af8 T alloc_large_system_hash
c0014d6c T page_writeback_init
c0014dac T swap_setup
c0014e00 t kswapd_init
c0014e20 T init_tmpfs
c0014f0c t setup_vmstat
c0014fac t bdi_class_init
c0015018 t default_bdi_init
c00150e0 t set_mminit_loglevel
c0015114 t mm_sysfs_init
c0015158 T mminit_verify_pageflags_layout
c001526c T percpu_init_late
c0015304 T pcpu_setup_first_chunk
c0015b78 T pcpu_free_alloc_info
c0015b98 T pcpu_alloc_alloc_info
c0015c2c T setup_per_cpu_areas
c0015cc4 T page_address_init
c0015d68 t disable_randmaps
c0015d8c t init_zero_pfn
c0015dd0 T mmap_init
c0015df4 T anon_vma_init
c0015e68 T vm_area_register_early
c0015ee8 t proc_vmalloc_init
c0015f28 T vmalloc_init
c0015fd8 t bootmem_debug_setup
c0015ffc t bootmap_bytes
c001601c T bootmem_bootmap_pages
c001603c t align_idx
c0016068 t alloc_arch_preferred_bootmem
c00160c8 t __free
c001618c t __reserve
c0016288 t alloc_bootmem_core
c0016618 t ___alloc_bootmem_nopanic
c00166e4 T __alloc_bootmem_nopanic
c00166fc t mark_bootmem_node
c00167dc T reserve_bootmem_node
c0016818 t mark_bootmem
c0016934 T reserve_bootmem
c0016964 W reserve_bootmem_generic
c0016978 T free_bootmem
c00169a8 t ___alloc_bootmem
c00169e4 T __alloc_bootmem_low
c00169fc t ___alloc_bootmem_node
c0016a70 T __alloc_bootmem_low_node
c0016b04 T __alloc_bootmem_node
c0016b90 T __alloc_bootmem_node_high
c0016ba4 T __alloc_bootmem
c0016bbc t free_all_bootmem_core
c0016e10 T free_all_bootmem
c0016e64 T free_all_bootmem_node
c0016e7c t init_bootmem_core
c0016f8c T init_bootmem
c0016fd8 T init_bootmem_node
c0016ff0 T free_bootmem_late
c0017064 T free_bootmem_node
c00170a4 T __alloc_bootmem_node_nopanic
c0017174 W memblock_nid_range
c0017190 T memblock_phys_mem_size
c00171ac T memblock_enforce_memory_limit
c00172bc T memblock_is_reserved
c00172e4 T memblock_init
c001736c t early_memblock
c00173a8 t memblock_init_debugfs
c0017428 T memblock_analyze
c00174f0 T memblock_alloc_nid
c0017610 T __memblock_alloc_base
c001766c T memblock_alloc_base
c00176b4 T memblock_alloc_try_nid
c00176e8 T memblock_alloc
c0017700 t init_emergency_pool
c00177b4 t max_swapfiles_check
c00177c8 t procswaps_init
c0017808 t setup_slub_nomerge
c001782c t kmem_cache_bootstrap_fixup
c00178c0 T kmem_cache_init_late
c00178d0 t setup_slub_min_objects
c0017904 t setup_slub_max_order
c001794c t setup_slub_min_order
c0017980 t slab_proc_init
c00179c0 t setup_slub_debug
c0017b80 t slab_sysfs_init
c0017cd8 t create_kmalloc_cache
c0017d6c T kmem_cache_init
c001801c T files_init
c00180a8 T chrdev_init
c00180e4 t init_pipe_fs
c0018140 t fcntl_init
c0018188 t set_dhash_entries
c00181d0 T vfs_caches_init
c0018324 T vfs_caches_init_early
c00183d0 t set_ihash_entries
c0018418 T inode_init
c0018508 T inode_init_early
c00185b0 T files_defer_init
c0018600 t proc_filesystems_init
c0018640 T get_filesystem_list
c00186bc T mnt_init
c0018894 T buffer_init
c0018908 t init_bio
c0018a74 T bdev_cache_init
c0018b10 T bio_integrity_init
c0018bec t fsnotify_init
c0018c18 T fsnotify_notification_init
c0018ccc t fsnotify_mark_init
c0018d14 t dnotify_init
c0018db0 t inotify_user_setup
c0018e50 t eventpoll_init
c0018f50 t anon_inode_init
c001908c t aio_setup
c001913c t proc_locks_init
c001917c t filelock_init
c00191c8 t init_script_binfmt
c00191e8 t init_elf_binfmt
c0019208 t init_mbcache
c0019228 T proc_init_inodecache
c0019270 T proc_root_init
c001933c T proc_tty_init
c00193ec t proc_cmdline_init
c001942c t proc_consoles_init
c001946c t proc_cpuinfo_init
c00194ac t proc_devices_init
c00194ec t proc_interrupts_init
c001952c t proc_loadavg_init
c001956c t proc_meminfo_init
c00195ac t proc_stat_init
c00195ec t proc_uptime_init
c001962c t proc_version_init
c001966c t proc_softirqs_init
c00196ac T proc_sys_init
c00196f0 T proc_net_init
c0019724 t proc_net_ns_init
c00197d8 t proc_kmsg_init
c0019818 t proc_page_init
c0019878 T sysfs_inode_init
c0019894 T sysfs_init
c001995c t init_devpts_fs
c00199b8 t init_ext3_fs
c0019a3c T init_ext3_xattr
c0019a78 T journal_init_revoke_caches
c0019b38 t journal_init
c0019c0c t init_cramfs_fs
c0019c50 t init_ramfs_fs
c0019c6c T init_rootfs
c0019cbc T fat_cache_init
c0019d14 t init_fat_fs
c0019d80 t init_vfat_fs
c0019d9c t init_msdos_fs
c0019db8 t init_nls_cp437
c0019dd4 t init_nls_cp936
c0019df0 t init_nls_ascii
c0019e0c t init_nls_iso8859_1
c0019e28 t init_nls_utf8
c0019e68 t debugfs_init
c0019ee0 t ipc_init
c0019f0c T ipc_init_proc_interface
c0019fa4 T msg_init
c0019ff8 T sem_init
c001a034 T shm_init
c001a070 t ipc_sysctl_init
c001a090 T key_init
c001a14c t key_proc_init
c001a1a0 t init_mmap_min_addr
c001a1b8 t crypto_wq_init
c001a20c t crypto_algapi_init
c001a224 T crypto_init_proc
c001a260 t skcipher_module_init
c001a288 t chainiv_module_init
c001a2a4 t eseqiv_module_init
c001a2c0 t cryptomgr_init
c001a2dc t hmac_module_init
c001a2f8 t md5_mod_init
c001a314 t sha1_generic_mod_init
c001a330 t crypto_ecb_module_init
c001a34c t crypto_cbc_module_init
c001a368 t des_generic_mod_init
c001a3b8 t aes_init
c001a3d4 t arc4_init
c001a3f0 t michael_mic_init
c001a40c t crc32c_mod_init
c001a428 t crypto_authenc_module_init
c001a444 t crypto_authenc_esn_module_init
c001a460 t krng_mod_init
c001a47c t elevator_setup
c001a4a4 T blk_dev_init
c001a550 t blk_settings_init
c001a59c t blk_ioc_init
c001a5e4 t blk_softirq_init
c001a618 t blk_iopoll_setup
c001a64c t genhd_device_init
c001a6fc T printk_all_partitions
c001a950 t proc_genhd_init
c001a9b0 t blk_scsi_ioctl_init
c001aaa4 t bsg_init
c001ac00 t noop_init
c001ac20 t deadline_init
c001ac40 t cfq_init
c001ad14 t blk_dev_integrity_init
c001ad5c t get_bits
c001ae74 t nofill
c001ae88 T bunzip2
c001bca8 t nofill
c001bcbc T gunzip
c001c068 t read_int
c001c0c4 t nofill
c001c0d8 t rc_read
c001c148 t rc_do_normalize
c001c198 t rc_get_bit
c001c244 T unlzma
c001d2f0 T parse_header
c001d3b4 T unlzo
c001d8e8 T unxz
c001dc00 T idr_init_cache
c001dc44 t kobject_uevent_init
c001dc6c T prio_tree_init
c001dcc0 T radix_tree_init
c001dd88 t random32_init
c001de3c t random32_reseed
c001dea4 t libcrc32c_mod_init
c001dee4 t audit_classes_init
c001df48 t gpiolib_debugfs_init
c001df8c T gpiochip_reserve
c001e060 T samsung_gpiolib_add_4bit
c001e090 T samsung_gpiolib_add_4bit2
c001e0c0 T samsung_gpiolib_add_2bit_chips
c001e0f0 T samsung_gpiolib_add_4bit2_chips
c001e128 T samsung_gpiolib_add_4bit_chips
c001e160 T tty_init
c001e2bc T console_init
c001e2fc t tty_class_init
c001e34c t pty_init
c001e5cc t sysrq_always_enabled_setup
c001e600 t sysrq_init
c001e69c T vcs_init
c001e758 T kbd_init
c001e864 T console_map_init
c001e8cc T vty_init
c001eaa0 t vtconsole_class_init
c001eb9c t con_init
c001ee70 T uart_get_console
c001ef6c t s3c24xx_serial_modinit
c001efa4 t s3c24xx_serial_console_setup
c001f164 t s3c_serial_console_init
c001f1a4 t s3c6400_serial_init
c001f1c8 t chr_dev_init
c001f2b8 t random_int_secret_init
c001f2dc t misc_init
c001f3b0 t cn_proc_init
c001f3f8 t sysfs_deprecated_setup
c001f418 T devices_init
c001f4e8 T system_bus_init
c001f534 T buses_init
c001f578 T classes_init
c001f5b8 T early_platform_add_devices
c001f620 T early_platform_cleanup
c001f698 T early_platform_driver_probe
c001f930 T early_platform_driver_register_all
c001f944 T platform_bus_init
c001f998 T early_platform_driver_register
c001fb34 T cpu_dev_init
c001fb50 T firmware_init
c001fb8c T driver_init
c001fbbc t mount_param
c001fbe8 T devtmpfs_init
c001fcb8 t firmware_class_init
c001fcdc t ramdisk_size
c001fd08 t brd_init
c001fee4 t loop_init
c00200a0 t max_loop_setup
c00200cc t init_scsi
c0020170 T scsi_init_queue
c00202c8 T scsi_init_devinfo
c00203a4 T scsi_init_sysctl
c00203dc T scsi_init_procfs
c0020460 t init_sd
c00205ac t init_sg
c0020704 t vcan_init_module
c002074c t slcan_init
c00207fc t can_dev_init
c0020834 t probe_list2
c00208a8 t net_olddevs_init
c002097c t loopback_net_init
c00209f0 t input_init
c0020b14 t mousedev_init
c0020b80 t sock_init
c0020c28 T sk_init
c0020ca4 t proto_init
c0020cc0 t proto_init_net
c0020cf4 T skb_init
c0020d60 t net_ns_init
c0020eac t net_secret_init
c0020ed0 t sysctl_core_init
c0020f18 t sysctl_core_net_init
c0020f5c t dev_proc_net_init
c0021018 t initialize_hashrnd
c002103c T netdev_boot_setup
c0021140 t netdev_init
c0021198 t net_dev_init
c0021308 T dev_mcast_init
c0021324 t dev_mc_net_init
c0021358 T dst_init
c0021374 t neigh_init
c0021400 t rtnetlink_net_init
c0021458 T rtnetlink_init
c0021590 t flow_cache_init_global
c0021690 t netlink_net_init
c00216c4 t netlink_proto_init
c00218b0 t genl_pernet_init
c0021910 t genl_init
c00219ac T netfilter_init
c0021a70 T netfilter_log_init
c0021b78 T netfilter_queue_init
c0021bc8 t set_rhash_entries
c0021c10 T ip_static_sysctl_init
c0021c34 t rt_genid_init
c0021c68 t sysctl_route_net_init
c0021cac t ip_rt_do_proc_init
c0021d2c T ip_rt_init
c0021f0c T inet_initpeers
c0021ffc t ipv4_frags_init_net
c0022064 T ipfrag_init
c00220fc T ip_init
c0022114 t set_thash_entries
c002215c T tcp_init
c0022458 T tcp4_proc_init
c0022474 T tcp_v4_init
c00224ac t tcp_sk_init
c00224e0 t tcp4_proc_init_net
c00224fc t tcp_congestion_default
c0022518 T raw_proc_exit
c0022534 t raw_init_net
c0022568 T raw_proc_init
c0022584 t set_uhash_entries
c00225dc T udp_table_init
c002271c T udp_init
c0022790 T udp4_proc_init
c00227ac t udp4_proc_init_net
c00227c8 T udplite4_register
c002286c t udplite4_proc_init_net
c0022888 T arp_init
c00228e8 t arp_net_init
c002291c T icmp_init
c0022938 t icmp_sk_init
c0022a34 T devinet_init
c0022aec t devinet_init_net
c0022b94 t ipv4_mib_init_net
c0022cf0 t inet_init
c0022f5c T igmp_mc_proc_init
c0022f78 t igmp_net_init
c0022fec T ip_fib_init
c002306c t fib_net_init
c0023190 T fib_proc_init
c0023234 T fib_trie_init
c00232a0 T ping_init
c00232dc t ping_proc_init_net
c0023310 T ping_proc_init
c002332c t sysctl_ipv4_init
c00233dc t ipv4_sysctl_init_net
c0023430 T ip_misc_proc_init
c002344c t ip_proc_init_net
c00234f0 t xfrm4_beet_init
c0023510 t xfrm4_transport_init
c0023530 t xfrm4_mode_tunnel_init
c0023550 t ic_proto_name
c002369c t ic_is_init_dev
c0023704 t ic_bootp_string
c0023744 t ic_close_devs
c00237b0 t ic_devinet_ioctl
c0023838 t vendor_class_identifier_setup
c0023878 t ip_auto_config_setup
c0023aac t nfsaddrs_config_setup
c0023ac0 T root_nfs_parse_addr
c0023ba4 t ip_auto_config
c0024df8 t ic_rarp_recv
c0024ffc t ic_bootp_recv
c00256fc t inet_diag_init
c00257b0 t tcp_diag_init
c00257cc t cubictcp_register
c0025880 T xfrm4_init
c00258e8 T xfrm4_state_init
c0025904 T xfrm_init
c0025924 t xfrm_net_init
c0025acc T xfrm_state_init
c0025bb0 T xfrm_input_init
c0025bf4 T xfrm_sysctl_init
c0025c98 t af_unix_init
c0025cfc t unix_net_init
c0025d5c T unix_sysctl_register
c0025dc8 t packet_init
c0025e1c t packet_net_init
c0025e54 t can_init
c0025f58 t raw_module_init
c0025fa4 t bcm_module_init
c0026018 t cfg80211_init
c00260f0 T regulatory_init
c00261dc t lib80211_init
c0026204 t wext_pernet_init
c002622c t wireless_nlevent_init
c0026248 T wext_proc_init
c002627c t ieee80211_init
c00262c8 T rc80211_minstrel_init
c00262e4 T rc80211_minstrel_ht_init
c00263b4 t sysctl_init
c002640c t sysctl_net_init
c0026438 t init_dns_resolver
c0026580 t __lookup_processor_type
c00265b8 t __lookup_processor_type_data
c00265c4 t __error_p
c00265e0 t str_p1
c0026617 t str_p2
c002661c t __error
c0026624 T calibrate_delay
c002681c t dbg_reset_notify
c0026858 t __v6_setup
c0026898 t v6_crval
c00268a0 T init_idle_bootup_task
c00268bc T init_idle
c0026918 W idle_regs
c002693c T fork_idle
c00269cc t cpu_callback
c0026abc t timer_cpu_notify
c0026c50 t hrtimer_cpu_notify
c0026cac t perf_cpu_notify
c0026d68 t ratelimit_handler
c0026d80 T register_cpu
c0026ddc t flow_cache_cpu_prepare
c0026e64 t flow_cache_cpu
c0026f10 T init_currently_empty_zone
c0027040 T memmap_init_zone
c0027164 T init_per_zone_wmark_min
c0027214 T __free_pages_bootmem
c00272c8 T mminit_verify_page_links
c0027334 T __proc_info_begin
c0027334 t __v6_proc_info
c0027334 T _einittext
复制代码
(3)真正的驻留在内存中的内核内代码段
从脚本上来看,所有.text开始,.etext结束区间的段都是内核代码段:
.text : { /* Real text segment */
_text = .; /* Text and read-only data */
__exception_text_start = .;
*(.exception.text)
__exception_text_end = .;
IRQENTRY_TEXT
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
*(.gnu.warning)
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
*(.got) /* Global offset table */
ARM_CPU_KEEP(PROC_INFO)
}
RO_DATA(PAGE_SIZE)
#ifdef CONFIG_ARM_UNWIND
/*
* Stack unwinding tables
*/
. = ALIGN(8);
.ARM.unwind_idx : {
__start_unwind_idx = .;
*(.ARM.exidx*)
__stop_unwind_idx = .;
}
.ARM.unwind_tab : {
__start_unwind_tab = .;
*(.ARM.extab*)
__stop_unwind_tab = .;
}
#endif
_etext = .; /* End of text and rodata section */
复制代码
这些段中的代码都是事实在在的内核函数。
(4)已经初始化的data数据段:
.data : AT(__data_loc) {
_data = .; /* address in memory */
_sdata = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
INIT_TASK_DATA(THREAD_SIZE)
#ifdef CONFIG_XIP_KERNEL
. = ALIGN(PAGE_SIZE);
__init_begin = .;
INIT_DATA
ARM_EXIT_KEEP(EXIT_DATA)
. = ALIGN(PAGE_SIZE);
__init_end = .;
#endif
NOSAVE_DATA
CACHELINE_ALIGNED_DATA(32)
READ_MOSTLY_DATA(32)
/*
* The exception fixup table (might need resorting at runtime)
*/
. = ALIGN(32);
__start___ex_table = .;
#ifdef CONFIG_MMU
*(__ex_table)
#endif
__stop___ex_table = .;
/*
* and the usual data section
*/
DATA_DATA
CONSTRUCTORS
_edata = .;
复制代码
(5)紧接着以初始化的.data段的是.bss,未经初始化的内核数据段。
BSS_SECTION(0, 0, 0)
_end = .;
复制代码
相关文章推荐
- ARM架构内核启动分析-head.S(1.1、vmlinux.lds 链接脚本分析)
- arm-linux-ld命令 ld链接脚本(不错,推荐可以学习一些lds链接脚本文件)
- Linux内核链接文件分析(zz) -----vmlinux.lds文件链接文件
- Linux下的lds链接脚本
- linux下lds链接脚本详解
- 嵌入式Linux系统中的.lds链接脚本基础
- 嵌入式Linux系统中的.lds链接脚本基础
- Linux下的lds链接脚本基础
- Linux下的lds链接脚本简介(一)
- Linux链接脚本学习--lds
- *lds ----linux下的通用链接脚本
- linux 内核移植(四)——Makefile和链接脚本分析
- Linux下的lds链接脚本简介(一)
- Linux下的lds链接脚本详解
- u-boot中.lds链接脚本文件的分析
- ARM学习笔记020之LDS脚本链接文件
- Linux链接脚本学习--lds
- Linux下的lds链接脚本基础
- Linux下的lds链接脚本<一>
- Linux下的lds链接脚本基础