3.1.4 Hyperspace 的临时映射1

【在Unity引擎搭建欧美卡通风格舞台场景_系列程序化动效设计与效果渲染(第二篇)】 从第一篇的 UI/2D 管线自动化搭建,再到今天这篇用 Shader 在 GPU 层面做全方位的动态特效注入,我们打通了从美术静态资产到最终高级视觉呈现的整个闭环。掌握了这些底层的数学思维与通道技巧,你可以在此基础上衍生出无数惊艳的视觉效果!如果你对其中的某个数学公式或者参数调优有疑问,也欢迎在评论区随时探讨。下期教程再见! 阅读详情

系列文章目录


3.1.4 Hyperspace 的临时映射

Windows内核有时候需要将某些物理页面临时映射到内核的虚存区间,用做“草稿”或其他临时的用途。为此,Windows内核在系统空间划出了一块(虚存)区间专门用于这样的临时映射,称为“超级空间(Hyperspace)”。采用32位物理地址时,这个“空间”的起点HYPERSPACE 定义为0xc0400000:

#define HYPERSPACE		(Ke386Pae ? 0xc0800000 : 0xc0400000)

区间的大小为 0x400000,即4MB。换言之,这个区间的大小是1024个页面函数 MmCreateHyperspaceMapping()就用来建立这样的临时映射:

MmCreateHyperspaceMapping


PVOID
NTAPI
MmCreateHyperspaceMapping(PFN_TYPE Page)
{
   PVOID Address;
   ULONG i;

   if (Ke386Pae)
   {
      ...
   }
   else
   {
      ULONG Entry;
      PULONG Pte;
      Entry = PFN_TO_PTE(Page) | PA_PRESENT | PA_READWRITE;//构建页面选项
      Pte = ADDR_TO_PTE(HYPERSPACE) + Page % 1024;//页面表象的地址
      if (Page & 1024)
      {		//物理页面的号bit10为1
         for (i = Page % 1024; i < 1024; i++, Pte++)//从Page%1024开始向上搜索
         {
            if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
            {
               break;/发现了一个无映射的虚存页面
            }
         }
         if (i >= 1024)//在Page %1024以上无空闲,回头在Page%1024 以下搜索
         {
            Pte = ADDR_TO_PTE(HYPERSPACE);
            for (i = 0; i < Page % 1024; i++, Pte++)//从HYPERSPACE 开始向上搜索
            {
               if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
               {
                  break;//发现了一个无映射的虚存页面
               }
            }
            if (i >= Page % 1024)
            {
               KEBUGCHECK(0);
            }
         }
      }
      else //物理页面号的Bit10为0
      {
         for (i = Page % 1024; (LONG)i >= 0; i--, Pte--)//从Page%1024开始向下搜索
         {
            if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
            {
               break;//发现了一个无映射的虚存页面
            }
         }
         if ((LONG)i < 0)//在 Page %1024以下无空闲,回头在Page%1024 以上搜索
         {
            Pte = ADDR_TO_PTE(HYPERSPACE) + 1023;
            for (i = 1023; i > Page % 1024; i--, Pte--)//从上向下搜索
            {
               if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
               {
                  break;//发现了一个无映射的虚存页面
               }
            }
            if (i <= Page % 1024)
            {
               KEBUGCHECK(0);
            }
         }
      }
   }
   Address = (PVOID)((ULONG_PTR)HYPERSPACE + i * PAGE_SIZE);//虚拟地址
   __invlpg(Address);
   return Address;
}

先构建页面映射表项PTE的内容,该内容由物理页面号、PA_PRESENT标志位,以及表示访问模式 PA_READWRITE 的位段三个部分构成。其实这里还有一个表示访问权限要求的位段 DPL,但因为所要求的是0环即系统态,故而数值恰好为0。注意页面表项的内容与所用的虚拟地址即虚拟页面号是无关的,虚拟页面号只决定 PTE在页面表中的位置。

