当前位置: 首页 > news >正文

重庆建网站诚选快忻科技悉心个人网站建设方案书实例

重庆建网站诚选快忻科技悉心,个人网站建设方案书实例,湖州公众号开发公司,网站建设实训报告目的内核版本#xff1a;linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作#xff0c;内存分配是其中非常重要的一环#xff0c;作为一个linux程序员必然会想要知道这个过程到底是怎么样的#xff0c;内核源码会告诉你这一切。 线性区 一个可执行程序#xff…内核版本linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作内存分配是其中非常重要的一环作为一个linux程序员必然会想要知道这个过程到底是怎么样的内核源码会告诉你这一切。 线性区 一个可执行程序是经过编译器处理后的遵守一定规则的数据、符号表和指令序列的组合当linux加载一个可执行程序的时候会为其创建一个新的进程其对应的进程描述符task_struct中会保存许多资源的描述符其中的mm_struct就是这个进程的内存描述符用来管理该进程拥有的所有内存。 一个进程拥有的内存是动态变化的比如栈的扩充、堆的扩充、新的文件映射等等出于这个原因需要一个更细粒度的单位来实现内存的动态增加减少这个单位叫线性地址区间简称线性区用vm_area_struct描述。 线性地址空间 线性地址空间是基于单个进程的暂时抛开写时复制机制不谈不同进程之间的线性地址空间是彼此隔离的这是由linux的多级分页机制实现。 一个进程拥有的线性地址空间的具体表示就是这个进程的内存描述符中存储的线性区的集合。 死程序活进程 现在我们知道了进程是通过增加和减少线性区来管理自己拥有的内存并通过逻辑地址加上某一个线性区的基地址来进行寻址操作那么ok这两点已经能够保证一个四肢头脑健全的进程正常运行然而一个可执行程序是存在硬盘上的是一个死的东西linux加载器需要把它变成活的需要给她四肢给她头脑即把她的代码、数据、栈、依赖库全部放到内存中。 这个过程从do_fork开始。 do_fork和写时复制 Linux用do_fork来创建一个新的用户态进程写时复制机制让新的子进程在不进行写操作的前提下会拥有父进程的所有页框相当于父子进程拥有相同的线性区当子进程对线性区写操作或者执行exec的时候系统会将子进程的mm_struct重新初始化 简单说下写时复制机制的实现主要函数调用流程do_fork--copy_process--copy_mm--dup_mmap--copy_page_range,copy_page_range将父进程的多级页表结构整个复制一遍此时父子进程拥有彼此分离的多级页表结构但在最后一级页表中存放的相同的页描述符即子进程在进行写操作之前依然跟父进程共享相同的页当子进程对某个共享页进行写操作时系统会将执行流定向到do_wp_page这个函数将复制一个新的页来替换要写的页。因此一个新的进程在初始的时候跟父进程共享相同的地址空间但经过一段时间后父子进程的地址空间将变得真正隔离开来。 分配线性区 然而运行一个新的程序会干掉所有旧的内存空间并为新进程重新分配新的线性地址空间从sys_execve()即exec的系统调用例程开始调用流程依次是sys_execve--do_execve--mm_alloc--mm_init--mm_alloc_pgd--pgd_alloc。最后这个pgd_alloc为这个进程分配了一个新的页全局目录第一级页表。 此时该进程的线性地址空间依然为空因为还未曾为其分配任何线性区。 sys_execve()会在最后会调用这个可执行程序对应格式的load_binary函数这个函数完成了这种格式的可执行程序的加载其中最主要的过程就是多次调用do_mmap为该进程分配一系列的线性区并存放不同的内容分配顺序是栈段-代码段-数据段-bss-依赖库堆是在运行过程中动态分配的由内核中brk和mmap函数实现C库将其封装成我们熟知的malloc函数。 线性区的分配简单说就是扫描用户态线性地址空间32位系统下通常是从0x40000000开始的低3G的空间查找一个足够大的线性地址范围。 经过以上的过程新进程拥有了自己的线性地址空间但是别忘了系统从未给这个进程分配任何可用的物理页 仅仅只初始化了一个页全局目录那么当进程寻址的时候MMU如何正确进行地址转换呢。 分配页框填充页表 Linux顺理成章的将新进程物理页的分配放在了缺页异常处理程序中进程运行前期会频繁通过缺页异常来请求分页缺页异常处理程序最终会调用伙伴系统的一个入口alloc_pages来分配新的页框并为缺页的线性地址填充页表一段时间后该进程的运行环境就会被完全载入内存。 至此死程序变活进程。 插一段sys_execve()第一步是调用getname()函数获得程序名网上和一些书上说这个函数是用来得到一个新的页框并从用户空间拷贝程序名到这个页框中然而2.6的源码最终指向的一个函数是kmem_cache_alloc(cachep, flags)这个函数我在Linux内核笔记——内存管理之slab分配器里提到过这是slab分配器的调用入口所以从这里可以知道getname其实是通过指定一个叫names_cachep的高速缓存描述符来分配一个这个类型的内存对象这个names_cachep则是一个kmem_cache_t类型的指针是一种高速缓存类型所以这里说获得一个新的页框是欠妥的实际上getname是获得了一个names_cachep这种高速缓存里注册的构造函数对应的一个指定的可用内存对象然后再存入程序名到这个内存对象中。虽然这个对象可能就是一个普通页框这依赖于这个注册的构造函数 详细解释见Linux内核笔记——内存管理之slab分配器。 PS: 个人理解错误难免望能指出万分感谢 转载于:https://www.cnblogs.com/JaSonS-toy/p/4998936.html
http://www.zqtcl.cn/news/624732/

相关文章:

  • 做网站费用上海判断网站做的好坏
  • 有了域名和空间怎么建网站哪些公司需要网页电商设计师
  • 网站开站备案深圳创业补贴10万
  • 圆通我做网站拉上海建站系统
  • 对于做网站有什么要求新闻发布会视频
  • 网站建设专业就业前景成都房产信息网 官网
  • 西宁网站建设公司排行网站查询域名ip解析
  • 柳州企业网站开发公司如何做网站首页图
  • 刷赞网站空间免费深圳网站制作公司排名
  • 网站内部优化策略获取网站的路径
  • 网站群 优点今天西安最新通告
  • 惠济免费网站建设设计制作的广告公司
  • 做一个网站建设装潢设计属于什么专业
  • 水处理网站源码注册销售公司流程和费用
  • 诸城网站建设0536s整站优化seo排名点击
  • 企业建设网站需注意哪些内容苏州网站怎么做
  • 浏览器打开网站网站推广软件工具
  • 网站主题编辑工具WordPress公司网站策划方案
  • 做旅游网站选什么空间搜索引擎优化策略有哪些
  • 网站备案多少钱安全网站建设与服务的关系
  • 手机端网页设计尺寸规范优化seo排名
  • 做网站业务提成多少厦门十大装修公司排名榜
  • 为什么用开源建站wordpress rss 插件
  • 语文建设投稿网站南昌做网站的公司多不多
  • 石家庄网站建设的公司功能性质网站
  • 企业网站主页模板装饰公司名字起名大全
  • 马鞍山网站设计价格如何在微信公众号内部做网站
  • 申请网站建设经费的报告生态建设网站
  • 建网站要多少钱用自己的服务器河北工程大学网站开发成本
  • 宁波网站建站公司商务网站模块设计时前台基础设施建设不包括