在分页之后,如何正确接收物理地址 我已经实施了基本分页(部分基于OSDEV)并成功映射了内存页面。但是,我面临一个问题,我无法再访问存储在物理

问题描述 投票:0回答:0

,在启用分页之后,这种情况不再起作用。我的分页实现包括以下内容:

togaging代码:

// paging.h #ifndef _PAGING_H_ #define _PAGING_H_ #include <types.h> #include <string.h> #define PAGE_SIZES 4096 extern void loadPageDirectory(dword_t*); extern void enablePaging(); void init_paging(void); #endif // paging.c #include <paging/paging.h> dword_t page_directory[1024] __attribute__((aligned(4096))); dword_t first_page_table[1024] __attribute__((aligned(4096))); void native_flush_tlb_single(dword_t addr) { asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); } void *get_physaddr(void *virtualaddr) { dword_t pdindex = (dword_t)virtualaddr >> 22; dword_t ptindex = (dword_t)virtualaddr >> 12 & 0x03FF; dword_t *pd = (dword_t*)0xFFFFF000; dword_t *pt = ((dword_t*)0xFFC00000) + (0x400 * pdindex); return (void *)((pt[ptindex] & ~0xFFF) + ((dword_t)virtualaddr & 0xFFF)); } void map_page(void *physaddr, void *virtualaddr, dword_t flags) { dword_t pdindex = (dword_t)virtualaddr >> 22; dword_t ptindex = (dword_t)virtualaddr >> 12 & 0x03FF; dword_t *pd = (dword_t*)0xFFFFF000; dword_t *pt = ((dword_t*)0xFFC00000) + (0x400 * pdindex); pt[ptindex] = ((dword_t)physaddr) | (flags & 0xFFF) | 0x01; // Present native_flush_tlb_single((dword_t)virtualaddr); } void init_paging(void) { for (byte_t i = 0; i < 1024; i++) { page_directory[i] = 0x00000002; } for(byte_t i = 0; i < 1024; i++) { first_page_table[i] = (i * 0x1000) | 3; // Supervisor, read/write, present } page_directory[0] = ((dword_t)first_page_table) | 3; loadPageDirectory(page_directory); enablePaging(); }
启用页面后,我通常无法访问我的VRAM 0x1028地址,这使我能够绘制像素。如何恢复此地址(尤其是0x1028)。我需要它绘制像素。
任何指导都将不胜感激!谢谢
    

您的分页实现仅映射第一个4MIB内存。

0x1028

在此范围内且可访问,但是它指向(例如,
0xE0000000
)的Framebuffer地址可能位于其外部。您需要将此脱水的Framebuffer地址映射到虚拟地址,然后将其用于访问。

c operating-system paging
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.