操作系统(一)-进程虚拟地址空间内存划分与布局
2022/6/26 5:21:45
本文主要是介绍操作系统(一)-进程虚拟地址空间内存划分与布局,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
虚拟空间内存划分
我们所写的程序通常是由指令和数据组成的,当执行 xxx.exe 时,程序先从磁盘上加载到内存中,但不是直接加载到物理内存。
以下基于 X86 32位 LINUX环境
虚拟的概念: 不存在,却看得见
虚拟地址空间实际上是内核创建的一系列的数据结构而已
空间默认划分两部分
- 用户空间:默认占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 都能看见
这篇关于操作系统(一)-进程虚拟地址空间内存划分与布局的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南