名字不能取太长 2023-01-29 00:46 采纳率: 78%
浏览 127
已结题

内存管理的一段代码不是很理解

以下代码将当前分页结构体在位图中对应的位清零,表示该页为可用页,memory_management_struct.bits_map表示位图数据结构的起始地址,
p->PHY_address是当前分页的物理地址,PAGE_2M_SHIFT是2MB分页的大小(2的多少次方),分页采用2MB分页。
请详细解释以下表达式的含义以及如何推导

*(memory_management_struct.bits_map + ((p->PHY_address >> PAGE_2M_SHIFT) >> 6)) ^= 1UL << (p->PHY_address >> PAGE_2M_SHIFT) % 64;

另外是否可以改成
*(memory_management_struct.bits_map + (p->PHY_address >> PAGE_2M_SHIFT) %64 )^= 1UL ;

  • 写回答

5条回答 默认 最新

  • 社区专家-Monster-XH 2023-01-29 01:08
    关注

    有用请采纳:
    这个表达式用于在内存管理结构的位图中更改一个特定页面的状态。
    memory_management_struct.bits_map 是一个指向位图的指针,p->PHY_address 是页面的物理地址,PAGE_2M_SHIFT 是页面大小的常量,通常定义为21。

    具体来说,先要通过 p->PHY_address >> PAGE_2M_SHIFT 计算出页面在位图中的编号,然后再通过 (p->PHY_address >> PAGE_2M_SHIFT) >> 6 计算出页面所在的 long int 数组元素编号。最后再通过 (1UL ​1Malformed citation << (p->PHY_address >> PAGE_2M_SHIFT) % 64) 计算出页面在其所在 long int 数组元素中的位置。

    其中,1UL 表示一个 unsigned long int 类型的 1,^= 运算符表示位异或并赋值,这会将页面所在的位图位置上的值反转,即将 0 变为 1 或将 1 变为 0。
    可以改的。
    因为 (p->PHY_address >> PAGE_2M_SHIFT) % 64 已经计算出了页面在其所在long int数组元素中的位置。

    所以 memory_management_struct.bits_map + (p->PHY_address >> PAGE_2M_SHIFT) %64 就是指向该位置的指针。

    而 1UL 不需要左移了,因为这个页面所在的位置已经确定了,在这个位置上直接异或1就可以将它取反。改了之后的可读性比较差罢了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月31日
  • 已采纳回答 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 BDSBAS-B1C和B1C信号有什么不同
  • ¥15 在半圆平面内随机生成点坐标
  • ¥15 系统容量变化的几种多址方式TDMA, CDMA,FDMA,OFDMA 对比,应该给的是一个曲线 图,随着系统容量的增加,几种多址方式性能的对比 图,MATLAB程序仿真折线图
  • ¥15 用visual Studio 写c ++只运行上一个旧代码的运行结果是怎么回事
  • ¥15 系统容量变化的几种多址方式(TDMA,FDMA,OFDMA,CDMA)对比(相关搜索:曲线图)
  • ¥15 worldclim 历史及未来气候数据矫正
  • ¥15 ajax服务器不能下载
  • ¥15 运用c++和opencv实现二维码的识别和三维坐标的建立
  • ¥100 理想汽车的ADB为什么到了国外换了SIM就可以打开?
  • ¥15 k210烧入flash报错error:2005