趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85458 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

20 | 内存管理(上):为客户保密,规划进程内存空间布局

栈(Stack)地址段
Memory Mapping Segment
堆(Heap)段
Text Segment、Data Segment和BSS Segment
虚拟地址和物理地址的映射
虚拟地址的管理
物理内存的管理
内存管理系统的三个要做的事情
内核空间的视角
内存空间布局
用户空间和内核空间的划分
操作系统内存管理的三个方面
虚拟地址和物理地址映射
内存地址隔离
课堂练习
总结时刻
规划虚拟地址空间
独享内存空间的原理
如何规划进程内存空间布局

该思维导图由 AI 生成,仅供参考

平时我们说计算机的“计算”两个字,其实说的就是两方面,第一,进程和线程对于 CPU 的使用;第二,对于内存的管理。所以从这一节开始,我们来看看内存管理的机制。
我之前说把内存管理比喻为一个项目组的“封闭开发的会议室”。很显然,如果不隔离,就会不安全、就会泄密,所以我们说每个进程应该有自己的内存空间。内存空间都是独立的、相互隔离的。对于每个进程来讲,看起来应该都是独占的。

独享内存空间的原理

之前我只是简单地形容了一下。这一节,我们来深入分析一下,为啥一定要封闭开发呢?
执行一个项目,要依赖于项目执行计划书里的指令。项目只要按这些指令运行就行了。但是,在运行指令的过程中,免不了要产生一些数据。这些数据要保存在一个地方,这个地方就是内存,也就是我们刚才说的“会议室”。
和会议室一样,内存都被分成一块一块儿的,都编好了号。例如 3F-10,就是三楼十号会议室。内存也有这样一个地址。这个地址是实实在在的地址,通过这个地址我们就能够定位到物理内存的位置。
使用这种类型的地址会不会有问题呢?我们的二进制程序,也就是项目执行计划书,都是事先写好的,可以多次运行的。如果里面有个指令是,要把用户输入的数字保存在内存中,那就会有问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过生动的比喻和深入的技术分析,向读者介绍了进程内存空间布局的重要性和实现原理。作者以内存管理比喻为“封闭开发的会议室”,强调了内存空间的独立性和隔离性。文章指出,每个进程都应该有自己的内存空间,而内存地址的虚拟化是实现这一目标的关键。通过将不同进程的虚拟地址和不同内存的物理地址进行映射,操作系统实现了进程间内存空间的隔离和独立性。文章深入分析了独享内存空间的原理,强调了虚拟地址和物理地址的映射机制,以及内核的数据结构进行地址转换的重要性。此外,文章还介绍了内核空间和用户空间的划分,以及不同内存段的功能和使用方式。文章内容生动有趣,深入浅出地解释了进程内存空间布局的重要性和实现原理,对读者理解和应用相关技术具有指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(39)

  • 最新
  • 精选
  • 有铭
    请问,老师的意思是,内核空间其实是完全共享的吗?大家看到的数据都是相同的,如果修改数据,会影响到所有进程?也就是说,其实内核空间其实只占用一份物理内存?另外,既然都是相同的,所谓“内核栈是各用各的”是啥意思?

    作者回复: 是完全共享的。内核的代码是有权限修改所有进程的,但是内核代码的书写者写的代码不会这样做,会很小心。也即内核是能为而不为。只占用一份物理内存。只不过这一块是进程A的内核栈,那一块是进程B的内核栈,作为内核代码,我都能动,但是我不随便动。

    2019-05-13
    3
    54
  • 雪人
    老师,我想问一下,所有进程的内核空间是共用一块内存吗?还有就是,是不是可以这样理解,用户空间是负责办事情的,内核空间是负责管理所有进程的资源,以及负责与内核一些不公开的资源进行交互的?

    作者回复: 是的

    2019-05-13
    13
  • 活的潇洒
    配合《深入浅出计算机组成原理》和《Linux性能优化实战》一起学 感觉《趣谈Linux操作系统》难度最大,希望自己能坚持把笔记做到最后 day20笔记:https://www.cnblogs.com/luoahong/p/10919317.html

    作者回复: 加油

    2019-05-29
    5
    7
  • 铁皮
    @ CHEN 你的程序有问题,如果sleep在malloc之前调用,那么是看不到[heap]的,是因为还没有程序在heap上分配空间。 如果你在malloc之后调用sleep,就可以看到。

    作者回复: 赞

    2019-05-23
    2
    4
  • 杉松壁
    没个进程都有内核空间,其实都是映射到同一个物理地址段吗

    作者回复: 是的

    2020-05-18
    2
    3
  • 嘉木
    个人觉得三个相同的程序写同一个物理内存地址的例子不是太妥当 因为内存管理的提供虚拟地址,每个进程才能有一致的地址空间,没有内存管理的话,多个相同的进程不会在运行到同一个地方写内存的时候写同一个地址吧。。。

    作者回复: 如果实模式下,写汇编,就会冲突的

    2019-06-18
    1
  • Yayu
    请问,用户态 和 内核态 是用来限定什么的?这两个的区分标准是什么?

    作者回复: DPL

    2019-06-06
    2
    1
  • sam
    请问一下,分析的是linux kernel那个版本?

    作者回复: 4.13

    2019-05-13
    1
  • 超超
    请问下超哥,在写驱动时,比如DMA操作的内存地址,也是虚拟内存地址吗?还是虚拟内存地址只是在用户态界面而言的?

    作者回复: 也是虚拟地址

    2019-07-03
  • Feelfree
    ``` <?php if(time()%10==5) { echo "I got it".PHP_EOL; } sleep(mt_rand(1,6)); ?> ``` php sleep.php & cat /proc/$pid/maps 可以看到分了很多段,但是 7fffc2822000-7fffc2843000 rw-p 00000000 00:00 0 [stack] 7fffc294b000-7fffc294d000 r--p 00000000 00:00 0 [vvar] 7fffc294d000-7fffc294f000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] [stack]和[vsyscall]之间的也是属于syscall么?

    作者回复: vsyscall和vDSO是用于加速某些系统调用的两种机制。

    2019-05-23
收起评论
显示
设置
留言
39
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部