[OS] mmap() 函数的参数及其作用

参数说明:

  • addr:映射区域的起始地址。如果设置为 0,则由内核自动选择页对齐的地址。
  • length:需要映射的字节数,决定映射的区域大小。
  • prot:映射区域的内存保护属性,如只读、可读写等。这个属性不能与文件的打开模式冲突。
  • flags:确定映射是否对底层文件可见,即更新是否会写入文件。
  • fd:文件描述符,用来标识要映射的文件。
  • offset:文件的起始偏移量,表示从文件的哪个字节开始映射。

通俗解释

在使用 mmap() 时,我们可以通过这些参数告诉系统具体如何进行映射。举个例子:

  • addr 就像是我们指定文件在内存中的“安放位置”,如果不想指定位置,可以让系统自动分配。
  • length 就是告诉系统要映射多少内容,相当于“文件的页数”。
  • prot 就像文件的权限标识,比如只能读,或者可以读写。
  • flags 决定了对文件的修改是否同步,比如写进内存里的内容是否自动写回到文件。
  • fd 是文件的“身份证”,标识了哪个文件要被映射。
  • offset 是从文件的哪个字节开始映射,类似于文件的“章节页码”。

关键词解释

  • addr:起始地址,如果为 0 则由系统决定。
  • length:映射的区域大小,以字节为单位。
  • prot:保护属性,比如 PROT_READ(只读)、PROT_WRITE(可写)。
  • flags:映射选项,比如 MAP_SHARED(共享)和 MAP_PRIVATE(私有)。
  • fd:文件描述符,用于标识文件。
  • offset:偏移量,从文件的指定字节开始映射

这个调用将文件的部分内容映射到内存中

,具体解释如下:

  • 0:将 addr 参数设为 0,让内核自动选择一个页对齐的地址。
  • PGSIZE*2:映射区域的大小是 PGSIZE 的两倍。PGSIZE 表示页的大小(通常是 4096 字节),因此这里映射 2 个页面的大小。
  • PROT_READ:映射区域的权限是只读,表示映射的内容不能被修改。
  • MAP_PRIVATE:表示私有映射,如果进程修改了映射的内存,修改不会反映回到原文件。这在这里是默认的,因为 PROT_READ 已经设置了只读属性,禁止了任何写入操作。
  • fd:文件描述符,指向要映射的文件。
  • 0:偏移量为 0,表示从文件的开头开始映射。

通俗解释

简单来说,这个调用的作用是将文件的前两页内容加载到内存中,并且只允许读取,不能修改。因为设置了 MAP_PRIVATE,即使我们尝试修改(尽管 PROT_READ 已经禁止了),修改也不会影响到原文件的内容。

这张图片的内容是在指导您如何实现 mmap() 的功能。具体来说,需要完成以下两项工作:

1. 实现 sys_mmap 函数

  • 该函数应该在 sysfile.c 文件中编写。
  • sys_mmap 是系统调用 mmap() 在内核中的实际实现,用于将文件映射到用户空间内存区域。
  • 您需要在 sys_mmap 中处理 mmap() 所需的逻辑,包括分配内存、设置映射关系等。

2. 定义 VMA(虚拟内存区域,Virtual Memory Area)结构体

  • 这个结构体应该在 proc.h 文件中定义。
  • VMA 是用来描述一个进程的内存映射区域的结构体,包括起始地址、大小、权限等信息。
  • 定义 VMA 结构体后,可以在 sys_mmap 中用它来跟踪每个映射区域的信息,帮助内核管理这些内存映射。

总结

这两步的目的是让您完成 mmap() 系统调用的核心实现。sys_mmap 负责具体的映射逻辑,而 VMA 结构体则是用来记录每个映射区域的信息。完成这些部分后,mmap() 就能够在您的系统中正常工作。

VMA(Virtual Memory Area,虚拟内存区域)

是一个由操作系统内核使用的数据结构,用于追踪进程的内存映射区域。每个 VMA 代表一个连续的虚拟内存区域,具备相同的访问权限,并且由同类对象支持(例如文件或设备)。

