深入理解虚拟内存机制

虚拟内存(深入了解计算机系统) 文章目录1.物理和虚拟寻址1.1 物理寻址1.2 虚拟寻址2.虚拟内存作为缓存的工具2.1 DRAM 缓存的组织结构2.2 页表2.3 页命中2.4 缺页2.5 分配页面3 虚拟内存作为内存管理的工具4 虚拟内存作为内存保护的工具5 地址翻译5.1 结合高速缓存和虚拟内存5.2 利用TLB加速地址翻译5.3 多级页表5.4 深入理解端到端的地址理解(示例)6. Linux 虚拟内存系统6.1 Linux 缺页异常处理7 内存映射7.1 共享对象7.2 fork函数7.3 execve函数7.4 mmap函数 阅读详情

原文转载自:https://www.jianshu.com/p/13e337312651

概述

现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力:

  1. 它将主存看成是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。
  2. 它为内阁进程提供了一致的地址空间,简化了内存管理。
  3. 它保护了每个进程的地址空间不被其他进程破坏。

物理和虚拟寻址

计算机的主存可以看做是一个由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址(Physical Address,PA)。第一个字节的地址为 0,接下来的地址为 1,以此类推。CPU 访问内存的最简单的方式是使用物理寻址(physical addressing)。

物理寻址

 

该图例的上下文是一条加载指令,塔读取从物理地址 4 处开始的 4 字节字。CPU 在执行这条指令的时候,生成一个有效物理地址,通过内存总线,把这个物理地址传递给主存,主存取出从物理地址4处开始的 4 个字节字,然后将它返回给 CPU,CPU 将它存放在一个寄存器里。早期使用物理寻址的系统通常都比较简单,比如数字信号处理器,计算器等嵌入式设备。

虚拟寻址

 

