设为首页 收藏本站
查看: 290|回复: 0

[经验分享] Linux 进程的内存

[复制链接]
累计签到:77 天
连续签到:1 天
发表于 2014-5-27 08:38:02 | 显示全部楼层 |阅读模式
在linux中,每个进程都运行在虚拟内存环境中,通过页表,可以实现虚拟内存到物理内存之间的映射,
wKiom1OCqpbhVBuoAAB1CBm1kK0588.jpg
linux操作系统为每个进程维护了各自的页表,避免不同进程之间操作实际内存时的出现冲突。
wKioL1OCqrji5ukDAADh7m4AKd4805.jpg

每个进程独占4G的虚拟内存,这4G的内存分布情况如下图所示:
wKiom1OCr-HDj4UHAAGlpmAobwk546.jpg
程序编译之后,虚拟地址一定,但是物理地址随着程序的每一次运行而不同。
在linux中,程序的编译过程如下:
wKiom1OCsZDAIFisAAC3Uzg3JNk805.jpg 通常,我们使用的库文件(二进制形式的API)位于libc.so中,如果我们使用的库文件不在libc.so中,在编译过程中需要指定:
gcc -o hello.o hello.c -lm libm.so(math.h)
内核空间申请内存空间的函数包括:
__get_free_page:每次申请的都是完整的页。连续的虚拟空间和物理空间
kmalloc:以字节为单位。连续的虚拟空间和物理空间
vmalloc:以字节为单位,离散的物理空间---》连续的虚拟空间
进程的地址信息
无论是内核线程还是用户进程,对于内核来说,无非都是task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为'内存描述符‘(memory descriptor)的数据结构mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息。
wKioL1OCs9SR7laAAAFWCFP0QTg586.jpg
内核代码的定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct mm_struct {
    struct vm_area_struct * mmap;///各个区域所组成的双向链表
    struct rb_root mm_rb;///采用红黑树描述内存区块
     ......
    atomic_t mm_users;         /* How many users with user space? */
    atomic_t mm_count;         /* How many references to "struct mm_struct" (users count as 1) */
    int map_count;             /* number of VMAs */

    spinlock_t page_table_lock;        /* Protects page tables and some counters */
    struct rw_semaphore mmap_sem;

    struct list_head mmlist;      /* List of maybe swapped mm's. These are globally strung
                         * together off init_mm.mmlist, and are protected
                         * by mmlist_lock
                         */


    unsigned long hiwater_rss;    /* High-watermark of RSS usage */
    unsigned long hiwater_vm; /* High-water virtual memory usage */

    unsigned long total_vm;       /* Total pages mapped */
    unsigned long locked_vm;  /* Pages that have PG_mlocked set */
    unsigned long pinned_vm;  /* Refcount permanently increased */
    unsigned long shared_vm;  /* Shared pages (files) */
    unsigned long exec_vm;        /* VM_EXEC & ~VM_WRITE */
    unsigned long stack_vm;       /* VM_GROWSUP/DOWN */
    unsigned long reserved_vm;    /* VM_RESERVED|VM_IO pages */
    unsigned long def_flags;
    unsigned long nr_ptes;        /* Page table pages */
    unsigned long start_code, end_code, start_data, end_data;
    unsigned long start_brk, brk, start_stack;
    unsigned long arg_start, arg_end, env_start, env_end;
        ......
    unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */
}   



如果想要查看某个进程的内存区域,可以查看:
/proc/进程号/maps文件。
对于每个进程,内核为其分配了一块存储区域,用于存放内核栈以及thread_info结构体,当进程从用户态切换到内核态时,可以根据esp寄存器的值找到thread_info的地址,从而得到当前进程对应的task_struct结构体的地址。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-19683-1-1.html 上篇帖子: Centos6.5下service network status 没有输出 下篇帖子: CentOS 6安装内核源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表