上文参考: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. 1: daniel@ubuntu:~/linux-3.0$ objdump vmlinux -h

  1. 2: 

  1. 3: vmlinux: file format elf32-i386

  1. 4: 

  1. 5: Sections:

  1. 6: Idx Name Size VMA LMA File off Algn

  1. 7: 0 .interp 00000013 08048114 08048114 00000114 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 8: 1 .init.text 0000b35f 08049000 08049000 00001000 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 9: 2 .gnu.hash 000002b0 08055000 08055000 0000d000 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 10: 3 .dynsym 00000b00 080552b0 080552b0 0000d2b0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 11: 4 .dynstr 00000622 08055db0 08055db0 0000ddb0 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 12: 5 .gnu.version 00000160 080563d2 080563d2 0000e3d2 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 13: 6 .gnu.version_r 000000a0 08056534 08056534 0000e534 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 14: 7 .rel.got 00000008 080565d4 080565d4 0000e5d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 15: 8 .rel.bss 00000010 080565dc 080565dc 0000e5dc 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 16: 9 .rel.plt 00000460 080565ec 080565ec 0000e5ec 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 17: 10 .init 0000002e 08056a4c 08056a4c 0000ea4c 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 18: 11 .plt 000008d0 08056a80 08056a80 0000ea80 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 19: 12 .text 0016bcb0 08057350 08057350 0000f350 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 20: 13 .syscall_stub 000000cc 081c3000 081c3000 0017b000 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 21: 14 .fini 0000001a 081c30cc 081c30cc 0017b0cc 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 22: 15 .rodata 000592b0 081c4000 081c4000 0017c000 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 23: 16 .eh_frame_hdr 00012554 0821d2b0 0821d2b0 001d52b0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 24: 17 __ksymtab 00004698 0822f808 0822f808 001e7808 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 25: 18 __ksymtab_gpl 00001598 08233ea0 08233ea0 001ebea0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 26: 19 __ksymtab_strings 0000c299 08235438 08235438 001ed438 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 27: 20 __param 00000110 082416d4 082416d4 001f96d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 28: 21 __modver 0000081c 082417e4 082417e4 001f97e4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 29: 22 .note 00000044 08242000 08242000 001fa000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 30: 23 __ex_table 00000130 08242044 08242044 001fa044 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 31: 24 .uml.setup.init 00000090 08242178 08242178 001fa178 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 32: 25 .uml.help.init 00000064 08242208 08242208 001fa208 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 33: 26 .init.setup 000002ac 0824226c 0824226c 001fa26c 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 34: 27 .initcall.init 00000270 08243000 08243000 001fb000 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 35: 28 .con_initcall.init 00000004 08243270 08243270 001fb270 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 36: 29 .exitcall 0000005c 08243274 08243274 001fb274 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 37: 30 .uml.exitcall 00000024 082432d0 082432d0 001fb2d0 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 38: 31 .altinstructions 00000030 082432f4 082432f4 001fb2f4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 39: 32 .altinstr_replacement 0000000c 08243324 08243324 001fb324 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 40: 33 .exit.text 000002c3 08243330 08243330 001fb330 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE

  1. 41: 34 init.data 00006ea0 08244000 08244000 001fc000 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 42: 35 .data 00014460 0824aea0 0824aea0 00202ea0 2**5 CONTENTS, ALLOC, LOAD, DATA

  1. 43: 36 .eh_frame 0009fbc0 0825f300 0825f300 00217300 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA

  1. 44: 37 .dynamic 000000d8 082feec0 082feec0 002b6ec0 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 45: 38 .ctors 00000008 082fef98 082fef98 002b6f98 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 46: 39 .dtors 00000008 082fefa0 082fefa0 002b6fa0 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 47: 40 .jcr 00000004 082fefa8 082fefa8 002b6fa8 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 48: 41 .got 00000240 082fefac 082fefac 002b6fac 2**2 CONTENTS, ALLOC, LOAD, DATA

  1. 49: 42 .bss 0000d464 082ff200 082ff200 002b71ec 2**5 ALLOC

  1. 50: 43 .comment 0000002a 00000000 00000000 002b71ec 2**0 CONTENTS, READONLY

  1. 51: 44 .gnu_debuglink 00000024 00000000 00000000 002b7216 2**0 CONTENTS, READONLY

  1. 52: 45 .debug_aranges 00005950 00000000 00000000 002b7240 2**3 CONTENTS, READONLY, DEBUGGING

  1. 53: 46 .debug_info 01322c32 00000000 00000000 002bcb90 2**0 CONTENTS, READONLY, DEBUGGING

  1. 54: 47 .debug_abbrev 000a2c21 00000000 00000000 015df7c2 2**0 CONTENTS, READONLY, DEBUGGING

  1. 55: 48 .debug_line 0016b63c 00000000 00000000 016823e3 2**0 CONTENTS, READONLY, DEBUGGING

  1. 56: 49 .debug_str 0008d834 00000000 00000000 017eda1f 2**0 CONTENTS, READONLY, DEBUGGING

  1. 57: 50 .debug_loc 002823be 00000000 00000000 0187b253 2**0 CONTENTS, READONLY, DEBUGGING

  1. 58: 51 .debug_ranges 00058c80 00000000 00000000 01afd618 2**3 CONTENTS, READONLY, DEBUGGING

  1. 1: daniel@ubuntu:~/linux-3.0$ readelf -S vmlinux

  1. 2: There are 56 section headers, starting at offset 0x1b564bc:

  1. 3: 

  1. 4: Section Headers:

  1. 5: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al

  1. 6: [ 0] NULL 00000000 000000 000000 00 0 0 0

  1. 7: [ 1] .interp PROGBITS 08048114 000114 000013 00 A 0 0 1

  1. 8: [ 2] .init.text PROGBITS 08049000 001000 00b35f 00 AX 0 0 1

  1. 9: [ 3] .gnu.hash GNU_HASH 08055000 00d000 0002b0 04 A 4 0 4

  1. 10: [ 4] .dynsym DYNSYM 080552b0 00d2b0 000b00 10 A 5 1 4

  1. 11: [ 5] .dynstr STRTAB 08055db0 00ddb0 000622 00 A 0 0 1

  1. 12: [ 6] .gnu.version VERSYM 080563d2 00e3d2 000160 02 A 4 0 2

  1. 13: [ 7] .gnu.version_r VERNEED 08056534 00e534 0000a0 00 A 5 2 4

  1. 14: [ 8] .rel.got REL 080565d4 00e5d4 000008 08 A 4 42 4

  1. 15: [ 9] .rel.bss REL 080565dc 00e5dc 000010 08 A 4 43 4

  1. 16: [10] .rel.plt REL 080565ec 00e5ec 000460 08 A 4 12 4

  1. 17: [11] .init PROGBITS 08056a4c 00ea4c 00002e 00 AX 0 0 4

  1. 18: [12] .plt PROGBITS 08056a80 00ea80 0008d0 04 AX 0 0 16

  1. 19: [13] .text PROGBITS 08057350 00f350 16bcb0 00 AX 0 0 16

  1. 20: [14] .syscall_stub PROGBITS 081c3000 17b000 0000cc 00 AX 0 0 1

  1. 21: [15] .fini PROGBITS 081c30cc 17b0cc 00001a 00 AX 0 0 4

  1. 22: [16] .rodata PROGBITS 081c4000 17c000 0592b0 00 A 0 0 32

  1. 23: [17] .eh_frame_hdr PROGBITS 0821d2b0 1d52b0 012554 00 A 0 0 4

  1. 24: [18] __ksymtab PROGBITS 0822f808 1e7808 004698 00 A 0 0 4

  1. 25: [19] __ksymtab_gpl PROGBITS 08233ea0 1ebea0 001598 00 A 0 0 4

  1. 26: [20] __ksymtab_strings PROGBITS 08235438 1ed438 00c299 00 A 0 0 1

  1. 27: [21] __param PROGBITS 082416d4 1f96d4 000110 00 A 0 0 4

  1. 28: [22] __modver PROGBITS 082417e4 1f97e4 00081c 00 A 0 0 4

  1. 29: [23] .note NOTE 08242000 1fa000 000044 00 AX 0 0 4

  1. 30: [24] __ex_table PROGBITS 08242044 1fa044 000130 00 A 0 0 1

  1. 31: [25] .uml.setup.init PROGBITS 08242178 1fa178 000090 00 WA 0 0 4

  1. 32: [26] .uml.help.init PROGBITS 08242208 1fa208 000064 00 WA 0 0 4

  1. 33: [27] .init.setup PROGBITS 0824226c 1fa26c 0002ac 00 WA 0 0 4

  1. 34: [28] .initcall.init PROGBITS 08243000 1fb000 000270 00 WA 0 0 4

  1. 35: [29] .con_initcall.ini PROGBITS 08243270 1fb270 000004 00 WA 0 0 4

  1. 36: [30] .exitcall PROGBITS 08243274 1fb274 00005c 00 WA 0 0 4

  1. 37: [31] .uml.exitcall PROGBITS 082432d0 1fb2d0 000024 00 WA 0 0 4

  1. 38: [32] .altinstructions PROGBITS 082432f4 1fb2f4 000030 00 A 0 0 4

  1. 39: [33] .altinstr_replace PROGBITS 08243324 1fb324 00000c 00 AX 0 0 1

  1. 40: [34] .exit.text PROGBITS 08243330 1fb330 0002c3 00 AX 0 0 1

  1. 41: [35] init.data PROGBITS 08244000 1fc000 006ea0 00 WA 0 0 4

  1. 42: [36] .data PROGBITS 0824aea0 202ea0 014460 00 WA 0 0 32

  1. 43: [37] .eh_frame PROGBITS 0825f300 217300 09fbc0 00 A 0 0 4

  1. 44: [38] .dynamic DYNAMIC 082feec0 2b6ec0 0000d8 08 WA 5 0 4

  1. 45: [39] .ctors PROGBITS 082fef98 2b6f98 000008 00 WA 0 0 4

  1. 46: [40] .dtors PROGBITS 082fefa0 2b6fa0 000008 00 WA 0 0 4

  1. 47: [41] .jcr PROGBITS 082fefa8 2b6fa8 000004 00 WA 0 0 4

  1. 48: [42] .got PROGBITS 082fefac 2b6fac 000240 04 WA 0 0 4

  1. 49: [43] .bss NOBITS 082ff200 2b71ec 00d464 00 WA 0 0 32

  1. 50: [44] .comment PROGBITS 00000000 2b71ec 00002a 01 MS 0 0 1

  1. 51: [45] .gnu_debuglink PROGBITS 00000000 2b7216 000024 00 0 0 1

  1. 52: [46] .debug_aranges PROGBITS 00000000 2b7240 005950 00 0 0 8

  1. 53: [47] .debug_info PROGBITS 00000000 2bcb90 1322c32 00 0 0 1

  1. 54: [48] .debug_abbrev PROGBITS 00000000 15df7c2 0a2c21 00 0 0 1

  1. 55: [49] .debug_line PROGBITS 00000000 16823e3 16b63c 00 0 0 1

  1. 56: [50] .debug_str PROGBITS 00000000 17eda1f 08d834 01 MS 0 0 1

  1. 57: [51] .debug_loc PROGBITS 00000000 187b253 2823be 00 0 0 1

  1. 58: [52] .debug_ranges PROGBITS 00000000 1afd618 058c80 00 0 0 8

  1. 59: [53] .shstrtab STRTAB 00000000 1b56298 000223 00 0 0 1

  1. 60: [54] .symtab SYMTAB 00000000 1b56d7c 04e810 10 55 13787 4

  1. 61: [55] .strtab STRTAB 00000000 1ba558c 060090 00 0 0 1

  1. 62: Key to Flags:

  1. 63: W (write), A (alloc), X (execute), M (merge), S (strings)

  1. 64: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)

  1. 65: O (extra OS processing required) o (OS specific), p (processor specific)

  1. 1: daniel@ubuntu:~/linux-3.0$ readelf -s vmlinux | grep _stext

  1. 2: 16700: 08049000 0 NOTYPE GLOBAL DEFAULT ABS _stext

  1. 3: daniel@ubuntu:~/linux-3.0$ readelf -s vmlinux | grep _etext

  1. 4: 17219: 081c30e6 0 NOTYPE GLOBAL DEFAULT ABS _etext

  1. 5: daniel@ubuntu:~/linux-3.0$ readelf -s vmlinux | grep _sdata

  1. 6: 14535: 081c4000 0 NOTYPE GLOBAL DEFAULT ABS _sdata

  1. 7: daniel@ubuntu:~/linux-3.0$ readelf -s vmlinux | grep _edata

  1. 8: 19451: 082ff1ec 0 NOTYPE GLOBAL DEFAULT ABS _edata

