Linux内核学习(十一)—— 进程地址空间(基于Linux 2.6内核)

目录

一、地址空间

二、内存描述符

三、虚拟内存区域

四、操作内存区域

find_vma()

mmap() 和 do_mmap():创建地址区间

五、页表


一、地址空间

进程地址空间由进程可寻址并且允许进程使用的虚拟内存组成, 每个进程都有一个 32 位或 64 位的平坦(flat)地址空间,空间的具体大小取决于体系结构。术语 “平坦(flat)” 指的是地址空间范围是一个独立的连续空间。每个进程都有唯一的这种平坦地址空间,一个进程的地址空间与另一个进程的地址空间即使有相同的内存地址,实际上也彼此互不相干。相对地,能与其他进程共享它们的地址空间的进程,被称为线程。

进程只能访问有效内存区域内的内存地址,每个内存区域也具有相关权限,如果一个进程访问了不在有效范围中的内存区域,或以不正确的方式访问了有效地址,那么内核就会终止该进程,并返回 “段错误(Segmentation Fault)” 信息

内存区域可以有如下类型的内容:

  • 代码段(text section),可执行文件代码的内存映射。
  • 数据段(data section),可执行文件的已初始化全局变量的内存映射。
  • bss 段(bss section),可执行文件的未初始化全局变量的内存映射。
  • 进程用户空间栈。
  • 内存映射文件。
  • 共享内存段。
  • 匿名的内存映射,比如由 malloc() 分配的内存。

二、内存描述符

内核使用内存描述符结构体表示进程的地址空间,该结构包含了和进程地址空间有关的全部信息。内存描述符由 mm_struct 结构体表示,定义在 <linux/sched.h> 中:

 

mm_users 域记录正在使用该地址的进程数目。比如,两个线程共享该地址空间,那么 mm_users 的值便等于 2;

mmap 和 mm_rb 这两个不同数据结构体描述的对象是相同的:该地址空间中的全部内存区域。但是前者以链表形式存放而后者以红黑树形式存放。mmap 结构体作为链表,利于简单、高效地遍历所有元素;而 mm_rb 作为红黑树,更适合搜索指定元素。

在进程描述符 task_struct 中的 mm 域就存放着该进程使用的内存描述符。fork() 函数利用 copy_mm() 函数复制父进程的内存描述符给子进程。通常,每个进程都有唯一的 mm_struct 结构体,即唯一的进程地址空间。

当进程退出时,内核会调用 exit_mm() 函数,内存描述符中的 mm_users 用户计数会减一,如果用户计数等于 0,则减少 mm_count 使用计数,如果该计数也为 0,则释放该结构体。

内核线程没有进程地址空间,也没有相关的内存描述符。所以内核线程对应的进程描述符中 mm 域为空。所以内核线程没有用户上下文。

三、虚拟内存区域

虚拟内存区域(virtual memoryAreas,VMAs),由 vm_area_struct 结构体描述,定义在 <linux/mm_types.h> 中。该结构体描述了指定地址空间内连续区间上的一个独立内存范围。

vm_start 是内存区间的开始地址,而 vm_end 是内存区间的结束地址。

VMA 标志是一种位标志,定义于 <linux/mm.h>。包含在 vm_flags 域内,标志了内存区域所包含的页面的行为和信息。

vm_area_struct 结构体中的 vm_ops 域指向与指定内存区域相关的操作函数表,内核使用表中的方法操作 VMA。操作函数表由 vm_operations_struct 结构体表示,定义在文件 <linux/mm.h> 中:

四、操作内存区域

find_vma()

find_vma() 函数能识别给定的内存地址属于哪一个内存区域,定义在 <mm/mmap.c> 中:

struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr);

该函数在指定的地址空间中搜索第一个 vm_end 大于 addr 的内存区域。如果没找到这种区域,则函数返回 NULL,否则返回指向匹配的内存区域的 vm_area_struct 结构体指针。 

mmap() 和 do_mmap():创建地址区间

内核使用 do_mmap() 函数创建一个新的线性地址区间。

unsigned long do_mmap(struct file *file, unsigned long addr,unsigned long len, unsigned long prot,unsigned long flag, unsigned long offset)

该函数映射由 file 指定的文件,具体映射的是文件中从偏移 offset 处开始,长度为 len 字节的范围内的数据。如果 file 参数是 NULL 并且 offset 参数也是 0,那么就代表这次映射没有和文件相关,被称为匿名映射(anonymous mapping)。如果指定了文件名和偏移量,那么该映射就被称为文件映射(file-backed mapping)。 

在用户空间可以通过 mmap() 系统调用获取内核函数 do_mmap() 的功能。定义如下:

