玄铁C910内存管理与地址转换技术

玄铁 C910 简介

C910 兼容 RISC-V 架构,采用12级超标量流水线,针对算术运算、内存访问以及多核同步等方面进行了优化,同时标配内存管理单元,可运行 Linux 等操作系统;采用3发射、8执行的深度乱序执行架构,配有单/双精度浮点单元,可进一步选配面向矢量运算引擎,适用于人工智能、5G、边缘服务器等对性能要求很高的应用领域。C910 是个开源的 RISC-V CPU,它的代码实现具体在 github 可见。

C910 MMU(Memory Management Unit)兼容 RISC-V SV39 标准。其作用主要有:

  • 地址转换:将虚拟地址(39 位)转换成物理地址(40 位)
  • 页面保护:通过对页面的访问者进行读/写/执行权限检查
  • 页面属性管理:扩展地址属性位,根据访问地址,获取页面对应属性,供系统进一步使用

MMU 代码文件结构

内存管理单元部分的源码主要集中在gen_rtl代码中的mmu部分,相关逻辑主要包含在以下文件中:

文件名.v 文件内容
ct_mmu_arb MMU中的仲裁器,当同时有多个读、写请求发送到JTLB时需要对它们进行仲裁,选择优先级更高的请求优先响应执行
ct_mmu_dplru 用于实现DTLB中伪LRU替换算法的模块
ct_mmu_dutlb_huge_entry DTLB大页表项,存放1G页对应的页表项信息
ct_mmu_dutlb_read 实现Load/Store访存指令读DTLB模块的逻辑
ct_mmu_dutlb DTLB顶层
ct_mmu_dutlb_entry DTLB表项,用于存放用于Load/Store访存指令虚实地址转换的页表项
ct_mmu_iplru 用于实现ITLB中伪LRU替换算法的模块
ct_mmu_iutlb_fst_entry ITLB第一级表项,用于存放指令PC虚实地址转换的页表项
ct_mmu_iutlb ITLB顶层
ct_mmu_iutlb_entry ITLB第二级表项,用于存放指令PC虚实地址转换的页表项
ct_mmu_jtlb_data_array 用于存放JTLB数据信息
ct_mmu_jtlb_tag_array 用于存放JTLB标志信息
ct_mmu_jtlb JTLB顶层
ct_mmu_ptw Page Table Walk单元,当TLB miss时通过PTW模块根据请求转换的虚拟地址访问内存中的页表,找到对应的物理地址
ct_mmu_regs MMU系统控制寄存器相关逻辑,不仅包含标准的SATP寄存器相关控制逻辑,还包括玄铁C910自定义扩展的SMIR、SMCIR、SMEL和SMEH寄存器的相关控制逻辑
ct_mmu_tlboper MMU控制寄存器与sfence.vma指令广播对TLB操作相关逻辑
ct_mmu_top MMU顶层

RISC-V CPU 的 Sv39

有关 RISC-V 的特权架构和分页机制,我在 RISC-V 特权架构 中介绍了很多,若读者不太熟悉内存管理,可以看一下该博客文末的附录内容。这里再将 Sv39 分页机制简单介绍一下:

在 RISC-V 中,SATP(Supervisor Address Translation and Protection Register) 寄存器的作用是在监管者模式下,控制地址转换与保护的。当 satp 启动分页时,在监管者模式或用户模式下,虚拟地址 (VA) 会将 satp 寄存器中根页表地址作为基址 (base),以及自带的页号作偏移 (VPN[1]),在页表中通过计算偏移位置 (base + VPN[1] * 4) 找到页表项 (Page Table Entry PTE)。如果该 PTE 不是叶 PTE(什么是页 PTE 下面会解释),那么再将刚刚找到的 PTE 作为基址,用虚拟地址携带的第二个页号作偏移,继续算出第二个页表项,直到获得物理地址 (PA),更加详细的虚拟地址转换过程见下小节。