然后就是虚拟页面号的确定了。在理想的情况下,如果物理页面号为Page,那么虚拟页面就应该是HYPERSPACE中的第(Page%1024)个页面。可是,这种理想的状况未必就会发生,因为这个虚拟页面有可能已在此前被分配使用了(同样也是用于临时的映射),这就得在HYPERSPACE 中搜索空闲的虚拟页面作为替代。怎样搜索呢?最简单的当然是完全的顺序搜索,更好的方法则是引入-些类似于散列(Hash)的算法。这里所用的算法是:根据物理页面号中的Bit0将所有的物理页面号分成两个集合,如果物理页面号的Bit10为1就从(Page%1024)开始向上搜索,搜索到HYPERSPACE的上沿以后再折回到HYPERSPACE,的下沿,继续向上搜索:Bit0为0则相反,即从(Page % 1024)开始向下搜索。

对虚拟页面是否空闲的判定是通过InterockedCompareExchange()进行的,这个函数提供一种原子的“比较并交换”操作。以InterlockedCompareExchange(Pte,Entry,0)为例,这里Pe是个PLONG指针,0是比较的目标,Entry是要写入Pte的值,这个函数先比较Pte所指是否为0,如果是就将Entry 写入 Pte 所指的 32 位字并返回 Pte 原来的值;否则就只是返回 Pte所指的值。所有这些操作一气呵成,事实上是只由一条指令实现的,所以是不可中断不可分割的原子操作。

因此,一旦发现某个虚拟页面空闲,这个页面的映射表项即已被设置成所需的内容,下面所需要的就是通过_invlpg(Address)冲刷该表项在TLB中的映像,并通过指针 Address 返回虚拟页面的起始地址了。
前面代码中所引用的宏操作PFN_TO_PTE和ADDR_TO_PTE 分别定义为:

#define PFN_TO_PTE(X)  ((X) << PAGE_SHIFT)
#define ADDR_TO_PTE(v) (PULONG)(PAGETABLE_MAP + ((((ULONG)(v) / 1024))&(~0x3)))

注意由MmCreateHyperspaceMapping()创建的HYPERSPACE页面映射只是临时的,使用了以后就要加以释放,一般都是通过 MmDeleteHyperspaceMapping()完成。

了解了Hyperspace 的映射,我们再来看一个运用Hyperspace 映射的实例,即函数 MmGetPageTableForProcess()

如前所述,每个进程都有自己的页面映射,因而都有自己的页面映射表。每当调度一个进程运行时,就将其映射表的物理地址装入CPU的控制寄存器CR3,因为MMU是通过物理地址访问页面映射表的。另一方面,如前所述,CPU本身(ALU)却只能通过虚拟地址访问页面映射表,而本进程的页面映射表总是在0xc0000000的地方。可是,如果要访问的是另一个进程的页面映射表,那该怎么办呢?

给定一个目标进程以及这个进程用户空间的一个地址,MmGetPageTableForProcess()将这个地址所属的二级页面表映射到Hyperspace,并返回指向其所在页面(在目标进程页面映射表中)的PTE的指针。这个函数名有些误导,容易使人以为是返回指向整个页面映射表的指针,而实际上却是指向具体表项的指针。

MmGetPageTableForProcess


static PULONG
MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
{
   ULONG PdeOffset = ADDR_TO_PDE_OFFSET(Address);//计算页面目录项下标
   NTSTATUS Status;
   PFN_TYPE Pfn;
   ULONG Entry;
   PULONG Pt, PageDir;

   if (Address < MmSystemRangeStart && Process && Process != PsGetCurrentProcess())
   {
      PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart));
      if (PageDir == NULL)
      {
         KEBUGCHECK(0);
      }
      if (0 == InterlockedCompareExchangeUL(&PageDir[PdeOffset], 0, 0))
      {/所属的页面目录项空白
         if (Create == FALSE)
	 {
	    MmDeleteHyperspaceMapping(PageDir);
	    return NULL;
	 }
	 //分配空白物理页面
         Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
	 if (!NT_SUCCESS(Status) || Pfn == 0)
	 {
	    KEBUGCHECK(0);
	 }
	 //使所属的目录项指向这个物理页面
         Entry = InterlockedCompareExchangeUL(&PageDir[PdeOffset], PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE | PA_USER, 0);
	 if (Entry != 0)
	 {
	    MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
	    Pfn = PTE_TO_PFN(Entry);
	 }
      }
      else
      {
         Pfn = PTE_TO_PFN(PageDir[PdeOffset]);//获取二级映射表所在的物理页面号
      }
      MmDeleteHyperspaceMapping(PageDir);//删除页面目录表的临时映射
      Pt = MmCreateHyperspaceMapping(Pfn);//为二级映射表建立临时映射
      if (Pt == NULL)
      {
         KEBUGCHECK(0);
      }
      return Pt + ADDR_TO_PTE_OFFSET(Address);//返回指向映射表项的指针
   }
  
}

