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宏相关推荐

  1. ucore物理内存管理

    物理内存管理 (1)编译运行 uCore Lab2的工程代码 (2)完成uCore Lab2 练习 1-3的编程作业 思考如何实现uCore Lab2扩展练习1-2 提交uCore Lab2实验报告的 ...

  2. 解析Winndows 2000/XP物理内存管理

    解析Winndows 2000/XP物理内存管理    物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键.Windows 2000/XP内部使用一个称为页框数据库(Page Fram ...

  3. 内存管理两部曲之物理内存管理

    内存管理总览 返利网站 m.cpa5.cn 先笼统地总结下内存管理到底是干啥的,下面这段话摘自<现代操作系统 - 第 3 版>: 内存管理的任务就是有效地管理内存,即记录哪些内存是正确使用 ...

  4. 【清华大学】操作系统 陈渝 Part3 ——物理内存管理 之 连续内存分配

    [清华大学]操作系统 陈渝 Part3 --物理内存管理 之 连续内存分配 3.1计算机体系结构及内存分层 计算机体系机构 内存体系层次 管理内存方法 3.2地址空间 & 地址生成 地址空间定 ...

  5. OS学习笔记-7(清华大学慕课)实验二物理内存管理

    实验二物理内存管理 X86特权级 分成4个特权级 内核在level0,应用程序在level3 一开始想用4个特权级,但现在一般2个就够了 cpu完成特权级检查 段选择子 DPL描述了段的优先级

  6. Linux 物理内存管理涉及的三大结构体之struct zone

    从Linux 物理内存管理涉及的三大结构体之struct page 中,大概知道了UMA和NUMA概念,同时也知道在每个node对应的内存范围内,都会将其分成不同的内存管理区域zone.之所以分成几类 ...

  7. 操作系统物理内存管理

    这里写目录标题 连续分配管理方式 单一连续存储管理 分区式存储管理 固定分区 动态分区 伙伴系统 内存紧缩(内存碎片化处理) 覆盖技术 交换技术 覆盖与交换的比较 外部碎片和内部碎片的区别 内部碎片 ...

  8. lab2物理内存管理实现

    0.虚拟内存的分配(malloc,free) 从操作系统角度来看,进程分配内存有2种方式,分别由2个系统调用完成:brk和mmap(不考虑共享内存). brk是将数据段(.data)的最高地址指针_e ...

  9. linux mmu的实现的讲解_Linux中的物理内存管理 [一]

    前面的文章介绍了Linux中虚拟地址空间的管理,本文将讨论Linux系统对物理内存的管理. NUMA 所谓物理内存,就是安装在机器上的,实打实的内存设备(不包括硬件cache),被CPU通过总线访问. ...

  10. Linux 内存管理 | 物理内存管理:物理内存、内存碎片、伙伴系统、slab分配器

    文章目录 物理内存 物理内存分配 内存碎片 外部碎片 内部碎片 伙伴系统(buddy system) slab分配器 本文举例为32位Linux 物理内存 在Linux中,内核将物理内存划分为三个区域 ...

最新文章

  1. 他们让云撸猫变成现实,台湾大学开发手持VR设备解救吸猫人
  2. 计蒜客NOIP模拟赛(2) D2T2紫色百合
  3. 筹码游戏java代码编写,PAT(Basic Level) 乙级练习题 ------ 1071 小赌怡情 java
  4. HarmonyOS之深入解析线程间的通信
  5. 未定义标识符 stringc/c++(20)_到 2024 年,阿斯顿·马丁汽车销量的 20%以上将是电动汽车...
  6. php 文件保存函数,php 写入和读取文件函数
  7. session一致性架构设计
  8. 实现原理 扫描枪_条码扫描枪工作原理
  9. 牛书终于在卓越网上架
  10. 2016百度之星资格赛总结
  11. php毕业设计商城模板,基于Thinkphp的毕业设计网上购物商城
  12. 单片机原理与c语言程序设计付先成版答案,单片机原理与C语言程序设计
  13. 测试导航卫星软件,北斗卫星导航定位系统简介及北斗测绘测亩仪应用
  14. java制作小鱼吃大鱼_大鱼吃小鱼游戏(Java编写)
  15. 计算机C语言好学吗?要是想自学应该怎么办?大学挂科赶紧恶补!
  16. UE4地形简单材质球制作,及地形变黑处理办法
  17. 前端学习(三)UI设计
  18. JDBC 事务和 JTA 事务的区别
  19. AR光波导厂商DigiLens进军SRG领域
  20. 【FAI】七日年化收益与万份收益的理解

热门文章

  1. C语言实现机器猫绘制
  2. java对接paypal支付应用实例 (v2)
  3. 西瓜书习题4.3 决策树
  4. [游戏引擎中文版]avg制作工具livemaker和Yuuki! Novel汉化版
  5. 朝花夕拾 - 停更三月,期待 失败
  6. USYD悉尼大学INFO1110 Oral Exam口语考试复习资料
  7. linux两个邮件服务,Linux系列-Red Hat5平台下的Postfix邮件服务搭建(二)
  8. PS 滤镜——扩散特效, 毛玻璃 效果
  9. 专科毕业五年,曲线救国进腾讯
  10. 海洋地震设备与采集的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告