虚拟地址和物理地址的二进制格式。以 Sv39 分页模式为例,虚拟地址、物理地址的编码都是将页号放在高位处(MSB),而将偏移量放在 低位(LSB)处。Sv39 分页支持三级分页。从偏移量位长可以看出,Sv39 的页粒度最小为 4KiB。其一级页表含有 512 个 PTEs,每个页表项占 8 字节,总共 4 KiB。
页表项。Valid 位指示该 PTE 是否有效;Readable,Writeable,eXecutable 指示了该页是否可读、可写、可运行,当这三位都是 0 时,表明该 PTE 指向了下一层页表,其为非叶 PTE ,否则就是叶 PTE;User 位指示了该页是否可以被用户模式访问;Global 指示了全局映射,存在于所有的地址空间中,可以被所有进程访问;Access 位指示了该页最近是否被读、写、取;Dirty 位指示了虚拟页最近是否被写过。对于非叶 PTE,D,A,U 位被保留,并被清零。RSW 是保留的,用于操作系统软件。

RISC-V 设计分页机制时充分了解并吸取了早期体系结构的设计教训。x86-64 分页中上层页表控制了下层页表,如果上层页表是只读的,那么被该页表控制的下层页表就不能被写入了,这可不是什么聪明的做法。而 x86-64 可以做到粗粒度控制与细粒度控制的转换,却是一个巧妙的做法。 RISC-V 设计人员引入了叶 PTE 与非叶 PTE 的概念,并使用 R W X 这三个位域来定义,从而将页表的层级 (level) 和它是指向页表还是仅包含物理地址区分开来,使得每个层级的 PTE 都可以是叶 PTE,既实现了粗细粒度控制,又可以防止上层页表控制下层页表。例如,在 Sv39 中,若第二级页表就是叶 PTE,那么就会形成一个大小为 2 M 的超级页,相比于 4 KB 更粗粒度。

地址转换过程

RISC-V Sv39 分页机制中关于虚拟地址的翻译/转换过程:

  1. 定义 a=satp.baseppn×PAGESIZEa = satp.baseppn × PAGESIZEa=satp.baseppn×PAGESIZE ,且定义 i=LEVELS−1i = LEVELS − 1i=LEVELS−1 。
  2. 定义 pte 指向地址为 a+va.vpn[i]×PTESIZEa +va.vpn[i]×PTESIZEa+va.vpn[i]×PTESIZE 的 PTE 的指针,并访问。若访问 pte 违反了 PMP (Physical Memory Protection) 或 PMA (Physical Memory Attributes) ,相应的访问异常会产生。
  3. 如果 pte.v=0pte.v = 0pte.v=0, or pte.r=0pte.r = 0pte.r=0 and pte.w=1pte.w = 1pte.w=1,停止并产生相应的页错误。
  4. 否则,PTE 有效,若 pte.r=1pte.r = 1pte.r=1 or pte.x=1pte.x = 1pte.x=1 跳转到第 5 步。否则,该 PTE 就是指向另一个页表的 PTE,令 i=i−1i = i -1i=i−1 。若 i<0i < 0i<0 ,停止并产生页错误。否则,令 a=pte.ppn×PAGESIZEa = pte.ppn × PAGESIZEa=pte.ppn×PAGESIZE ,跳转到第 2 步。
  5. 叶 PTE 找到了,根据 pte.rpte.rpte.r 、pte.wpte.wpte.w、pte.xpte.xpte.x、pte.upte.upte.u 位的值,确定它是否有权限,若没有,那么停止并产生相应的页错误。
  6. 若 i>0i > 0i>0 且 pte.pnn[i−1:0]!=0pte.pnn[i-1:0] != 0pte.pnn[i−1:0]!=0 ,这是一个非对齐的超级页;停止并产生相应的页错误。
  7. 若 pte.a=0pte.a = 0pte.a=0 ,或者内存访问为 store 且 pte.d=0pte.d = 0pte.d=0 ,要么产生页错误,要么
    • 置 pte.a=1pte.a = 1pte.a=1 ,如果内存访问为 store ,那么也置 pte.d=1pte.d = 1pte.d=1
    • 若访问违反了 PMA 或 PMP 检查,产生相应的错误。
    • 该更新以及第 2 步的访问必须是原子的。
  8. 此时转换成功,生成物理地址:
    • pa.pgoff=va.pgoffpa.pgoff = va.pgoffpa.pgoff=va.pgoff
    • 若 i>0i > 0i>0 ,那么就是超级页的转换,此时 pa.ppn[i−1:0]=va.vpn[i−1:0]pa.ppn[i-1:0] = va.vpn[i-1:0]pa.ppn[i−1:0]=va.vpn[i−1:0]
    • pa.ppn[LEVELS−1:i]=pte.ppn[LEVELS−1:i]pa.ppn[LEVELS-1:i] = pte.ppn[LEVELS-1:i]pa.ppn[LEVELS−1:i]=pte.ppn[LEVELS−1:i]


