好好看!
我们首先要了解代码文件的编译运行分为四步:
预编译:1.将所有的“#define”删除,并展开所有的宏定义
2.处理所有的条件编译指令,如“#if”、“#ifdef”、“elif”、“else”、“#endif”
3.处理“#include”指令,将被包含的文件插入到该预编译指令的位置
4.删除所有注释“//”、和“*/”、“/*”
5.添加行号和文件名标识
6.保留所有的#pragma编译器指令
编译:词法分析、语法分析、语义分析、代码优化
汇编:指令翻译成二进制
链接:合并段和符号表、符号解析、分配地址和空间、符号重定位
我们了解一下symtab符号表
强符号:全局已初始化的符号
弱符号:全局未初始化的符号
强弱符号的规则:
1.两个强符号 重定位错误
2.一强一弱 选强符号
3.两个弱符号 选数据较大的
强符号放*COM* 弱符号放*UND*
符号解析:在外部符号应用的地方找到符号定义的地方
然后我们来看上图:
首先我们看用户空间,用户空间两个段存放数据: .data .bss
.data段 : 放已初始化且初始化不为0的数据
.bss段: 未初始化或初始化为0的数据
之后是内核部分: DMA 16M 直接内存访问
NORMAL 892M 内核映射结构体
HIGHMEN 116M 高端内存