现在处理器采用的是一个程序虚拟寻址(virtual addressing)的寻址方式,如上图所示。CPU 通过生成一个虚拟地址(virtual address,VA)来访问主存,这个虚拟地址在被送到主存之前会先转换成一个物理地址。将虚拟地址转换成物理地址的任务叫做地址翻译(address translation),地址翻译需要 CPU 硬件和操作系统之间的配合。 CPU 芯片上叫做内存管理单元(Menory Management Unit, MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

地址空间

地址空间(address space)是一个非负整数 地址 的有序合集:{0,1,2,... }

地址空间

 

在一个带虚拟内存的系统中,CPU 从一个有 N= 2 的 n 次方 个地址的地址空间中生成虚拟地址,这个地址空间就称为虚拟地址空间:
{0,1,2,3,...., N-1}。
一个系统还有一个地理地址空间,对应于系统中物理内存的 M 个字节: {0,1,2,3,..., M-1}。
一个地址空间的大小通常是由表示最大地址所需要的位数来描述的,比如,一个包含 N = 2 的 n 次方 个地址的虚拟地址空间就叫做一个 n 位地址空间,现代操作系统通常支持 32 位或者 64 位虚拟地址空间。

虚拟内存做为缓存的工具

从概念上来说,虚拟内存被组织成为一个由存放在磁盘上的 N 个连续的字节大小的单元组成的数组,也就是字节数组。每个字节都有一个唯一的虚拟地址作为数组的索引。磁盘上活动的数组内容被缓存在主存中。在存储器结构中,较低层次上的磁盘的数据被分割成块,这些块作为和较高层次的主存之间的传输单元。主存作为虚拟内存的缓存。

虚拟内存(VM)系统将虚拟内存分割成称为虚拟页(Virtual Page,VP)的大小固定的块,每个虚拟页的大小为 P = 2 的 p 次方 字节。同样的,物理内存被分割为物理页(Physical Page,PP),大小也为 P 字节(物理页也称作页帧(page frame))。

在任意时刻,虚拟页面的集合都分为三个不相交的子集:

  1. 未分配的,VM 系统还未分配(或者创建)的页,未分配的页没有任何数据和它们关联,因此不占用任何内存空间。
  2. 缓存的,当前已缓存在物理内存中的已分配页。
  3. 未缓存的,未缓存在物理内存中的已分配页。

VM系统如何使用主存作为缓存

上图展示了在一个有 8 个虚拟内存的虚拟内存中,虚拟页 0 和 3 还没有被分配,所以在磁盘上不存在。虚拟页 1,4,6 被缓存在物理内存中。虚拟页 2,5,7 已经被分配了,但是当前并没有缓存在主存中。

DRAM 缓存的组织结构

image.png

我们使用 SRAM 缓存来表示位于 CPU 和 主存之间的 L1, L2 和 L3 高速缓存,使用 DRAM 缓存来表示虚拟内存系统中的缓存,也就是主存。

在存储器层次结构中, DRAM 比 SRAM 慢个大约 10x 倍,磁盘比 DRAM 慢大约 10, 000x 倍。因此 DRAM 缓存的不命中比 SRAM 缓存中的不命中要昂贵的多,因为 DRAM 缓存不命中需要和磁盘传送数据,而 SRAM 缓存不命中是和 DRAM 传送数据。

归根到底, DRAM 缓存的组织结构是由巨大的不命中开销驱动的。

页表

indexing

VA 是通过什么方式转成 PA 呢 ?
同任何缓存一样,虚拟内存系统必须有某种方法来判定一个虚拟也是否缓存在 DRAM 的某个地方。如果命中缓存,那么虚拟内存系统还必须确认这个虚拟页存在哪个物理页中。如果没有命中缓存,那么虚拟内存系统必须判断虚拟页存放在磁盘的哪个位置,在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到 DRAM,替换这个牺牲页。

这些功能由软硬件联合提供,包括操作系统软件,MMU 中的地址翻译硬件和一个存放在物理内存中叫页表(page table)的数据结构,页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换成物理地址时都会读取页表。

Page Tables

上图展示了一个页表的基本结构,页表就是一个页表条目(Page Table Entry,PTE)的数组。虚拟地址空间中的每个页在页表中都有一个 PTE。在这里我们假设每个 PTE 是由一个有效位(Valid bit)和一个 n 位地址字段组成的。有效位表明了该虚拟页当前是否被缓存在 DRAM 中。如果有效位为 1,那么地址字段就表示 DRAM 中相应的物理页的起始位置,这个物理页缓存了该虚拟页。如果有效位为 0,那么一个 null 地址表示这个虚拟页还未被分配,否则对应的这个地址就指向该虚拟页在磁盘上的起始位置。

上图所示中一共有 8 个虚拟页和 4 个物理页的页表,4 个虚拟页 VP1, VP2, VP4, VP7 当前被缓存在 DRAM 中,VP0 和 VP5 还未被分配,而剩下的 VP3 和 VP6 已经被分配了,但是当前未被缓存。

页命中

image.png

当 CPU 想要读取 VP2 中的虚拟内存中的一个字时,地址翻译硬件将虚拟地址作为一个索引来定位到 PTE2, 并从主存中读取它。因为 PTE2 设置了有效位,所以 VP2 是缓存在主存中的,所以地址翻译硬件使用 PTE 中的物理内存地址构造出这个字的物理地址。

缺页

缺页

在虚拟内存中,DRAM 缓存不命中称为缺页(page fault)。如上图所示,CPU 引用了 VP3 中的一个字, VP3 并未缓存在 DRAM 中。地址翻译硬件从内存中读取 PTE3, 从有效位判断出 VP3 未被缓存,并且触发了一个缺页异常。缺页异常会调用内核的缺页异常处理程序,该程序会选择一个牺牲页。如下图所示,在这个案例中就是存放在 PP3 中的 VP4。

牺牲页

此时如果 VP4 已经被修改了,那么内核程序会将它复制回磁盘。接下来,内核程序从磁盘赋值 VP3 到内存中的 PP3并更新 PTE3。随后返回用户进程。当异常处理程序返回时,它会重启执行导致缺页的指令,该指令会将导致缺页的虚拟地址重新发送到地址翻译硬件。如下图所示,现在 VP3 已经在主存中了,那么就是页命中了。

页命中

局部性

当我们了解了虚拟内存的运作机制之后,是不是觉得虚拟内存的效率会很低呢?因为页面没有命中的代价非常大。是不是担心虚拟内存会影响程序的性能呢?其实虚拟内存运作的非常好。它充分利用了局部性( locality )的原理。

局部性

在程序整个运作过程中,程序引用的不同页面的总数可能超出了物理内存的总大小,但是局部性原则可以保证在任意时刻,程序将趋向于在一个较小的活动页面(active page)集合上工作,这个集合被称作工作集(working set)或者常驻集合(resident set)。在程序初始开销之后也就是将工作集页面调入主存,接下来对这个工作集的访问会产生命中,这样就不会产生额外的磁盘消耗。
如果程序有良好的时间局部性,那么虚拟内存将工作的非常好。如果程序没有良好的时间局部性也就是工作集的大小超出了主存的大小,那么程序将会进入一个称作 抖动(thrashing)的状态,这个时候页面将不断地换进换出,程序会出现性能问题。

虚拟内存作为内存管理的工具

虚拟内存大大简化了内存管理,操作系统为每个进程提供了一个独立的虚拟地址空间。

内存管理工具

在上图中,进程 1 的页表将 VP1 映射到 PP2, VP2 映射到 PP6。进程 2 的页表将 VP1 映射到 PP8, VP2 映射到 PP6。在这里可以看到多个虚拟页面可以映射到同一个共享的物理页面上。

按需页面调度和独立的虚拟地址空间的结合,让 虚拟内存简化了链接和加载,代码和数据共享,以及应用程序的内存分配。

  • 简化链接。独立的地址空间允许每个进程的内存映像使用相同的基本格式,而不管代码和数据实际存放在物理内存的何处。
  • 简化加载。虚拟内存使得容易向内存中加载可执行文件和共享对象文件。将一组连续的虚拟页面映射到任意一个文件中的任意位置的表示法称作内存映射(memory mapping)。Linux 提供了一个 nmap 的系统调用,允许应用程序自己做内存映射。
  • 简化共享。独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般情况下,每个进程都有自己私有的代码、数据、堆栈。这些内容不与其他进程共享。在这种情况下,操作系统创建页表,将相应的虚拟页映射到不连续的物理页面。
  • 简化内存分配。虚拟内存向用户进程提供一个简单的分配额外内存的机制。当一个用户程序要求额外的堆空间时候,操作系统分配 k 个适当的连续的虚拟内存页面,并且将他们映射到物理内存的中的 k 个任意页面,操作系统没有必要分配 k 个连续的物理内存页面。

虚拟内存作为内存保护的工具

虚拟内存大大简化了内存管理,操作系统提供独立的地址空间使得区分不同进程的私有内存变得容易,但是地址翻译机制可以使用一种自然的方式拓展到提供更好的访问控制。每次 CPU 生成一个地址时,地址翻译硬件都会读一个 PTE ,通过在 PTE 上添加一些额外的控制位来控制对一个虚拟页面内容的访问。

访问控制

在上图中,每个 PTE 添加了三个控制位, SUP 位表示进程是否必须运行在超级用也就是内核模式下才能访问该页,WRITE 位控制页面的写访问, EXRC 位控制页面的执行。如果有指令违反了这些控制条件,那么 CPU 会触发一个一般保护故障,将控制传递给内核中的异常处理程序。

地址翻译

页面命中

上图中展示了页面命中的场景,CPU 硬件的执行步骤:

  1. 处理器 生成一个虚拟地址,并把它传送给 MMU。
  2. MMU 生成 PTE 地址,并从高速缓存/主存中请求这个 PTE 。
  3. 高速缓存/主存向 MMU 返回 PTE。
  4. MMU 构造物理地址,并把它传送给高速缓存/主存。
  5. 高速缓存/主存返回所请求的数据字给处理器。

页面命中是全部由硬件来处理的,既然有页面命中,那么就有页面不命中的场景。

页面不命中

上图展示了页面不命中的场景, CPU 硬件的执行步骤:

  1. 处理器 生成一个虚拟地址,并把它传送给 MMU。
  2. MMU 生成 PTE 地址,并从高速缓存/主存中请求这个 PTE 。
  3. 高速缓存/主存向 MMU 返回 PTE。
  4. PTE 中的有效控制位为 0 ,所以 MMU 触发了一次异常,传递 CPU 中的控制到操作系统内核中的缺页异常处理程序。
  5. 缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘。
  6. 缺页处理程序调入新的页面,并更新内存中的 PTE。
  7. 缺页处理程序返回原来的进程,再次执行导致缺页的指令, CPU 将引起缺页的虚拟地址重新发送给 MMU ,因为虚拟页面现在存在主存中,所以会命中,主存将请求字返回给处理器。

地址翻译的过程执行起来太慢了?怎么解决呢?答案你应该也猜到了,就是添加缓存。在 MMU 中包含了一个 TLB (Translation Lookaside Buffer)缓存。

TLB 命中

我们来看看 TLB 命中的场景,

  • 第 1 步 CPU 产生一个虚拟地址
  • 第 2 和 3 步 MMU 从 TLB 中取出对应的 PTE 。
  • 第 4 步 MMU 将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存。
  • 第 5 步 高速缓存/主存将所请求的数据字返回 CPU。

如下图所示,当 TLB 不命中的时候, 多了步骤 3 和 4 ,MMU 必须从 L1 缓存中取出对应的 PTE , 新取出的 PTE 存放在 TLB 中,可能会覆盖一个已经存在的 PTE 。

 

TLB 不命中

总结

虚拟内存对于计算机系统来说是核心的,虚拟内存也是强大的,同时虚拟内存也是危险的。虚拟内存还包括多级页表,内存映射,动态内存分配,垃圾收集等等内容。限于篇幅,这里只是叙述了一些基本的概念,帮助程序员理解 虚拟内存 这个概念,对具体细节不做深究。若是有兴趣的话,可以参考 《深入理解计算机系统》书籍,了解更多关于计算机虚拟内存要点。

参考

本文是华盛顿大学的公开课 《 The Hardware / Software Interface 》的课程笔记,该课程的参考书籍是大名鼎鼎的 CSAPP 也就是《 深入理解计算机系统 》这书。文章截图来源于课程,文章的内容也参考了 CSAPP 的书本内容。

  1. https://courses.cs.washington.edu/courses/cse351/17wi/videos.html
  2. https://book.douban.com/subject/26912767/



作者:要上班的斌哥
链接:https://www.jianshu.com/p/13e337312651
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

24、深入理解虚拟内存:原理、机制与优势 本文深入探讨了虚拟内存技术的原理、机制与优势,涵盖了内存管理单元(MMU)、分页机制、页表结构、多级页表、快表(TLB)、页面置换算法以及虚拟内存与缓存的交互。通过这些机制,虚拟内存实现了程序的位置独立性、内存隔离与保护、支持大型程序运行和高效利用存储,是现代计算机系统提升性能与效率的核心技术之一。 阅读详情

相关推荐

25、深入理解虚拟内存:原理、机制与优势

本文深入探讨了虚拟内存的原理、机制与优势,介绍了虚拟内存如何通过MMU实现虚拟地址到物理地址的转换,详细解析了一级分页、页表工作机制、页错误处理流程以及常见的页面替换算法。同时分析了虚拟内存带来的程序隔离、内存保护、支持大型程序运行等优点,并讨论了其与缓存系统的交互关系,帮助读者全面理解现代操作系统中虚拟内存的核心技术。

pink7的博客 109

linux内存管理笔记(三十八)----反向映射

用户进程在使用虚拟内存的过程中,从虚拟内存页面映射到物理内存页面时,PTE保留这个记录,page数据结构中的_mapcout记录有多少个用户PTE映射到物理页面。用户PTE是指用户进程地址空间到物理页面的建立映射的PTE,不包括内核地址空间映射到物理页面所产生的PTE,其要面对以下的问题 有些页面需要迁移 有些页面长时间不适用,需要交换到磁盘 在交换之前,必须找到哪个进程适用这个页面,然后解除这些映射的用户PTE 一个物理页面可以同时被多个进程的虚拟内存映射,但是一个虚拟页面同时只能映射到一个物理页面

奇小葩 3790

26、深入理解虚拟内存管理机制与页面置换算法

本文深入探讨了虚拟内存管理机制及其核心组件,包括页面划分、换入换出操作、页面错误处理以及关键术语解析。详细介绍了多种页面置换算法如LRU、LFU、FIFO、时钟变体和随机算法的原理、优缺点及适用场景,并通过操作系统工作台的模拟实验直观展示了虚拟内存的工作流程。文章还结合图示与实际案例,帮助读者理解虚拟内存系统在资源受限环境下的行为特征,最后总结了优化内存管理的策略与进一步探索方向。

49

计算机组成原理:简单页表和多级页表(虚拟内存的映射)

我们的指令和数据,都必须先加载到内存,才会被CPU拿去执行。但是程序并不能直接访问到物理内存。从这里可以知道,程序是怎么装载到内存中执行的。 我们的内存需要被分成固定大小的页(Page),然后才通过虚拟内存地址到物理内存地址的地址转换,才能到达实际存放数据的物理内存位置。而我们的程序看到的内存地址,都是虚拟内存地址。 那么,这些虚拟内存地址究竟是怎么转换成物理地址的呢? 简答页表 想要把虚拟内存地址,映射到物理内存地址,最直观的方法,就是来键一张映射表。这个映射表,能够实现虚拟内存里面的页,到物理内存里面

OceanStar的博客 2万+

虚拟地址空间映射到物理地址空间

虚拟地址空间映射到物理地址空间参考如下   当处理器读或写入内存位置时,它会使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势:   程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。   程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB

z4a1c2的专栏 5294

深入理解计算机系统:Virtual Memory 虚拟内存

经典书籍,深入理解计算机系统 虚拟内存机制、页表、TLB地址代换,高清PDF英文原版

GPU虚拟内存管理

摘要:GPU虚拟内存管理通过统一虚拟寻址(UVA)实现CPU和GPU共享地址空间,简化异构计算编程。CUDA统一内存(cudaMallocManaged)进一步提供易用性,支持主机和设备直接访问同一内存。底层采用按需分页机制,通过页错误自动迁移数据,但需注意PCIe带宽限制可能导致的性能瓶颈。在多GPU系统中,NVLink可实现GPU间直接内存访问。该技术虽简化编程,仍需优化数据迁移以提升性能。(149字)

1483

手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)

