程序员的自我修养--可执行文件的装载与进程

2023-05-16

进程的虚拟地址空间

  1. C语言指针大小的位数与虚拟地址空间的地址位数相同,即32位平台下进程的虚拟地址空间为4G
  2. 由于程序在运行是处于操作系统的监管下,进程的虚拟地址空间都在操作系统的掌握中,只能使用操作系统分配给进程的地址。如果访问未经允许的地址,将会强制结束进程。一般在linux上回出现Segmentation fault
  3. 在32位平台中,整个4 GB被划分成两部分,其中操作系统本身用去了一部分:从地址0xC00000000到0xFFFFFFFF,共1 GB。剩下的从0x00000000地址开始到0xBFFFFFFF共3 GB的空间都是留给进程使用的。那么从原则上讲,我们的进程最多可以使用3 GB的虚拟空间,也就是说整个进程在执行的时候,所有的代码、数据包括通过C语言malloc()等方法申请的虚拟空间之和不可以超过3 GB
  4. 通过窗口映射的方式将高于4G的物理内存进程的虚拟地址空间中,linux中采用mmap的系统调用实现

装载方式

  1. 动态装入:根据程序的局部性原理,将程序最常用的部分装入内存,不太常用的放到磁盘中
  2. 覆盖转入:程序员编写覆盖管理器,手工将程序分割成若干块,然后编写一个小的辅助代码来管理这些模块何时应该驻留内存而何时应该被替换掉
  3. 页映射:是虚拟存储机制的一部分,物理页与虚拟空间中的页大小相同,通过存储管理器进行调度虚拟页到物理页中

从操作系统角度看可执行文件的装载

1.进程的建立的三步:

  • 创建一个独立的虚拟地址空间(创建映射函数需要的数据结构,建立虚拟空间与物理内存映射关系)
  • 读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系(建立虚拟空间与可执行文件之间的关系)

当程序发生页错误的时候,操作系统将从物理内存中申请物理页空间,然后将“缺页”从内存中读到磁盘中,设置虚拟页与物理页之间的映射关系。当发生缺页错误的时候,通过虚拟地址空间与可执行文件之间的映射关系获取需要在相应页在可执行文件中的具体位置

  • 将CPU的指令寄存器设置成可执行文件的入口地址,启动运行

2.页错误

当发生页错误的时候,操作系统首先找到空页面所在的VMA,计算出相应页面在可执行文件中的偏移量,在物理内存中分配一个物理页面,将虚拟页面与物理页面之间建立映射关系,把控制权交还给进程,进程从刚才页错误的位置开始执行。

进程虚存空间分布

1.ELF文件链接视图和执行视图
在ELF文件被映射的时候。每个section在映射的时候长度都是该系统页长度的整数倍,如果不是,则多余的部分将会占用一个页,这种情况就会导致大量的内存碎片。

为了解决上述问题,操作系统将相同权限的section合并到一起当做一个segment进行映射,在映射之后在进程的虚拟地址空间中只有一个对应的VMA,在ELF文件中专门有一个程序头表用来保存Segment信息。

这里写图片描述

2.堆和栈
操作系统通过使用VMA来管理虚拟地址空间,除了用来映射各个segment,还可以用来管理栈、堆等空间。例如如下的elf文件和虚拟地址空间之间的映射关系:
这里写图片描述

上图中需要注意的是对于“.bss”和“__libcfreeres_ptrs”部分没有映射到文件,通过do_brk()将“.bss”和“__libcfreeres_ptrs”剩余部分映射到堆栈中。

3.堆空间的最大申请数量
具体数值是受到操作系统版本、程序大小、程序栈数量等的限制,甚至有些每次运行的结果不同。