void *mmap2(void start, size_t length, int prot, int flags, int fd, off_t pgoff)

该系统调用是 mmap() 调用的第二种变种,最原始的 mmap() 调用中最后一个参数是字节偏移量,而 mmap2() 使用页面偏移作为最后一个参数。使用页面偏移量可以映射更大的文件和更大的偏移位置。

五、页表

虽然应用程序操作的对象是映射到物理内存之上的虚拟内存,但是处理器直接操作的却是物理内存。所以当应用程序访问一个虚拟地址时,首先必须将虚拟地址转化成物理地址,然后处理器才能解析地址访问请求。地址的转换工作需要通过查询页表才能完成,地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表项则指向下一级别的页表或者指向最终的物理页面。 

Linux 中使用三级页表完成地址转换。利用多级页表能够节约地址转换需要占用的存放空间。

  • 顶级页表是页全局目录(PGD),PGD中的表项指向二级页目录中的表项:PMD。
  • 二级页表是中间页目录(PMD),其中表项指向 PTE 中的表项。
  • 最后一级简称页表,该页表直接指向物理页面。

多数体系结构中,搜索页表的工作是由硬件完成的。

 

为了加快查询速度,多数体系结构实现了一种高速缓存(translate lookaside buffer,TLB)。TLB 作为一个将虚拟地址直接映射到物理地址的硬件缓存,当请求访问一个虚拟地址时,处理器会首先检查 TLB 中是否缓存了该虚拟地址到物理地址的映射,如果在缓存中则直接命中,立即返回物理地址;否则,就要再通过页表搜索需要的物理地址。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621484.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

在云原生环境中构建可扩展的大数据平台:方法和策略

文章目录 1. **选择适当的云提供商&#xff1a;**2. **采用容器化和微服务架构&#xff1a;**3. **分层架构设计&#xff1a;**4. **弹性计算资源&#xff1a;**5. **使用分布式计算框架&#xff1a;**6. **数据分区和分片&#xff1a;**7. **使用列式存储&#xff1a;**8. **缓…

java 高级面试题整理(薄弱技术-2023)

session 和cookie的区别和联系 session1.什么是session Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存在客户端浏览器中&#xff0c;而Session保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上。这就…

第一讲:工业网络的“语言”——通讯标准

工业网络的“语言”——通讯标准 a) CC-Link CANopen Modbus等&#xff1b; b) 民用网络&#xff1a;TCP-IP协议 c) 民用网络VS工业网络——网络架构&#xff1a; i. 民用网络架构&#xff1a; ii. 工业网络架构&#xff1a; 从网络架构上来看&#xff…

时间敏感网络(TSN)关键协议的介绍

TSN的概述 为了简洁明了&#xff0c;此笔记不再介绍TSN的背景知识。 由于通信主体的演进&#xff0c;各个业务对于时间敏感程度愈加严格。为了构建一个统一的数据链路层协议&#xff0c;通过标准化使其在不同的领域都可以同构运行&#xff0c;提供实时数据的传输保障。 时间…

Arduino ESP32 最简单直接获取网络时间方法

Arduino ESP32 最简单直接获取网络时间方法 ✨在 ArduinoESP32核心支持库当中已经包含相关的获取时间的库&#xff0c;所有获取网络时间&#xff0c;只需要连接好网络&#xff0c;调用相关的库函数即可实现NTP时间的获取&#xff0c;免去的额外加载扩展库的头文件。 &#x1f9…

TCN-时间卷积网络

目录 一、引言 二、时序卷积神经网络 2.1 因果卷积&#xff08;Causal Convolution&#xff09; 2.2 膨胀卷积&#xff08;Dilated Convolution&#xff09; 2.3 残差链接&#xff08;Residual Connections&#xff09; 三、讨论和总结 1. TCN的优点 2. TCN的缺点 参考…

DBeaver的安装和使用:windows版

DBeaver官网下载地址&#xff1a;https://dbeaver.io/download/ 下载完成后&#xff0c; 进入傻瓜式安装&#xff1a; 这里会进入重复界面&#xff0c;一样点击下一步即可 选择安装目录&#xff0c;尽量不要选C盘&#xff0c; 我的电脑只有c盘&#xff0c; 没办法 等待安装完成…

这款远程桌面软件开源了

相信在七八年前&#xff0c;大部分读者都使用 QQ 远程控制电脑。到后面&#xff0c;才接触到一些好用的远程控制产品&#xff0c;比如 Teamviewer、向日葵等。 最近&#xff0c;自己装的远程控制产品试用期到了&#xff0c;便想到去 GitHub 找找有没有可以替代的开源项目&#…

Modbus转Profinet网关在大型自动化仓储项目应用案例

