名字不能取太长 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 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)