精华内容
下载资源
问答
  • 如何获得物理地址
    千次阅读
    2020-10-09 16:21:28

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。

    少数应用场景下,用户可能会关心,比如在用户态做DMA的场景(如DPDK之类的)。还有一些场景,比如想调试剖析每一页的内存占用情况,是否swap出去了等。

    从用户态得到虚拟地址对应的物理地址,我们不可能去walk进程的page table,也没有权限。不过还好内核给我们提供了一个接口,叫pagemap,而且,这个接口与硬件的体系架构无关。在/proc/pid/下面有个文件叫pagemap,它会每个page,生成了一个64bit的描述符,来描述虚拟地址这一页对应的物理页帧号或者SWAP里面的便宜,详见文档:

    linux/Documentation/admin-guide/mm/pagemap.rst

    这64bit的描述如下:

    不同的体系架构的MMU不同,页表格式也不同,但是pagemap这个接口与具体页表的格式无关,可以说都被抽象化了。

    下面我们忽略swap的影响(假设关闭了swap或者page一直是pin的状态),从DPDK抄一段虚拟地址转换为物理地址的代码:

    #define phys_addr_t     uint64_t
    #define PFN_MASK_SIZE   8
    
    
    phys_addr_t
    rte_mem_virt2phy(const void *virtaddr)
    {
            int fd, retval;
            uint64_t page, physaddr;
            unsigned long virt_pfn;
            int page_size;
            off_t offset;
    
    
            /* standard page size */
            page_size = getpagesize();
    
    
            fd = open("/proc/self/pagemap", O_RDONLY);
            if (fd < 0) { 
                    ...
            }
    
    
            virt_pfn = (unsigned long)virtaddr / page_size;
            offset = sizeof(uint64_t) * virt_pfn;
            if (lseek(fd, offset, SEEK_SET) == (off_t) -1) {
                    ...
                    return -1;
            }
    
    
            retval = read(fd, &page, PFN_MASK_SIZE);
            close(fd);
            ...
    
    
            /*
             * the pfn (page frame number) are bits 0-54 (see
             * pagemap.txt in linux Documentation)
             */
            if ((page & 0x7fffffffffffffULL) == 0)
                    return -1;
    
    
            physaddr = ((page & 0x7fffffffffffffULL) * page_size)
                    + ((unsigned long)virtaddr % page_size);
    
    
            return physaddr;
    }
    

    最后的一步是关键的计算过程:

           physaddr = ((page & 0x7fffffffffffffULL) * page_size)
                    + ((unsigned long)virtaddr % page_size);
    

    page & 0x7fffffffffffffULL取得了页帧号(PFN),乘以页的size得到这页起始的物理地址,之后加上virtaddr % page_size的页内偏移,得到最终的物理地址。

    我们来实操一下调用上面的函数完成地址转化:

    int main(int argc, char *argv[])
    {
      uint8_t *p = malloc(1024 * 1024);
    
    
      *(p + 4096) = 10;
      printf("virt:%p phys:%p\n", p + 4096, rte_mem_virt2phy(p + 4096));
    
    
      *(p + 2 * 4096) = 10;
      printf("virt:%p phys:%p\n", p + 2 * 4096, rte_mem_virt2phy(p + 2 * 4096));
    }
    

    运行结果如下:

    ~$ sudo ./a.out 
    virt:0x7f81e402a010 phys:0x2b601010
    virt:0x7f81e402b010 phys:0x3ceec010
    

    内核态实现pagemap proc接口的代码位于:

    fs/proc/task_mmu.c

    其中比较核心的函数是把PTE转换为pagemap_entry的过程,有兴趣的童鞋可以仔细阅读下:

    特别留意画红线的位置,可以知道pagemap里面的那些flag是怎么被置上的。

    更多相关内容
  • VB获取网卡的物理地址,也就是MAC地址,网络编程必备的基础知识,通过本例子,你将掌握这一知识技巧。
  • ARP协议工作原理:主机想要知道某个IP地址的主机对应的物理地址是什么。主机向自己所在的网络发送ARP广播,广播里包含一个目标地址。这个目标地址也是主机所在的网络的主机里面的。此网络中的其他机器都会收到这个...

    ARP协议工作原理:主机想要知道某个IP地址的主机对应的物理地址是什么。主机向自己所在的网络发送ARP广播,广播里包含一个目标地址。这个目标地址也是主机所在的网络的主机里面的。此网络中的其他机器都会收到这个请求,但只有被请求的目标地址会回一个ARP应答,应答里面包含了目标主机的物理地址。

    一、以太网ARP请求 / 应答报文

    以太网ARP请求 / 应答报文格式一样,如下:

    其值如下:

     二、请求和应答过程

    1、A填写除了B的MAC地址外的其他字段构造ARP请求报文并发送:

    2、B收到此报文,将自己的MAC地址填入,然后交换目的地址和发送地址并修改操作类型构造ARP应答报文并发送:

    三、ARP高速缓存查看

    ARP协议维护了一个高速缓存,保存了经常访问的机器的IP地址到物理地址的映射,这样可以避免重复地发送ARP请求获取物理地址。

    Linux下arp命令:

    • arp命令可查看ARP高速缓存。
    • arp -d 机器A的ip地址:删除建立的和机器A的ARP缓存。
    • arp -s 机器A的ip地址 机器A的MAC地址:建立机器A的ARP缓存。
    展开全文
  • 本文主要介绍android 获取本机的IP地址和mac物理地址的实现方法,这里提供示例代码,实现功能,有需要的小伙伴可以参考下
  • 一、通过二级页表映射的方式访问物理地址 1、取一级页表的基地址Abase1 2、取虚拟地址的前12bit[31:20]地址O1 3、计算得到新地址Apgd=(Abase1&0xFFFFF000)+O1,此地址是PGD页表上的地址,取此地址中的数据Abase...

    环境:32bit CPU
    一、通过二级页表映射的方式访问物理地址
    在这里插入图片描述
    1、取一级页表的基地址Abase1
    2、取虚拟地址的前12bit[31:20]地址O1
    3、计算得到新地址Apgd=(Abase1&0xFFFFF000)+O1,此地址是PGD页表上的地址,取此地址中的数据Abase2
    4、取虚拟地址的中间8bit[19:12]地址O2
    5、计算得到新地址Apte=(Abase2&0xFFFFFF00)+O2,此地址是PTE页表上的地址,取此地址中的数据Abase3
    6、取虚拟地址的后12bit[11:0]地址O3
    7、计算得到新地址Aphy=(Abase3&0xFFFFF000)+O3,此地址就是实实在在的物理地址
    以上的计算和查找过程有MMU模块实现,同时会把映射信息存放在MMU中的TLB中,类似于cache,方便下次快速的查找。
    二、疑问
    1、一级页表的基地址存放在什么地方?
    2、如何找到存放在物理地址的信息?
    三、分析问题
    1、操作系统有个专门的结构体负责进程的内存使用情况,task_struct里面的mm_struct

    struct task_struct {
    	......
    	int on_rq;
    
    	int prio, static_prio, normal_prio;
    	unsigned int rt_priority;
    	const struct sched_class *sched_class;
    	struct sched_entity se;
    	struct sched_rt_entity rt;
    	......
    
    	struct mm_struct *mm, *active_mm;
    
    struct mm_struct {
    	......
    	unsigned long mmap_base;		/* base of mmap area */
    	unsigned long mmap_legacy_base;         /* base of mmap area in bottom-up allocations */
    	unsigned long task_size;		/* size of task vm space */
    	unsigned long highest_vm_end;		/* highest vma end address */
    	pgd_t * pgd;
    	atomic_t mm_users;			/* How many users with user space? */
    	atomic_t mm_count;			/* How many references to "struct mm_struct" (users count as 1) */
    	atomic_long_t nr_ptes;			/* PTE page table pages */
    	......
    

    其中pgd保存的就是一级页表的基地址。进程切换时,会把TTBRx寄存器(上图所示)保存起来,把下一个进程的pgd内容写到TTBRx寄存器中。
    2、写段程序,找到存放信息的物理地址
    2.1、内核态代码
    根据上面所描述的页表映射方式,查找到虚拟地址对应的物理地址
    需要在内核态下面运行,内核态下可以获取当前进程的PCB task_struct进而获取mm_struct内存管理模块

    #include <linux/init_task.h>
    unsigned int get_phy_addr(struct mm_struct *mm, unsigned long addr)
    {
           pgd_t *pgd        = NULL;
           pud_t *pud        = NULL;
           pmd_t *pmd        = NULL;
           pte_t *pte        = NULL;
           unsigned int phy_addr = 0;
    
           printk("pgd_base = %p\n",mm->pgd);
           pgd = pgd_offset(mm, addr);                                  //一级页表项的地址
           printk("vaddr=[0x%08x] *pgd=%08x\n", addr, pgd_val(*pgd));
    
           if (pgd_none(*pgd))
           		goto out;
    
           if (pgd_bad(*pgd)) {
    	       printk("pgd bad\n");
           	   goto out;
           }
    
    
           pud = pud_offset(pgd, addr);
           printk("pud=0x%08x,*pud=%08x\n", pud, pud_val(*pud));
    
           if (pud_none(*pud))
           		goto out;
                   
           if (pud_bad(*pud)) {
           		printk("pud bad");
    			goto out;
           }
    
    
           pmd = pmd_offset(pud, addr);
           printk("pmd=0x%08x,*pmd=%08x\n", pmd, pmd_val(*pmd));
    
           if (pmd_none(*pmd))
           		goto out;
    
           if (pmd_bad(*pmd)) {
    	   		printk("(bad)");
           		goto out;
           }
           
           //二级映射,pmd等于pgd。函数中实现两个功能:1、根据pgd地址查找二级页表基地址;2、二级页表基地址和addr算出二级页表地址
           pte = pte_offset_map(pmd, addr);     
           printk("pte=0x%08x, *pte=%08x\n", pte, pte_val(*pte));
    
           if(!pte_none(*pte) && pte_present(*pte)) {
           		phy_addr = (pte_val(*pte) & 0xFFFFF000) | (addr & 0xFFF);
           		printk("phy_addr is 0x%x\n", phy_addr);
           }else{
           		printk("pte is not present\n") ;
           }
    
           pte_unmap(pte);
    
           return phy_addr;
    out:
           return -1;
    }
    
    

    2.2、/dev/mem节点说明
    知道虚拟地址对应的物理地址,我们就可以借助/dev/mem节点访问对应的物理地址查看是否是虚拟地址存放的数据。
    /dev/mem是系统物理内存的映像文件,这里的物理内存是指我们插在内存槽上的内存条吗?当然是,但物理内存不单单指内存条。
    物理内存严格来讲应该是指 物理地址空间 ,内存条只是映射到这个地址空间的一部分,其余的还有各种PCI设备,IO端口等。
    我们可以从/proc/iomem中看到这个映射:

    cat /proc/iomem
    

    在这里插入图片描述
    其中 内存分配的物理地址是0x80000000~0x83FFFFFF 64M
    事实上,它就是一个活着的Linux系统实时映像,所有的进程task_struct结构体,sock结构体,sk_buff结构体,进程数据等等都在里面的某个位置:
    在这里插入图片描述
    如果能定位它们在/dev/mem里的位置,我们就能得到系统中这些数据结构的实时值,所谓的调试工具所做的也不过如此。其实我们在调试内核转储文件的时候,vmcore也是一个物理内存映像,和/dev/mem不同的是,它是一具尸体。
    无论是活体,还是尸体,均五脏俱全,分析它们的手段是一致。和静态分析vmcore不同的是,/dev/mem是一个动态的内存映像,有时候借助它可以做一些正经的事情。
    2.3、应用层获取/dev/mem的映射

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    
    int main(int argc, char *argv[])
    {
           int i = 0, fd = 0;
           unsigned int addr = 0, content 	= 0;
           unsigned int page_size        	= getpagesize();
           unsigned int taddr        		= 0;
           unsigned int *map_base        	= NULL;
           unsigned int offset_in_page 		= 0;
    
           printf("page_size=0x%x\n", page_size);
           fd = open("/dev/mem", O_RDWR|O_SYNC);
           if (fd == -1) {
                   printf("open /dev/mem error.\n");
                   return -1;
           }
    
           taddr = strtoll(argv[1], NULL, 16);
           offset_in_page = taddr & (page_size - 1);
           //map_base = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, taddr & (~(unsigned int)(page_size - 1)));
      	   map_base = mmap(NULL, page_size, PROT_READ, MAP_PRIVATE, fd, taddr & (~(unsigned int)(page_size - 1)));
           if (-1 == (int)map_base) {
                   printf("mmap failed!, errno=%d\n", errno);
                   close(fd);
                   return -1;
           }
           
           printf("map_base=0x%x\n", map_base);
           
           addr = (unsigned int)(((unsigned char *)map_base) + offset_in_page);
           printf("addressx:0x%x\n", addr);
           printf("content 0x%x\n\n", *(unsigned int *)(addr));
    
    	   //*(unsigned int *)(addr) = 0x6f6a6944;
    	   
           close(fd);
           munmap(map_base, page_size);
    
           return 1;
    }
    

    2.4、测试程序

    测试程序:
    int main(int argc, char** argv)
    {
           int fd                        = -1;
           struct param_s param;
    
    
           char *buf = "Chinaxxxxx.\n";
           memset(&param, 0x00, sizeof(struct ty_motor_param_s));
    
           fd = open("/dev/motor", O_RDWR);
           if (fd < 0) {
                   printf("open error.\n");
                   return 0;
           }
    
           printf("buf=0x%x", buf);
    
           param.addr = buf;
           ioctl(fd, IOCTL_SET, &param);
    
           close(fd);
    
           sleep(10);
    	   printf("buf=0x%x", buf);
    	   
           return 0;
    }
    

    2.5、实验开始
    2.5.1、运行2.4程序,通过ioctl运行内核代码,执行2.3程序get_phy_addr函数,获取物理地址。
    2.5.2、通过传入获取到的物理地址,运行2.2程序,打印物理地址的信息。
    在这里插入图片描述
    其中0x83e6573c是获取的物理地址
    ARM处理器小端存储数据,因此0x43 0x68 0x69 0x6e 刚好对应着Chinaxxxxx中的Chin的Ascii码值
    2.6、扩展
    2.6.1、既然知道物理地址了,是不是可以修改物理地址里面的内容?
    2.6.2、打开2.3代码的注释 *(unsigned int *)(addr) = 0x6f6a6944;
    2.6.3、再操作2.5中的步骤,发现原先的Chinaxxxxx被修改了
    在这里插入图片描述

    3、遇到的问题
    3.1.1、2.3中的代码mmap一直返回-1,错误码一直是1(errno 1 Operation not permitted)
    3.1.2、解决方法
    在.config文件中设置CONFIG_STRICT_DEVMEM is not set

    正如上面描述的,通过获取物理地址修改物理地址里面的数据,这对系统来说就毫无安全可言。因此内核通过CONFIG_STRICT_DEVMEM配置项禁止内存空间实现映射。

    展开全文
  • 物理地址是怎么确定的?以8086为例

    千次阅读 2021-11-20 10:01:48
    物理地址 我们知道,CPU 访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。 8086是16位...

    物理地址

    我们知道,CPU 访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。

    8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放。

    而上一篇我们讲到,地址总线的宽度决定CPU的寻址能力。8086有20根地址总线,可以传送20位地址,所以其寻址能力为2^20B,即1M。

    很自然地,这里产生了矛盾:如果只是简单地将地址从内部发出,那么8086只能发出16位的地址,表现的寻址能力也就只有2^16byte,即64KB。这这与1M的寻址能力不符!

    那么如何解决该矛盾呢?

    在正式讨论之前,我们换一个话题。如下图所示,假如大熊要去图书馆,询问胖虎图书馆的具体位置(物理地址),于是胖虎告诉他:

    图片

    (1)你可以从从学校走2826米能到图书馆;

    (2)也可以从学校走2000米到体育馆,再走826米就是图书馆。

    显然,两种方式大熊都能找到图书馆的位置。

    那么现在加一些限制条件,比如大熊和胖虎之间用如下的方格纸进行通信,那么按照第一种方式直接写入2826表示图书馆的位置就能准确定位。

    图片

    如果现在再加一个限定条件:假如方格个数只有三个,如何才能定位图书馆的位置呢?

    只能采用第二种方式咯:先找到体育馆,再通过偏移的826米找到图书馆。

    图片

    概括表述为:先用200米表示起始位置,我给它起个名字叫段地址,将200米乘以10的位置我们叫它基地址,基地址再加上偏移位置826米,正好是2826米,也就是图书馆的位置!

    好了,我们再回到8086CPU确定物理地址的方式上来,根据上面的例子我们就能解决CPU内部与数据总线的矛盾。8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

    (1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

    (2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;

    (3)地址加法器将两个16位地址合成为一个20位的物理地址;

    (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;

    (5)输入输出控制电路将20位物理地址送上地址总线;

    (6)20位物理地址被地址总线传送到存储器。

    动图演示如下:

    图片

    地址加法器采用物理地址=段地址x16+偏移地址的方式合成物理地址,其思想和上述例子中找图书馆的位置时如出一辙的,只不过从10进制变成了计算机的16进制。

    图片

    当个体受限时,借助外力以及互相配合则显得尤为重要!

    图片

    君子性非异也,善假于物也。——荀子

    两点注意:

    (1)段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;

    (2)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

    总结

    • CPU将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元;
    • 物理地址=段地址x16+偏移地址
      在这里插入图片描述
    展开全文
  • 物理地址(硬件地址)

    千次阅读 2021-09-16 14:48:18
    IP 地址由网络地址和主机地址两部分组成,网络地址部分表示主机所在的逻辑网络,每一个逻辑网络都有一个惟一的网络地址部分;主机地址部分表示所在逻辑网络的一台特定主机。一个IP地址可以表示为∶网络号+主机号。 ...
  • 这里,我们讲解一下Linux是如何将虚拟地址转换成物理地址的 一、地址转换 在进程中,我们不直接对物理地址进行操作,CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存。 地址转换的过程分为两部分...
  • 虚拟地址转物理地址

    2022-05-13 17:09:03
    概述 CPU是如何利用页目录和页表 等数据结构将一个32位的虚拟地址翻译为32位的物理地址的。其过程可以概括为如下步骤。 ① 通过CR3寄存器定位到页目录的...将二者合并到一起便得到物理地址。如果PS位为0,那么根据P
  • 如果要形成20位地址,但是是16位的寄存器,则需要组合起来,段地址x16+偏移地址=物理地址 需要偏移的位数是20-16=4位,2进制偏移4位即相当于16进制偏移1位。 比如:123C8=123016+c8=123c16+8, 可见,对于同一块内存...
  • 关注+星标公众号,不错过精彩内容转自 |嵌入式应用研究院计算机操作系统中的内存使用两种不同类型的地址。物理地址是内存的实际地址,如RAM,虚拟地址只是缓存和RAM之间的逻辑地址映射。在操...
  • 如何将逻辑地址转换成物理地址

    千次阅读 2020-12-07 17:13:30
    1.确定虚拟地址(物理地址)zhi的有效位 例如:假设dao页面大小zhuan1KB,共32页。(shu页面:逻辑地址 页框:物理地址) 由32(KB)=32×1024(B) 即等于32×1024 字节 二进制用多少位能有效表示这么多字节呢——答是...
  • 当进程需要内存时,从内核获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程并没有获得物理内存,获得的仅仅是对一个新的线性地址区间的使用权。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会...
  • 01、物理地址 02、有效地址 03、逻辑地址 04、线性地址 。。。 。。。
  • 假设有一台配置了虚拟存储器的计算机,其物理地址空间为64kb,逻辑地址空间地址为64kb,按字节编制。某进程正常运行最多需要6页数据存储空间,系统中每个页框的大小是1kb,操作系统采用固定分配局部置换策略为此进程...
  • 虚拟地址和物理地址

    千次阅读 2021-09-28 20:57:20
    物理地址:物理内存就是真实的内存,CPU的地址线可以直接进行寻址的内存空间大小。比如在32位平台下,寻址的范围是2^32也就是4G,并且这是固定的。 在实际的应用中,很多的应用程序都比较大,计算机实际所配置的内存...
  • 2016-11-30 07:29:28可通过这种办法确定自己的IP设置的正确性和获得本机网卡的物理地址(MAC地址),方法如下: 1、打开“开始”-“运行”-在弹出窗口中输入 'cmd' -“确定”2、在DOS窗口下输...2017-01-09 16:01:...
  • ip地址设置及IP地址和物理地址绑定设置IP地址1. 设置本机的IP地址⑴在桌面上用鼠标右键单击“网上邻居”图标,打开如图5-45所示的“网络连接”窗口。图5-45 “网络连接”窗口⑵用鼠标右键单击“网络连接”窗口中的...
  • 物理地址1. 基本概念2. 说明二. 逻辑地址1. 基本概念2. 说明三. 虚拟地址1. **为什么有虚拟地址**(个人理解)2. 基本概念3. 说明四、小结 一. 物理地址 1. 基本概念 物理存储器(内存/主存/逻辑存储器):由微...
  • 逻辑地址、线性地址和物理地址的关系 首先不得不提的历史 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以...
  • 广告用ipconfig查看了自己电脑的mac地址前两个知道是什么意思那后面两个是什么意思?现在一般线都会有这3个无线局域网...如果是安装了虚拟操作系统,比如VM,也会出现多个网卡,但是虚拟机的物理地址是不同的,...
  • 虚拟地址、虚拟内存、物理地址、物理内存物理内存和虚拟内存虚拟地址、物理地址 物理内存和虚拟内存 物理内存 物理内存时有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,...
  • 浅谈逻辑地址和物理地址

    千次阅读 2022-03-29 23:20:37
    在程序运行时由中央处理单元生成的内容的地址称为逻辑地址。该地址也称为虚拟地址。当我们谈论逻辑地址时,我们指的是CPU分配给每个进程的地址,一个进程在内存中...物理地址是进程及其内容放置在主内存或硬盘中的地址
  • 【操作系统复习】 物理地址虚拟地址物理地址和虚拟地址的区别物理地址逻辑地址线性地址为什么要分成物理地址和虚拟地址物理内存及虚拟内存定义为什么要有虚拟内存虚拟内存的实现(可以在页式或段式内存管理的基础上...
  •  在逻辑地址、线性地址和物理地址一节中,已经对逻辑地址、线性地址和物理地址的概念做了详细的讲解。现在在这篇文章中,我们可以详细的对段式、页式、段页式内存管理方式以及三种地址之间的转化做一个详细且深入的...
  • ——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址...
  • 逻辑地址、物理地址、虚拟地址

    千次阅读 2020-08-21 15:44:07
    文章目录物理地址(physical address)虚拟地址(virtual memory)逻辑地址(logical address)线性地址(linear address)或也叫虚拟地址(virtual address)地址转换 物理地址(physical address) 用于内存芯片级的单元寻址,...
  • 物理地址空间是什么

    千次阅读 2021-07-25 00:33:25
    今天学习啦小编给大家介绍一下物理地址空间的相关知识。供大家参考!物理地址空间参考如下物理存储器和存储地址空间是两个不同的概念。但是由于这两者有十分密切的关系,而且两者都用B、KB、MB、GB来度量其容量大小,...
  • 通过逻辑地址得到物理地址

    千次阅读 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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 362,813
精华内容 145,125
关键字:

如何获得物理地址