借用一张知乎的图说明虚实地址转换流程。

C910 的 MMU

C910 MMU(Memory Management Unit)兼容 RISC-V SV39 标准,主要利用 TLB(Translation Look-aside Buffer) 来实现加速地址转换的功能。TLB 将 CPU 访存所使用的虚拟地址作为输入,转换前检查 TLB 的页属性,再输出该虚拟地址所对应的物理地址。C910 支持 4KB,2MB,1GB 三种页面大小,虚拟页号(VPN)低9位加上虚拟地址低12位作为大小为2MB页面的页偏移,VPN低18位加上虚拟地址低12位作为大小为1GB页面的页偏移。

C910 MMU 采用两级 TLB,第一级为 uTLB,包括指令 I-uTLB 和数据 D-uTLB,第二级为 jTLB。在处理器复位后,硬件会将 uTLB 和 jTLB 的所有表项进行无效化操作,软件无需初始化操作。

I-uTLB 有 32 个全相联表项,可以混合存储 4K、 2M 和 1G 三种大小的页面,取指请求命中 I-uTLB 时,当拍可以得到物理地址和相应权限属性。D-uTLB 有 17 个全相联表项,可以混合存储 4K、 2M 和 1G 三种大小的页面,加载和存储请求命中 D-uTLB 时,当拍可以得到物理地址和相应权限属性。

jTLB 为指令和数据共用的二级 TLB,4 路组相联结构,表项大小 1024,可以混合存储 4K、 2M 和 1G 三种大小页面。uTLB 缺失,jTLB 命中时,最快 3 个 cycle 返回物理地址和相应权限属性。

叶 PTE 会被缓存于 TLB 内以加速地址转换。若 uTLB 丢失则访问 jTLB,若 jTLB 进一步丢失,则 MMU 会启动硬件页表遍历(Hardware Page Table Walk),访问内存得到最终的地址转换结果。下图借用知乎回答

I-uTLB

I-uTLB 接受来自 IFU(Instruction Fetch Unit) 的虚拟地址,并缓存了指令 PC 虚拟地址的页表项。由于玄铁C910中指令缓存为 VIPT(Virtual Index Physical Tag) 结构,虚拟地址从指令 Cache 中索引查找的同时,MMU 需要找出缓存的 PC 物理地址,并将其读出的 tag 与指令 Cache tag 判断是否发生缓存命中。因此必须要在 MMU 返回指令物理地址后,指令的地址才是有效的。若因 ITLB 缺失未及时完成地址转换,IF 级流水线会被阻塞。

当 32 个表项均未命中时,发生缺失,对应缺失的虚拟地址被发送给 JTLB 处理,JTLB 发送回填的虚拟地址、物理地址、页面属性和页面大小信息,并通过伪LRU替换算法模块选择将要被更新(替换)的表项。

D-uTLB

D-uTLB 接受来自 LSU(Load Store Unit) 的虚拟地址,缓存了 Load/Store 指令访问虚拟地址的页表项。D-uTLB 有两个读端口以支持 LSU 标量指令的双发射,可并行处理 LSU 双流水线中 Load/Store 指令的地址转换。在 DTLB 命中后,读出的物理地址返回,后访问 DCache。为了缩短关键路径,计算有效地址和基址的地址转换是并行执行的。可能存在计算出有效地址发生跨页的情况,这时会将AG级阻塞一个周期,MMU 将对计算出的有效地址重新进行地址转换。

