Linux-程序地址空间
目录
1. 程序地址空间分布
2. 两个问题
3. 虚拟地址和物理地址
4. 页表
5. 解决问题
6. 为什么要有地址空间
1. 程序地址空间分布

测试一下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>int gal_init = 1;
int gal_uninit;int main(int argc, char* argv[], char* env[])
{printf("code add:%p\n",main);const char* str = "hello";printf("str add:%p\n",str);printf("init global add:%p\n",&gal_init);printf("uninit global add:%p\n",&gal_uninit);char* heap1 = (char*)malloc(10);char* heap2 = (char*)malloc(10);char* heap3 = (char*)malloc(10);char* heap4 = (char*)malloc(10);printf("heap1 add:%p\n",heap1);printf("heap2 add:%p\n",heap2);printf("heap3 add:%p\n",heap3);printf("heap4 add:%p\n",heap4);printf("stack1 add:%p\n",&heap1);printf("stack2 add:%p\n",&heap2);printf("stack3 add:%p\n",&heap3);printf("stack4 add:%p\n",&heap4);int i = 0;for(;i < argc; ++i){printf("%s:%p\n",argv[i],&argv[i]);}printf("env add:%p\n",env);return 0;
}
运行结果:
| code add | 0x40057d |
| int a add | 0x7ffc2b16df7c |
| static int b add | 0x601044 |
| str add | 0x40081d |
| init global add | 0x60103c |
| uninit global add | 0x601048 |
| heap1 add | 0x2301010 |
| heap2 add | 0x2301030 |
| heap3 add | 0x2301050 |
| heap4 add | 0x2301070 |
| stack1 add | 0x7ffc2b16df70 |
| stack2 add | 0x7ffc2b16df68 |
| stack3 add | 0x7ffc2b16df60 |
| stack4 add | 0x7ffc2b16df58 |
| ./myproc | 0x7ffc2b16e078 |
| env add | 0x7ffc2b16e088 |
这些都是之前就了解过的内容,今天详细聊聊地址空间
2. 两个问题
1. 安全问题:
这些程序都在同一个地址空间中,如果发生了越界访问,野指针问题,这些问题该怎么办?
2. 一个特殊现象问题:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main()
{int num = 0;int ret = fork();if(ret == 0){int i = 3;while(i--){printf("I am child,num = %d,&num = %p\n",num,&num);sleep(1); }num = 1;while(1){printf("I am child,num = %d,&num = %p\n",num,&num);sleep(1);}}else{while(1){printf("I am father,num = %d,&num = %p\n",num,&num);sleep(1);}}return 0;
}

为什么父进程和子进程中的num同一个地址,但是却有两个值?
3. 虚拟地址和物理地址
在Linux地址下,这种地址叫做 虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!
物理地址,用户一概看不到,由OS统一管理
由OS负责将 虚拟地址 转化成 物理地址
上面的地址空间分布就是虚拟地址,每个进程被创建,就会有对应的虚拟地址表
虚拟地址表在linux下就是由mm_struct结构体来描述的
Linux下的进程管理PCB:task_struct就有一个指针指向mm_struct,程序和虚拟地址空间联系起来了

4. 页表
OS是如何把虚拟地址转换成物理地址的呢?
页表
页表是一种key-value的数据结构,记录虚拟地址和物理地址一一映射关系
task_struck有一个指针指向页表
页表里的值(虚拟地址,物理地址)是哪里来的呢?

代码在被编译器编译后的每一条语句每一个函数都会有对应的地址,这个地址是逻辑地址,和虚拟地址一样,作为页表的虚拟地址。当程序被加载到物理内存中时,就会有对应的物理地址,然后在对应到页表里面。
程序被执行时,使用的地址是虚拟地址,需要用页表映射到物理地址
5. 解决问题
到这里,我们就可以解决第一个问题,每个进程都有一个虚拟地址和页表,这些都由OS来维护,在页表对应的每一个物理地址后面,都有一个像文件访问权限一样的标志,如果这个物理地址没有访问权限,就会直接报错终止。有效的保护了物理内存。

