Linux 进程虚拟地址空间与虚拟内存

《深入理解Linux进程与内存》学习笔记——进程如何使用内存 以glibc中ptmalloc内存分配器为例。 阅读详情

Linux 进程虚拟地址空间与虚拟内存

本文主要介绍Linux进程虚拟地址空间和虚拟内存的概念,学习可用物理内存中的页帧与所有的进程虚拟地址空间中的页之间的关联:

逆向映射(reverse mapping) 技术有助于从虚拟内存页追踪到对应的物理内存页

缺页处理(page fault handliing 则允许从块设备按需读取数据填充虚拟地址空间。

1. 简介

无论是何种体系结构,虚拟地址空间的分布方式都有以下几个成分

  • 当前运行的二进制代码
  • 程序使用的动态链接库的代码
  • 存储全局变量和动态产生的数据的堆
  • 用于保存局部变量和实现函数/过程调用的栈
  • 环境变量和命令行参数的栈
  • 将文件内容映射到虚拟地址空间中的内存映射

在这里插入图片描述

系统中的各个进程都具有一个struct mm_struct的实例,可以通过task_struct访问,这个实例保存了进程的内存管理信息

struct mm_struct {
    unsigned long (*get_unmapped_area) (struct file* filp,
                    			unsigned long addr, unsigned long len,
                          unsigned long pgoff, unsigned long flags);
...
    unsigned long mmap_base; /* mmap 区域的基地址 */
    unsigned long task_size; /* 进程虚拟内存空间的长度 */
...
    unsigned long start_code, end_code, start_data, end_data;
    unsigned long start_brk, brk, start_stack;
    unsigned long arg_start, arg_end, env_start, env_end;
...
}

可执行代码占用的虚拟地址空间区域,其开始和结束分别通过start_code和end_code标记,类似的,start_data和end_data标记了包含已初始化数据的区域。在ELF二进制文件映射到地址空间后,这些区域的长度不再改变。

堆的起始地址保存在start_brk,brk表示堆区域当前的结束地址,尽管堆的起始地址在进程生命周期中保持不变,但是堆的长度会发生变化,因此brk也会发生变化。

参数列表和环境变量的位置分别由arg_start和arg_end、env_start和env_end描述。两个区域都位于栈中最高区域。

mmap_base表示虚拟地址空间中用于内存映射的起始地址,可调用get_unmapped_area在mmap区域中为新映射区为新映射找到适当的位置。

task_size顾名思义,存储了对应进程的地址空间长度。

test段如何映射到虚拟地址空间中由ELF标准确定,例如IA-32系统起始于0x0804800,AMD64则使用0x000000000400000。堆紧接着text段开始,向上生长。栈起始于STACK_TOP ,如果设置PF_RANDOMIZE,则起始点会减少一个小的随机值。每个体系结构都必须定义STACK_TOP ,大多数都设置为TASK_SIZE,即户地址空间中的最高可用地址。进程的参数列表和环境变量都是栈的初始数据。

用于内存映射区域起始于mm_stuct->mm_base,通常设置为TASK_UNMAPPED_BASE,每个体系结构都需定义,几乎所有情况下,都为TASK_SIZE/3。

2. 内存映射原理

由于所有的用户进程总的虚拟地址空间比可用的物理内存大得多,因此只有最常用的部分才与物理页帧关联。内核利用address_space数据结构,提供一组方法从后备存储器(例如文件系统功能)读取数据。因此,address_space形成了一个辅助层,将映射的数据表示为连续的线性区域,提供给内存管理子系统。
在这里插入图片描述

  1. 试图访问用户地址空间中的一个内存地址,但是用页表无法确定物理地址
  2. 处理器接下来会触发一个缺页异常,发送到内核
  3. 内核会检查负责缺页区域的进程地址空间的数据结构,找到适当的后备存储器,或者确认该访问实际上是不正确的
  4. 分配物理内存页,并从后备存储器读取所需数据填充
  5. 借助页表将物理内存页并入到用户进程的地址空间,应用恢复执行。

struct mm_struct出了前面提到的成员,还包括下列成员,用于管理用户进程在虚拟地址空间中的所有内存区域

struct mm_struct {
    struct vm_area_struct * mmap; /* 虚拟内存区域列表 */
    struct rb_root mm_rb;
    struct vm_area_struct * mmap_cache; /* 上次find_vma的结果 */
...
}

每个区域都通过一个vm_area_struct实例描述,进程的各区域按两种方法排序

  1. 在一个单链表上(开始于mm_struct -> mmap)
  2. 在一个红黑树中,根结点位于mm_rb

内存映射也分好几种类型

  • 按照物理页的类型来分

    • 文件映射

      把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件

    • 匿名映射

      没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源

​ 通常把文件映射的物理页称为文件页,把匿名映射的物理页称为匿名页。

  • 按照对其他进程是否可见来分

    • 共享映射

      修改数据时映射相同区域的其他进程可以看见,如果是文件支持的映射,修改会传递到底层文件

    • 私有映射

      第一次修改数据时会从数据源复制一个副本,然后修改副本,其他进程不可见,不影响数据源

两个进程可以使用共享的文件映射实现共享内存,匿名映射通常为私有映射,共享的匿名映射只可能出现在父进程和子进程之间,在进程的虚拟地址空间中,代码段和数据段是私有的文件映射,未初始化的数据段、堆栈是私有的匿名映射。

虚拟内存区域的表示

每个内存区域表示为vm_area_struct的一个实例,简化定义如下:

struct vm_area_struct {
    struct mm_struct * vmm; /* 所属地址空间 */
    unsigned long vm_start; /* vm_mm内的起始地址 */
    unsigned long vm_end; /* 在vm_mm内结束地址后的第一个字节地址 */
    
    /* 各进程的虚拟内存区域链表,按地址排序 */
    struct vm_area_struct * vm_next;
  
  	pgprot_t vm_page_prot; /* 该虚拟内存区域的访问权限 */
    unsigned long vm_flags; /* 标志,如下列出 */
    
    struct rb_node vm_rb;
  
    /* 
     * 对于有地址空间和后备存储器的区域来说
     * shared连接到address_space->i_mmap优先树
     * 或连接到悬挂在优先树节点外、类似的一组虚拟内存区域的链表
     * 或连接到address_space->i_mmap_nonlinear链表中的虚拟内存区域 */
    union {
        struct  {
				    struct list_head list;
            void *parent; /* 与prio_tree_node的parent成员在内存中位于同一位置 */
            struct vm_area_struct *head;
        } vm_set;
        
        struct raw_prio_tree_node prio_tree_node;
    } shared;
  
    /*
     * 在文件的某一页经过写时复制之后,文件的MAP_PRIVATE虚拟内存区域可能同时在i_mmap树和
     * anon_vma链表中,MAP_SHARED虚拟内存区域只能在i_mmap树中,匿名的MAP_PRIVATE、栈
     * 或者brk虚拟内存区域(file指针为NULL)只能处于anon_vma链表中 */
    struct list_head anon_vma_node; /* 对该成员的访问通过anno_vma->lock串行化 */
    struct anon_vma *anon_vma;      /* 对该成员的访问通过page_table_lock串行化 */
    
    /* 用于处理该结构的各个函数指针 */
    struct vm_operation_struct *vm_ops;
  
    /* 后备存储器的相关信息 */
    unsigned vm_pgoff; /* 文件映射的偏移量,以页为单位 */
    struct file *vmfile; /* 所映射到的文件,也有可能为null */
    void * vm_privat_data; /* vm_pte即共享内存 */
};

vm_ops是一个指针,指向许多方法的集合,这些方法用于在区域上执行各种标准操作

struct vm_operation_struct {
		void (*open) (struct vm_area_struct *area);
  	void (*close) (struct vm_area_struct *area);
    int (*fault) (struct vm_area_struct *vma, struct vm_fault *vmf);
    struct page * (*nopage) (struct vm_area_struct *area, unsigned long
                             addresss, int * type);
}

在创建和删除区域时,分别调用open和close,这两个接口通常不使用,设置为NULL指针。

但是fault是非常重要的,如果地址空间中某个虚拟内存页不在物理内存中,自动触发的缺页异常处理程序会调用该函数,将对应的数据读取到一个映射在用户地址空间的物理内存页中。

nopage是内核原来用于响应缺页异常的办法,不如fault灵活,出于兼容考虑,该成员依然保留,但不应该用于新的代码。
在这里插入图片描述

优先查找树

优先查找树(priority search tree)用于建立文件中的一个区域与该区域映射到的所有虚拟地址空间之间的关联。

struct address_space {
		struct inode *host;
...
    struct prio_tree_root i_mmap;
    struct list_head i_mmap_nonlinear;
}

struct file {
...
		struct address_space *f_mapping;
...
}

struct inode {
...
		struct address_space *i_mapping;
...
}

在这里插入图片描述

3. 对区域的操作

将虚拟地址关联到区域

通过虚拟地址,find_vma可以查找到用户地址空间中结束地址在给定地址后的第一个区域,即满足addr < vm_area_struct->vm_end条件的第一个区域

struct vm_area_struct * find_vma(struct mm_struct *mm, unsigned long addr) 
{
  	struct vm_area_struct *vma = NULL;
  
    if (mm) {
    		/* 首先检查缓存 */
      	/* 缓存命中概率通常为35% */
      	vma = mm->mmap_cache;
      	if (!(vma && vma->end > addr && vma->vm_struct <= addr)) {
          	struct rb_node *rb_node;
          	
          	rb_node = mm->mm_rb.rb_node;
          	vma = NULL;
          
          	while (rb_node) {
              	struct vm_area_struct * vma_tmp;
              	vma_tmp = rb_entry(rb_node, struct vm_area_struct, vm_rb);
             		if (vma_tmp -> vm_end > addr) {
										vma = vma_tmp;
                    if (vma_tmp->vm_start <= addr)
                      	break;
                  	rb_node = rb_node -> rb_left;
                } else 
                  	rb_node = rb_node -> rb_right;
            }
          	if (vma)
              	mm->mmap_cache = vma;
        }
    }
  	return vma;
}

添加区域

删除区域

插入区域

4. 内存映射

C语言标准库提供了mmap函数建立映射,在内核测,提供了两个系统调用mmap和mmap2

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags,
           int fd, off_t offset);