本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。

weixin_28716769的博客 412

操作系统——深入理解虚拟内存机制

本文来自:https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它为所有进程提供了一致的地址空间,简化了内存管理。 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问 它将主存看成是一个存储在磁盘空间上的地...

zhaohong_bo的专栏 1847

深入理解虚拟内存机制(转载)

现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。

小小的手心 622

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL)

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL),xfce桌面美化、安装google-chrome

NiKoJJ‘s Blog 1万+

深入理解Linux进程管理与虚拟内存机制

task_struct中包含了进程ID、状态、优先级等关键信息,并通过双向链表组织起来。平台提供即开即用的Linux环境,无需复杂配置就能实践进程管理、内存分配等操作,特别适合学习系统编程原理。这种机制使得子进程初始共享父进程资源,仅在需要修改时才创建副本,既保证了效率又确保了进程独立性。这也是为什么fork能"返回两次"的奥秘所在。每个进程看到的都是独立的4GB虚拟地址空间(32位系统),包含代码段、数据段、堆、栈等区域。环境变量通过继承机制实现全局性,从bash进程开始,所有子进程都会继承环境变量表。

RubyWolf84的博客 445

方法二:旋转机械动平衡精度计算

本文以实际案例为基础,系统阐述基于ISO 1940标准的动平衡精度G GG等级计算方法。通过角速度转换、许用剩余不平衡量e p e r e_{per}e per ​ 推导及G GG等级公式应用,结合惯性力偶矩、转子质量等参数,得出某转子系统的动平衡精度为G 40 G40G40。文中详细解析了公式原理与参数单位转换要点,并附完整ISO 1940动平衡等级参考表,为工程师提供从理论到实践的完整解决方案。研究结果表明,该方法可有效量化旋转机械的平衡精度,适用于风机、泵类等中低速设备的设计与调试,对提升设备运行