因此,内核中的.text section被加载到0x08049000~0x081c30e6范围内,而.data section被加载到0x081c4000~0x082ff1ec范围内,这里面的地址都是指物理地址。

/* 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

而内核代码段的各个子section,比如HEAD_TEXT, TEXT_TEXT……IRQENTRY_TEXT都按顺序排列在0x08049000~0x081c30e6物理地址范围内。

Linux内核代码布局的更多相关文章

  1. [转] Linux内核代码风格 CodingStyle [CH]

    from:http://blog.csdn.net/jiang_dlut/article/details/8163731 中文版维护者: 张乐 Zhang Le <r0bertz@gentoo. ...

  2. 从linux内核代码分析操作系统启动过程

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在本次的实验中, ...

  3. 第三次阅读赵炯博士的《linux内核代码完全注释》:序

    这是我第三次阅读linux内核代码完全注释了,当然前两次也没有读完,第一次读到第五章,第二次第七章. 所以说,赵炯博士对我最大的帮助时介绍了intel386的结构,以及内核编程的方法. 至于真正的内核 ...

  4. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  5. win7 变WIFI热点 & 在线Linux 内核代码

    https://daniel.haxx.se/docs/sshproxy.html netsh wlan set hostednetwork mode=allow ssid=mywifi  key=1 ...

  6. linux内核代码的编写初步以及makefile的配置

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  7. Linux学习笔记:【004】Linux内核代码风格

    Chinese translated version of Documentation/CodingStyle   If you have any comment or update to the c ...

  8. Linux内核代码

    全局描述符表GDT(Global Descriptor Table): (1)在整个系统中,全局描述符表(注意这里是表,表只有一张)GDT只有一张(一个处理器对应一个GDT). (2)GDT可以被放在 ...

  9. linux内核代码注释 赵炯 第三章引导启动程序

    linux内核代码注释 第三章引导启动程序 boot目录中的三个汇编代码文件   bootsect.s和setup.s采用近似intel的汇编语法,需要8086汇编器连接器as86和ld86 head ...

随机推荐

  1. 97、PageRank算法学习

    最近由于.......你懂得,需要一些搜索方面的知识,于是乎我重新复习了一下上半年读的那本书<数学之美>Dr吴军老师写的. 感觉读完这种书还是写一下比较好,因为将来说不定就会忘记了. 接下 ...

  2. 5、java操作xml,dom4j

    . 1.首先在项目路径下引入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar包,jaxp方式解析xml文件 <?xml version="1.0" e ...

  3. Nginx网络架构实战学习笔记(二):编译PHP并与nginx整合、安装ecshop、商城url重写实战

    文章目录 编译PHP并与nginx整合 安装ecshop(这是一个多年前php的项目貌似,作为java开发的我暂时不去关心) 商城url重写实战 编译PHP并与nginx整合 安装mysql yum ...

  4. VEX IR语言语法

    /*---------------------------------------------------------------*//*--- High-level IR description - ...

  5. EOJ 1127. 多边形面积(计算几何)

    题目链接:1127. 多边形面积(计算几何) 题意 按逆时针顺序给出 \(n\) 个点的坐标,求这些点围成的多边形的面积. 思路 选择多边形上的一个点,然后每次枚举之后的两个点,计算叉积,注意要保留符 ...

  6. git和svn的比较

    当前的市场上主流的两种项目开发版本控制软件就是Git和SVN,那么这二者到底有什么区别呢? 在我们公司,其实两个都用,跟对个人体验,我觉得两者差不多,都是进行代码的版本管理. 我觉得1.由于我是实习生 ...

  7. git操作的日常用法

    参考博客:  https://blog.csdn.net/afei__/article/details/51567155# 最近一段时间总结一些git在个人日常开发当中用到的方法, 并记录下来, 同时 ...

  8. centors7 和 win7 修改开机顺序

    打开/boot/grub2/grub.cfg,找到windows对应的项 我的是 Windows 7 (loader) (on /dev/sda1) 执行命令 grub2-set-default &q ...

  9. A 小G数数

    题目链接 题解: 此题可以直接暴力求解,(甚至可以四层循环 具体思想便是a[k]充当两种身份,同时判断两种不同情况,然后计数便可以了 /** /*@author victor /*language c ...

  10. safari 调试iPhone web页面

    safari设置-打开Safari偏好者设置,选中“高级菜单”,在页面最下方看到“在菜单中显示开发菜单”的复选框,在复选框内打钩,这样设置完毕就能在Safari菜单中看到开发菜单了 iPhone 设置 ...