与ITLB一样,DTLB也是全相联结构,有 17 个表项,前 16 个表项存放 4KB 或 2MB 大小的页的页表项信息,最后一个表项存放 1GB 页的页表项信息。表项中储存了虚拟地址、物理地址和页面属性三个信息。因为小页和大页储存在不同的表项中,所以不需要储存页面大小的信息,通过简单的逻辑就可以判断是否命中并输出相应的物理地址。

不同于发生 ITLB 缺失时对 IFU 进行阻塞,当发生 DTLB 缺失时不会阻塞 LSU,而是将加载/储存流水线中缺失对应的指令丢弃,将 IDU 中对应的表项冻结(freeze)——即不会优先发射这些指令。只有当发送DTLB 缺失的虚拟地址对应的页表项被更新后,才会唤醒(wake up)那些被冻结的表项,并重新发送对应的 Load/Store 指令,等这些指令下一次到达AG流水级时将会成功得到转换的物理地址。这很好地利用了 LSU 乱序执行的机制。

JTLB

JTLB 为玄铁C910中的第二级TLB,为四路组相联结构,一共有 256 个表项,使用虚拟地址作为索引。JTLB由 tag array 和 data array 构成,tag array 用于保存标志信息,每一路的标志由 27 位的虚拟页号,16位的ASID,3位的页大小以及1位页有效位。data array 用于储存数据,包括 28 位的物理页号和 15 位的页面属性。相比于第一级的 UTLB,JTLB 有更大的容量和更高的相联度使得它有更低的缓存缺失率,但JTLB访问速度较ITLB更慢。ASID 为操作系统分配的进程号,因此进程切换导致的上下文切换(Context Switching)时不需要刷新 JTLB。JTLB 命中表项中的 ASID 号与当前 SATP 寄存器中的 ASID 号匹配时才能够判断该页表项是有效的,否则作为缺失处理。由于 UTLB 没有储存对应进程的 ASID 号,因此当发生上下文切换时,即对 SATP 进行写操作时,需要刷新全部表项,即 TLB Shootdown。

JTLB 存在两级流水,第一级流水根据虚拟地址的索引,读出四路的标志与数据,第二级流水得到后,比较标志,判断命中或缺失。当发生 JTLB 缺失时,需要通过 PTW 模块访问内存/dcache中的页表。

Page Table Walk

玄铁C910 有三级页表索引,因此最多需要访问四次内存才能完成数据读取。第一级页表索引时,SATP 里的物理页号与 VPN[2] 拼接,然后经过 PMP 单元检查该物理地址是否拥有访问权限,再向 MCIC(mmu dcache issue controler) 单元发送访问请求。若 DCache 响应 MCIC 模块的请求,MMU 就可借用 LSU 中DC流水线,进行访问 DCache/内存读页表的操作。在PTW模块读页表操作结束之前,LSU中的DC流水级将会发生流水线停顿,来处理 PTW 模块访问 DCache/内存操作。直到 LSU 收到 MMU 发送 PTW 操作完成的请求后,DC流水级重新正常工作。

若页表不在 DCache 中,将通过总线从内存中读入页表信息。检查读入页表项的X、W、R权限位,判断该页表项是否为叶表项。若为叶表项,则成功命中,完成 PTW 操作。若未非叶表项,则以该表现的物理页号,再与下一级别的虚拟页号 9 位拼接,继续索引,读出页表项后判断是否是叶表项。

命中叶表项后还需检查页面属性,若违反了权限规定会产生页错误。页错误会根据导致 JTLB 缺失的来源,即来自于ITLB、DTLB请求回填或者是来自PFU访问时的缺失,返回到相应的模块中。可以看到,PTW 的过程中,其命中的页面大小信息是已知的,我们可根据页大小选择更新 JTLB 的索引位,然后更新对应 JTLB 表项中的 tag array 和 data array,完成 PTW 模块的回填。