在操作系统中,内核需要跟踪每个 VMA 的以下信息:

  • 起始地址:VMA 的起始虚拟地址。
  • 大小:VMA 的长度(以字节为单位)。
  • 权限:VMA 的访问权限(如只读、可读写等)。
  • 文件或设备:VMA 所映射的文件或设备。

通俗解释

VMA 就像是一本“地图”,帮助内核记录一个进程有哪些“特殊区域”可以访问,并且记录每个区域的访问规则。每个区域就是一个 VMA,比如你正在操作的文件在内存中的位置、大小、权限等。通过这本“地图”,系统可以更快找到文件在内存的位置,管理对文件的访问。

关键词解释

  • Virtual Memory Area (VMA):虚拟内存区域,是内核用来管理进程内存映射的单元。
  • Contiguous Region:一个连续的内存块,VMA 代表一个连续的虚拟内存区域。
  • Permissions:权限,比如只读或读写。
  • Backed by Object:支持的对象,通常是某个文件或设备。
  • Start Address:起始地址,表示 VMA 在虚拟内存中的起点。
  • Size:大小,表示 VMA 的总字节数。
  • File/Device:文件或设备,指的是 VMA 所映射的文件或设备。

用法与场景

在实现 mmap() 的时候,VMA 起到了记录和管理的作用。每次调用 mmap() 时,系统会创建一个新的 VMA,用来描述映射的起始地址、长度、权限等。VMA 的作用包括:

  1. 记录映射信息:VMA 帮助系统跟踪每个进程的内存映射区域,记录了每个区域的起始位置、大小、权限等。
  2. 权限检查:VMA 还可以帮助操作系统检查进程是否有权限访问某个内存区域,避免非法访问。
  3. 内存管理优化:通过将相同权限的区域分组,内核可以更有效地管理进程的内存,减少管理开销。
#define VMASIZE 16// TODO: complete struct of VMA
struct vma {// (结构体内容在此处填写)
};// Per-process state
struct proc {struct spinlock lock;          // 锁,用于保护此结构体的数据 / Lock to protect fields in this structure// 进程状态字段 / Process state fieldsenum procstate state;          // 进程状态 / Process statevoid *chan;                    // 如果非零,则进程在 chan 上睡眠 / If non-zero, sleeping on chanint killed;                    // 如果非零,则进程已被终止 / If non-zero, process has been killedint xstate;                    // 进程的退出状态,供父进程等待时使用 / Exit status to be returned to parent's waitint pid;                       // 进程ID / Process ID// 进程的父子关系 / Parent-child relationship of the processstruct proc *parent;           // 父进程指针 / Pointer to the parent process// 以下是私有字段,不需要锁保护 / Fields private to this process, lock not requireduint64 kstack;                 // 内核栈的虚拟地址 / Virtual address of the kernel stackuint64 sz;                     // 进程的内存大小(字节) / Size of the process's memory (in bytes)pagetable_t pagetable;         // 用户页表 / User page tablestruct trapframe *trapframe;   // 用于存储中断时的寄存器 / Data page for trampoline.Sstruct context context;        // 上下文,用于进程切换 / Context for process switchingstruct file *ofile[NOFILE];    // 打开的文件列表 / List of open filesstruct inode *cwd;             // 当前目录 / Current directorychar name[16];                 // 进程名称(用于调试) / Process name (for debugging)struct vma vma[VMASIZE];       // 虚拟内存区域(VMA) / Virtual Memory Areas (VMA)
};

什么是 proc

procprocess 的缩写,它是操作系统中用于表示单个进程的结构体。在 xv6 操作系统中,struct proc 用于描述和管理一个进程的所有信息,比如进程的状态、打开的文件、虚拟内存区域(VMA)等。

通俗解释: 可以把 proc 想象成操作系统为每个运行的程序建立的一个“档案”,档案里详细记录了这个程序的各种信息(比如身份、位置、大小、状态、正在使用的文件等)。操作系统通过这个“档案”来管理和控制程序的执行。

1. VMA 和进程的关系是什么?

VMA(Virtual Memory Area,虚拟内存区域)是描述一个进程在内存中映射的特定区域的结构。在现代操作系统中,每个进程都会有一系列的内存区域,用于存储代码、数据、堆栈、共享库或映射的文件。这些内存区域就是通过 VMA 来描述的。

