上文参考:http://www.cnblogs.com/long123king/p/3545991.html
先分析一下linker script的语法。
#ifdef CONFIG_X86_32
#define LOAD_OFFSET __PAGE_OFFSET
#else
#define LOAD_OFFSET __START_KERNEL_map
#endif
/* Text and read-only data */
.text : AT(ADDR(.text) - LOAD_OFFSET) {
_text = .;
/* bootstrapping code */
HEAD_TEXT
#ifdef CONFIG_X86_32
. = ALIGN(PAGE_SIZE);
*(.text..page_aligned)
#endif
. = ALIGN(8);
_stext = .;
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
ENTRY_TEXT
IRQENTRY_TEXT
*(.fixup)
*(.gnu.warning)
/* End of text section */
_etext = .;
} :text = 0x9090
这一段定义了.text section中的内容,AT(ADDR(.text) - LOAD_OFFSET)定义了这个section的LMA(Load Memory Address),说白了,而通过.定义的是VMA(Virtual Memory Address)。在x86平台,二者没有区别,都对应相对于加载起始点(LOAD_OFFSET,即0xC0000000, 3GB)的偏移地址。
:text = 0x9090指明这个.section要加载到text segment段中,0x9090指明了用于填充由于section对齐而产生的空隙。90是nop汇编语句。
我们看一下生成的内核映像文件vmlinux的布局
1: daniel@ubuntu:~/linux-3.0$ objdump vmlinux -h
2:
3: vmlinux: file format elf32-i386
4:
5: Sections:
6: Idx Name Size VMA LMA File off Algn
7: 0 .interp 00000013 08048114 08048114 00000114 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA
8: 1 .init.text 0000b35f 08049000 08049000 00001000 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE
9: 2 .gnu.hash 000002b0 08055000 08055000 0000d000 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
10: 3 .dynsym 00000b00 080552b0 080552b0 0000d2b0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
11: 4 .dynstr 00000622 08055db0 08055db0 0000ddb0 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA
12: 5 .gnu.version 00000160 080563d2 080563d2 0000e3d2 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA
13: 6 .gnu.version_r 000000a0 08056534 08056534 0000e534 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
14: 7 .rel.got 00000008 080565d4 080565d4 0000e5d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
15: 8 .rel.bss 00000010 080565dc 080565dc 0000e5dc 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
16: 9 .rel.plt 00000460 080565ec 080565ec 0000e5ec 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
17: 10 .init 0000002e 08056a4c 08056a4c 0000ea4c 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE
18: 11 .plt 000008d0 08056a80 08056a80 0000ea80 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE
19: 12 .text 0016bcb0 08057350 08057350 0000f350 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE
20: 13 .syscall_stub 000000cc 081c3000 081c3000 0017b000 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE
21: 14 .fini 0000001a 081c30cc 081c30cc 0017b0cc 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE
22: 15 .rodata 000592b0 081c4000 081c4000 0017c000 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA
23: 16 .eh_frame_hdr 00012554 0821d2b0 0821d2b0 001d52b0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
24: 17 __ksymtab 00004698 0822f808 0822f808 001e7808 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
25: 18 __ksymtab_gpl 00001598 08233ea0 08233ea0 001ebea0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
26: 19 __ksymtab_strings 0000c299 08235438 08235438 001ed438 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA
27: 20 __param 00000110 082416d4 082416d4 001f96d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
28: 21 __modver 0000081c 082417e4 082417e4 001f97e4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
29: 22 .note 00000044 08242000 08242000 001fa000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE
30: 23 __ex_table 00000130 08242044 08242044 001fa044 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA
31: 24 .uml.setup.init 00000090 08242178 08242178 001fa178 2**2 CONTENTS, ALLOC, LOAD, DATA
32: 25 .uml.help.init 00000064 08242208 08242208 001fa208 2**2 CONTENTS, ALLOC, LOAD, DATA
33: 26 .init.setup 000002ac 0824226c 0824226c 001fa26c 2**2 CONTENTS, ALLOC, LOAD, DATA
34: 27 .initcall.init 00000270 08243000 08243000 001fb000 2**2 CONTENTS, ALLOC, LOAD, DATA
35: 28 .con_initcall.init 00000004 08243270 08243270 001fb270 2**2 CONTENTS, ALLOC, LOAD, DATA
36: 29 .exitcall 0000005c 08243274 08243274 001fb274 2**2 CONTENTS, ALLOC, LOAD, DATA
37: 30 .uml.exitcall 00000024 082432d0 082432d0 001fb2d0 2**2 CONTENTS, ALLOC, LOAD, DATA
38: 31 .altinstructions 00000030 082432f4 082432f4 001fb2f4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
39: 32 .altinstr_replacement 0000000c 08243324 08243324 001fb324 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE
40: 33 .exit.text 000002c3 08243330 08243330 001fb330 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE
41: 34 init.data 00006ea0 08244000 08244000 001fc000 2**2 CONTENTS, ALLOC, LOAD, DATA
42: 35 .data 00014460 0824aea0 0824aea0 00202ea0 2**5 CONTENTS, ALLOC, LOAD, DATA
43: 36 .eh_frame 0009fbc0 0825f300 0825f300 00217300 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA
44: 37 .dynamic 000000d8 082feec0 082feec0 002b6ec0 2**2 CONTENTS, ALLOC, LOAD, DATA
45: 38 .ctors 00000008 082fef98 082fef98 002b6f98 2**2 CONTENTS, ALLOC, LOAD, DATA
46: 39 .dtors 00000008 082fefa0 082fefa0 002b6fa0 2**2 CONTENTS, ALLOC, LOAD, DATA
47: 40 .jcr 00000004 082fefa8 082fefa8 002b6fa8 2**2 CONTENTS, ALLOC, LOAD, DATA
48: 41 .got 00000240 082fefac 082fefac 002b6fac 2**2 CONTENTS, ALLOC, LOAD, DATA
49: 42 .bss 0000d464 082ff200 082ff200 002b71ec 2**5 ALLOC
50: 43 .comment 0000002a 00000000 00000000 002b71ec 2**0 CONTENTS, READONLY
51: 44 .gnu_debuglink 00000024 00000000 00000000 002b7216 2**0 CONTENTS, READONLY
52: 45 .debug_aranges 00005950 00000000 00000000 002b7240 2**3 CONTENTS, READONLY, DEBUGGING
53: 46 .debug_info 01322c32 00000000 00000000 002bcb90 2**0 CONTENTS, READONLY, DEBUGGING
54: 47 .debug_abbrev 000a2c21 00000000 00000000 015df7c2 2**0 CONTENTS, READONLY, DEBUGGING
55: 48 .debug_line 0016b63c 00000000 00000000 016823e3 2**0 CONTENTS, READONLY, DEBUGGING
56: 49 .debug_str 0008d834 00000000 00000000 017eda1f 2**0 CONTENTS, READONLY, DEBUGGING
57: 50 .debug_loc 002823be 00000000 00000000 0187b253 2**0 CONTENTS, READONLY, DEBUGGING
58: 51 .debug_ranges 00058c80 00000000 00000000 01afd618 2**3 CONTENTS, READONLY, DEBUGGING