关于虚拟地址计算

本文解释了偏移量的概念及其位数与页面大小的关系,例如4KB页面的偏移量为12位。虚拟地址由虚拟页号与偏移量组成,虚拟页号决定页表大小,偏移量决定页面大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偏移量(page offset)的位数就是页面大小的位数。

比如4KB的页面他的位数为2^10*4

=  2^2*2^10

=2^12

因为内存存储都是二进制(binary system) 所以4KB页面的偏移量就为12位 就是说12位的偏移量大小就可以表示4KB页面的

所有位置。

虚拟地址等于虚拟号加上偏移量,其前半部分为高位叫做虚拟页号后半部分为低位叫做偏移量 虚拟页号的大小决定页表的大小 偏移量的大小决定页面的大小

通过其虚拟页号索引可以得出该虚拟页面的页框号 页框号加上偏移量就是其物理地址 

### 虚拟地址的概念 虚拟地址是一种抽象化的地址表示形式,它并不直接指向实际的物理内存置[^2]。通过这种机制,操作系统可以为每个进程创建独立的逻辑地址空间,从而实现资源隔离并提高安全性。 --- ### 虚拟地址的工作方式 虚拟地址的核心功能在于将程序所使用的逻辑地址映射到真实的物理地址上。这一过程主要依赖于分页机制以及硬件和软件协同完成的地址翻译技术: 1. **分页机制** 操作系统会将虚拟地址划分为若干固定大小页面(Page),同样地,物理内存也被划分成相同大小的帧(Frame)。每一页会被映射到某个具体的帧中[^3]。 2. **页表的作用** 为了记录这些映射关系,引入了页表结构来维护虚拟页号与物理帧号之间的对应关系。当处理器生成一条指令涉及特定虚拟地址时,CPU 的内存管理单元 (MMU) 将查询该地址所属的页,并查找其对应的物理帧编号。 3. **TLB 缓冲加速** 鉴于频繁访问主存中的页表可能带来性能开销,现代架构设计了一种名为转换后备缓冲区(Translation Lookaside Buffer, TLB) 或者叫快表的小型专用缓存设备。如果请求的虚实地址对存在于 TLB 中,则可以直接返回结果;否则才需进一步检索完整的慢速页表。 4. **多级页表优化** 对于大容量地址空间而言,单层平坦式页表可能会占用过多存储资源。因此,在实践中常采用多层次嵌套式的页表设计方案以减少未命中情况下的平均延迟时间。 --- ### 映射流程概述 以下是典型的从虚拟地址到物理地址转化的过程描述: - 假设给定一个虚拟地址 `VA` ,先提取出它的高几作为索引来定所在页; - 接着利用上述找到的置去读取关联项内的目标帧号码 FPN; - 同时保留低部分偏移量 Offset 不变; - 最终组合得到最终所需的绝对物理地址 PA = (FPN << PAGE_SIZE_BITS)| OFFSET[^1]。 ```c // C伪代码展示简单的地址转换算法 uint64_t translate_virtual_to_physical(uint64_t virtual_address){ uint64_t page_number = extract_page_num(virtual_address); // 提取页码 uint64_t offset = get_offset(virtual_address); // 获取偏移 struct PageTableEntry *pte = lookup_in_TLB(page_number); if(!pte){ pte = search_full_page_table(page_number); // 如果不在TLB里就查满表 } return construct_physical_addr(pte->frame_number,offset);// 构造物理地址 } ``` --- #### 注意事项 尽管这里简化说明了整个映射路径,但在实际情况当中还存在诸多复杂因素比如权限校验、异常处理等等都需要额外考虑进去。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值