本文是个人分析《Linux内核设计与实现》而写的总结,欢迎转载,请注明出处:

http://blog.csdn.net/dlutbrucezhang/article/details/13621133

      第七章--进程地址空间
      内核运行在内核地址空间中,相应的,用户程序需要运行,肯定也需要地址空间,这其实是属于资源的。进程运行在自己的地址空间中,进程描述符中有指向这一地址的指针。线程没有自己独立的地址空间,所以,它和进程共享地址空间,也就是说线程的地址空间字段也是指向它所在进程的地址空间。

      1.地址空间
      内存区域也称为虚拟内存区域,它包含多个不同的内存对象。
      代码段:可执行文件的内存映射
      数据段:可执行文件已初始化的全局变量的内存映射
      bss 段:可执行文件未初始化的全局变量的内存映射
      进程的用户空间栈的零页内存映射
      共享库的代码段,数据段和bss段也会包含在进程的地址空间中
      。。。。。。

      2.内存描述符
      为了更好的理解进程的地址空间,首先贴出它的数据结构,之后再简单的介绍其中的字段。
struct mm_struct
{
struct vm_area_struct *mmap; //list of VMA
rb_root_t mm_rb; //指向vma段红黑树的指针
struct vm_area_struct *mmap_cache; //last find_vma result 存储上一次查询的操作的结果
pgd_t *pgd; //进程页目录的起始地址
atomic_t mm_users; //how many users with user space
atomic_t mm_count; //how many reference to "struct mm_struct"
int map_count; //Number of VMA
struct rw_semaphore mmap_sem; //对mmap操作的互赤信号量
spinlock_t page_table_lock; //Protects task page tables and mm->rss
struct list_head mmlist; //list of all active mm's. These are globally together off init_mm.mmlist,and are protected by mmlist_lock
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 rss,total_vm,locked_vm; //rss进程内容驻留在物理内存的页面地址
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_address; //页面换出过程用到交换空间地址 unsigned dumpable:1;
//Architecture-specific MM context
mm_context_t context; //存放着当前进程使用的段起始地址
};

从中我们可以看出,进程中确实包含了代码段,数据段,bss端,栈等内存区域。对于每一个内存区域,都有着一致的属性描述,例如,映射的物理内存,权限(可读,可写,可执行)等。


      3.mm_struct 和内核线程
      由于内核线程不会访问用户的地址空间,所以,它并不存在地址空间,但是这个字段又不能为空,所以,为了效率,Linux的设计方案是一旦内核线程执行,那么它就用前一个执行进程的地址空间字段,这当然包含了进程的页表,内核线程虽然不会访问用户地址空间,但是仍然需要与内核交互。
      

Linux内核探讨-- 第七章的更多相关文章

  1. Linux内核分析——第七章 链接

    第七章——链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载到存储器并执行. 2.链接可以执行于编译时,加载时,运行时. 7.1编译器驱动程序 1.大多数编译系 ...

  2. 深入理解Linux内核-第七章 进程调度

    原文:http://blog.csdn.net/sailor_8318/article/details/2460177

  3. Linux内核设计第七周 ——可执行程序的装载

    Linux内核设计第七周 ——可执行程序的装载 第一部分 知识点总结 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 编译链接的过程 预处理阶段 gcc -E -o XX.cpp ...

  4. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  5. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  6. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  7. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  8. Linux内核分析 第七周 可执行程序的装载

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...

  9. LINUX内核分析第七周学习总结

    LINUX内核分析第七周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...

随机推荐

  1. selenium python (五)打印信息及设置等待时间

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #一般情况下我们要验证打开的页面是否正确,可通过网页的Title和Cur ...

  2. git 换行符问题

    git 换行符问题 在windows环境中 对于autocrlf = false 不会激发 关于换行符的处理 对于autocrlf = true 会在提交是将LF替换成CRLF 切出时时CRLF 对于 ...

  3. Code-first示例

    首先创建一个空数据库 在vs2013中添加数据库类,按提示操作一直下一步   添加完以后,数据库类的代码 namespace mvctest.Models { using System; using ...

  4. [转]caffe+Ubuntu14.0.4 64bit 环境配置说明(无CUDA,caffe在CPU下运行) --for --Amd

    caffe是一个简洁高效的深度学习框架,具体介绍可以看这里,caffe环境配置过程可以参考这里,我在搭建环境时搜集了许多资料,这里整理了一下,介绍一下caffe在无CUDA的环境下如何配置. 1. 安 ...

  5. xdebug初步

    ;加载xdebug模块. 根据PHP版本来选择是zend_extension还是zend_extension_ts  ts代表线程安全  被坑过1次zend_extension="\web\ ...

  6. Node-APN 开源推送服务

    Node-APN是一个开放的结合了苹果推送通知的Node.js模块,该源码模块使用简单,反馈服务支持.错误处理,在发送出错时自动重发.遵从苹果的最佳实践. Node-APN(github)

  7. reds pub/sub官方文档翻译

    Publish / Subscribe发布/订阅 redis-py includes a PubSub object that subscribes to channels and listens f ...

  8. Java之对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  9. Struts2数据校验方法

    方法: 1.在Action类中execute()方法中进行校验. 优点:Action类无需继承框架中的类. 缺点:(1)当有多个校验时,代码重复,违反高内聚,低耦合. 2.重写框架ActionSupp ...

  10. codeforces 644A Parliament of Berland

    A. Parliament of Berland time limit per test 1 second memory limit per test 256 megabytes input stan ...