参数 Process 指向目标进程的 EPROCESS数据结构。如果参数Create为TRUE,就表示如果给定的地址尚无映射则为其创建一个映射。
这个函数的代码分成两部分,第一部分处理的是最为一般化的情况,即目标进程并非当前进程自身,并且目标地址在其用户空间(Address<MmSystemRangeStart)。而第二部分处理的则是当前进程自身或者目标地址在系统空间的情况。搞清了第一部分的代码,后一部分也就不难了。
如前所述,页面映射表是个二层的结构,其顶层是页面目录,根据给定的地址可以从页面目录中找到其页面映射表项在哪一个二级映射表中。每个二级映射表的大小是一个4KB页面,页面目录的大小也是 4KB。
代码中先通过宏操作ADDR_TO_PDE_OFFSET计算虚拟地址Address所属目录表项在页面目录中的位置。这个宏操作的定义如下:

#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))

页面目录中有1024个目录项,每个目录项占4个字节,所以页面目录占一个页面,即4KB。每个目录项只要不是空白就通过物理页面号指向一个物理页面,这就是一个二级页面表,每个二级页面表也各有1024个表项,其占一个页面,每个表项定义了一个页面的映射和保护模式。

所以,ADDRTO_PDEOFFSETO)计算给定的地址落在哪一个目录项中,所得到的是这个目录项在目录表中的下标。除以(1024*PAGE_SIZE)跟右移 22位的效果是一样的。换言之就是取虚拟地址的高10位为页面目录中的下标。
可是目标进程的页面映射目录在哪里呢?“进程控制块”EPROCESS中有个成分

#define PTE_TO_PFN(X)  ((X) >> PAGE_SHIFT)

DirectoryTableBase 记录着该进程的页面映射表,实际上是页面目录所在的物理地址。物理地址的数据类型为LARGE_INTEGER,所以字段名 DirectoryTableBase后面加上了后缀.QuadPart,表示将其看做64位整数LONGLONG。知道了页面目录表所在的物理地址以后,还要通过宏操作PTETO PFNO)将其转换成物理页面号:

这里的PAGE_SHIFT定义为12,将物理地址右移12位,就成了物理页面号PFN。但是这只是个物理页面号,必须将其映射到当前进程的虚拟地址空间才能访问这个页面。然而目标进程并非当前进程,其页面目录在当前进程的页面映射中一般是无映射的,这时候就需要建立一个临时映射。需要用到MmCreateHyperspaceMapping()了。
为目标进程的页面目录表建立了临时映射,就可以读出目标地址所属的目录项,而目录项又指向目标地址所属的二级页面映射表,于是再为该二级页面映射表建立临时映射。

注意这里并未删除为二级页面表创建的临时映射,因为MmGetPageTableForProcess()所返回的是映射表项的指针,这个函数的调用者势必还要访问这个映射表项。由此可见,MmGetPageTableForProcessO)的调用者承担着删除临时映射的责任。

下面一篇文章看如何获取本进程当前的页面映射表象

地图自定义编码CSV转换成ini文件 创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。... 阅读详情

相关推荐

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

windows内核情景分析读书笔记-----HYPERSPACE

