linux中虚拟地址和物理地址怎样映射
3个回答
展开全部
虚拟就是虚拟的,不是实际真是的物理地址。你可以认为,这两个地址之间没关系。
这个虚拟是通过系统和硬件的双重工作,做的一种点对点的映射(当然实际内存分配是按照页来处理)。
也就是软件不需要考虑内存数据的物理地址,只需要用虚拟地址做数据存储处理就行了。
这样一个好处是,软件不需要自己做内存分配,也不需要考虑别的软件的内存占用问题。操作系统会根据当前的内存使用情况,动态的分配内存空间。虚拟内存地址还一个好处是因为是虚拟的,所以内存并不一定非要在物理内存中。可以存放在任何位置,比如把暂时不用的数据放进硬盘上的虚拟内存,腾出真实的物理内存交给程序运行而提高多程序时运行的效率。而且因为每个软件的虚拟内存地址都是从 0 开始,每个软件的寻址都是独立而且顺序的。程序编写和运行时,都好像是机器里面只有自己一个程序在运行,程序开发起来也很容易。软件不需要考虑内存分配的问题,也不需要担心内存不足和两个程序抢同一片内存导致系统整个崩溃的情况。
这个虚拟是通过系统和硬件的双重工作,做的一种点对点的映射(当然实际内存分配是按照页来处理)。
也就是软件不需要考虑内存数据的物理地址,只需要用虚拟地址做数据存储处理就行了。
这样一个好处是,软件不需要自己做内存分配,也不需要考虑别的软件的内存占用问题。操作系统会根据当前的内存使用情况,动态的分配内存空间。虚拟内存地址还一个好处是因为是虚拟的,所以内存并不一定非要在物理内存中。可以存放在任何位置,比如把暂时不用的数据放进硬盘上的虚拟内存,腾出真实的物理内存交给程序运行而提高多程序时运行的效率。而且因为每个软件的虚拟内存地址都是从 0 开始,每个软件的寻址都是独立而且顺序的。程序编写和运行时,都好像是机器里面只有自己一个程序在运行,程序开发起来也很容易。软件不需要考虑内存分配的问题,也不需要担心内存不足和两个程序抢同一片内存导致系统整个崩溃的情况。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家提供动态代理服务器服务的企业,旨在帮助用户更好地管理网络访问和安全。以下是一些关于StormProxies的IP动态代理服务的特点:1. 高匿名性:StormProxies的动态代理服务器具有高匿名性,可以有效...
点击进入详情页
本回答由Storm代理提供
展开全部
/*
*伪代码,示例
*32位地址,三级映射(没有pud_t),页面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虚拟地址,用户空间所访问的地址
unsigned long real_addr = 0x00;//要输出的地址
struct task_struct *cur_task = get_current();//获取当前进程控制块
struct mm_struct *mm = cur_task -> mm;//进程虚拟空间
pgd_t *pgd;//描述页全局目录项
pmd_t *pmd;//描述页中间项
pte_t *pte;//页表项
pgd = pgd_offset(mm, addr);//找出所在目录
if (pgd_none(*pgd)){
goto out;
}
pmd = pmd_offset(pgd, addr);//找出所在中间项
if (pmd_none(*pmd)){
goto out;
}
pte = pte_offset(pmd, addr);//找出所在页面
if (pte_none(*pte)) {
goto out;
}
//假设每页4KB
real_addr = addr & 0x00003fff; //取出页面偏移量
real_addr += pte;//内核空间访问的地址
real_addr -= PAGE_OFFSET;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("没有内存映射",real_addr);
*伪代码,示例
*32位地址,三级映射(没有pud_t),页面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虚拟地址,用户空间所访问的地址
unsigned long real_addr = 0x00;//要输出的地址
struct task_struct *cur_task = get_current();//获取当前进程控制块
struct mm_struct *mm = cur_task -> mm;//进程虚拟空间
pgd_t *pgd;//描述页全局目录项
pmd_t *pmd;//描述页中间项
pte_t *pte;//页表项
pgd = pgd_offset(mm, addr);//找出所在目录
if (pgd_none(*pgd)){
goto out;
}
pmd = pmd_offset(pgd, addr);//找出所在中间项
if (pmd_none(*pmd)){
goto out;
}
pte = pte_offset(pmd, addr);//找出所在页面
if (pte_none(*pte)) {
goto out;
}
//假设每页4KB
real_addr = addr & 0x00003fff; //取出页面偏移量
real_addr += pte;//内核空间访问的地址
real_addr -= PAGE_OFFSET;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("没有内存映射",real_addr);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚拟就是虚拟的,不是实际真是的物理地址。你可以认为,这两个地址之间没关系。这个虚拟是通过系统和硬件的双重工作,做的一种点对点的映射(当然实际内存分配是按照页来处理)。也就是软件不需要考虑内存数据的物理地址,只需要用虚拟地址做数据存储处理就行了。linux中虚拟地址和物理地址怎样映射
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询