精华内容
下载资源
问答
  • 通过逻辑地址得到物理地址

    千次阅读 2013-10-18 17:12:40
    逻辑地址TCODE: FILE 所对应的物理地址所在的表是PATH   取地址时的代码是:  select single p~pathextern into l_dsn  from path as p join opsystem as o  on

    逻辑地址TCODE: FILE

    所对应的物理地址所在的表是PATH

     

    取地址时的代码是:


        select single p~pathextern into l_dsn

                                   from path as join opsystem as o

                                   on  p~filesys o~filesys

                                   where p~pathintern 'ZMMPP_INFO_GET_OPENPO'

                                   and   o~opsys sy-opsys.

     

        if sy-subrc 0.

          replace'<FILENAME>' in l_dsn  with filename.

        else.

          message i208(00with 'Logic path is invalid!'.

          stop.

        endif.


     

     


     


    展开全文
  • Cpu不进行自动地址转换)下,程序员操作的就是物理地址,所谓的物理地址就是物理内存上的32位地址,即物理地址可以直接定位到物理内存上的位置,无论任何操作,最终都必须要得到物理地址才能在物理内存上进行操作. ...

    1.物理地址

    用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

    在实地址模式(因为实模式没有分段或分页机制,Cpu不进行自动地址转换),程序员操作的就是物理地址,所谓的物理地址就是物理内存上的32位地址,物理地址可以直接定位到物理内存上的位置,无论任何操作,最终都必须要得到物理地址才能在物理内存上进行操作.

    2.虚拟地址
    操作系统都提供了虚拟内存virtual memory管理抽象进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它转换成真正的物理地址

    有了虚拟内存,一个程序就可以使用比真实物理地址大得多的地址空间。所谓的虚拟地址,从广义上讲,不是物理的就是虚拟的,因为不是物理地址的地址是无法在物理内存上定位的,所以他们都可以被称为虚拟地址”,从这个意义上讲,逻辑地址和线性地址都可以被称为虚拟地址而从狭义上讲,虚拟地址指的是没有经过分页机制和分段机制转换的地址,也就是段寄存器和变址寄存器内容的组合,从这个意义上来说,虚拟地址就是类似于CS:SI这样形式的地址.

    3.逻辑地址Logical Address

    逻辑地址就是上层程序员可以操作的地址,和段相关的偏移地址部分也就是变址寄存器中存储的32偏移地址,而其他寄存器上的地址往往对于上层程序员来说是不可更改甚至是不可见的只有在实模式下,逻辑地址才和物理地址一致(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑地址也就是在保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样).应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及.应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作.

    4.线性地址

    对狭义上的虚拟地址通过分段机制以后,可以得到段基址段界限以及段偏移地址(即逻辑地址),段基址与段偏移地址的组合就是线性地址,线性地址可以在虚拟内存上完成定位如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址.若没有启用分页机制,那么线性地址直接就是物理地址.对于程序员来说,他们并不关注MMU如何工作以及其得到的结果,他们只需要关心线性地址或者逻辑地址就可以完成全部工作了.

    5.虚拟内存

    是指计算机呈现出要比实际拥有的内存大得多的内存量.因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序.这使得许多大型项目也能够在具有有限内存资源的系统上实现.

    很多内存管理策略都需要同时将多个进程放在内存中,以便执行这些进程,这些策略都需要在进程执行之前将整个进程放在内存中。而虚拟内存技术允许执行进程不必完全放在内存中,这样我们就可以运行比物理内存大的程序,使得程序员不受内存存储的限制。

        比如说异常处理、错误处理可能不经常执行或者就不执行,这些程序使得我们可以只需要加载需要执行的部分,从而减少了内存使用。

        从而,构造一个大的虚拟内存空间,将其映射到较小的物理内存。这个大的虚拟内存空间存储我们进程的所有信息,而当执行进程时,我们只加载需要执行的部分,。这里就需要采用一定的技术,比如按需调页、页面置换、帧分配等,使得进程的执行可以在虚拟内存和物理内存之间进行协调,完成整个程序的执行。

        优点:虚拟内存可以大于物理内存,一般为物理内存的1.5倍到3倍,从而可以运行比物理内存大的程序,进而使得更多的程序可以同时执行,提高了多道程序的程度,增加了CPU的使用率,并且使得进程之间的独立性得到了更好的体现。

    6.内存的基本管理(页  段  段页)

        1通常将逻辑内存进行分页,将逻辑内存分成很多小的页面,然后通过页表,映射到物理内存,而物理内存则划分为很多成为帧的块,从而和页对应起来,页和帧的对应关系主要是通过页表来保存的,页表中有很多条目,较为详细地保存了这些信息。进程都有自己的内存空间(虚拟内存),上面所说的虚拟内存技术就是指进程的虚拟内存空间存储了所有的进程信息,然后虚拟内存空间分成很多页,这些页并不是在进程执行时全部换入到物理内存,而是按照需要进行换入,这需要一定的算法管理

        虚拟内存(虚拟存储器)是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,

        虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。它的工作过程包括6个步骤:

      1CPU访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内。
      2)如该组号已在主存内,则转而执行;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
      3)从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中。
      4)从地址变换表读出与逻辑组号a对应的物理组号a
      5)从物理组号a和组内字节地址b得到物理地址。
      6)根据物理地址从主存中存取必要的信息。
        调度方式有分页式、段式、段页式3种。

    页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。页式调度的优点没有外碎片只有内碎片,页表对程序员来说是透明的,地址变换快,调入操作简单;缺点各页不是程序的独立模块不便于实现程序和数据的保护

    段式调度是按程序的逻辑结构划分地址空间,段的长度不等的,并且允许伸长,它的优点是消除了内碎片有外碎片易于实现存储保护,便于程序动态装配;缺点是调入操作复杂

    段页式调度中把物理空间分成页程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度。

     

     


    展开全文
  • 物理地址和逻辑地址

    千次阅读 2017-07-28 10:12:43
    物理地址和逻辑地址概述   当操作数是存放在存储器中时,存储器的存储单元的物理地址有两部分组成。一部分是偏移地址,一部分是段地址。 在8086/8088的各种寻址方式中,寻找存储单元所需的偏移地址可由各种成分...

    物理地址和逻辑地址概述  

    当操作数是存放在存储器中时,存储器的存储单元的物理地址有两部分组成。一部分是偏移地址,一部分是段地址。

    在8086/8088的各种寻址方式中,寻找存储单元所需的偏移地址可由各种成分组成,称为有效地址,用EA表示。可以通过存储器寻址方式获得有效地址。 

     8086/8088CPU的地址线有20根,直接寻址220=1MB。而8086/8088CPU的字长为16位,直接寻址216=64KB,无法寻址1MB。为此,8086/8088采用了存储器地址分段的方法。  将整个存储器分成许多逻辑段,每个逻辑段的容量最多为64KB,允许它们在整个存储器空间浮动,各个逻辑段可以紧密相连,也可以重叠。对于任何一个物理地址来说,可以唯一地被包含在一个逻辑段中,也可以被包含在多个相互重叠的逻辑段中,只要能得到它所在段的首地址和段内相对地址,就可以对它进行访问。在8086/8088存储空间中,从0地址开始,把每16个连续字节的存储空间称为小节。为了简化操作,逻辑段必须从任一小节的首地址开始。这样划分的特点是:在16进制表示的地址中,最低位为0(即20位地址中的低4位为0)。 

    综上所述,分段的原则如下:  (1)每个段的最大长度为64KB; (2)段的首地址能被16整除。  

    8086/8088中,每一个存储单元都有一个唯一的20位地址,称此地址为该存储单元的物理地址。

    CPU访问存储器时,必须先确定所要访问的存储单元地址才能取得该单元的内容。20位的物理地址由16位的段地址和16位的段内偏移地址计算得到。段地址是每一逻辑段的起始地址,必须是每个小节的首地址,其低4位一定是0,于是在保留段地址时,可以只取段地址的高16位。偏移地址则是在段内相对于段起始地址的偏移值。

    因此任一存储单元物理地址的计算方法如下:  物理地址=16(10H)×段地址+段内偏移地址  

    在微型计算机中,有4个存放段地址的寄存器,称为段寄存器。它们是代码段寄存器CS、数据段寄存器DS、附加段寄存器ES、堆栈段寄存器SS。


    展开全文
  • 另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址 以上便是虚拟地址转换成所对应的实际物理地址的思路。 大致的代码编写流程: 首先根据pid我们可以得到这个进程的...

    思路:

    进程号是一个进程在用户空间的唯一标示,所以,根据pid可以从内核中得到一个进程的所有信息,

    另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址

    以上便是虚拟地址转换成所对应的实际物理地址的思路。

    大致的代码编写流程:

    首先根据pid我们可以得到这个进程的task_struct,进而通过task_struct得到mm,通过mm得到pgd。
    好了,现在我们有pgd和virtualaddress.
    通过pgd和virtualaddress我们可以得到页表pte.
     
    有了pte和virtualaddress,我们就可以计算物理地址了
    phyaddress=(pte_val(pte)&PAGE_MASK)|(virtualladdress&~PAGE_MASK)


    代码:

    #include <linux/sched.h> 
    #include <linux/mm.h> 
    #include <asm/pgtable.h> 
    #include <asm/page.h> 
     
    static int v2p(int pid, unsigned long va) 
    { 
        unsigned long pa = 0; 
        struct task_struct *pcb_tmp; 
        pgd_t *pgd_tmp = NULL; 
        pud_t *pud_tmp = NULL; 
        pmd_t *pmd_tmp = NULL; 
        pte_t *pte_tmp = NULL; 
     
        printk(KERN_INFO"PAGE_OFFSET = 0x%lx\n",PAGE_OFFSET); 
        printk(KERN_INFO"PGDIR_SHIFT = %d\n",PGDIR_SHIFT); 
        printk(KERN_INFO"PUD_SHIFT = %d\n",PUD_SHIFT); 
        printk(KERN_INFO"PMD_SHIFT = %d\n",PMD_SHIFT); 
        printk(KERN_INFO"PAGE_SHIFT = %d\n",PAGE_SHIFT); 
     
        printk(KERN_INFO"PTRS_PER_PGD = %d\n",PTRS_PER_PGD); 
        printk(KERN_INFO"PTRS_PER_PUD = %d\n",PTRS_PER_PUD); 
        printk(KERN_INFO"PTRS_PER_PMD = %d\n",PTRS_PER_PMD); 
        printk(KERN_INFO"PTRS_PER_PTE = %d\n",PTRS_PER_PTE); 
     
        printk(KERN_INFO"PAGE_MASK = 0x%lx\n",PAGE_MASK); 
     /* 查询当前进程下的虚拟地址 */
     //   pcb_tmp = current; 
    /* 查询指定进程的下的虚拟地址 */
         pcb_tmp = find_task_by_vpid (pid); // 较新一点的内核版本使用这个函数
    // pcb_tmp = find_task_by_pid (pid);    // 旧版本的内核版本使用这个函数
        printk(KERN_INFO"pgd = 0x%p\n",pcb_tmp->mm->pgd); 
        if(!find_vma(pcb_tmp->mm,va)){ 
                        printk(KERN_INFO"virt_addr 0x%lx not available.\n",va); 
                        return 0; 
        } 
        pgd_tmp = pgd_offset(pcb_tmp->mm,va); 
        printk(KERN_INFO"pgd_tmp = 0x%p\n",pgd_tmp); 
        printk(KERN_INFO"pgd_val(*pgd_tmp) = 0x%lx\n",pgd_val(*pgd_tmp)); 
        if(pgd_none(*pgd_tmp)){ 
                        printk(KERN_INFO"Not mapped in pgd.\n");                 
                        return 0; 
        } 
        pud_tmp = pud_offset(pgd_tmp,va); 
        printk(KERN_INFO"pud_tmp = 0x%p\n",pud_tmp); 
        printk(KERN_INFO"pud_val(*pud_tmp) = 0x%lx\n",pud_val(*pud_tmp)); 
        if(pud_none(*pud_tmp)){ 
                        printk(KERN_INFO"Not mapped in pud.\n"); 
                        return 0; 
        } 
        pmd_tmp = pmd_offset(pud_tmp,va); 
        printk(KERN_INFO"pmd_tmp = 0x%p\n",pmd_tmp); 
        printk(KERN_INFO"pmd_val(*pmd_tmp) = 0x%lx\n",pmd_val(*pmd_tmp)); 
        if(pmd_none(*pmd_tmp)){ 
                        printk(KERN_INFO"Not mapped in pmd.\n"); 
                        return 0; 
        } 
     
        pte_tmp = pte_offset_kernel(pmd_tmp,va); 
     
        printk(KERN_INFO"pte_tmp = 0x%p\n",pte_tmp); 
        printk(KERN_INFO"pte_val(*pte_tmp) = 0x%lx\n",pte_val(*pte_tmp)); 
        if(pte_none(*pte_tmp)){ 
                        printk(KERN_INFO"Not mapped in pte.\n"); 
                        return 0; 
        } 
        if(!pte_present(*pte_tmp)){ 
                        printk(KERN_INFO"pte not in RAM.\n"); 
                        return 0; 
        } 
        pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK); 
        printk(KERN_INFO"virt_addr 0x%lx in RAM is 0x%lx .\n",va,pa); 
        printk(KERN_INFO"contect in 0x%lx is 0x%lx\n",pa, 
                        *(unsigned long *)((char *)pa + PAGE_OFFSET)); 
                               
    }
    

    展开全文
  • 1.物理地址:是指在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终...要经过寻址方式的计算和变换才得到物理地址。一个逻辑地址由两部份组成,段标识符: 段内偏移量。同时处理器内部以及程序员编程
  • 一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。少数应用场景下,用户可能会关心,比如在用户态做DMA的场景(如DPDK之类的)。还有一些...
  • 逻辑地址、虚拟地址、线性地址、物理地址的区别:虚拟地址:在保护模式下,虚拟地址由段选择子+段内偏移量组成。利用段选择子可以获取到段描述符,再从段描述符中取得段的基地址。也就是说虚拟地址就是xxxx:yyyy ...
  • 物理地址 虚拟地址

    2011-10-24 10:49:05
    Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。...而访问物理内存,需要使用物理地址。 下面我们看看什么是物理地址,什么是虚拟地址。 物理地址 (physical address): 放在寻址总线
  • 逻辑地址&物理地址

    2016-10-27 09:41:32
    相互转换 逻辑地址为16位物理地址为20位 具体转换过程为: 将段存储器提供的16位段地址左移四位,低位补0,恢复为20位地址, ...然后由各种寻址方式提供的16位偏移地址相加,得到20位的物理地址
  •  在逻辑地址、线性地址和物理地址一节中,已经对逻辑地址、线性地址和物理地址的概念做了详细的讲解。现在在这篇文章中,我们可以详细的对段式、页式、段页式内存管理方式以及三种地址之间的转化做一个详细且深入的...
  • 逻辑地址与物理地址

    2014-04-19 16:16:37
    物理地址是外部连接使用的、唯一的,它是“与地址总线相对应”;而逻辑地址是内部和编程使用的、并不唯一。 在内存中的实际地址就是所谓的“物理地址”,而逻辑地址就是逻辑段管理内存而形成的。 例如,你在进行...
  • 物理地址从线性地址获得和分页机制获得,或者直接获得。线性地址从逻辑地址和段获得
  • 在内存地址上,我们要区分逻辑地址、线性地址以及物理地址这三个概念。 逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址。每一个逻辑地址都由一个段选择符和段偏移量组成。 线性地址:也称为...
  • 段地址与物理地址

    2017-01-03 18:00:09
    段地址的值x16就是物理地址的初始地址·,偏移地址代表段中的内存单元。 将若干地址连续的内存单元看做一个段,用段地址x16定位段的起始地址,用偏移地址定位段中的内存单元。 有两点需要注意: 1.段的起始地址...
  • 物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少个内存单元,物理地址的大小由地址总线的位宽决定!虚拟地址:虚拟地址是CPU保护模式下的...
  • Linux 虚拟地址到物理地址转换

    千次阅读 2019-03-08 13:58:14
    CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址...
  • 逻辑地址,线性地址和物理地址转换

    千次阅读 2019-08-02 18:50:14
    机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到 我们写个最简单的hello world程序,用gcc编译,再反汇编后会看到以下指令: mov ...
  • linux虚拟地址转物理地址

    千次阅读 2018-06-21 07:06:00
    80386虚拟地址和物理地址转换CPU的发展之前在看malloc内存分配函数的原理时,有涉及到分配虚拟内存,然后再映射到物理内存,当初也是看得一头雾水,因为对虚拟内存和物...
  • 一、 在保护模式下,有以下三个地址概念: 1、逻辑地址 2、线性地址 3、物理地址 其中逻辑地址又叫做相对地址或偏移地址,无论是使用C语言还是汇编语言编程,程序中所用到的地址都是逻辑地址...线性地址到物理地址的...
  • 物理地址、虚拟地址、逻辑地址、线性地址之间的关系进行了细致分析。其实,内存资源在驱动设计中的地位是至关重要的,我们要对设备进行操作,首先要获取到设备的地址。在UIO用户态驱动设计中,用户直接操作设备,...
  • 这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,...
  • 物理地址和虚拟地址的区别

    千次阅读 2015-08-30 14:22:00
    1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中 很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、 BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后...
  • 每个进程都是独立的虚拟地址空间,两个独立进程的相同地址互不干扰,但是在物理上对每个进程可能也就分了一部分空间给了某个进程,所以中间就要用到映射,那么虚拟地址与物理地址怎么映射呢?今天学习啦小编与大家分享下...
  • 逻辑地址与物理地址的转换

    万次阅读 2016-05-25 23:39:25
    最近一直在学8086,上课老师突然问了个这。对于问题“8086 CPU 能提供20位的地址信息,可直接对1M个存储单元进行访问,而CPU内部可用来提供地址信息的寄存器都是16位,那怎样用16... 逻辑地址和物理地址的转换?(期...
  • 8086如何计算物理地址

    2020-12-02 23:46:16
    8086中含有存储器。存储器中每一个单元的地址可以...2.物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址物理地址=段地址×10H+段内偏移量 注:H为16进制,CS :代码段寄存器, ...
  • 物理地址空间和虚拟地址空间

    千次阅读 2018-02-18 21:43:18
    因为CPU是32位的,其地址总线是32位的,所以其地址总线可编码的个数是2^32(4G),这2^32个物理地址的集合就是物理地址空间。这与38译码器的道理是一样的,这一点很好理解。 二、虚拟地址(空间) &nbsp; &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 298,366
精华内容 119,346
关键字:

如何获得物理地址