weixin_46153372的博客 903

深入理解Linux程序地址空间与虚拟内存机制

我们可以快速搭建Linux内存管理相关的演示环境,无需配置复杂的环境变量,一键部署就能看到实际效果。我们观察到的变量地址实际上是虚拟地址,相同的虚拟地址可能映射到不同的物理地址,这就是为什么父子进程中相同变量的地址相同但值可以不同的原因。页表是操作系统维护的数据结构,每个进程都有自己独立的页表,记录虚拟地址到物理地址的映射关系。内核使用mm_struct结构体来描述进程的地址空间,记录各内存区域的起始和结束地址。这种机制既保证了进程的独立性,又避免了不必要的内存复制,提高了系统效率。

PurpleRain89的博客 431

深入理解Linux虚拟内存与物理内存的映射机制

在Linux系统中,虚拟内存是一个非常重要的概念,它让每个进程都认为自己拥有独立的4GB(32位系统)内存空间。只有当子进程尝试修改数据时,操作系统才会真正复制数据到新的物理内存,并更新子进程的页表。当访问尚未加载的虚拟地址时,会触发缺页中断,操作系统再加载相应的内存页。虚拟地址空间是进程视角的内存视图,每个进程都有自己的虚拟地址空间,这使得不同进程可以使用相同的虚拟地址而不会冲突。页表中记录了每个内存区域的访问权限,当程序尝试非法访问(如向只读区域写入数据)时,操作系统会阻止这种操作。