int munmap(void *addr, size_t length);

mmap在调用进程的虚拟地址空间中创建一个新的映射,新映射的起始地址为addr,映射长度为length

prot定义了映射的内存保护类型

  • PROT_EXEC:Pages may be executed.

  • PROT_READ:Pages may be read.

  • PROT_WRITE:Pages may be written.

  • PROT_NONE:Pages may not be accessed.

最重要的几个标志:

  1. MAP_FIXED除了给定地址之外,不能将其他地址用于映射,如果没有设置该标志,内核可以在受阻时随意改变目标地址
  2. 如果一个对象(通常是文件)在几个进程之间共享时,则必须使用MAP_SHARED
  3. MAP_PRIVATE创建一个与数据源分离的私有映射,对映射区域的写操作不影响文件源数据
  4. MAP_ANONYMOUS创建与任何数据都不相关的匿名映射,内容被初始化为0,fd和off参数被忽略

通过前面的介绍,可以建立虚拟地址 和物理地址 之间的联系(通过页表),也可以建立一个进程的内存区域 和其虚拟内存页地址 之间的联系,但是仍然缺乏物理内存页和该页所属进程(更精确的说,所有使用该页的进程的对应页表项)之间的联系。

逆向映射

5. 缺页异常

在这里插入图片描述