4.段地址对齐
由于段地址对齐的方式会在文件段的内部出现很多的碎片,导致磁盘的浪费。操作系统通过让各个segment接壤的部分共享一个物理页面,将该页面分别映射两次来解决,如下图:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员的自我修养--可执行文件的装载与进程 的相关文章

  • ARM接口技术基础

    ARM介绍 嵌入式系统 xff1a 嵌入式系统 61 嵌入式硬件 43 嵌入式软件 硬件是软件的载体 xff0c 软件是硬件的灵魂 嵌入式软件 xff1a 1 裸机 xff1a APP 2 系统 xff1a OS 43 APP 嵌入式硬件
  • ARM指令之MOV指令汇编与机器码的对应关系

    指令条件码 条件码就是一种简单的测试ALU状态标志位的方法 mov指令机器码 比如 xff1a mov r1 3 立即数 xff1a 3 第一个操作数 xff1a 寄存器1 S xff1a 0 xff08 注意 xff1a mov指令后面加
  • 设计模式之外观模式

    什么是外观模式 外观模式就是将一个复杂的子类系统抽象到同一个接口进行管理 外界只需要通过此接口与子类系统进行交互 xff0c 不需要直接与复杂的子类系统进行交互 外观模式属于结构型模式 外观模式案例 1 实现KTV模式 xff1a 打开电视
  • 设计模式之适配器模式

    概念 将一个类的接口转换成客户希望的另外一个接口 使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 用vector容器中的for each 举例子 span class token keyword class span span c
  • Qt基础学习笔记

    Qt中的常用快捷键 注释 xff1a ctrl 43 运行 xff1a ctrl 43 r 编译 xff1a ctrl 43 b 帮助文档 xff1a F1 自动对齐 xff1a ctrl 43 i 同名之间 h文件与 cpp文件的切换 x
  • Nginx学习 (1) —— 初识Nginx(编译安装、启动停止、简单配置)

    文章目录 Nginx的发行版本Nginx的编译安装 xff08 ubuntu18 04 xff09 Nginx相关操作Nginx启动停止命令安装Nginx为系统服务 Nginx的目录结构与基本原理目录结构 xff1a 基本运行原理 xff1
  • Nginx学习 (2) —— 虚拟主机配置

    文章目录 虚拟主机原理域名解析与泛域名解析 xff08 实践 xff09 配置文件中ServerName的匹配规则技术架构多用户二级域名短网址 虚拟主机原理 为什么需要虚拟主机 xff1a 当一台主机充当服务器给用户提供资源的时候 xff0
  • 如任让Echarts默认显示全部的数据(x轴(时间轴)默认显示查询到的所有数据)

    Echarts绘制折线图 有时候会用到时间轴 但是有时候时间轴默认显示的是部分数据 而不是全部的数据 当客户要求默认显示全部的数据的时候 就可以使用下面的方法 把dataZoom属性的startValue设置为0即可 dataZoom st
  • Nginx学习(3)—— 反向代理、负载均衡、动静分离、URLRewrite、防盗链

    文章目录 网关 代理与反向代理Nginx的反向代理配置基于反向代理的负载均衡的配置负载均衡策略负载均衡权重相关配置 xff08 weight xff09 动静分离Nginx配置动静分离 URL rewrite伪静态配置负载均衡 43 URL
  • Nginx学习(4)—— 高可用配置(keepalived实现Nginx的高可用)

    文章目录 高可用场景及解决方案keepalived的安装 高可用场景及解决方案 一般高可用的服务端会都有备用服务 xff0c 当某一个服务节点挂掉的时候就会有备用机顶上 这往往需要反向代理 Nginx 来将连接切换到可用的服务机器上 如下图
  • Nginx学习(5)—— 基本结构(源码)

    文章目录 Nginx源码学习基本数据结构1 字符串结构 xff1a ngx str t2 类似资源管理的结构 xff1a ngx pool t3 Nginx数组结构 xff1a ngx array t4 哈希表结构 xff1a 1 ngx
  • Nginx学习(6)—— handler模块(自定义handler配置模块的编码编译)

    文章目录 Nginx请求的处理handler简介handler模块的基本结构模块配置结构模块配置指令先看一下 ngx command t 结构 一个模块配置的demo简单模块配置的案例演示 模块上下文结构模块的定义handler模块的基本结
  • Nginx学习(7)—— 过滤模块(filter)

    文章目录 过滤模块简介执行时间和内容执行顺序Nginx是怎么按照次序依次来执行各个过滤模块的呢这些过滤模块的简述 xff08 按执行顺序 xff09 模块编译过滤模块分析相关结构体 响应头过滤函数响应体过滤函数主要功能介绍发出子请求优化措施
  • Nginx学习(8)—— upstream模块

    文章目录 upstream模块简介upstream模块接口memcached模块分析小结 upstream模块简介 nginx模块一般被分成三大类 xff1a handler filter和upstream 前面的章节中 xff0c 读者已
  • Nginx学习(9)—— 负载均衡模块

    文章目录 Nginx负载均衡模块负载均衡配置指令钩子初始化配置初始化请求peer get和peer free回调函数 小结 Nginx负载均衡模块 负载均衡模块用于从 upstream 指令定义的后端主机列表中选取一台主机 nginx先使用
  • Nginx学习(10)—— event模块、core模块、变量

    文章目录 core模块Nginx启动模块 event模块event的类型和功能accept锁 定时器变量Nginx中的变量指的是什么Nginx中如何创建变量Nginx中如何使用变量举个例子 Nginx的模块种类有很多 xff0c 除了HTT
  • Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

    文章目录 Nginx的源码目录结构Nginx中configure的原理auto脚本 模块编译顺序 Nginx的源码目录结构 nginx的源码目录与nginx的模块化以及功能的划分是紧密结合 xff0c 这也使得我们可以很方便地找到相关功能的
  • C语言中命令行工具 (getopt和getopt_long)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • C#与Java的比较

    关于java和C 争论不是一年两年了 贬低C 的文章也看过了很多 说一下个人见解 C 本身并不是不如java C 的优势在于学了之后在web和winform之间可以自由切换 web现在 net mvc已经效率很高了 企业级的应用现在很受欢迎
  • vs2010 和 vs2012同时安装遇到的问题

    安装VS2012后遇到的问题 悲剧的种子是在上个月初种下的 9月份微软发布了Visual Studio2012 xff08 发布会 xff09 xff0c 我是个对各种 新版本 极有偏好的人 xff0c 一看到新闻就立刻下载了VS2012