FrostfireStag78的博客 349

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5248

深入理解Windows虚拟内存机制 - 0xZ0F逆向工程课程第七章解析

你是否曾经遇到过这样的困境:系统只有4GB物理内存(RAM),但运行的程序却需要6GB内存空间?或者多个程序同时运行时,硬编码的内存地址冲突导致程序崩溃?这些正是虚拟内存(Virtual Memory)技术要解决的核心问题。 在逆向工程领域,深入理解Windows虚拟内存机制至关重要。无论是分析恶意软件的内存行为、调试复杂应用程序,还是理解操作系统底层原理,虚拟内存知识都是不可或缺的基础。本文将...

gitblog_00952的博客 1126

【HALCON工业视觉应用探索】08. C#+Halcon视觉引导机器人抓取:从入门到工业级实战(附完整代码+部署指南)

摘要:本文聚焦C#+Halcon在视觉引导机器人抓取领域的落地应用,从新手友好的“二十分钟基础引导系统”切入,逐步深入工业级场景(汽车变速箱壳体抓取)。内容涵盖核心概念(手眼标定原理、坐标转换、机器人通信协议)、完整技术流程(图像采集→目标定位→标定转换→机器人执行→结果反馈)、工业级代码实现(多目标识别、智能抓取策略、实时状态监控),以及现场部署关键技巧(硬件选型、通信配置、精度优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1228

