原文:Hack The Virtual Memory: C strings & /proc - Holberton
翻译:RobotCode俱乐部

介绍

这是一系列关于虚拟内存的小文章/教程中的第一篇。我们的目标是学习一些计算机基础知识,但是是以一种不同的、更实际的方式。对于第一部分,我们将使用/proc来查找和修改运行进程的虚拟内存中包含的变量(在本例中是ASCII字符串),并在此过程中学习一些很酷的东西。

虚拟内存

在计算中,虚拟内存是一种同时使用硬件和软件实现的内存管理技术。它将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。主内存(进程所见)以连续地址空间或连续段的集合的形式出现。操作系统管理虚拟地址空间,并将实际内存分配给虚拟内存。CPU中的地址转换硬件,通常称为内存管理单元或MMU,自动将虚拟地址转换为物理地址。操作系统中的软件可以扩展这些功能,以提供超过实际内存容量的虚拟地址空间,从而可以使用比计算机中实际存在的内存更多的内存。

虚拟内存的主要好处包括使应用程序不必管理共享内存空间,由于内存隔离而提高了安全性,并且能够使用分页技术使用比物理上可用的更多的内存。

在第2章中,我们将深入讨论更多细节,并对虚拟内存中的内容和位置进行一些事实检查。现在,这里有一些关键点,你应该知道:

  • 每个进程都有自己的虚拟内存
  • 虚拟内存的数量取决于系统的体系结构
  • 每个操作系统处理虚拟内存的方式不同,但是对于大多数现代操作系统,进程的虚拟内存是这样的:

如图所示,高内存地址中存放:

  • 命令行参数和环境变量
  • 栈,“向下”增长。这可能看起来违反直觉,但这是在虚拟内存中实现堆栈的方式

在低内存地址,你可以找到:

  • 你的可执行文件(比这稍微复杂一些,但这足以理解本文的其余部分)
  • 堆,“向上”生长。堆是动态分配的内存的一部分(即包含使用malloc分配的内存)。

另外,请记住虚拟内存与RAM是不同的。

C程序

让我们从这个简单的C程序开始,探索字符串到底存在虚拟内存的哪个位置:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>/*** main - uses strdup to create a new string, and prints the* address of the new duplcated string** Return: EXIT_FAILURE if malloc failed. Otherwise EXIT_SUCCESS*/
int main(void)
{char *s;s = strdup("Holberton");if (s == NULL){fprintf(stderr, "Can't allocate mem with mallocn");return (EXIT_FAILURE);}printf("%pn", (void *)s);return (EXIT_SUCCESS);
}

在继续之前,花点时间想一想。你认为strdup如何创建字符串“Holberton”的副本?你如何证实?

strdup

strdup必须创建一个新字符串,因此它首先必须为它预留空间。函数strdup可能正在使用malloc。快速浏览一下手册页就可以确认:

在继续之前,花点时间想一想。根据我们前面关于虚拟内存的讨论,你认为重复字符串将位于何处?在高或低内存地址?

可能在较低的地址(堆中)。让我们编译并运行我们的小C程序来测试我们的假设:

复制的字符串位于地址0x80e5008。太好了。但这是一个低或高地址?

进程的虚拟内存有多大

进程的虚拟内存大小取决于你的系统架构。在这个例子中,我使用一个32位的机器,所以理论上每个进程的虚拟内存的大小是2 ^ 32字节。理论上,可能的最高内存地址是0xFFFFFFFF,最低内存地址是0x0。

0x80e5008与0xFFFFFFFF相比很小,所以重复的字符串可能位于较低的内存地址。在查看proc文件系统时,我们将能够确认这一点)。

proc文件系统

如果您列出/proc目录的内容,您可能会看到很多文件。我们将集中讨论其中两项:

/proc/[pid]/ mem

/proc/[pid] /maps

mem

太棒了!那么,我们可以访问和修改任何进程的整个虚拟内存吗?

maps

这意味着我们可以查看/proc/[pid]/mem文件来定位正在运行的进程的堆。如果可以从堆中读取,就可以定位要修改的字符串。如果我们可以写堆,我们可以用我们想要的替换这个字符串。