TLB 一致性

作为一种缓存,TLB 在多核系统中需要维护一致性。当某个处理器核将某一表项写更新到内存或磁盘中,其他的核内的 TLB 需要及时更新。RISC-V 指令集中 sfence.vma 指令用于维护TLB一致性,可以通过配置sfence.vma 指令源寄存器与目的寄存器的值来无效化对应的 TLB 表项。当一个处理器核修改了另一个处理器核正在使用的页表时,使用处理器间中断(IPI)通知其他的核。

玄铁C910中采用硬件的方式实现 TLB 一致性以提升性能。当一个处理器核检测到 sfence.vma 指令,将其发送到CIU(数据一致性接口单元)中,由 CIU 广播到其他的核中。而每个处理器核本身维护了一个队列 ,用于缓冲和仲裁其他处理器核广播的请求。sfence.vma指令格式如下:
sfence.vmars1rs2sfence.vma \; rs1 \; rs2sfence.vmars1rs2

  • 当rs1=x0并且rs2=x0时,将刷新TLB所有表项。
  • 当rs1!=x0并且rs2=x0时,将刷新TLB中虚拟页号与rs1中储存的虚拟页号相等的表项。
  • 当rs1=x0并且rs2!=x0时,将刷新TLB中ASID与rs2中储存的ASID相等的表项。
  • 当rs1!=x0并且rs2!=x0时,将刷新TLB中虚拟页号与rs1中储存的虚拟页号相等,并且ASID与rs2中储存的ASID相等的表项。

根据需要可以配置sfence.vma指令的源寄存器,刷新TLB中对TLB一致性有影响的表项。

附:内存管理单元是什么?

内存管理单元 (Memory Management Unit, aka MMU) 是一种负责处理来自 CPU 的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、CPU Cache 的控制,在较为简单的计算机体系结构中,还负责总线仲裁以及存储 bank 切换。以下三小节简单介绍了一下 MMU 的主要功能。

虚拟内存管理与分页机制

随着计算机程序规模越来越大,以及高并发的背景下,将所有运行中的程序的代码和数据完整地放入到内存中已经显得不可能。当程序占用的内存空间过大,以至于剩下的空间不足以放下其他的程序时,就造成内存资源的浪费,即内存的外部碎片问题。此外,核中 PMP (Physical Memory Protection) 模块通过检查相应地址范围的权限保护内存,但由于其仅支持固定数量的内存区域,缺乏灵活性,因此越来越无法满足复杂的内存保护需求。为此,现代计算机系统普遍采用分页机制和虚拟内存管理。

虚拟内存采用一种分页机制,即将虚拟内存空间以一定的大小分割成一个一个的页(page),同时将物理内存空间以同样的大小分块成帧(frame),两者大小相同,内存块的大小也被称为页偏移(page offset)。于是,程序就被划分为若干个页,当需要用到某页的代码或数据时,操作系统通知硬件将该页从外存中读入内存,并占用物理内存中的一个页帧。这样,每个程序都能按需分配在物理内存中,每个虚拟页有自己的**虚拟页号(Virtual Page Number)**唯一标识,物理页也一样。

此外,操作系统使用**页表(Page Table)**记录虚拟页与物理帧之间的映射关系,以及该页的属性(可读、可执行等)。MMU 根据页表中的映射关系,将CPU中的 PC 指令访存与 Load/Store 数据访存地址,转化为物理地址后访问指令与数据缓存,作为发生缓存命中的依据。并且,MMU 与分页机制可以根据页的属性,检查访问内存的行为是否合法,从而发挥出灵活的内存保护功能。

内存保护

MMU 在命中页时,会检查访问该页的行为是否越权、合法。一般地,计算机体系架构都有用户模式 (User Mode) 和特权模式 (Privileged Mode) 之分,应用程序根据自己的性质,在页表中设置其下内存页的访问权限,有些页属于高模式,不允许低模式程序(代码)访问,而访问权限又分为可读、可写和可执行三种。当程序想执行一个非法的操作,会产生一个异常或中断阻止程序继续运行。

