,在启用分页之后,这种情况不再起作用。我的分页实现包括以下内容:
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地址映射到虚拟地址,然后将其用于访问。