主要介绍HYPERSPACE的创建映射函数 赏光看我这一系列文章的朋友最好结合毛德操老师的书来看,具体的细节我这里就不阐述了 简单说下这个函数功能 Windows内核有时候需要把某些物理页面临时映射到内核的虚存空间,用做临时的用途 #define HYPERSPACE (Ke386Pae?0x c080 0000:0x c040 0000) 区间大小为0x0040 0000  也就是

lycommand的专栏 1388

python采集keep运动数据

我国2009年确立“全民健身日”;2012年,“广泛开展全民健身运动”写入十八大报告;到2014年上升为国家战略,全民健身的分量越来越重。推动全民健身和全民健康深度融合,通过全民健身实现全民健康。 全民健身运动在我国越来越普及,每天清晨和傍晚时分,城市的广场上、公园里,到处是运动健身的人们,跑步、打球、跳舞、游泳、打太极拳等运动项目十分丰富,人们在运动中获得越来越多的幸福感。 随之诞生出了很多运动app,例如keep,咪咕,微信等,大家可以通过app随时记录自己的运动数据,特别是对于很多的减肥人群来说,通过

Z_suger7的博客 5657

3.1.5 系统空间的映射1

这是初始化进程的页面映射表,其内容是系统初始化的产物。凡是缓存在 TLB 中的映射表项,只要这个标志位为1就不受整体的冲刷。一部分即系统空间是公共的,其内容来自全局的内核映射表,这一部分的页面映射是常驻的,不受进程切换的影响。第一个是地址PAGETABLE_MAP所属的目录项,这个目录项应该指向页面目录所在的页面,原来当然是指向 MmGlobalKemelPageDirectory[]里面的某个页面,但是现在则要使其指向子进程的页面目录所在的页面,就是刚才所分配的页面Pfn[0],所以要修改这个目录项。

zhyjhacker的博客 969

【图神经网络】从0到1使用PyG手把手创建异构图

异构图的准确定义如下:异构图(Heterogeneous Graphs):一个异构图GGG有一组节点V=v1,v2,...,vnV=v_1,v_2,...,v_nV=v1​,v2​,...,vn​和一组边E=e1,e2,...,emE=e_1,e_2,...,e_mE=e1​,e2​,...,em​组成,其中每个节点和每条边都对应着一种类型,用TvT_vTv​表示节点类型的集合,TeT_eTe​表示边类型的集合,一个异构图有两个映射函数,分别将每个节点映射到其对应的类型ϕv:V→Tv\phi_v:V\rig

小哲的博客 7833

基于Ultralytic实现多路摄像头目标检测

基于Ultralytic实现多路摄像头目标检测前面的文章分享了单路摄像头画面的YOLO目标检测,这篇文章主要分享一下多路摄像头画面的实时YOLO目标检测。测试环境在Windows系统下进行。

qq_57674776的博客 942

3分钟掌握硬件信息伪装:Windows内核级修改终极指南

你是否曾想过彻底改变电脑的硬件身份?EASY-HWID-SPOOFER正是这样一个能够深度修改硬件信息的强大工具。这款基于内核模式的硬件信息欺骗工具,让技术爱好者和安全研究人员能够学习并实践硬件层面的信息伪装技术。从硬盘序列号到网卡MAC地址,从BIOS信息到显卡参数,这款工具提供了全方位的硬件信息修改能力。 ## 🔍 硬件伪装的实际应用场景 ### 为什么需要修改硬件信息? 硬件信息伪装

gitblog_00864的博客 252

STM32-DAC定时器触发三角波生成【频率与幅度精准控制】

本文详细介绍了STM32 DAC定时器触发三角波生成的原理与实现方法,涵盖硬件配置、频率与幅度精准控制技巧及代码实现。通过定时器触发DAC模块,可灵活调节三角波的频率和幅度,适用于信号发生器等高精度应用场景。

weixin_29161785的博客 453

windows内核情景分析--内存管理(精细分析系统物理内存使用)

  32位系统中有4GB的虚拟地址空间   每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间)   各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同   虚拟地址如0x11111111, 看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页...

安徽小亚哥哥的博客 948

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 242

多物理场耦合仿真-主题032-电磁-流体耦合

