深入理解程序的结构

在这里插入图片描述
在这里插入图片描述
有初始值的变量存入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是内核空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值