Arnis Minecraft 城市生成:三步把真实城市搬进游戏世界

Arnis 是一款用 Rust 写的 Minecraft 城市生成工具。它从 OpenStreetMap 获取真实地理数据,结合高程数据,把你的家乡、大城市或自然地貌高保真地生成 Minecraft 世界。适合想把现实城市搬进游戏、想自己搭服务器的玩家和地图创作者。 ## 先看看效果:能生成到什么程度 [![Arnis 生成的 Minecraft 真实城市与地形效果预览](https://ra

gitblog_02246的博客 1056

虚拟内存:从分页机制到页面置换,深入理解操作系统内存管理

内存管理是操作系统的核心功能之一,它负责高效、安全地分配和回收计算机的物理内存资源。其基本原理是通过地址映射机制,将进程使用的逻辑地址转换为实际的物理地址,从而实现多道程序并发运行时的内存隔离与保护。这项技术的核心价值在于提升了系统的稳定性、安全性,并简化了应用程序的开发模型,程序员无需直接操作复杂的物理内存。在应用层面,内存管理支撑着从桌面应用到服务器、嵌入式系统的几乎所有软件运行。本文聚焦于虚拟内存这一关键实现技术,它通过分页、页表、TLB快表等机制,结合页面置换算法,在物理内存有限的情况下,为每个进程

weixin_33922672的博客 366

北斗导航 | 接收机自主完好性监测(RAIM)算法近三年研究现状总结(2022-2025)

近三年RAIM算法已从传统的单故障检测演进为多星座协同、智能融合的复杂系统,在航空、自动驾驶等安全关键领域实现规模化应用。未来需重点突破城市复杂环境适应性和标准化体系建设,推动技术从"可用"向"可信"跨越。

尘世冰封的专栏 415

Linux内存管理章节七:虚拟内存的寻宝图:深入理解页表管理机制

虚拟内存的寻宝图:深入理解页表管理机制

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 955

简单温度采集程序 源代码_labview温度采集_温度采集_labview_源码

上位机、下位机搭配实现温度采集界面,LabVIEW实现温度采集,下位机包含main.c文件

上一篇: STL图书笔记入门1.9:__STL_MEMBER_TEMPLATE
下一篇: spark学习笔记1
我能想到的
博客等级 码龄12年 44粉丝 60原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值