电磁-流体耦合,即磁流体动力学(MHD, Magnetohydrodynamics),是研究导电流体在电磁场中运动规律的学科,涉及电磁场与流体力学的深度耦合。本主题系统阐述磁流体动力学的基本理论、控制方程和数值方法。首先介绍MHD的基本概念和物理基础,包括导电流体的性质、电磁场基本方程;然后详细推导MHD控制方程组,包括连续性方程、动量方程、能量方程和电磁场方程;接着讨论MHD流动的特征参数,如Hartmann数、磁雷诺数、相互作用参数等;最后通过六个典型工程案例展示MHD分析的实际应用,包括电磁泵、磁流体

2401_87715305的博客 425

windows内核情景分析--内存管理

32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111,  看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位

maomao171314的专栏 2613

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用DynamicConv高效动态卷积改进YOLO26检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

YOLO26作为新一代轻量化目标检测模型的代表,凭借精简的Backbone架构、高效的特征融合 Neck 设计,在实时检测场景(如嵌入式设备、边缘计算)中展现出优异的性能,成为工业落地与科研入门的优选模型。但在实际应用中,YOLO26原生检测头仍存在核心瓶颈:采用固定参数卷积核,无法根据输入特征的目标尺度、纹理差异动态调整卷积权重,导致多尺度目标适配不足、复杂背景下特征利用率低,且传统改进方案往往难以平衡“精度提升”与“轻量化”,要么精度提升有限,要么大幅增加参数量、拖累推理速度。

qq_36130719的博客 372

3.1.4 Hyperspace 的临时映射2

所以,如果要为一个进程的页面映射表创建映射,在虚存空间就大可采用单层的、大小为1M的连续的数组,占1024个虚存页面就1024个虚存页面。在前面的代码中我们看到,如果内核即系统空间的映射有所变化,则该变化首先是反映在内核映射目录 MmGlobalKermelPageDirectory]中,然后才复制到当前目录的页面目录中,这是因为所有进程的系统空间基本上都是公共的,只有PAGETABLE_MAP和HYPERSPACE这两块地方例外。如果放在地址为0的地方,那么第一个页面就是特殊的,就是页面目录。

zhyjhacker的博客 656

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Reactos 第 3 章 内存管理 — 【中篇】Hyperspace、系统空间、API 与异常

