ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

操作系统(一)-进程虚拟地址空间内存划分与布局

2022-06-25 10:32:43  阅读:168  来源: 互联网

标签:操作系统 int 虚拟地址 bss static 内核 空间 内存


虚拟空间内存划分

我们所写的程序通常是由指令和数据组成的,当执行 xxx.exe 时,程序先从磁盘上加载到内存中,但不是直接加载到物理内存

以下基于 X86 32位 LINUX环境

image

虚拟的概念: 不存在,却看得见
虚拟地址空间实际上是内核创建的一系列的数据结构而已

空间默认划分两部分

  • 用户空间:默认占3G
    • 预留空间:不能访问;比如空指针:char* p = nullptr; strlen(p);
    • .text:运行的指令代码段; 只能读不能写;
    • .rodata (read only):只读数据段;只能读不能写; 如:char *p = "hello world";(指针指向常量字符串)
    • .data : 初始化、初始化不为0
    • .bss :未初始化、初始化为0
    • .heap:堆内存;从低地址到高地址;
    • 加载共享库 .dll(win) .so(lin)
    • stack:栈空间;函数运行时,每个线程独有的;从高地址到低地址
    • 命令行参数和环境变量:./a.out 192.168.1.100 9090
  • 内核空间:默认占1G
    • ZONE_DMA 16M
    • ZONE_NORMAL 800M 内核空间的进程控制块、内核函数、内核栈空间
    • ZONE_HIGHMEM 高端内存,地址映射

推荐《深入理解计算机系统》第七章链接重点多读

代码分析:

#include <iostream>

//全局变量不管静态还是动态都属于数据
//编译时都会产生符号
int gdata1 = 10;	//.data
int gdata2 = 0;		//.bss
int gdata3;		//.bss

static int gdata4 = 11;	//.data
static int gdata5 = 0;	//.bss
static int gdata6;	//.bss

int main(int argc, char const *argv[])
{
	// mov dword ptr[a], 0Ch 
	// 对应三个mov指令,不产生符号
	int a = 12;	//.text
	int b = 0;	//.text
	int c;		//.text 一定不为0 栈上的无效值

        //静态局部变量,运行时初始化
	static int e = 13;	//.data
	static int f = 0;	//.bss
	static int g;		//.bss 一定为0 内核起来后会把.bss清零

	return 0;
}



进程通信方式

每一个进程的用户空间是私有的,但是内核空间是共享的

进程之间靠匿名管道通信
内核空间划分了一块内存,进程1 往内核内存中写了数据,进程2和3 都能看见

标签:操作系统,int,虚拟地址,bss,static,内核,空间,内存
来源: https://www.cnblogs.com/anqwjoe/p/16391709.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有