每个进程都会有多个 VMA,用于描述不同的内存区域。例如:

  • 代码段:存储程序代码的区域。
  • 数据段:存储全局变量、静态变量的区域。
  • :动态分配内存的区域(例如,malloc 分配的内存)。
  • :存储函数调用和局部变量的区域。
  • 内存映射区域:用于 mmap() 映射的文件或设备。

2. 为什么进程需要 VMA?

进程在内存中运行,需要访问各种不同的数据和代码区域。每个区域可能有不同的访问权限(例如,代码段是只读的,数据段是可读写的),也可能映射到不同的物理资源(例如,某个区域映射到一个文件)。VMA 就是用来描述这些区域的:

  • 标识区域的边界:VMA 记录每个区域的起始地址和大小,帮助操作系统知道每个内存区域的范围。
  • 设置权限:VMA 记录每个区域的权限(例如只读、读写),确保进程不会违规访问或修改内存。
  • 关联文件:对于使用 mmap() 映射的文件,VMA 记录了文件信息,确保进程可以在内存中直接访问文件内容。
  • 管理资源:VMA 是操作系统管理进程内存资源的基本单元,操作系统可以基于 VMA 信息高效地分配和回收内存。

3. VMA 与 proc 的关系

在 xv6 或其他操作系统中,每个进程的核心数据结构通常叫做 proc,它包含了所有管理该进程所需的信息。例如,进程的 ID、状态、父进程等。

由于每个进程有自己的独立内存空间和多个内存区域(由 VMA 描述),所以 proc 中会包含一个 VMA 列表(或数组),用来记录该进程的所有内存区域。这样,操作系统在管理进程的内存时,可以直接通过 proc 结构访问并操作对应的 VMA 信息。

简单总结
  • VMA 是描述进程内存区域的基本单位:每个进程都可以有多个 VMA。
  • proc 包含了 VMA 列表,用于管理和访问进程的内存映射信息。
  • 通过 proc 中的 VMA 信息,操作系统可以知道进程在使用哪些内存区域,以及每个区域的权限、大小等信息。

4. 您需要实现的功能

在实现 mmap() 系统调用时,需要完成以下几项任务:

  1. 定义 VMA 结构:在 struct vma 中定义必要的字段(如起始地址、大小、权限等),以便在 proc 中记录每个映射区域的信息。

  2. proc 中存储 VMA:为每个进程分配一个 VMA 数组或列表,允许进程同时管理多个 VMA。一般来说,数组大小是有限的(例如 VMASIZE),表示一个进程的最大映射区域数量。

  3. 实现 sys_mmap 系统调用

    • 当调用 mmap() 时,在 proc 的 VMA 数组中找到一个空位,为新的映射区域创建一个 VMA,并设置对应的地址、大小、权限等。
    • 更新页表,将虚拟地址映射到文件的物理地址,并在 VMA 中记录此映射信息。
  4. 管理 VMA 生命周期:当进程退出或调用 munmap() 时,需要释放 VMA 并清理相关资源。

通俗解释

可以把 VMA 想象成一个进程的“内存分区记录表”,而 proc 则是进程的“档案”。每个进程的内存就像一个房间,房间里有不同的区域(例如书架、桌子、衣柜等),这些区域各有自己的位置、大小和用途。VMA 记录了每个区域的信息,而 proc 是整个房间的信息总表。

  • VMA 是区域的信息卡,记录每个内存区域的地址、大小和用途。
  • proc 是整个进程的档案,包括了所有的 VMA 信息,让操作系统可以管理和调度进程。

希望这样解释能帮助您理解 VMA 与进程的关系,以及 proc 结构中的 VMA 列表的作用。


代码的作用和字段的含义

