66#define SIMPLEKERNEL_TESTS_UNIT_TEST_CPU_IO_H_
77
88#include < cstddef>
9+ #include < cstdint>
910
1011namespace cpu_io {
1112
@@ -15,6 +16,111 @@ inline void DisableInterrupt() {}
1516inline bool GetInterruptStatus () { return false ; }
1617inline 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