精华内容
下载资源
问答
  • 页式地址变换 虚地址结构 ...虚地址转换为内存地址计算 如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出 第一步,将虚地址转换成二进制的数; 第二步,按页的大...

    页式地址变换

    虚地址结构

    虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移)

    区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分。

    • 假设页面大小为1024字节,虚地址占用2个字节(16位)

    虚地址转换为内存地址计算

    • 如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出
    • 第一步,将虚地址转换成二进制的数;
    • 第二步,按页的大小分离出页号和位移量(低位部分是位移量,高位部分是页号);
    • 第三步,根据题意产生页表,将位移量直接复制到内存地址寄存器的低位部分;
    • 第四步,以页号查页表,得到对应页装入内存的块号,并将块号转换成二进制数填入地址寄存器的高位部分,从而形成内存地址。

    举例说明:
    1.有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH,1ADDH转换成内存地址。
    解:
    |页号|块号 |
    | 0 | 7 |
    | 1 | 9 |
    | 2 | A |
    | 3 | 5 |
    虚地址0AFEH转化为二进制数:0000 1010 1111 1110
    已知页大小是2kb,所以低位部分是11位,所以,w=010 1111 1110, p=0000 1=1
    根据页号与块号的排列 p=1时,块号为9,9的二进制数为1001,表首地址为0
    所以,MR=(首0)0100 1010 1111 1110(二进制)=4AFEH(16进制)

    同理可计算出1ADDH,大家动手试一试吧。答案会放在在评论区里。

    • 如果,虚地址以十进制数给出,那么就用公式进行计算。
    • 页 号(整除)=虚地址 / 页大小
      位移量(取模)=虚地址 mod 页大小
      根据题意产生页表;
      以页号查页表,得到对应页装入内存的块号
      内存地址=块号×页大小+位移量
    同样我们举例说明
    1. 有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、10、5块,试将虚地址7145,3412转换成内存地址。
      解:
      |页号|块号 |
      | 0 | 7 |
      | 1 | 9 |
      | 2 | A |
      | 3 | 5 |
      首先,已知虚地址7415,页大小为2kb
      计算 P=7145/2048=3
      W=7145mod2048=1001
      MR=5*2048+1001=11241
      所以虚地址7145的内存地址是:11241

    同样的,3412的内存地址请大家动手试一下,答案放在评论区。
    其实是很简单的东西,怕自己忘记计算方式,所以记录一下,各位大佬见笑了。

    展开全文
  • CPU只能访问虚拟内存,而实际的...据传送到CPU中进行运算,而这个地址的映射就通过页表来完成的。 --------------------------------------------------------------------------------- 一,linux内核的四级页表。
    CPU只能访问虚拟内存,而实际的数据都存放在物理内存上面,
    
    这就需要将虚拟内存映射到物理内存上面去,然后在物理内存上获取数
    据传送到CPU中进行运算,而这个地址的映射就通过页表来完成的。
    ---------------------------------------------------------------------------------
    一,linux内核的四级页表。
           内核为什么要设计四级页表呢?主要是为了支持多种硬件平台,
    各种CPU提供的硬件支持不一样,还有要支持64位机。内核的4级页表可
    以退化为3级页表,还可以退化到2级页表。四级页表也就是把一个虚拟
    地址分为了5部分,分别是PGD,PUD,PMD,PTE,offset
    示意图如下:

    ------------------------------------------------------------------------------
    二,实战,将一个用vmalloc开辟的地址映射为物理地址。

    1. static unsigned long vaddr_to_paddr(unsigned long va)
    2. {
    3.     pgd_t *pgd;
    4.     pud_t *pud;
    5.     pmd_t *pmd;
    6.     pte_t *pte;
    7.     unsigned long paddr;
    8.     unsigned long page_addr;
    9.     unsigned long page_offset;

    10.     pgd = pgd_offset(current->mm,va);
    11.     printk("pgd_val = 0x%lx\n",pgd_val(*pgd));
    12.     printk("pgd_index = %lu\n",pgd_index(va));
    13.     if (pgd_none(*pgd)) {
    14.         printk("not mapped in pgd!\n");
    15.         return -1;
    16.     }

    17.     pud = pud_offset(pgd,va);
    18.     printk("pud_val = 0x%lx\n",pud_val(*pud));
    19.     printk("pud_index = %lu\n",my_pud_index(va));
    20.     if (pud_none(*pud)) {
    21.         printk("not mapped in pud!\n");
    22.         return -1;
    23.     }

    24.     pmd = pmd_offset(pud,va);
    25.     printk("pmd_val = 0x%lx\n",pmd_val(*pmd));
    26.     printk("pmd_index = %lu\n",pmd_index(va));
    27.     if (pmd_none(*pmd)) {
    28.         printk("not mapped in pmd!\n");
    29.         return -1;
    30.     }

    31.     pte = pte_offset_kernel(pmd,va);
    32.     printk("pte_val = 0x%lx\n",pte_val(*pte));
    33.     printk("pte_index = %lu\n",pte_index(va));
    34.     if (pte_none(*pte)) {
    35.         printk("not mapped in pte!\n");
    36.         return -1;
    37.     }
    38.     

    39.     page_addr = pte_val(*pte) & PAGE_MASK;
    40.     page_offset = va & ~PAGE_MASK;
    41.     paddr = page_addr | page_offset;

    42.     printk("vaddr = %lx,paddr = %lx\n",va,paddr);
    43.     printk("page_addr = %lx\n",page_addr);
    44.     
    45.     return paddr; 
    46. }
    模块运行结果:(环境:linux.2.6.36,intel 32位系统)

    1. [263298.365202] pgd_val = 0x5e18067
    2. [263298.365207] pgd_index = 995
    3. [263298.365210] pud_val = 0x5e18067
    4. [263298.365213] pud_index = 0
    5. [263298.365216] pmd_val = 0x5e18067
    6. [263298.365218] pmd_index = 0
    7. [263298.365221] pte_val = 0x63c0163
    8. [263298.365223] pte_index = 127
    9. [263298.365226] vaddr = f8c7f000,paddr = 63c0000
    10. [263298.365229] page_addr = 63c0000
    可以看出pud和pmd的偏移量均为0,说明在这儿就只使用了二级页表,
    将pud和pmd都“折叠”起来了。代码的过程完全可以由上面的图解释。
    -----------------------------------------------------------------------------------------
    三,模块完整代码
     vaddr_to_paddr.rar   
    ------------------------------------------------------------------------------------------
    展开全文
  • 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。 first() {//检索快表 if(找到) { 修改页表项访问位 if(是写指令) { 修改位置"1"; } use(物理地址&&页...

    详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。

    first()
    {//检索快表
    	if(找到)
    	{
    		修改页表项访问位
    			if(是写指令)
    			{
    				修改位置为"1";
    					
    			}
    			use(物理地址&&页内地址)
    			{
    				形成物理地址
    			}
    	}
    	else
    	{//未找到
    		内存中查找页表查看其状态位从而知道是否调入内存
    			if(该页已调入内存)
    			{
    				页表项写入快表
    					if(快表已满)
    					{
    						调入算法确定换出页,并将此页表项写入快表
    					}
    			}
    			else
    			{//尚未调入内存
    				发生缺页中断
    					从外存将该页调入内存
    					
    			}
    			
    	}
    }


    展开全文
  • 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。 first() {//检索快表 if(找到) { 修改页表项访问位 if(是写指令) { 修改位置"1"; } use(物理地址&...

    详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。

    first()
    {//检索快表
    	if(找到)
    	{
    		修改页表项访问位
    			if(是写指令)
    			{
    				修改位置为"1";
    					
    			}
    			use(物理地址&&页内地址)
    			{
    				形成物理地址
    			}
    	}
    	else
    	{//未找到
    		内存中查找页表查看其状态位从而知道是否调入内存
    			if(该页已调入内存)
    			{
    				页表项写入快表
    					if(快表已满)
    					{
    						调入算法确定换出页,并将此页表项写入快表
    					}
    			}
    			else
    			{//尚未调入内存
    				发生缺页中断
    					从外存将该页调入内存
    					
    			}
    			
    	}
    }


    转载于:https://www.cnblogs.com/zhuhengjie/p/5966890.html

    展开全文
  • 一、 与页相关的数据结构及宏的定义 分页机制是硬件对分页的支持,这是虚拟内存管理的硬件基础。要想使这种硬件机制充分发挥其功能,必须有相应软件的支持,我们来看一下Linux所定义的一些主要数据结构,其分布在...
  •  分页机制是硬件对分页的支持,这是虚拟内存管理的硬件基础。要想使这种硬件机制充分发挥其功能,必须有相应软件的支持,我们来看一下Linux所定义的一些主要数据结构,其分布在include/asm-i386/目录下的page.h,...
  • 1. 利用 crash 展示和解说一个虚地址经过页表逐级转换的过程 2. 分配内存,释放内存形成孔洞,记录该进程的虚存空间变化,验证进程空间的内存分配算法 3. 测试出你的系统单个进程所能分配到的最大虚拟内存空间多...
  • 简单说一下表的概念:在一个类中如果有函数,那么此类的实例中就有一个表指针指向表,这个表是一块儿专门存放类的函数地址内存。 通过sizeof运算符我们可以查看一个对象所占的空间,对于一个只有函数...
  • 虚地址空间

    2016-12-07 22:46:05
    作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势: 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。 程序可以使用一系列虚拟地址来...
  • 题目一:有一系统采用页式存储管理,有一作业大小是8KB,页大小2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH转换内存地址。 先来明确一下地址结构的分布 前一部分页号 P,后一部分位移量 W(或称为页...
  • 转换 这种转换主要是把线性地址(经过段转换过的)转换成物理地址。页转换是操作系统实现虚拟内存的基础,CPU也可以在也转换基础上实现页访问保护,增强系统的稳定性。 页转换是可选的,只有当CR0寄存器的PG...
  • 把一个虚地址转换为物理地址本是一个复杂的过程,在此,去掉哪些枝枝叶叶,只留下树干。 一个虚地址转换成物理地址是通过页表这个桥梁的,三级页表包括:·PGD(Page Global Directory)·PUD(Page Upper ...
  • 共享内存简介

    2017-05-19 23:53:00
    原理: 地址空间:一个连续的内存地址单元 ...虚拟地址空间:CPU MMU 提供的功能,可将虚地址转换为物理地址,所有的虚地址组成的连续空间叫虚地址空间,有时候也叫线性空间。其空间大小与机器字长相关。32位...
  • 16、XSI 共享内存简介

    2011-09-14 07:44:00
    虚拟地址空间:CPU MMU 提供的功能,可将虚地址转换为物理地址,所有的虚地址组成的连续空间叫虚地址空间,有时候也叫线性空间。其空间大小与机器字长相关。32位机器上为2^32,4G左右 3)特性...
  • 会在内存中有相应的地址空间,但是处理器一般产生的是逻辑地址即虚地址,中间要通过存储管理单元(MMU)进行转化将逻辑地址转换为物理地址下图是一个内存地址的生成过程: 那么到底逻辑地址到物理地址是怎么...
  • 映射物理地址,即地址转换。 80386以两级方式实现地址转换: 第一级使用段机制,第二级使用分页机制。 在80386上,分页机制是支持虚拟存储器的最佳选择。段机制使用可变大小的块,使段机制较适合处理复杂系统...
  • c++浅探类内存布局

    2021-01-05 14:50:08
    若父类和子类都没有函数,则子类对象的内存布局没有表指针和表,只有成员变量的内存(字节需要对齐),且父类成员在内存地址,子类额外的成员在内存地址(因此,子类指针可以转换为父类指针,又可以再次...
  • 操作系统之内存管理

    2018-08-16 15:54:03
    为了保证 CPU 执行指令时可正确访问 存储单元 ,需将 用户程序 中的逻辑 地址转换 运行时由机器 直接寻址 的物理地址,这一过程称为地址映射。 地址重定位:操作系统把用户程序指令中的相对地址变换成为所在存储...
  • Linux 存储管理1——内存管理

    千次阅读 2013-05-18 09:54:07
    1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。万里长征就从此长始了。 2、每一个活动的进程,因为都有其独立的对应的内存(页目录也是唯一的),那么它也对应了一个...
  • Linux内存寻址

    2014-05-22 21:07:20
    /*读《深入理解linux内核》第二章 内存寻址 读书笔记*/ 以80286处理器例,因为80286在8086基础上引入存储管理中的虚存管理机制。通过“虚地址”和“保护”两重功能对存储器...下图为地址转换过程 1、首先是逻辑
  • 内存管理[1]

    千次阅读 2008-12-25 15:33:00
    尽管处理器的最小可寻址单位通常为字(甚至是字节),但是,内存管理单元(MMU,管理内存并把虚地址转换为物理地址的硬件)通常以页为单位进行处理。MMU也页page为单位来管理系统中的页表,从虚拟内存的角度来看,页...
  • 宋宝华Linux培训笔记-Linux内存管理

    千次阅读 2018-08-26 11:24:51
    内存映射中最重要的是页表,页表除了找到虚地址对应的物理地址外,在对应这一行中还存有两个标志位,一个是RWX标志位,表明该位置是可读还是可写,另一个是u/k标志位,区分用户空间和内核空间。每个进程看到4G内存,...
  • 即不同进程中可以用相同地址的指针用来指向属于各自进程中的内容,互不干扰,因为彼此都是以进程中的虚地址去访问内存的,操作系统再将虚拟地址转换为真正的物理内存地址。这样减少了程序员很多的麻烦事,使得我们
  • 虚拟地址又是如何转换为物理内存地址的呢?本章将对此作一个简要阐述。1.1 Linux内存寻址概述现代意义上的操作系统都处于32位保护模式下。每个进程一般都能寻址4G的物理空间。但是我们的物理内存一般都是几百M,进程...
  • 相关知识点 二级指针 不同指针类型的解引用 指针类型转换 ...如果一个内存段存储的是一个指针,则指向该内存段的指针至少是一...而如果p一个对象b的指针,则*p解引用的地址长度范围sizeof(b)。 指针类型的转...
  • 多重继承和继承1)定义 子类同时拥有两个或两个以上的基类,同时继承了所有基类的属性和行为。 ...将子类对象的地址隐式或者静态转换为基类指针,编译器会做地址计算,以保证基类指针的类型和其所
  • 1. 如果父类的纯虚函数没有实现,在没有使用的的情况下(没有new 或者直接...原因是此对象有多个父类,static_cast是直接将父类指针指向了对象的内存地址,这样在调用父类方法的时候就出现了问题,找不到这个父类的...
  • 页表由多个页表项组成,即页表中每一行的就是一个页表项。...页表项一般是由硬件设计的,因为地址转换时大多数是由硬件完成的。 引出页目录: 对于32位虚拟地址空间,假设页面大小4K,页表项大小4字节: 一个进程

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

虚地址转换为内存地址