Cache 与 MMU

之前我们提到过,CPU 进行访问内存时需要经过 MMU 完成地址转换,得到物理地址后才能从内存中获取数据。然而,很多时候 CPU 中的 Cache 就缓存了所需的数据,此时 MMU 还需要进行地址转换吗?更具体地说,在查询 Cache 的时候,使用虚拟地址还是物理地址的索引域 (Index) 呢?此外,在查询得到对应 Cache 组后,应该使用虚拟地址还是物理地址的标记域 (Tag) 来匹配 CacheLine 呢?不同的系统设计者也许会给出不同的回答,因此情况可分成如下三种:

  • VIVT(Virtual Index Virtual Tag):使用虚拟地址索引域和虚拟地址的标记域。
  • VIPT(Virtual Index Physical Tag):使用虚拟地址的索引域和物理地址的标记域。
  • PIPT(Physical Index Physical Tag):使用物理地址的索引域和物理地址的标记域。

VIVT——使用虚拟地址的索引域和标记域来查找 CacheLine。好处是无需经过 MMU,所以查找速度会快一些。但 VIVT 可能会遇到一个棘手的问题——缓存别名 (cache aliasing) 。因为多个虚拟地址可能会被映射到同一个物理地址,对其的更改会导致一致性问题——其他进程更改了一个虚拟地址的 CacheLine 后,其他缓存中对应的虚拟地址的 CacheLine 没有更改,此时数据不一致。此外 VIVT 还会遇到相同的虚拟地址指向不同的物理地址的问题,这是不同进程含有的不同页表所决定的,因此仅仅依靠 Virtual Index 是不能区分物理地址。一个简单粗暴的想法是,每次进程切换时清除缓存,以彻底避免这个问题,但这样也就扼杀了 cache 缓存多个进程数据的可能。明智的方法是为每个虚拟地址空间加个标记 (ASID) 来区分不同的进程地址空间。最后,当虚拟地址与物理地址的映射关系发生变化时,也需要清空 Cache。

VIPT——使用虚拟地址的索引域和物理地址的标记域来查找 CacheLine,它可以避免缓存别名的问题,因为使用了物理地址的标记域。至于相同的虚拟地址指向不同的物理地址的问题,以 Linux kernel 中使用的 4KB 的页为例,显然虚拟地址和物理地址的低 12bit 是相同的,所以当不同的虚拟地址映射到同一个物理地址的时候,这些虚拟地址的低 12bit 也是相同的。那么只要 Cache 的索引域(Index) 在 [11:0] 之内,那么这些虚拟地址的 Cache 组是相同的,而其 Tag 也是必须相同,那么就不存在不同的虚拟地址映射到同一个物理地址的情况了。但坏处就是,VIPT 需要通过地址翻译取得物理地址。不过架构师们找到了一个精妙的解决方案,让系统在访问查找 Cache index 的同时,访问 MMU 中的 TLB 获得物理地址,从而掩盖了地址翻译时间,TLB 和 Cache 的高命中率可以保证 VIPT 的性能损失。

PIPT——使用索引域和标记域都采用物理地址,很显然,这种方式也可以避免缓存别名问题,不过性能方面要差一些,因为地址翻译已经无法与 Cache 查找并行执行了。

这样看来 VIPT 的方法更能兼顾性能和一致性问题。然而事实上越接近 CPU 的 Cache 越会采用 VIPT 的方式构造,因为这些 Cache 对性能非常敏感。但是 Virtual Index 并不是适用于所有级别的缓存——因为 VIPT 要求 Index 域必须在低位,然而这会限制缓存的大小。所以更大的缓存必须抛开这一限制,使用 Physical Index 索引。