随机推荐

  • React警告:Received NaN for the `children` attribute. If this is expected, cast the value to a string.

    使用React框架时 xff0c 组件在使用 lt span gt Math abs goal goalInfo pretimes goal usergoalInfo cpt times lt span gt 这一语句时出现警告 xff1a
  • 持续请求/socket.io/?EIO=3&transport=polling&t=N8HrzIR

    项目基本介绍 xff1a 使用React xff0c webpack xff0c socket io client Node js Express socket io 等技术 xff0c 采用前后端分离开发 实现项目中的聊天室时遇到报错 x
  • node-xlsx 生成并下载有超链接的excel文件

    需求 xff1a 将微信小程序云数据库中的数据导出为excel文件 xff0c 文件按团队分为不同的sheet页 xff0c 首页汇总每个sheet页的数据总数 xff0c 并可点击跳转至对应的sheet页 下载时可选择今年某月份进行下载对
  • Vue通过v-for渲染的元素与$refs得到的实例对应不上

    开发时遇到一个bug xff1a 通过v for渲染出几个搜索条件组件 xff08 对应的数组数据记为selectList xff09 xff0c 通过其他方式修改了这些筛选条件对应的数据selectList xff0c 之后通过 refs
  • iView的Select 选择器选择失效

    问题 xff1a 给iView的Select赋的值通过接口获取 xff0c 得到数组 list xff0c 选择器的默认值 defaultValue 为数组list的第一个选择项 xff08 defaultValue 61 list 0 x
  • 不同路由对应同一组件页面

    在vue中 xff0c 当不同路由对应同一组件页面时会发生再次进入页面时不再重新渲染 xff08 为了更高效 xff0c 所以vue进行了复用 xff09 的问题 xff0c 整理一下解决办法 xff0c 如下 xff1a 方式一 Watc
  • /deep/样式穿透失效的原因和解决办法

    问题 xff1a vue页面中 xff08 样式使用less书写 xff09 xff0c 对iview的组件使用 deep 进行样式穿透修改默认样式 xff0c 发现在Google Chrome版本64上看样式修改成功 xff0c 但在火狐
  • 错误:ERROR in ./node_modules/_webpack-dev-server...Module not found: Error: Can't resolve 'webpack/hot

    学习webpack的途中总是困难重重 使用webpack dev server工具时 xff0c 运行cnpm run dev后报错 xff1a ERROR in node modules webpack dev server 64 2 1
  • 带参数的宏定义与有参函数的区别

    1 先介绍一下什么是宏定义 宏定义属于C语言编译系统中编译预处理中的一部分 xff08 但编译预处理不是C语言的语句 xff09 xff0c 其作用是为编译系统提供必要的前置信息 xff0c 告诉编译系统在源程序进行编译之前应该做些什么 它
  • UART接口控制器-RS-232的9脚接口

    RS 232常见引脚信号的定义 RXD 接收数据 xff0c TXD 发送数据 xff0c DTR 数据终端准备 xff0c GND 信号地 xff0c DSR 数据设备准备好 xff0c RTS 请求发送 xff0c CTS 清除发送 串
  • 去掉字符串最后一个字符的方法

    C 开发过程中一般都需要进行字符串的格式化处理 xff0c xff0c 以下提供去掉字符串最后一个字符的方法 如果是其他语言开发的话仅供参考有可能写法不一样 xff0c 但是意思是一样的 字符串 xff1a string s 61 34 1
  • C++11之lambda函数

    最近一直在看mesos的源代码 xff0c mesos中用到了很多C 43 43 11的新特性 xff0c lambda函数就是其中的一个 对于lambda函数简单的来说就是java中的匿名函数 语法定义 capture paramente
  • C++中两个类互相包含

    今天突然想起一个C 43 43 的问题 xff0c 如果一个类A包含类B的实例 xff0c 而实例B也包含另一个类A xff0c 这种方式的代码应该怎么写 xff0c 按照一般的开发者的想法的代码如下 xff1a 文件A h span cl
  • 命名空间

    命名空间的作用 命名空间是为了防止名字冲突提供更加可控的机制 命名空间分割了全局命名空间 xff0c 其中每一个命名空间是一个作用域 命名空间的定义 命名空间由三部分组成 xff0c 分别是namespace 空间名字和一系列由花括号括起来
  • STL中的swap函数

    swap函数执行会调用容器内数据类型的 xff0c 拷贝构造和赋值函数调用 对自定义类型使用STL algorithm中的swap函数 xff0c 会调用自定义的类型的拷贝构造函数一次 赋值函数两次 xff1b 自定义类型中没有定义那么就会
  • C++11之POD类型

    什么是POD类型 POD的全称叫做Plain Old Data xff0c 简单讲就是一个类或者一个结构体通过二进制拷贝之后还能保持其不变 xff0c 那么这个类型就是POD类型 什么类型属于POD类型 当一个类型具有平凡的定义和标准布局这
  • C++11之初始化成员变量

    C 43 43 98中的成员变量初始化 在声明类的时候 xff0c 对于静态类型并且是常量类型 xff0c 同时是枚举或者是整型的变量可以使用 61 在声明时初始化 对于不符合上述要求的静态变量可以在类外使用 61 进行初始化对于非静态类型
  • C++11之左值、纯右值和将亡值

    在C 43 43 11中所有的值一定属于左值 纯右值和将亡值三种值之一 xff0c 分别介绍一下这三种类型 左值与右值 在C 43 43 中定义左值与右值的比较标准的方法是根据其可以取地址来判断 左值就是可以对变量进行取地址或者有名字的变量
  • Skip List

    Skip List 是什么 我们常用数组和链表来组织数据 xff0c 对于已排序的数据 xff0c 数组的查询时间复杂度可以是 lgn 二分查找 xff0c 插入和删除都是 n 链表提供了一种更加灵活的组织方式 xff0c 插入和删除的时间
  • 程序员的自我修养--可执行文件的装载与进程

    进程的虚拟地址空间 C语言指针大小的位数与虚拟地址空间的地址位数相同 xff0c 即32位平台下进程的虚拟地址空间为4G由于程序在运行是处于操作系统的监管下 xff0c 进程的虚拟地址空间都在操作系统的掌握中 xff0c 只能使用操作系统分