深入理解程序的结构
Posted 阿弥陀佛.a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解程序的结构相关的知识,希望对你有一定的参考价值。
有初始值的变量存入data段
没有初始值的变量存入bss段
局部变量a、b存在栈中
最重要的是代码段:
广义上数据段包含:bss data rodata
实验:
指定入口函数为dt_main,且不使用相关库函数
使用objdump查看段信息,可以发现有代码段,没有数据段
修改代码:
再次objdump -h
g_no_value、c_no_value都是4个字节大小,所以bss段有8字节
同理data段也是8字节
下面将c_no_value改成静态char型:
再次objdump -h,发现bss段还是8字节,为啥呢?因为字节对齐知识点,去看C语言进阶知识点
再次改进:
objdump -h后发现bss段占4字节,编译器默认4字节对齐,所以一共大小是2,但是默认是4
可以发现dt_main函数的入口地址与text段一致
证明函数编译之后进入代码段
main函数隶属于一个线程(主线程)
传统读文件:先从硬盘拷贝到内核,由于用户不能直接访问内核空间的内存,只能先拷贝出来再访问:
先记录哪一段内存空间与文件映射起来,指针ptr只是从逻辑指向内存空间,然后读一个字节,去访问物理内存(能否访问得到要看MMU),此时MMU去查指针虚拟内存是否映射到物理内存,肯定查不到,因为映射只是逻辑映射,没有怎么办?
操作系统登场,ptr指针之前已经建立映射了,映射到文件,操作系统先开辟一段物理内存空间,将文件内容载入内存,那么ptr保存的虚拟地址对应的物理地址就有了,于是映射过来,那么就可以读文件内容了。文件内容载入心内才能是在中断程序里进行载入的:
上面两张图对比:下面这张只拷贝一次,上面的那张(传统读文件方式)拷贝两次
最下面白色保留给操作系统
0x08048000是代码段,上面是data段,bss段,堆(Heap),bss和Heap中间白色的是随即偏移,堆的起始地址是随机的(为了安全)
上面是内存映射段,起始地址也是随机的,为了安全
上面是栈,起始地址也是随机的,也是为了安全(如果是固定的,那么我们可以访问任意的栈帧信息,如果做恶意修改,随意的话就增加了破坏的难度了)
注意他们的增长方向
上面的Kernel space是内核空间
以上是关于深入理解程序的结构的主要内容,如果未能解决你的问题,请参考以下文章