在这个代码片段中,struct proc 是定义进程信息的结构体。以下是各字段的解释和它们的作用:

  1. struct spinlock lock

    • 解释:这是一个自旋锁,用于确保对 proc 结构体数据的安全访问,避免多个内核线程同时修改。
    • 通俗解释:相当于“上锁”,在修改进程数据时确保只有一个线程能操作,避免数据冲突。
  2. enum procstate state

    • 解释:进程的状态字段,用来表示当前进程的运行状态(如运行中、等待中、终止等)。
    • 通俗解释:这是进程的“状态标签”,标明进程当前是在工作、等待还是被终止了。
  3. *void chan

    • 解释:用于进程的睡眠锁,表示进程在哪个资源上等待。如果 chan 非零,说明进程正在等待该资源。
    • 通俗解释:就像“等待牌号”,当进程需要某个资源时,它会挂在 chan 上等待资源释放。
  4. int killed

    • 解释:标志是否进程被杀死(终止),如果非零,则表示进程已被终止。
    • 通俗解释:类似一个“生死标志”,标记进程是否被操作系统终止。
  5. int xstate

    • 解释:进程的退出状态,当进程终止时会返回给父进程。
    • 通俗解释:这是进程的“离职原因”,退出时会告诉父进程自己的退出状态。
  6. int pid

    • 解释:进程的唯一标识符,用来区分不同的进程。
    • 通俗解释:就像“身份证号码”,每个进程都有一个唯一的 ID。
  7. *struct proc parent

    • 解释:指向父进程的指针,用于追踪进程的父子关系。
    • 通俗解释:这是“父母”指针,标识该进程由哪个父进程生成。
  8. uint64 kstack

    • 解释:内核栈的虚拟地址,用于管理进程的栈空间。
    • 通俗解释:这是进程的“工作台地址”,存储进程运行时需要的临时数据。
  9. uint64 sz

    • 解释:进程内存空间的大小,单位为字节。
    • 通俗解释:这是进程“房间的大小”,记录进程使用的内存总量。
  10. pagetable_t pagetable

    • 解释:用户页表,管理虚拟地址和物理地址之间的映射。
    • 通俗解释:这是“地址簿”,用于管理进程的虚拟内存到物理内存的映射关系。
  11. *struct trapframe trapframe

    • 解释:用于保存进程陷阱帧的结构体,包括进程发生中断时的寄存器状态。
    • 通俗解释:就像“事故报告单”,记录进程在中断或异常时的寄存器信息。
  12. struct context context

    • 解释:进程切换时的上下文,用于保存进程的状态。
    • 通俗解释:类似“断点保存”,在进程切换时保存当前进程的运行状态。
  13. *struct file ofile[NOFILE]

    • 解释:进程打开的文件列表。
    • 通俗解释:就像“工具包”,存储进程打开的文件。
  14. *struct inode cwd

    • 解释:当前目录节点,表示进程的工作目录。
    • 通俗解释:这是“当前文件夹”,标记进程当前所在的目录。
  15. char name[16]

    • 解释:进程的名称,用于调试和标识进程。
    • 通俗解释:类似进程的“名字标签”,方便识别。
  16. struct vma vma[VMASIZE]

    • 解释:虚拟内存区域(VMA),用于存储进程的内存映射区域信息。
    • 通俗解释:这是进程的“虚拟房间表”,记录进程的每个内存映射区域。

字段的关系

这些字段共同构成了一个进程的完整信息。进程的 基础信息(如 pidparent 等)帮助操作系统管理进程的身份和关系;内存信息(如 kstackszpagetable 等)帮助操作系统管理进程的内存;而 VMA 信息 则专门用于管理 mmap() 的映射区域。所有这些信息都存储在 struct proc 中,便于操作系统在进程调度、内存管理、文件管理等操作中快速访问和修改。


需要实现的功能

根据代码中的提示,您需要完成以下功能:

  1. 定义 VMA 结构体

    • struct vma 中,定义 VMA 的各个字段,如起始地址、大小、权限等,以便用于管理 mmap() 映射的区域。
  2. 实现 sys_mmap 系统调用

    • 编写 sys_mmap 函数,将文件映射到进程的虚拟地址空间。具体来说,您需要:
      • 分配合适大小的内存区域。
      • 更新页表,将虚拟地址映射到文件的物理地址。
      • vma 结构体中记录映射信息,以便后续管理。
  3. 管理 VMA 的分配和释放

    • 当进程调用 mmap() 时,在 struct procvma 数组中分配一个新的 VMA。
    • 当进程结束或调用 munmap()(取消映射)时,释放相应的 VMA 并清理资源。