第二问题的答案就在图中,fork函数创建子进程时,其实就是拷贝了大部分对应的task_struct,mm_struct和页表,因为父子进程之间大部分属性都一样,但当需要改变num的值时,子进程就在物理空间上重新开了一块空间,拷贝父进程,OS也会更新对应的页表映射关系。这个叫做写时拷贝。但是虚拟地址还是一样的,只是映射关系发生了变化。所以num相同的虚拟地址,不同的值。
6. 为什么要有地址空间
安全性,有效的保护了物理内存
因为地址空间和页表是OS创建并维护的,凡是想用地址空间和页表进行映射,都需要在OS的监管下来进行访问。
内存管理模块和进程管理模块完成了解耦
提高内存的利用率
用户申请的物理空间,malloc和new其实是在虚拟地址上申请的,OS通过延迟分配,提高物理内存的利用率
地址空间和页表的存在可以将内存分布有序化(按照地址空间分布)和进程的独立性(不同的进程映射到不同的物理空间)每一个进程不知道其他进程的存在
对于程序的分批加载,当程序刚刚新建的状态下,进程就只创建内核结构,程序和数据还没有加载到内存中。
程序的分批换出,当进程短时间内不会再被执行了,比如阻塞了,进程的数据和代码被换出到磁盘中的swap区,页表的映射关系也改为磁盘地址。这个过程就叫挂起。
完,写的不好的地方多有体谅,还在学
相关文章:
Linux-程序地址空间
目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…...
adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月
登录adobe stock的官网,点击你想要下载的视频,然后点击免费下载,我们点击免费试用按钮,可以看到非常贵,需要80美金一个月,用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡,就可以白嫖一个…...
Mysql的基本命令
1 服务相关命令 命令描述systemctl status mysql查看MySQL服务的状态systemctl stop mysql停止MySQL服务systemctl start mysql启动MySQL服务systemctl restart mysql重启MySQL服务ps -ef | grep mysql查看mysql的进程mysql -uroot -hlocalhost -p123456登录MySQLhelp显示MySQ…...
leetcode.24. 两两交换链表中的节点
题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 思路 创建虚拟头节点,画图,确认步骤。 实现 /*** Definition for singly-li…...
后端开发框架Spring Boot快速入门
写在前面 推荐将本文与Spring Boot 相关知识和工具类一文结合起来看,本文为主,上面那篇文章为辅,一起食用,以达到最佳效果,当然,大佬随意。 IDEA创建Spring Boot工程 关于Spring Boot框架项目࿰…...
I2C驱动实验:验证所添加的I2C设备的设备节点
一. 简介 前面一篇文章向设备树中的 I2C1控制器节点下,添加了AP3216C设备节点。文章如下: I2C驱动实验:向设备树添加 I2C设备的设备节点信息-CSDN博客 本文对设备树进行测试,确认设备节点是否成功创建好。 二. I2C驱动实验&a…...
160 Linux C++ 通讯架构实战14,epoll 反应堆模型
到这里,我们需要整理一下之前学习的epoll模型,并根据之前的epoll模型,提出弊端,进而整理epoll反应堆模型,进一步深刻理解,这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…...
根据mysql的执行顺序来写select
过滤顺序指的是mysql的逻辑执行顺序,个人觉得我们可以按照执行顺序来写select查询语句。 目录 一、执行顺序二、小tips三、案例第一轮查询:统计每个num的出现次数第二轮查询:计算**最多次数**第三轮查询:找到所有出现次数为最多次…...
spring 和spring boot的区别
Spring是一个开源的Java开发框架,旨在简化Java应用程序的开发。它提供了一个综合的编程和配置模型,用于构建各种类型的应用程序,从简单的命令行工具到复杂的企业级Web应用程序。 Spring Boot是Spring框架的一个扩展,旨在简化Spri…...
Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测
目录 端口协议-口令爆破&未授权 弱口令爆破 FTP:文件传输协议 RDP:Windows远程桌面协议 SSH:Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…...
视频分块上传Vue3+SpringBoot3+Minio
文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块,依次上传到后端,后端将其保存到文件系统。前…...
深入浅出 -- 系统架构之单体到分布式架构的演变
一、传统模式的技术改革 在很多年以前,其实没有严格意义上的前后端工程师之分,每个后端就是前端,同理,前端也可以是后端,即Ajax、jQuery技术未盛行前的年代。 起初,大部分前端界面很简单,显示的…...
每日一题 第七十期 洛谷 [蓝桥杯 2020 省 AB2] 回文日期
[蓝桥杯 2020 省 AB2] 回文日期 题目描述 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 8 8 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。…...
蓝桥杯第十四届C++A组(未完)
【规律题】平方差 题目描述 给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …...
职场口才提升之道
职场口才提升之道 在职场中,口才的重要性不言而喻。无论是与同事沟通协作,还是向上级汇报工作,亦或是与客户洽谈业务,都需要具备良好的口才能力。一个出色的职场人,除了拥有扎实的专业技能外,还应具备出色…...
【算法练习】28:选择排序学习笔记
一、选择排序的算法思想 弄懂选择排序算法,先得知道两个概念:未排序序列,已排序序列。 原理:以升序为例,选择排序算法的思想是,先将整个序列当做未排序的序列,以序列的第一个元素开始。然后从左…...
【关于窗口移动求和的两种计算方法】
窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动,比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列:OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15],定义窗口长度为5,每次…...
Win10文件夹共享(有密码的安全共享)(SMB协议共享)
前言 局域网内(无安全问题,比如自己家里wifi)无密码访问,参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全…...
Client sent an HTTP request to an HTTPS server
背景 最近踩坑了 我发现域名:8000可以访问我的服务 但是域名:443却不行,这很反常 结果发现是nginx配置的问题,需要把http改成https! 原因 如果你的后端服务(运行在8000端口上)已经配置了SS…...
Springboot传参要求
Web.java(这里定义了一个实体类交Web) public class Web{ private int Page; public int getPage() {return Page;}public void setPage(int page) {Page page;} } 1、通过编译器自带的getter、Setter传参 。只是要注意参数的名字是固定的,不能灵活改变。 传参的…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
