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

news2024/11/16 17:39:09

目录

一、地址空间

二、内存描述符

三、虚拟内存区域

四、操作内存区域

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://www.coloradmin.cn/o/936653.html

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

相关文章

HTB Getting Started

HackTheBox Getting Started 练习解析 1.Basic Tools 直接用知识点 sjhdvjshtb[/htb]$ netcat 10.10.10.10 22SSH-2.0-OpenSSH_8.4p1 Debian-32.Service Scanning 这题需要连接vpn进行扫描 kail连接VPN sudo openvpn academy-regular.opvn #kail 没安装openvpn需要进行安装…

文本分类任务

文章目录 引言1. 文本分类-使用场景2. 自定义类别任务3. 贝叶斯算法3.1 预备知识3.2 贝叶斯公式3.3 贝叶斯公式的应用3.4 贝叶斯公式在NLP中的应用3.5 贝叶斯公式-文本分类3.6 代码实现3.7 贝叶斯算法的优缺点 4. 支持向量机4.1 支持向量机-核函数4.2 支持向量机-解决多分类4.3…

设计模式入门:解密优雅的代码构建

从本篇文章开始&#xff0c;我们将开启一个设计模式的系列文章&#xff0c;主要用来介绍常用的设计模式&#xff0c;使用场景和代码案例&#xff0c;对设计模式不熟悉的老铁可以关注一下&#xff0c;可以快速让你入门设计模式。 在软件开发的世界中&#xff0c;设计模式是一种…

1.神经网络基础知识

所有有用的计算机系统都有一个输入和一个输出&#xff0c; 并在输入和输出之间进行某种类型的计算。 神经网络也是如此。 当我们不能精确知道一些事情如何运作时&#xff0c; 我们可以尝试使用模型来估计其运作方式&#xff0c; 在模型中&#xff0c; 包括了我们可以调整的参数…

4-1-netty

非阻塞io 服务端就一个线程&#xff0c;可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件

list(介绍与实现)

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modififiers 1.2.6 list的迭代器失效 2. list的模拟实现 2.1 模拟实现list 2.2 list的反向迭代器 1.…

Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资...

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中三则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊由 Python猫 出品…

内核模块添加功能及使用(静态、动态)

一、向内核添加新功能 1.1 静态加载法&#xff1a; 即新功能源码与内核其它代码一起编译进uImage文件内 新功能源码与Linux内核源码在同一目录结构下 在linux-3.14/driver/char/目录下编写myhello.c&#xff0c;文件内容如下&#xff1a; #include <linux/module.h> #i…

如何使用腾讯云服务器搭建网站?

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网分享使用腾讯云服务器建站教程&#xff0c;新手站长搭…

【深度学习】Pytorch训练过程中损失值出现NaN

项目场景 利用Pytorch框架&#xff0c;结合FEDformer开源代码&#xff08;https://github.com/MAZiqing/FEDformer&#xff09;&#xff0c;将自己的数据集作为输入训练模型。 问题描述 训练过程中&#xff0c;发现打印出来的Train loss, Test loss, Test loss中&#xff0c…

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

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

API管理风险:如何确保您的API安全与可靠?

API管理风险&#xff1a;如何确保您的API安全与可靠&#xff1f; 随着数字化时代的到来&#xff0c;应用程序接口&#xff08;API&#xff09;在现代软件开发中发挥着关键的作用。然而&#xff0c;API管理过程中存在着各种潜在的风险。本文将探讨如何有效地管理和缓解这些风险…

前端将file文件传给后台,后台将文件传给前台(包含上传下载)

前端将file文件传给后台&#xff0c;后台将文件传给前台&#xff08;包含上传下载&#xff09; 在开发过程中&#xff0c;经常会遇见对文件的处理。 例如&#xff1a;在上传、下载文件时&#xff0c;需要在前端选完文件传到后台传到服务器&#xff1b;或者文件从后台&#xf…

001微信小程序云开发 API数据库-导入/导出

文章目录 微信小程序云开发 API数据库-导入案例代码微信小程序云开发API数据库-导出案例代码 微信小程序云开发 API数据库-导入 随着移动互联网的普及&#xff0c;微信小程序已经成为一种受欢迎的应用形式。微信小程序云开发 API 数据库是微信小程序的一项重要功能&#xff0c…

msvcp140.dll重新安装的解决方法,msvcp140.dll丢失解决方案

今天&#xff0c;我将向大家传授一种与我们的日常生活紧密相连的技巧——解决msvcp140.dll重新安装的方法。在这个信息爆炸的时代&#xff0c;每个人就像是在纷繁复杂的电脑问题中航行的船只&#xff0c;随时可能遭遇各种故障和问题。 首先&#xff0c;让我们来了解一下msvcp14…

Modbus转Profinet网关应用在自动上料机案例

该案例中的自动上料机通过使用Modbus转Profinet网关实现了与1200PLC和G120变频器的通信。这种通信方式能够实现设备之间的数据交换和控制命令传输&#xff0c;大大提升了自动上料机的运行效率和精度。通过使用该网关&#xff0c;1200PLC可以准确地向G120变频器发送控制命令&…

RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…

vue2 路由进阶,VueCli 自定义创建项目

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

2000-2021年上市公司绿色投资环保投资与营业收入之比数据(原始数据+计算代码+计算结果)

2000-2021年上市公司绿色投资环保投资与营业收入之比数据&#xff08;原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、企业名称、年份、管理费用环保投资、管理费用环保投资/营业收入…