通俗解释

  • 您可以将 struct proc 看作是一个记录每个程序运行的“档案表”。
  • 在实现 mmap() 时,您需要在 proc 的 VMA 结构体中为每个内存映射创建“记录”。
  • sys_mmap 就是负责分配并建立这些映射的“创建函数”,而 VMA 记录了这些映射区域的信息。

实现 VMA 的步骤

  1. 定义 VMA 结构体

    • struct vma 中定义以下字段,用来记录 mmap() 映射的内存区域的信息:
      • 地址(address):记录映射区域的起始地址。
      • 长度(length):记录映射区域的大小。
      • 权限(permissions):记录映射区域的权限(如只读、可写等)。
      • 文件(file):指向被映射的文件,以便通过 mmap() 将文件内容映射到内存。
  2. 参考 mmap() 的参数

    • 查看 mmap() 的参数,确保所有必要的信息都被包含在 VMA 中。例如,mmap() 参数中的 protflags 可能会影响权限字段的定义,而 fdoffset 则关系到映射文件的具体部分。
  3. 扩展 VMA 结构体

    • 根据需求,可以在 VMA 结构体中添加其他字段,以存储更多信息。如果在实现过程中发现有其他信息对管理映射有帮助,可以将其添加到 VMA 中。

可能的 VMA 结构体定义示例

 

struct vma {void *start_addr;    // 映射区域的起始地址 / Start address of the mapped regionsize_t length;       // 映射区域的大小 / Length of the mapped regionint permissions;     // 访问权限(如只读、可写) / Access permissions (e.g., read-only, writable)struct file *file;   // 指向被映射的文件 / Pointer to the mapped fileoff_t offset;        // 文件的偏移量 / Offset in the file
};

通俗解释

  • 可以把 VMA 看成一本记录映射“地址簿”,每个映射区域都有自己的地址、大小、权限、以及映射的文件信息。操作系统通过 VMA 结构体知道每个映射区域的“地理位置”(地址)、“面积”(长度)、“入口权限”(权限)和“来源”(文件)。

通过定义这个结构体,mmap() 系统调用就能在进程中管理每个内存映射区域的信息,确保操作系统可以高效地控制和管理虚拟内存。

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

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

相关文章

meta-learning based FD论文阅读笔记

[1]Semi-Supervised Temporal Meta-Learning Framework for Wind Turbine Bearing Fault Diagnosis Under Limited Annotation Data 问题背景 the fault data are so scarce that it is time-consuming to acquire a well behaved deep learning modelmuch unlabeled data ca…

web渗透——小白入狱

目录 理论知识总结一、Web渗透核心知识点二、Web渗透实操案例三、Web渗透学习建议实操案例一、信息收集实操步骤: 二、SQL注入实操步骤: 三、跨站脚本攻击(XSS)实操步骤: 四、CSRF攻击实操步骤: 五、本地文…

一个完整的产品级物联网系统在农业领域的应用,通过传感器、通信、云计算和控制设备的协同工作,实现了智能化的农业灌溉管理

以下为您详细介绍一个智能农业灌溉系统作为产品级的物联网实际案例: **一、项目背景** 随着农业现代化的发展,精准灌溉对于提高农作物产量、节约水资源具有重要意义。传统的灌溉方式往往依赖人工经验,效率低下且浪费水资源。因此&#xff0c…

JeecgBoot入门

最近在了解低代码平台,其中关注到gitee上开源项目JeecgBoot,JeecgBoot官方也有比较完整的入门教学文档,这里我们将耕者官方教程学习,并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

qt QEvent详解

1、概述 QEvent是Qt框架中事件机制的基础类。在Qt中,事件是由底层窗口系统(如Windows、Linux的X11、macOS的Cocoa等)生成的,Qt的主事件循环(QCoreApplication::exec())负责从事件队列中获取这些事件&#…

#Jest进阶知识:整合 webpack 综合练习

这一小节,我们来做一个综合的练习,该练习会整合: typescriptwebpackjest 准备工作 首先创建项目目录,通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发,因此需要安装 typescript npm i t…