玄铁C910内存管理与地址转换技术相关推荐

  1. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  2. 华为NAT(地址转换技术)

    文章目录 一.什么是NAT 二.NAT类型 三.拓扑 四.配置实验 五.实验测试 一.什么是NAT 1.NAT–Network Address Translation:网络地址转换 NAT属于接入广域 ...

  3. 华为路由器:NAT地址转换技术

    文章目录 第一节 理论环节 一.NAT的介绍 二.NAT的工作原理 三.NAT技术的三种类类型 1.静态NAT(Static NAT) 2.动态地址NAT(Pooled NAT) 3.网络地址端口转换 ...

  4. NAT、Napt(地址转换技术)详解

    NAT的由来 IPv4即网际网协议第4版--Internet Protocol Version 4的缩写.IPv4定义一个跨越异种网络互连的超级网,它为每个网际网的节点分配全球唯一IP地址.如果我们把 ...

  5. NAT (PAT)地址转换技术(讲解+配置)

    目录 一.技术背景: (1)NAT技术背景 (2) PAT技术背景: 二.NAT技术优缺点: 三.NAT类型: 四.配置及思路: (1)PAT地址转换思路: (2)PAT配置 (3)静态NAT配置及思 ...

  6. 地址转换技术 NAT

    概述 为了解决IPv4地址不足的问题,提出了私有地址,而私有地址只能在内部网络内使用,当要与外界进行通信的时候,需要转换为公有IP. NAT技术的作用:将私有地址转换成公网地址. 专业术语 内部本地网 ...

  7. 03-网络地址转换技术

    IP地址分类 私网地址: A类地址:10.0.0.0-10.255.255.255 B类地址:172.16.0.0-172.31.255.255 C类地址:192.168.0.0-192.168.25 ...

  8. 华为防火墙地址转换技术(NAT)

    281.NAT理论 私网地址不能再公网上路由,NAT的功能主要就是将私网地址在往外转发的过程中,将私网地址转换成为公网地址: 282.PAT:端口多路复用,可以将多个私网地址转换成为一个公网IP地址上 ...

  9. 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)

    缺页异常: 缺页异常(Page Faults)属于ARM V8处理器的异常类型中的同步异常.当MMU走表时可能会产生若干种类型的MMU faults(有同步的也有异步的),其中的同步异常,即这里将要讨 ...

最新文章

  1. winform配置文件的简单使用(转载)
  2. php指定时间显示内容,织梦用php判断某个时间段显示和隐藏内容
  3. mysql查看在线用户
  4. uboot启动过程中关闭Caches
  5. java调试jdk源码_JDK源码调试
  6. 微软腾讯京东都在高薪招.NET Core,你准备好了吗!
  7. LeetCode 758. 字符串中的加粗单词(Trie树)
  8. java文件读取的总结_java 读取文件方法的总结
  9. 祝贺 Java 走过创新的 25 年
  10. 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究
  11. ubuntu国内镜像站点及更新源
  12. python好玩的代码-这10个Python项目超有趣!
  13. 最新爱客影院自动采集源码v3.5.5
  14. 聚焦“生态化”,e签宝讲好电子签名的“中国故事”
  15. 今天使用overleaf生成个人简历
  16. IOI2020国家集训队集中培训通知及如何进入国家集训队
  17. c++框架crow搭建web服务入门
  18. 付给铁匠的账单 数据结构
  19. 记一次cocos逆向
  20. 《Rethinking Efficient Lane Detection via Curve Modeling》论文笔记

热门文章

  1. 新春送祝福,直接发红包。现金红包等你来拿~
  2. 【数据结构】单链表的实现
  3. php strstr批量替换,也就这样,
  4. 设置手机静音和固定电话来电时手机震动
  5. Nginx的安装与常用配置
  6. 一级消防工程师【技术实务】(爆炸)
  7. cie1931 python绘制_科学网—gnuplot与CIE1931 XYZ三刺激值曲线 - 范学良的博文
  8. 520特辑 | 狗粮之下,没有一个程序员是无辜的...
  9. 大白菜装机教程win10_如何通过U盘重装win10系统?
  10. CTFHub题解-技能树-Misc-流量分析-数据库类流量【MySQL流量、Redis流量、MongoDB流量】