我们通过cat /proc/[pid]/maps再次确认,字符串属于内存的哪个段中:

程序里加了暂停,让其停在此处,方便我们查看maps

--未完待续,下篇讨论如何修改堆中的数据

由于本人水平有限,翻译必然有很多不妥的地方,欢迎指正。
同时,欢迎关注下方微信公众号,一起交流学习:)

oracle 截取字符串中指定位置_手撕虚拟内存(1)——字符串在虚拟内存中的段位置与/proc虚拟文件系统...相关推荐

  1. 将一个数组中的字符串用指定字符分割开,分别放到另一个数组中

    #include "stdafx.h" #include <stdio.h> #include <string.h> #pragma warning(dis ...

  2. python中字符串的制表符为_零基础学python_03_字符串(拼接+换行+制表符)

    字符串拼接 在编码的过程很多时候都会用到字符串的拼接,例如,你可能想将姓和名存储在不同的变量中,等要显示姓名时再将它们合而为一:first_name = "li" last_nam ...

  3. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  4. redis mysql主从同步_手撕Redis,主从同步

    原标题:手撕Redis,主从同步 一.主从同步的工作原理 redis主从复制过程: 当配置好slave后,slave与master建立连接,然后发送sync命令.无论是第一次连接还是重新连接,mast ...

  5. 在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?

    在Eclipse中,我可以将源文件夹作为"链接的源文件夹"添加到我的android项目中. 如何在Android Studio中实现同一目的? 或者是否可以添加外部文件夹以构建gr ...

  6. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口

    相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...

  7. carsim中质心加速度_振动CAE分析在空调压缩机支架设计中的应用

    [摘要]本文运用有限元分析方法分析空调压缩机系统模态,并通过分析引起振动的激励源,找出压缩机支架和安装螺栓断裂的根本原因,并根据分析提出了解决措施.关键词:空调压缩机支架模态激励共振一.引言发动机轮系 ...

  8. Java中合法的关键词_优秀程序员必须掌握的java中50个关键字

    关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...

  9. mysql获取字符串第2次出现的位置_我要获取一个字符串中某个标点第二次出现的位置...

    展开全部 获取方法e5a48de588b662616964757a686964616f31333365643662: //根据第一个点的位置 获得第二个点的位置 index=str.indexOf(& ...

最新文章

  1. 根据16S预测微生物群落功能最全攻略
  2. 手机pc显示不同的内容
  3. Session 'app': Error Installing APK
  4. Python类的静态属性、类方法、静态方法
  5. 如何在 Github 工作流文件里引用自定义实现的 action
  6. ansbile--playbook剧本案例
  7. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)
  8. .js——alert()语句
  9. IOS开发学习笔记024-UIButton和UIImageView的区别
  10. 免费查题合集大推荐,付费根本不存在的!
  11. 远程访问服务器并登录LPAR,MySQL设置远程连接服务器
  12. 关于12306Bypass
  13. Halcon 算子 convexity
  14. MaskNet 这个CTR模型,有点意思
  15. 【数据结构与算法】期末复习刷题日寄Part02
  16. 错误ORA-01438: 值大于为此列指定的允许精度
  17. 如何从零开始搭建自己的博客(通俗易懂)
  18. Pytorch:优化器、损失函数与深度神经网络框架
  19. 韩国PAYWAVE认证之技术篇2
  20. 【计算机网络】计算机三级网络——需要理解的题

热门文章

  1. JS打印页面指定区域
  2. Android异步处理三:Handler+Looper+MessageQueue深入详解
  3. OO学习之二——面向对象分析(OOD)的介绍
  4. 在Web页面上启动运行Linux系统
  5. 关于职业目标规划的一点讨论
  6. 基于SSM实现招聘网站
  7. Hadoop安装及eclipse配置
  8. Oracle VM VirtualBox 虚拟机中ubuntu里,鼠标滚轮不能使用
  9. webBrowse无法正常显示Excel
  10. 邮箱数据库营销的概念及其特点介绍