【安卓13 源码】Input子系统(4)- InputReader 数据处理

1. 多指触控协议 多指触控协议有 2 种: > A类: 处理无关联的接触: 用于直接发送原始数据; > B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新。 B协议可以使用一个ID来标识触点&…

VMware 虚拟机使用教程及 Kali Linux 安装指南

VMware 虚拟机使用教程及 Kali Linux 安装指南 在现代计算机科学与网络安全领域,虚拟化技术的应用越来越广泛。VMware 是一款功能强大的虚拟化软件,可以帮助用户在同一台物理机上运行多个操作系统。本文将详细介绍如何使用 VMware 虚拟机,并…

工业通信网关的各项功能解析-天拓四方

在工业自动化和智能制造的浪潮中,工业通信网关作为连接工业现场与互联网的重要桥梁,发挥着至关重要的作用。它不仅实现了不同网络协议之间的转换,还在数据采集、设备控制、网络管理等方面展现出强大的功能。 一、协议转换功能 工业通信网关…

用Python打造媒体管理播放器:从零到全功能GUI应用

背景 在日常生活中,我们经常需要管理和播放大量媒体文件。市面上的音频播放器可能功能单一,或者界面复杂。作为一名程序员,我决定使用Python自己打造一个简单yet强大的媒体管理播放器。 C:\pythoncode\new\playsong.py 全部代码 import os…

ubuntu 20.04 安装使用 nvidia gdrcopy

1,预备环境 首先安装 nvidia display driver ,cuda toolkit 其次安装依赖工具 sudo apt install build-essential devscripts debhelper fakeroot pkg-config dkms 2,下载源码 git clone --recursive https://github.com/NVIDIA/gdrcopy.…

MongoDB简介

一.MongoDB相关概念 1.1.简介 MongoDB是一个开源,高性能,无模式的文档性数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系数据库。 它支持的…

Socket篇(学习前言)

目录 一、计算机网络 二、网络编程 三、网络编程三要素 1. IP地址 1.1. 简介 1.2. IP地址分为两大类 IPv4 IPv6 1.3. IP地址形式 1.4. DOS常用命令 1.5. 特殊IP地址 2. 端口 2.1. 简介 2.2. 端口号 2.3. 端口类型 周知端口 注册端口 动态端口 3. 协议 3.1. …

【专题】基于服务的体系结构

对于面向服务的体系结构(Service-Oriented Architecture,SOA)的几种定义: W3C:SOA是一种应用程序体系结构,在这种体系结构中,所有功能都定义为独立的服务,这些服务带有定义明确的可…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

问题 折磨的开始是天下苦黄狗久矣,为了不再被讨乞丐的显存恶心,一怒之下购入了AMD显卡(20GB显存确实爽 头一天就跑了3dmark验机,完美通过,玩游戏也没毛病 但是呢这厮是一点不省心,玩游戏没问题&#xff0c…

小容器拉动大市场 全面云原生化刻不容缓

毋庸置疑,容器技术的发展推动了云原生计算革命。当前,在云原生已经成为企业用云新常态的情况下,作为一项核心能力,容器管理与服务也成了检验云服务商的试金石。Omdia最新发布的《Omdia Universe: Cloud Container Management &…

一招帮你搞懂数据结构的插入、删除

目录 一、尾部插入(添加) 1.初始化 2.一个打印数组的函数 3.尾插 4.完整版 二、任意位置插入 1.流程图 2.任意插 3.完整版 三、指定数据删除 1.流程图 2. 删除(首位查找到的元素) 四、删除所有 思想 代码 五、有序…

二叉树相关算法

满二叉树:每层都是满的 完全二叉树:特殊的满二叉树,可以有一个子节点,但最后一层必须是从左到右排列,中间不能有空隙,强调除了最后一层外,其他层都是满的 一、dfs深度搜索 例题:求…

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例

OpenGL入门004——使用EBO绘制矩形

本节将利用EBO来绘制矩形 文章目录 一些概念EBO 实战简介utilswindowFactory.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 EBO 概述: Element Buffer Object 用于存储顶点的索引数据,以便在绘制图形时可以重用顶点数…