在自动化仓储项目中&#xff0c;Modbus是一种常见的通信协议&#xff0c;用于连接各种设备&#xff0c;例如传感器、PLC和人机界面。然而&#xff0c;Modbus协议只支持串行通信&#xff0c;并且数据传输速度较慢。为了提高通信效率和整体系统性能&#xff0c;许多大型仓储项目选…

LeetCode-455-分发饼干-贪心算法

题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…

手机怎么解决同ip多账号_游戏工作室如何实现手游多开多窗口多IP

经常能看到的一个画面就是游戏工作室&#xff0c;一台电脑许多个手机游戏窗口同时进行&#xff0c;需求量1台程序运行好几个微端。或是相同应用程序开启好几个窗口。那样做能够节约成本&#xff0c;不用多个设备。 但他们全是公用相同网络ip地扯得&#xff0c;那麼如何来防止由…

【产品文档】团队介绍PPT模板

今天和大家免费分享团队介绍的PPT模板。团队介绍是向他人展示团队的实力、专业性和能力的重要方式。通过一个有力的团队介绍&#xff0c;您可以突出团队的成员、经验、技能和取得的成就&#xff0c;从而增加信任、吸引合作伙伴、客户或投资者的兴趣 【模板预览】 动态演示效果…

【交换机 挑选】什么交换机适合游戏工作室

【交换机 挑选】如何选择合适的交换机&#xff1f;什么交换机适合游戏工作室&#xff1f;交换机作为局域网数据转发的核心设备&#xff0c;其性能及功能决定着局域网的可管理性和数据转发性能&#xff0c;选择交换机时ONV/光网视小编建议可以从以下几方面去考虑&#xff1a;1.端…

“钩子”、体验和思考人生,一家瑞典游戏工作室如何站稳脚跟,又不被自己的野心呛到

“瑞典夏天短&#xff0c;冬夜漫漫&#xff0c;我想大家就窝在家里做游戏了。” Minecraft、《战地》、《城市&#xff1a;天际线》、Candy Crush……你曾玩过或当前在玩的很多游戏都是瑞典出产。为什么瑞典人这么擅长做游戏&#xff1f;Anton Albiin 给出了一个有点冷的回答。…

c++游戏工作室,不容错过

zzz工作室&#xff0c;链接zzz07.ysepan.com 在这里&#xff0c;你可以聊天留言&#xff0c;可以贴上自己的小游戏或自己的文章&#xff0c;可以下载教程和其他小游戏&#xff0c;也可以做题哟(&#xff3e;&#xff35;&#xff3e;)ノ~&#xff39;&#xff2f;。并且在目前…

SaaS | 金山软件西山居游戏工作室

SaaS | 金山软件西山居游戏工作室 原创&#xff1a; 鲁迅本人 鲁迅都说好 3天前 想了想金山软件还是得放到SaaS&#xff0c;以后比较好归类。 主要三个关注点吧 剑侠IP带来的流量是否能长此以往经久不衰端游转手游是趋势&#xff0c;转换是否成功腾讯入股代理&#xff0c;渠…

游戏工作室

各位玩家大家中午好&#xff0c;工作室对游戏内的影响是非常巨大的&#xff0c;我们会一直严厉打击工作室及其相关账号。如果某部分账号是工作室的获利账号我们查出来以后也会进行封停处理。当然&#xff0c;账号被封停的原因不仅仅是工作室&#xff0c;还有因为使用外挂等第三…

手游游戏工作室内部OA管理系统免费安装教程

1. 安装配置&#xff0c;下载OA源码 ①&#xff1a;安装宝塔&#xff08;https://www.bt.cn/&#xff09;系统&#xff0c;配置环境 ②&#xff1a;下载溪谷工作室OA免费版 溪谷软件工作室OA管理系统免费下载地址-游戏公会管理-游戏公会运营推广资讯-游戏工作室OA &#xff08…

专业游戏后端引擎“坚果矩阵” 解初创游戏工作室的燃眉之急

2020年新冠疫情肆虐全球对各行各业都造成了不同程度的冲击&#xff0c;在这种经济形势下游戏行业反倒获得了逆势增长&#xff0c;玩家在线时长大幅上升&#xff0c;中国游戏市场实际销售收入增长超20%。仅2020年上半年中国新增注册游戏企业超4.42万家&#xff0c;平均每天新增注…

手机游戏辅助和游戏工作室的相关性

说起游戏辅助,特别是手游辅助,最大的需求群体算是游戏工作室了。游戏工作室是中国游戏产业链上重要的一环,他们需要使用游戏辅助工具,配合手机群控软件,批量进行手机游戏,如自动刷金币,自动跑图,自动刷极,自动挂机等操作, 多则上百台手机同时操作,效率极高。 Total Control集手…