6. 虚拟地址空间与虚拟内存的联系与不同

很多人都以为虚拟地址空间和虚拟内存是一个概念,但严格意义上来讲,二者的差别就像Java和Javascript

虚拟地址空间指的是操作系统给每个进程准备的地址空间,上面解释的,包括代码段、数据段、堆、栈等,是进程逻辑上使用的地址空间。虚拟地址空间的大小并不等于物理内存的大小,而是由操作系统总线宽度决定,32位操作系统那一半就是4G大小,操作系统会为每个进程分配特定的地址空间,并维护映射关系,将虚拟地址映射到物理地址上。当进程访问虚拟地址空间时,操作系统会通过MMU(可以去看我文件系统那篇博客)将虚拟地址转换为对应的物理地址,并进行访问。

而虚拟内存是指操作系统提供的一种机制,使得进程能够访问超出物理内存大小的地址空间。虚拟内存的实现方式是将物理内存分为许多大小相等的页(Page),并将虚拟地址空间也分为大小相等的页。当进程访问一个虚拟页时,操作系统会将该页从磁盘中加载到物理内存中的一个页框(Page Frame)中,并将虚拟地址映射到这个页框上。如果物理内存中的页框数量不足,操作系统会进行页面置换(Page Replacement),将不再需要或者使用频率较低的页从物理内存中移除,并将新的页加载到空出的页框中。

虚拟地址空间是进程在逻辑上使用的地址空间,而虚拟内存则是操作系统在物理内存和磁盘之间建立的一层抽象,使得进程能够访问超出物理内存大小的地址空间。虚拟地址空间则是通过对地址空间进行划分和映射来实现的,而虚拟内存是通过将虚拟地址转换为物理地址来实现的。没有虚拟内存这层抽象,虚拟地址空间根本无从发力。

