Linux内核源码分析 (B.x)Linux内存布局

一、32位系统的内存布局

Linux内核源码分析 (B.x)Linux内存布局_第1张图片

  • 为什么要将进程地址空间划分成内核空间和用户空间?
    • 这个和处理器的体系结构有关。比如X86分为ring0~ring3级别,ring0给内核空间使用,ring3给用户空间使用;同样的,ARMv7也是如此,svc给内核使用,user级别给用户程序使用的。
  • 所有进程共享内存空间,但各自都独立享用用户空间,给每个进程提供了一个自己占用整个进程地址空间的假象。
  • 线性映射区跟物理内存之间的转换非常方便,只需要添加一个偏移量即可。线性映射区也被成为低端内存,除线性映射区外的内核空间为高端内存
  • vmalloc保证虚拟地址是连续的,不保证分配的物理页面的地址是连续的。
  • mmap空间用来映射文件和大段的匿名页面等,当内存分配大段的内存页面时,libc会偏向使用mmap来分配进程地址空间

二、进程的角度来看内存布局

Linux内核源码分析 (B.x)Linux内存布局_第2张图片
Linux内核源码分析 (B.x)Linux内存布局_第3张图片

  • .init段:程序初始化代码段
  • .text段:程序编译完成后的机器指令
  • .data段:已经初始化过的全局变量和静态变量
  • .bss段:保存没有初始化过的全局变量和静态变量

Linux内核源码分析 (B.x)Linux内存布局_第4张图片

  • 该实例描述程序头描述elf文件如何被os映射到进程的虚拟地址空间的。
  • 观察发现第一个段中有.init段和.text段, 可读可执行
  • 观察发现第二个段中有 .data段和.bss段, 可读可写

Linux内核源码分析 (B.x)Linux内存布局_第5张图片

  • 这里是将进程跑起来之后对应的效果。

Linux内核源码分析 (B.x)Linux内存布局_第6张图片

三、64位系统的内存布局图

Linux内核源码分析 (B.x)Linux内存布局_第7张图片

你可能感兴趣的:(Linux内核源码分析,linux,运维,服务器)