[上篇](file:///d:/reactos/doc/第3章_内存管理_上.md) 讲述了 ReactOS 内存管理器的骨架——VAD 树(用户态虚拟地址空间的使用清单)、PFN Database(物理页的状态账本)、PTE 数组(虚拟→物理的硬件映射)。本篇要讨论的是肌肉:当内核需要"零时访问一块物理页"时怎么办(Hyperspace 临时映射);当内核需要"申请一组 PTE 槽位做一次性映射"时怎么办(系统空间映射);当用户调用 时从用户态到内核态经历了什么(NtAllocateVirtualMem

大坡3D软件开发 311

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

hyperspace目录结构

hyperspace dir : ------------------------------------------------------------------ / hypertable master[address, next_server_id, lock.generation] namemap ids 3 [lock.generation, name] 4 [lock.

记录、分享 2401

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

题解:超空间配对(Hyperspace Pairing)

二进制 & 位运算。

Hzy_L的博客 186

hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

Hyperspace Time Limit: 20000/10000 MS (Java/Others)Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 1023Accepted Submission(s): 492 Problem Description The great Mr.Smith has i...

weixin_30436101的博客 121

Windows 内存管理概念详解

本文详细讲解了 Windows 内核内存管理中的两个核心概念:虚拟地址描述符(VAD)和页帧号数据库(PFN Database)。VAD 是描述进程虚拟地址空间的 AVL 树节点,分为三种类型(SHORT/STANDARD/LONG),记录内存区域的属性、保护标志等信息。PFN Database 是管理物理页面元数据的数组,包含 MMPFN 结构体,跟踪每个物理页的状态、引用计数和映射关系。文章通过数据结构定义、操作流程和 ReactOS 源码对应关系,深入解析了这些关键机制的实现原理。

大坡3D软件开发 298

特斯拉FSD入华在即,本土智驾公司开启BEV架构对决

硬核BEV玩家进场

shenzhoubb2017的博客 1229

Coding Challenge 001:在 Processing 与 p5.js 中实现 Starfield 曲速星空特效

本文围绕 Coding Train 网站归档中的第一个编程挑战(video_number 1,2016-04-12)展开,讲解如何在 Processing 中从零构建一段经典 "star field"(又称 "warp speed" / 曲速飞行)可视化:数百颗星点从画布中心向外飞驰、带透视缩放与运动尾迹。仓库 [CodingChallenges/CC_001_StarField](https:/

gitblog_00093的博客 333

鸣潮PAK模组怎么做?用AES密钥从仓库到生效的完整指南

拿新角色试无冷却连招,又不想反复刷本磨熟练度?WuWa-Mod 把《鸣潮》的 PAK 资源用 AES 密钥解包、改好参数再打包回来,现成的 .pak 丢进游戏目录就能用,参数也支持你自己改。 ## ⚠️ 装前必看:单机边界、版本匹配和备份动作 结论先行:战斗类修改只适合单机,装之前必须备份。 联机风险:《鸣潮》本质是联网游戏,匹配局里开伤害倍率、上帝模式、击杀光环,等于给自己挂外挂,封号不是

gitblog_00902的博客 224

H2O-3 网格(超参数)搜索完全指南:从 Cartesian 全空间遍历到随机搜索、网格持久化与容错恢复

网格搜索(Grid Search)是机器学习调参的核心手段。本文以 h2o-3 官方文档 [grid-search.rst](https://link.gitcode.com/i/0b44a1ae56a510246ac845a34a001ab2) 为主线,系统讲解 H2O 的两种网格搜索模式——传统的 Cartesian(笛卡尔)全组合搜索与 RandomDiscrete(随机离散)搜索,覆盖 R

gitblog_01113的博客 148

15MB轻量级数据库客户端:一站管理50+数据库,3分钟连上第一条连接

不同类型的 MySQL、Redis、MongoDB 要连,往往得换好几套工具;传统数据库管理工具体积大、启动慢,配置还散落在各台设备里。DBX 是仅 15MB 的跨平台数据库客户端,支持 50+ 种数据库类型,一次安装在 Windows、macOS、Linux 上都好用。 ## 15MB装进什么:体积、兼容与平台一览 DBX 打包后只有 15MB,比动辄数百 MB 的传统版本小了一个量级。它开

gitblog_00462的博客 418

从概念到实践:构建超维空间项目的完整指南

三维建模与实时渲染技术正推动数字体验从传统界面向沉浸式空间演进。其核心原理在于利用WebGL等图形API,在浏览器中构建可交互的三维环境,通过摄像机控制、光照计算和物理模拟实现逼真视觉效果。这项技术的价值在于突破二维信息呈现的局限,以空间叙事的方式组织复杂数据,显著提升信息传达效率和用户参与度。在应用场景上,它广泛适用于产品可视化展示、虚拟展厅、在线教育及数据可视化等领域。本文以Babylon.js和Three.js为例,深入解析超维空间项目的设计思路、技术选型与性能优化策略,并探讨如何融入空间音效与实时数

ajwh64482的博客 488

【Agent Harness】Gliding Horse 核心设计理念,不跟风开发自己的AI Agent

Gliding Horse Agent OS 建立在两个通用框架5W2H(What-做什么、Why-为什么、Who-谁做、When-何时、Where-何地、How-怎么做、How Much-多少资源)任务本体回答:"到底需要做什么?目的:明确意图、约束和成功标准时机:在任务初始化阶段应用PDCA 循环(Plan-计划、Do-执行、Check-检查、Act-改进)执行模型回答:"我们如何系统地执行和改进?目的:提供带持续反馈的迭代执行时机:贯穿任务生命周期专业模型(技能扩展)

Ik20uAosn的博客 266
上一篇: 3.1.3 看对于“肮脏”页面的处理
下一篇: 3.1.4 Hyperspace 的临时映射2
zhyjhacker
博客等级 码龄17年 3203粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值