虚拟内存以及进程的虚拟内存分布(第六章) 在早期的计算机中,程序都是直接运行在物理内存上的,运行时访问的地址都是物理地址,而这要求程序使用的内存空间不超过物理内存的大小。在现代计算机操作系统中,计算机同时运行多个程序,为了提高CPU的利用率和物理内存的利用率,操作系统应用虚拟内存机制来管理内存。 本文介绍一些与虚拟内存相关的概念。 目录 1.物理内存 vs 虚拟内存 2.物理内存空间 和 虚拟内存空间 3.4GB虚拟内存 cp... 阅读详情

相关推荐

TLSR8258蓝牙Mesh实战:从SDK下载到自定义通信指令全流程(附避坑指南)

本文详细介绍了TLSR8258蓝牙Mesh开发的完整流程,从SDK下载、环境搭建到自定义通信指令的实现。通过实战案例和避坑指南,帮助开发者快速掌握低功耗蓝牙Mesh网络构建技巧,适用于智能家居、工业监控等物联网场景。

weixin_29176179的博客 199

Linux 进程:程序地址空间 与 虚拟内存

简单介绍了程序地址空间的概念和程序地址空间的划分,每部分的作用。详细介绍了虚拟内存(虚拟地址空间)的概念,以及虚拟内存的实现原理和虚拟内存的好处。

weixin_57761086的博客 1976

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9239

虚拟内存与虚拟地址空间

虚拟地址空间是一种使程序可以直接访问这些内存而不必真正了解这些内存在物理上所处的位置的技术。每个进程都有自己的独立虚拟地址空间,同时操作系统负责将每个进程的虚拟地址映射到主存中的物理内存地址。虚拟地址空间使每个进程都有最大4GB(32位系统)或16EB(64位系统)可用的虚拟内存空间,尽管实际物理内存少于该数量,这样允许处理器利用虚拟内存空间存储更多数据。总的来说,虚拟地址空间是一种重要的内存管理技术,它允许计算机以更高效、可靠和安全的方式管理内存。虚拟地址空间允许各进程共享某些资源并提升系统的效率。

weixin_49503250的博客 4616

强化学习-马尔可夫模型

前文提到了强化学习源自马尔可夫决策过程,本文从马尔可夫概念入手,讲解和马尔可夫有关的模型和概念。在马尔科夫决策过程中,我们有一个智能体,它在一个马尔科夫过程中进行决策,每次决策都会导致状态的转移和获得即时奖励。智能体的目标是通过选择动作来最大化未来奖励的期望值。通常马尔科夫决策过程是个五元组:SAPRγSAPRγS 表示状态集合,代表智能体可能处于的所有状态。A 表示动作集合,代表智能体可以采取的所有动作。

君子之学必日新,日新者日进也。不日新者必日退,未有不进而不退者 8062

Challenge 6 - OSCP C

开放了161端口,直接snmpbulkwalk扫描得到账号密码试了那几个web端口,发现可以登录8083的vesta,但是需要用户名大写Jack接着登录之后里面可以创建计划任务,直接弄个反弹shell,一分钟回弹。得到shell后,运行linpeas.sh提供了几个可能的漏洞,挨个试一下。

羽的博客 4134

Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

VFS(Virtual Filesystem Switch)称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。要访问一个文件系统中的文件,必须先将这个文件系统挂载在全局文件系统树的某个根目录下,这一挂载过程被称作文件系统的挂载,所挂载的目录称为挂载点。文件对象描述的是进程已经打开的文件。

qq18218628646的博客 1379

ANFIS实现数据非线性回归附Matlab代码

在本文中,我们将介绍如何使用Matlab实现基于MSE的ANFIS非线性回归,并提供相应的源代码。ANFIS是一种融合了模糊逻辑和神经网络的方法,它可以通过学习数据集中的模式来构建一个模糊推理系统。ANFIS的训练过程基于最小化MSE,以提高模型的拟合能力。通过上述代码示例,我们可以使用基于MSE的ANFIS模型对数据进行非线性回归,并获得相应的预测结果。在示例中,我们定义了一个包含两个样本的新输入数据集 X_new,然后使用训练好的ANFIS模型进行预测,并将结果存储在变量 Y_pred 中。

2301_79326588的博客 473

虚拟内存、虚拟地址空间和物理地址空间(内存管理)

虚拟内存、虚拟地址空间和物理地址空间(内存管理)

