进程的虚拟内存

news/2024/7/20 15:17:59 标签: 内存管理

本文将以实验角度来认识进程的虚拟地址空间。

进程的虚拟地址空间就是进程如何在内存中存放的逻辑视图。通常该视图为进程从某一逻辑地址(如弟子0)开始,连续存放,如下图。物理地址可以按页帧来组织,且分配给进程的物理页帧也可能不是连续的。这就需要内存管理单元(MMU)将逻辑页映射到内存的物理页帧。

这里写图片描述

  1. Code segment: 存储除去共享库的静态代码
  2. Data segment : 存储除去共享库的全局变量
  3. Stack segment : 存储局部变量包括函数参数,也称为调用栈
  4. Heap segment, : 存储动态申请的变量

We will run a simple program and observe its memory layout.

我们写一个简单的程序来观测它的虚拟内存布局。

#include<stdio.h>    
int main(int argc, char *argv[]){
    printf("hello\n");
    getchar();
    return 0;
}
  1. 编译 gcc -o hello hello.c
  2. 执行 ./hello
  3. Ctrl Z 挂起程序
  4. cat /proc/ $(pgrep hello)/maps 查看虚拟内存空间布局

结果如下图所示:

这里写图片描述

00400000-00401000 r-xp 00000000 08:06 2490469 /home/susu/workspace/2015_OS_hw3/partA/hello.out

参数的涵义依次如下:

  • start, end
  • permision
  • inode, image, offset
  • major, minor

代码段&数据段

我们可以通过权限来区分虚拟内存区域。代码段一般有读与可执行权限,数据段会有读写权限。

代码段和数据段都是 0x1000 bytes,意味这它们在内存段中都只有一个 4KB 页。

下面分别表示代码段和数据段

00400000-00401000 r-xp 00000000 08:06 2490469          /home/susu/workspace/2015_OS_hw3/partA/hello.out
00600000-00601000 rw-p 00000000 08:06 2490469          /home/susu/workspace/2015_OS_hw3/partA/hello.out

栈段

栈段有读写权限与数据段相同

segment size = 0x7ffdf1cb1000 - 0x7ffdf1c90000 = 0x21000, 因此它由33个 4KB 页组成。

7ffdf1c90000-7ffdf1cb1000 rw-p 00000000 00:00 0        [stack]

共享内存段

共享内存段只有读权限

7fde68109000-7fde682a4000 r-xp 00000000 08:06 8787453  /usr/lib/libc-2.22.so
7fde682a4000-7fde684a3000 ---p 0019b000 08:06 8787453  /usr/lib/libc-2.22.so
7fde684a3000-7fde684a7000 r--p 0019a000 08:06 8787453  /usr/lib/libc-2.22.so
7fde684a7000-7fde684a9000 rw-p 0019e000 08:06 8787453  /usr/lib/libc-2.22.so
7fde684a9000-7fde684ad000 rw-p 00000000 00:00 0
7fde684ad000-7fde684cf000 r-xp 00000000 08:06 8787452  /usr/lib/ld-2.22.so
7fde68691000-7fde68694000 rw-p 00000000 00:00 0
7fde686cc000-7fde686ce000 rw-p 00000000 00:00 0
7fde686ce000-7fde686cf000 r--p 00021000 08:06 8787452  /usr/lib/ld-2.22.so
7fde686cf000-7fde686d0000 rw-p 00022000 08:06 8787452  /usr/lib/ld-2.22.so

lib.c 是标准 C 库,包含函数 printf(), fopen() 的实现。

ld.so 是动态链接装载器库,用来加载其他的共享库。


http://www.niftyadmin.cn/n/941490.html

相关文章

Linux 无 root 权限安装 zsh

神器 zsh 不解释&#xff0c;谁用谁知道。 下面介绍如何在无 root 权限的远程服务器上安装使用 zsh。 download mkdir ~/tmp cd ~/tmp wget http://sourceforge.net/projects/zsh/files/zsh/5.0.7/zsh-5.0.7.tar.gz/download解压 tar xzvf zsh-5.0.7.tar.gz编译 cd ~/tmp/zsh…

win32 程序开启控制台输出信息

在调试一个 win32 程序的时候&#xff0c;希望从 console 输出一些调试信息。 解决方案&#xff1a; AllocConsole(); freopen("conout$","w",stdout) ; printf("hello hplonline!-_-\n") ; std::cout<<"im cout"<<std:…

openGL 在光源处画一个球,移动光源

下面只谈在光源处画球与移动光源的方法&#xff0c;不贴全部代码&#xff0c;所有具体代码以及教程见我的 github : https://github.com/David-Guo/OpenGLTrain/tree/master/hw3%28Buffer%29 在光源处画球 // postion[3] 为光源所在坐标 glPushMatrix(); glDisable(GL_LIGHT…

matlab实现基于PCA的人脸识别算法

完整代码见我的 Github&#xff1a; face_recongnize 如果觉得有趣或对你有帮助&#xff0c;欢迎 star & fork 一、问题描述 在一个yale人脸库中&#xff0c;有15个人&#xff0c;每人有11幅图像。要求选定每一个人的若干幅图像组成样本库&#xff0c;由样本库得到特征库…

MATLAB 可以做什么有趣的事

图像处理&#xff08;人脸识别&#xff09; 从test文件夹任选一张人脸分类器会自动从train文件夹里面搜索出最接近的人像使用PCA降维和最小距离分类器&#xff0c;分类效果还不错算法比较简单&#xff0c;有线性代数知识就能理解&#xff0c;这里不多介绍&#xff08;如果有一定…

VS project 根目录 配置OpenGL 相关库

常用的 OpenGL 库有 glut glew glm 。 下面我们使用 VS 来为一个单一的 solution 配置这些库&#xff0c;作为一个独立的代码 repo&#xff0c;如此一来在任意机器上下载该 repo 使用高版本的 VS 都能编译通过&#xff0c;而不用重新再新的机器上配置相关库。 注意&#xff0…

ubuntu sublime 等宽字体设置

在ubuntu 14.04上会出现一个空格只有半个字符的超级dt的现象&#xff0c;一按tab就日了狗。 例如下面的 sublime 打开的 html 文件&#xff1a; 仔细看鼠标光标高亮部分的四个空格&#xff0c;占据的空间居然只有普通字符的一半&#xff0c;简直令人拽狂&#xff01;&#xff…

gzip: stdin: invalid compressed data--format violated 解决

使用 tar 命令出现如下错误&#xff1a; gzip: stdin: invalid compressed data--format violated tar: Child returned status 1 tar: Error is not recoverable: exiting now第一次遇到这种问题&#xff0c;还以为是文件损坏了&#xff0c;结果把那个3.1G 的压缩文件又重新下…