物理内存管理-ucore操作系统的PADDR宏
PADDR宏
在pmm.c文件中的pmm_init(void)函数中存在一个奇怪的PADDR宏,以前从未见,该宏完成了去除内核的虚拟起始地址,这个宏是如何工作的?
//pmm.c
//pmm_init - setup a pmm to manage physical memory, build PDT&PT to setup paging mechanism
// - check the correctness of pmm & paging mechanism, print PDT&PT
void
pmm_init(void) {// create boot_pgdir, an initial page directory(Page Directory Table, PDT)boot_pgdir = boot_alloc_page();memset(boot_pgdir, 0, PGSIZE);boot_cr3 = PADDR(boot_pgdir);// recursively insert boot_pgdir in itself// to form a virtual page table at virtual address VPTboot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_P | PTE_W;
}//pmm.h
/* ** PADDR - takes a kernel virtual address (an address that points above KERNBASE),* where the machine's maximum 256MB of physical memory is mapped and returns the* corresponding physical address. It panics if you pass it a non-kernel virtual address.* */
#define PADDR(kva) ({ \uintptr_t __m_kva = (uintptr_t)(kva); \if (__m_kva < KERNBASE) { \panic("PADDR called with invalid kva %08lx", __m_kva); \} \__m_kva - KERNBASE; \})
QT平台测试PADDR宏
#include <stdio.h>/* All physical memory mapped at this address */
#define KERNBASE 0xC0000000
/* ** PADDR - takes a kernel virtual address (an address that points above KERNBASE),* where the machine's maximum 256MB of physical memory is mapped and returns the* corresponding physical address. It panics if you pass it a non-kernel virtual address.* */
#define PADDR(kva) ({ \uintptr_t __m_kva = (uintptr_t)(kva); \if (__m_kva < KERNBASE) { \printf("PADDR called with invalid kva %08lx", __m_kva); \} \__m_kva - KERNBASE; \})int main()
{printf("Hello World!\n");uintptr_t boot_pgdir = 0xC0000000+0x500;uintptr_t a = PADDR(boot_pgdir);printf("addr %08lx\n", a);return 0;
}
程序能够输出
Hello World!
addr 00000500
因此PADDR宏仍然采用替换的方式,左边的PADDR(kva)替换成右边小括号内的东西,而括号内部执行完最后的一行代码完成赋值给指针变量a,即a = __m_kva - KERNBASE;
物理内存管理-ucore操作系统的PADDR宏相关推荐
- ucore物理内存管理
物理内存管理 (1)编译运行 uCore Lab2的工程代码 (2)完成uCore Lab2 练习 1-3的编程作业 思考如何实现uCore Lab2扩展练习1-2 提交uCore Lab2实验报告的 ...
- 解析Winndows 2000/XP物理内存管理
解析Winndows 2000/XP物理内存管理 物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键.Windows 2000/XP内部使用一个称为页框数据库(Page Fram ...
- 内存管理两部曲之物理内存管理
内存管理总览 返利网站 m.cpa5.cn 先笼统地总结下内存管理到底是干啥的,下面这段话摘自<现代操作系统 - 第 3 版>: 内存管理的任务就是有效地管理内存,即记录哪些内存是正确使用 ...
- 【清华大学】操作系统 陈渝 Part3 ——物理内存管理 之 连续内存分配
[清华大学]操作系统 陈渝 Part3 --物理内存管理 之 连续内存分配 3.1计算机体系结构及内存分层 计算机体系机构 内存体系层次 管理内存方法 3.2地址空间 & 地址生成 地址空间定 ...
- OS学习笔记-7(清华大学慕课)实验二物理内存管理
实验二物理内存管理 X86特权级 分成4个特权级 内核在level0,应用程序在level3 一开始想用4个特权级,但现在一般2个就够了 cpu完成特权级检查 段选择子 DPL描述了段的优先级
- Linux 物理内存管理涉及的三大结构体之struct zone
从Linux 物理内存管理涉及的三大结构体之struct page 中,大概知道了UMA和NUMA概念,同时也知道在每个node对应的内存范围内,都会将其分成不同的内存管理区域zone.之所以分成几类 ...
- 操作系统物理内存管理
这里写目录标题 连续分配管理方式 单一连续存储管理 分区式存储管理 固定分区 动态分区 伙伴系统 内存紧缩(内存碎片化处理) 覆盖技术 交换技术 覆盖与交换的比较 外部碎片和内部碎片的区别 内部碎片 ...
- lab2物理内存管理实现
0.虚拟内存的分配(malloc,free) 从操作系统角度来看,进程分配内存有2种方式,分别由2个系统调用完成:brk和mmap(不考虑共享内存). brk是将数据段(.data)的最高地址指针_e ...
- linux mmu的实现的讲解_Linux中的物理内存管理 [一]
前面的文章介绍了Linux中虚拟地址空间的管理,本文将讨论Linux系统对物理内存的管理. NUMA 所谓物理内存,就是安装在机器上的,实打实的内存设备(不包括硬件cache),被CPU通过总线访问. ...
- Linux 内存管理 | 物理内存管理:物理内存、内存碎片、伙伴系统、slab分配器
文章目录 物理内存 物理内存分配 内存碎片 外部碎片 内部碎片 伙伴系统(buddy system) slab分配器 本文举例为32位Linux 物理内存 在Linux中,内核将物理内存划分为三个区域 ...
最新文章
- 他们让云撸猫变成现实,台湾大学开发手持VR设备解救吸猫人
- 计蒜客NOIP模拟赛(2) D2T2紫色百合
- 筹码游戏java代码编写,PAT(Basic Level) 乙级练习题 ------ 1071 小赌怡情 java
- HarmonyOS之深入解析线程间的通信
- 未定义标识符 stringc/c++(20)_到 2024 年,阿斯顿·马丁汽车销量的 20%以上将是电动汽车...
- php 文件保存函数,php 写入和读取文件函数
- session一致性架构设计
- 实现原理 扫描枪_条码扫描枪工作原理
- 牛书终于在卓越网上架
- 2016百度之星资格赛总结
- php毕业设计商城模板,基于Thinkphp的毕业设计网上购物商城
- 单片机原理与c语言程序设计付先成版答案,单片机原理与C语言程序设计
- 测试导航卫星软件,北斗卫星导航定位系统简介及北斗测绘测亩仪应用
- java制作小鱼吃大鱼_大鱼吃小鱼游戏(Java编写)
- 计算机C语言好学吗?要是想自学应该怎么办?大学挂科赶紧恶补!
- UE4地形简单材质球制作,及地形变黑处理办法
- 前端学习(三)UI设计
- JDBC 事务和 JTA 事务的区别
- AR光波导厂商DigiLens进军SRG领域
- 【FAI】七日年化收益与万份收益的理解
热门文章
- C语言实现机器猫绘制
- java对接paypal支付应用实例 (v2)
- 西瓜书习题4.3 决策树
- [游戏引擎中文版]avg制作工具livemaker和Yuuki! Novel汉化版
- 朝花夕拾 - 停更三月,期待 失败
- USYD悉尼大学INFO1110 Oral Exam口语考试复习资料
- linux两个邮件服务,Linux系列-Red Hat5平台下的Postfix邮件服务搭建(二)
- PS 滤镜——扩散特效, 毛玻璃 效果
- 专科毕业五年,曲线救国进腾讯
- 海洋地震设备与采集的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告