摸鱼中...... 3530

Altium Designer20 PCB板子绘制

版层 top layer 顶层 bottom layer 底层 设置板子大小 布局 过孔 top layer层连到bottom layer层。通过via连接。 设置线宽 在design rules里可以设置线宽。 右键new rule 可以新增线宽,电源设置成20mil 还可以设置很多其他的线宽 修改安全距离 安全距离太短容易出现毛刺,然后短路,一般设置成20mil 修改元器件旋转角度 修改rotation step,每次旋转45°。 修改光标大小 下面的cursor type是修改光标

及时总结 2582

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 203

Linux:进程虚拟地址空间|虚拟内存管理

本文探讨了Linux系统中进程虚拟地址空间的概念及其重要性。通过C语言代码示例,分析了程序地址空间布局,包括代码区、全局变量区、堆区、栈区等不同内存区域的分布特点。重点解释了虚拟地址与物理地址的区别,以及操作系统通过页表实现两者映射的机制。文章还深入讲解了写时拷贝技术如何实现进程独立性,并阐述了虚拟地址空间的三大优势:内存保护、空间有序性和模块解耦。最后指出虚拟地址空间的存在使得内存管理更加灵活高效,物理内存分配对进程透明,实现了延迟分配等优化策略。

分享C,C++,数据结构,Linux,算法内容 1524

【ARM Coresight | AMBA BUS | Cache 与 MMU/MPU | CoreLink | GCC | CSH 专栏导读】

1. ARM Coresight(SoC-400/SoC-600) 专栏 2. ARMv8/v9 CPU/Cache 专栏 3. Linux ARM AMBA 总线 专栏 4. Trace32/DS-5 专栏。。。

CodingCos的博客 8241

Linux虚拟内存和进程虚拟地址空间简述

