Skip to content

Commit f29d6ee

Browse files
committed
test: update ut
Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
1 parent 7d7de74 commit f29d6ee

1 file changed

Lines changed: 106 additions & 0 deletions

File tree

tests/unit_test/cpu_io.h

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define SIMPLEKERNEL_TESTS_UNIT_TEST_CPU_IO_H_
77

88
#include <cstddef>
9+
#include <cstdint>
910

1011
namespace cpu_io {
1112

@@ -15,6 +16,111 @@ inline void DisableInterrupt() {}
1516
inline bool GetInterruptStatus() { return false; }
1617
inline size_t GetCurrentCoreId() { return 0; }
1718

19+
namespace virtual_memory {
20+
21+
// 页大小常量
22+
static constexpr size_t kPageSize = 4096;
23+
static constexpr size_t kPteAttributeBits = 12;
24+
static constexpr size_t kPageOffsetBits = 12;
25+
static constexpr size_t kVpnBits = 9;
26+
static constexpr size_t kVpnMask = 0x1FF;
27+
static constexpr size_t kPageTableLevels = 4;
28+
29+
// 页表项权限位定义
30+
static constexpr uint64_t kValid = 0x1;
31+
static constexpr uint64_t kWrite = 0x2;
32+
static constexpr uint64_t kUser = 0x4;
33+
static constexpr uint64_t kRead = 0x200;
34+
static constexpr uint64_t kExec = 0x400;
35+
static constexpr uint64_t kGlobal = 0x100;
36+
37+
// 获取用户页面权限
38+
inline auto GetUserPagePermissions(bool readable = true, bool writable = false,
39+
bool executable = false, bool global = false)
40+
-> uint64_t {
41+
uint64_t flags = kValid | kUser;
42+
if (readable) {
43+
flags |= kRead;
44+
}
45+
if (writable) {
46+
flags |= kWrite;
47+
}
48+
if (executable) {
49+
flags |= kExec;
50+
}
51+
if (global) {
52+
flags |= kGlobal;
53+
}
54+
return flags;
55+
}
56+
57+
// 获取内核页面权限
58+
inline auto GetKernelPagePermissions(bool readable = true,
59+
bool writable = false,
60+
bool executable = false,
61+
bool global = false) -> uint64_t {
62+
uint64_t flags = kValid; // Kernel pages don't need kUser
63+
if (readable) {
64+
flags |= kRead;
65+
}
66+
if (writable) {
67+
flags |= kWrite;
68+
}
69+
if (executable) {
70+
flags |= kExec;
71+
}
72+
if (global) {
73+
flags |= kGlobal;
74+
}
75+
return flags;
76+
}
77+
78+
// 页表操作函数
79+
inline void SetPageDirectory(uint64_t) {}
80+
inline void EnablePage() {}
81+
inline void FlushTLBAll() {}
82+
83+
// 获取页表项权限
84+
inline auto GetTableEntryPermissions() -> uint64_t {
85+
return kValid | kWrite | kUser | kRead | kExec;
86+
}
87+
88+
// 获取虚拟页号
89+
inline auto GetVirtualPageNumber(uint64_t virtual_addr, size_t level)
90+
-> uint64_t {
91+
return (virtual_addr >> (kPageOffsetBits + level * kVpnBits)) & kVpnMask;
92+
}
93+
94+
// 页对齐函数
95+
inline auto PageAlign(uint64_t addr) -> uint64_t {
96+
return addr & ~(kPageSize - 1);
97+
}
98+
99+
inline auto PageAlignUp(uint64_t addr) -> uint64_t {
100+
return (addr + kPageSize - 1) & ~(kPageSize - 1);
101+
}
102+
103+
inline auto IsPageAligned(uint64_t addr) -> bool {
104+
return (addr & (kPageSize - 1)) == 0;
105+
}
106+
107+
// 页表项操作函数
108+
inline auto IsPageTableEntryValid(uint64_t pte) -> bool {
109+
return (pte & kValid) != 0;
110+
}
111+
112+
inline auto PageTableEntryToPhysical(uint64_t pte) -> uint64_t {
113+
return pte & 0x000FFFFFFFFFF000ULL;
114+
}
115+
116+
inline auto PhysicalToPageTableEntry(uint64_t physical_addr, uint64_t flags)
117+
-> uint64_t {
118+
return (physical_addr & 0x000FFFFFFFFFF000ULL) | (flags & 0xFFF) |
119+
(flags & (1ULL << 63));
120+
}
121+
122+
} // namespace virtual_memory
123+
18124
} // namespace cpu_io
19125

20126
#endif /* SIMPLEKERNEL_TESTS_UNIT_TEST_CPU_IO_H_ */

0 commit comments

Comments
 (0)