【发布时间】:2021-12-20 05:07:21
【问题描述】:
我正在尝试在 C++ 中实现 x86 页表/页目录,我希望能够在编译时构建它们。为了做到这一点,我需要能够在编译时获取静态 constexpr 页表对象的地址,转换为算术类型,这样我就可以使用它们来构造静态 constexpr 页目录条目:
struct PageTable {
/* ... */
};
struct PageDirectory {
constexpr PageDirectory(std::initializer_list<uint32_t> entries)
{ /* ... */ }
/* ... */
};
static constexpr PageTable pt { /* ... */ };
static constexpr PageDirectory pd {
reinterpret_cast<uint32_t>(&pt) | WRITE | PRESENT,
/* ... */
};
这不起作用,因为reinterpret_cast 不能在常量表达式中使用。有没有其他方法可以让我意识到这一点或类似的事情?
【问题讨论】:
-
@JaMiT 是的,修复了。
-
似乎不可能。
-
@NicolBolas 我不明白这个问题,页面目录中的每个条目都包含页表的地址或与一些标志一起,因此需要这种转换。我可以对两者都使用纯 C 数组,但我希望它们是 C++ 类,而不是其 constexpr 构造函数做额外的事情。
-
@NicolBolas:我在写一个操作系统,运行时cr3会指向
pd和pd的第一个入口必须指向pt,pd不需要访问pt的内容。
标签: c++ c++17 constexpr page-tables