后台开发经常会问此类问题,虽说难度不大,但是知道和不知道还是有区别的。以下的内容总结自《深入理解Linux内核》第一章,仅仅是简述,没有深入研究,毕竟内存管理这一块内容超级多,感兴趣的同学可以去啃啃这本书。 虚拟内存 所有新近的Unix系统都提供了一种有用的抽象,叫虚拟内存(virtual memory)。虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元(Memory Manag...

fuyuande的博客 917

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Linux进程(七)】进程虚拟地址空间详解:从概念到实现与设计哲学

如下图所示,我们以一位资产超过10亿美刀、拥有众多私生子的北美大富翁为例,来理解一下什么是虚拟地址空间。这就是OS让私生子——进程——产生了一个错觉:“我独占资源”,至于为什么,我们后面介绍。画饼,饼本身要不要被管理?打个比方,你是一个公司老总,给每个员工画大饼,这个干好了当项目经理,那个完成了就把下一个项目交给他——如果不管理,大饼搞错了怎么办?比如明明许诺的是项目,却让他当了项目经理,明明是让他当项目经理,最后却让他去负责项目,这样可以吗?当然不行。我们私生子要管理,虚拟地址空间(画饼)也要管理!

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1435

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux —— 虚拟进程地址空间

页表是虚拟内存系统的核心数据结构,是连接虚拟地址和物理地址的“地图”或“翻译官”;是Kernel为每个进程维护的一个映射表,它记录了该进程的虚拟内存页对应到物理内存帧的映射关系简单来说,它的工作就是回答这个问题:“这个进程看到的虚拟地址 X,实际上在物理内存的哪个地方?OS 会将进程物理地址隐藏起来,我们只能观测到进程的虚拟地址。

2401_87692970的博客 1959

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux进程虚拟地址空间,Linux进程地址空间和虚拟内存

二、linux进程地址空间由前面可得知,进程有4G的寻址空间,其中第一部分为“用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节的虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节的虚拟地址。如下图将其更加详细地展示如下:环境变量:类似linux下的PATH,HOME等的环境变量,子进程会继承父进程的环境...

weixin_42449583的博客 187

Linux x86-64 虚拟内存管理:从进程虚拟地址空间到 4 级页表映射

本文深入解析Linux x86-64架构下的虚拟内存管理机制,从进程虚拟地址空间布局到4级页表映射的详细实现。通过代码示例和性能分析工具,揭示虚拟地址到物理地址的转换过程,并对比32位与64位系统的关键差异,帮助开发者优化内存管理性能。

weixin_30443747的博客 327

【Linux】进程(第九篇)

进程是操作系统进行资源分配的最小单位,而内存是进程运行必不可少的资源。那么,为什么需要内存呢?CPU 太快,但其数据容量极小且功能单一,而其他 I/O 等硬件功能多样,只是相对于 CPU 来说它们又太慢,所以便需要内存在 CPU 与 I/O 设备间进行缓冲。现代操作系统均支持多任务,操作系统一般会为每个进程分配独享的内存空间,这个独享的内存空间只是在进程自己看来是独享的,实际上其只是操作系统为其分配的虚拟内存空间,虚拟内存在真正被使用时才映射到物理内存上。

abclui的专栏 1376

LINUX文件系统和虚拟地址空间

目录 1.虚拟内存空间解决了什么问题? 2.LINUX虚拟内存空间结构 3.页表 1.虚拟内存空间解决了什么问题? 闲谈:在研究虚拟地址空间,看到了一篇博客,说:在看到一项技术时,如果直接去看他的概念、用法、而忽视了他对比以前的技术有什么提升,解决了了以前技术中的哪些问题,这样是很不负责的。 正题:在计算机技术发展的早期,通常程序是直接访问物理地址的,只要程序需要的内存大小不超过物理内...

第一视角 347

Linux——进程(4)

对上篇文的虚拟地址空间的知识进行了详细的解析,对一些相关问题进行了详细解释

2401_89408908的博客 1112

linux内存管理笔记(三十)----进程虚拟地址

在前面的章节中,我们主要关注的是内核的虚拟地址空间的管理。从本节开始,我们重点关注管理用户空间的方法,其中由于种种原因,这个比内核地址空间管理更复杂。本节主要围绕以下内容: 用户进程的虚拟地址空间是Linux的一个重要抽象,它向每个运行进程提供了同样的系统,每个应用程序都有自身的地址空间,与所有的应用程序分割开,不会干扰到其他进程内存的内容。 在内核的虚拟地址空间中,只有很少的段可用于各个用户空间进程,这些段彼此有一定的距离,内核需要一些数据结构来有效的管理这些分布的段 地址空间中只有极少的一部分与物理页

奇小葩 1829

虚拟地址空间 -- 虚拟地址,进程地址空间(虚拟地址空间),虚拟内存管理

本文摘要: C/C++程序的内存空间分布实际上是虚拟地址空间,而非物理内存。通过实验代码展示了代码区、全局变量区、堆区、栈区等不同区域的虚拟地址。进程地址空间通过页表映射到物理内存,父子进程共享相同虚拟地址但可能指向不同物理地址(写时拷贝机制)。虚拟地址空间由mm_struct结构体管理,包含各内存区域的边界信息。虚拟内存技术通过地址转换、内存隔离和分页管理,实现了进程间的稳定运行、内存保护和高效利用。内核使用vm_area_struct结构体组织虚拟内存区域,通过链表或红黑树进行高效管理。

CSQCSQCC的博客 1074

【寻找Linux的奥秘】第七章:虚拟地址空间

本专题将基于Linux操作系统来带领大家学习操作系统方面的知识以及学习使用Linux操作系统。上一章我们简单认识了环境变量,本章将讲解操作系统中另一个重要的概念——程序地址空间。

2302_80243065的博客 2483

linux mmu的实现的讲解_linux 虚拟内存

前面讲了单纯的操作系统的虚拟内存、linux进程的虚拟地址,然后又讲了linux的进程的内存布局,其实那张图就是linux进程的虚拟内存。取自:https://blog.youkuaiyun.com/dlutbrucezhang/article/details/9058583可是感觉理解不够,所以再来学习: 下面这部分是参考这个视频学习的:https://www.bilibili.com/video/av42...

weixin_32218919的博客 251

linux虚拟地址空间你真的理解了吗?

学了很久linux内核了,但对于linux内核对于内存管理这块始终有许多疑问,学而不思则罔!看了许多书籍和博客但还是没有搞得很明白。今天仔细思考了为什么需要虚拟内存的问题,突然觉得很有收获,所以记下来和大家分享,也是为了给自己留下更深刻的印象! 1.理解进程使用的全部资源是’虚拟‘的,我们知道我们编写的应用程序最终要以进程的形式来运行,因而进程就相当于一个虚拟机(虚拟的计算机),所以我们很容易感

回忆的往昔 7216
上一篇: QEMU-KVM CPU虚拟化
下一篇: TSL四次握手
Hack Rabbit
Hack Rabbit 新星创作者: 运维技术领域 新星创作者: 运维技术领域
博客等级 码龄9年 2893粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hack Rabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值