【CO003】操作系统笔记5 —— 内存管理分配

笔者:YY同学

生命不息,代码不止。好玩的项目尽在GitHub



内存区域由五部分组成:Text segment,Data segment,BSS,Stack 和 Heap。

Text segment(包含代码和常量)

  • 只可读
  • 运行期间不能更改值
  • 只能存取一个固定的特值
  • 通过地址/指针访问 (pointers)

在这里插入图片描述


Data segment(初始化的全局变量和静态变量)

  • 程序运行时才分配内存
  • 挨个存储(地址 +4 或 -4)
  • 地址 size 不同,根据声明大小而定
  • 全局 array 大小最大上限为 2G
  • 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel

在这里插入图片描述


BSS(未初始化的全局变量和静态变量)

  • 程序运行时才分配内存
  • 挨个存储(地址 +4 或 -4)
  • 地址 size 相同
  • 全局 array 大小最大上限为 2G
  • 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel

在这里插入图片描述


Stack(所有局部变量,所有函数参数,program 参数以及环境变量)

  • 32-bit Linux 中 Stack 的大小是 10Mb
  • 以 function 为界而不是 kernel,每当 function 调用时分配栈空间,当 function 返回时销毁栈空间
  • 使用 push-pop-stack
    • 局部变量动态大小
    • 栈计算取决于参数数量、局部变量数量以及嵌套函数的数量
    • 编译阶段无法评估栈大小(取决于 function 数量、用户输入、state 等条件)
  • kernel 为栈保留足够空间
  • 调用时把变量、参数等压入栈内,返回时将其取出
  • Intel 处理器会把返回值存入寄存器 EAX,返回函数结果时读取寄存器内的值
  • 当 main 函数 return 的时候,调用 exit() system call 结束程序

在这里插入图片描述


Heap(动态内存)

  • 动态内存,由 malloc(stdlib.h)申请获得
    • Dynamic: not defined at compile time
    • Allocated: if you don’t raise your hands and ask for something, you will be allocated nothing
  • malloc() 函数请求分配内存,开拓 heap 存储空间,其本质是调用 brk() system call 申请内存,但是 brk() 不知道具体需要申请多少(只管申请),brk() 本身也具备良好的缩放性
  • free() 函数释放内存,压缩 heap 空间或者创建一个 free blocks 的 list
  • allocates the space required by malloc(). But, it doesn’t care how malloc() uses the space
  • 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel

在这里插入图片描述
在这里插入图片描述


Segmentation Fault

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值