• lfn
    2019-05-13
    cat /proc/$pid/map
    
     30
  • why
    2019-05-14
    - 内存管理(上)
    - 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射
    - 除了内存管理模块, 其他都使用虚拟地址(包括内核)
    - 虚拟内存空间包含: 内核空间(高地址); 用户空间(低地址)
    - 用户空间从低到高布局为: 代码段; DATA 段; BSS 段(未初始化静态变量); 堆段; 内存映射段; 栈地址空间段
    - 多个进程看到的用户空间是独立的
    - 内核空间: 多个进程看到同一内核空间, 但内核栈每个进程不一样
    - 内核代码也仅能访问内核空间
    - 内核也有内核代码段, DATA 段, 和 BSS 段; 位于内核空间低地址
    - 内核代码也是 ELF 格式

    内核空间和进程的关系有点像进程和多线程的关系啊.
    展开
    
     8
  • Linuxer
    2019-05-13
    pmap pid
    
     5
  • garlic
    2019-12-31
    1. pmap $PID;
    2.cat /proc/$PID/maps;
    
     3
  • 雪人
    2019-05-13
    老师,我想问一下,所有进程的内核空间是共用一块内存吗?还有就是,是不是可以这样理解,用户空间是负责办事情的,内核空间是负责管理所有进程的资源,以及负责与内核一些不公开的资源进行交互的?

    作者回复: 是的

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

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

    
     3
  • aiter
    2019-05-13
    cat /proc/22528/maps
    00400000-00406000 r-xp 00000000 08:03 2886947 /usr/bin/sleep
    00606000-00607000 r--p 00006000 08:03 2886947 /usr/bin/sleep
    00607000-00608000 rw-p 00007000 08:03 2886947 /usr/bin/sleep
    01ecc000-01eed000 rw-p 00000000 00:00 0 [heap]
    7fef2bb48000-7fef3206f000 r--p 00000000 08:03 2888013 /usr/lib/locale/locale-archive
    7fef3206f000-7fef32225000 r-xp 00000000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32225000-7fef32425000 ---p 001b6000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32425000-7fef32429000 r--p 001b6000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32429000-7fef3242b000 rw-p 001ba000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef3242b000-7fef32430000 rw-p 00000000 00:00 0
    7fef32430000-7fef32451000 r-xp 00000000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32640000-7fef32643000 rw-p 00000000 00:00 0
    7fef32650000-7fef32651000 rw-p 00000000 00:00 0
    7fef32651000-7fef32652000 r--p 00021000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32652000-7fef32653000 rw-p 00022000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32653000-7fef32654000 rw-p 00000000 00:00 0
    7fff81aa3000-7fff81ac4000 rw-p 00000000 00:00 0 [stack]
    7fff81b8d000-7fff81b8f000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    展开
    
     3
  • neohope
    2019-12-10
    编译器在静态编译的时候,是比较容易将代码的内存空间做好规划的,也比较好映射到内存中。
    但如果用dlopen 或 loadlibrary这样的函数,动态加载so或dll是如何做到的,一直不很清楚。
    希望后面能老师能讲到。
    
     1
  • 陈志恒
    2019-11-25
    要抓住三点:
    1.为什么要使用虚拟内存?有什么好处
    2.既然使用的是虚拟内存,如何找到对应的物理内存?
    3.程序的运行分为用户态和内核态!
    
     1
  • 嘉木
    2019-06-18
    个人觉得三个相同的程序写同一个物理内存地址的例子不是太妥当
    因为内存管理的提供虚拟地址,每个进程才能有一致的地址空间,没有内存管理的话,多个相同的进程不会在运行到同一个地方写内存的时候写同一个地址吧。。。

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

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

    作者回复: 加油

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

    作者回复: 赞

     1
     1
  • sam
    2019-05-13
    请问一下,分析的是linux kernel那个版本?

    作者回复: 4.13

    
     1
  • 淤白
    2020-01-28
    本篇主要学习到的内容:

    1. 物理内存空间和虚拟内存空间的区别,物理内存空间只有管理模块可以使用;
    2. 虚拟内存空间分为两大块,内核空间和用户空间,每个进程的用户空间是独立的,内核空间是共享的。
    
    
  • Paul Shan
    2019-12-26
    虚拟内存解决的主要问题是多进程访问内存空间的私密性,仿佛让每个进程看到了巨量完全相同的内存资源。内核态内存区域是共享的,理论上可以用物理内存,也可以用虚拟内存,但是如果用了物理内存,内核态的编码就会和用户态迥异,所以还是用虚拟内存能够最大限度的统一这两者的编程风格,只不过这两者的映射有区别,用户态映射的时候要考虑进程信息,例如pid,内核态的内存空间是共享的,不需要考虑进程信息。
    让区别发生在映射模块,使得用户态和内核态代码访问内存的风格一致,本身就是一种值得借鉴的编程思路。
    
    
  • Geek_853778
    2019-11-12
    虚拟内存其实是为了避免多个进程运行时直接使用物理内存时可能会造成数据覆盖的问题,为每一个进程分配一块独立的内存,互不干扰
    
    
  • 坚持坚持在坚持
    2019-10-28
    pmap
    
    
  • 天王
    2019-10-11
    20 内存管理 1 计算机进行计算,包括2方面,一是进程和线程对cpu的使用,二是内存管理 。2 独享内存空间的原理 ,每个进程都有自己独立的内存空间,如果直接使用物理空间,多个程序同时执行会有占用冲突。所以程序使用虚拟地址,系统负责把虚拟地址和物理地址映射起来。2 操作系统的内存管理,包括3个方面,一是物理内存的管理,二是 虚拟地址的管理三 物理地址和虚拟地址做好映射。3 程序对内存使用,一代码会放到内存 二全局变量放到内存,三字符串放到内存,四是局部变量会放到栈 五malloc会分到堆 六glibc代码会放到内存,进入到内核,一是内核代码放到内存里 二是内核中也有全局变量 三 每个进程都有一个task_struct,四每个进程都有一个内核栈,五 内核栈里有动态分配的内存 ,六 虚拟内存和物理内存的映射 4 内存的排列 4.1 内存先分为用户态空间和内核态空间,用户态占用0到29号,内核态占用30到39号。4.2 用户态从0号到29号,依次是text segement(存放二进制可执行代码的位置段),data segment(存放初始化的静态常量),bss segment(存放未初始化的静态变量),heap(动态分配内存的区域),接下来是Memory Mapping segment,把文件映射进内存使用。接下来是栈地址段,4.3 内核态是共享的,无论哪个进程进入到内核,看到的空间和进程列表都是一样的,如果要访问公共资源需要加锁。
    展开
    
    
  • 无名
    2019-09-18
    老师,字符串常量是存储在Data Segment中吗?
    
    
  • williamcai
    2019-09-12
    老师,多个用户进程调用内核请求,如果内核处理不过来,是不是排队处理啊?还有内核怎么把执行结果返回给用户进程
    
    
我们在线,来聊聊吧