gpt4 book ai didi

c - 在 x86 Qemu 中启用分页

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:47 29 4
gpt4 key购买 nike

我正在尝试在 Qemu 上的 x86 架构上启用分页。
但是这段代码会导致三重错误。

此代码段在保护模式下执行。
代码:https://github.com/mridulv/simpleOperatingSystem

这是内核入口文件

[bits 32]

[extern main]
[extern main2]
[extern page_table]

call main

lea ECX, [page_table - 0xC0000000]
mov CR3, ECX

mov ECX, CR0
or ECX, 0x80000000
mov CR0, ECX

;lea ECX, [StartInHigherHalf]
;jmp ECX

;StartInHigherHalf:
; call main2

jmp $

这是创建页目录、表的内核文件。

unsigned int page_table[1024] __attribute__((aligned(4096)));;

void set_page_tables() {
unsigned int pages_entry[1024 * 1024] __attribute__((aligned(4096)));

unsigned int KERNEL_VIRTUAL_OFFSET = 0xC0000000;
unsigned int KERNEL_FIRST_VIRTUAL_ADDRESS = 0xC0000000 >> 12;

int numPageTables = 4;
int numPagesInPageTable = 1024;
int numPageTableEntriesInPageDirectory = 1024;
int totalPages = numPageTables * numPagesInPageTable;

unsigned int index = 0;
unsigned int *pages_ptr = (unsigned int *)(pages_entry - KERNEL_VIRTUAL_OFFSET);
unsigned int *page_table_ptr = (unsigned int *)(pages_entry - KERNEL_VIRTUAL_OFFSET);

unsigned int positionAndFlags = 7;

while (index < totalPages) {
pages_ptr[index] = positionAndFlags;
index = index + 1;
positionAndFlags += 4096;
}

positionAndFlags = 7;
index = KERNEL_FIRST_VIRTUAL_ADDRESS;
unsigned int totalPagesLeft = KERNEL_FIRST_VIRTUAL_ADDRESS + totalPages;
while (index < totalPagesLeft) {
pages_ptr[index] = positionAndFlags;
index = index + 1;
positionAndFlags += 4096;
}

positionAndFlags = (unsigned int)&pages_ptr[0];
positionAndFlags = positionAndFlags | 7;
index = 0;
while (index < numPageTableEntriesInPageDirectory) {
page_table_ptr[index] = positionAndFlags;
index = index + 1;
positionAndFlags += 4096;
}
}

void main() {
char* video_memory = (char*) 0xb8000;
*video_memory = 'X';
set_page_tables();
}

void main2() {
char* video_memory = (char*) 0xb8004;
*video_memory = 'Y';
// __asm__
// (
// "leal (page_table, ), %ecx\n\t" // 0xC0000000 = KERNEL_VIRTUAL_BASE
// "movl %cr3, %ecx"
// );
}

链接器.ld

SECTIONS {
. = 0xC0100000;

.text : AT(ADDR(.text) - 0xC0000000) {
*(.text);
}

. = ALIGN(0x1000);
.bss : AT(ADDR(.bss) - 0xC0000000) {
*(.text);
}

. = ALIGN(0x1000);
.data : AT(ADDR(.data) - 0xC0000000) {
*(.text);
}
}

最佳答案

我建议您在代码顶部添加部分声明,以使事情清楚 -

section .text

你的代码中的错误是在执行之前

call main

您的代码(根本)没有通过填充 ESP 寄存器来设置堆栈。

要做到这一点,你的代码应该是这样的

  1. 像这样创建常量“STACK_SIZE”-

    STACK_SIZE equ <valueOfSizeOfStack>
  2. 为堆栈创建空间

    section .bss
    kernelStack: RESB <valueOfSizeOfStack>

在“valueOfSizeOfStack”字段中,您可以为您的堆栈添加 4096 (4-KB) 或其任意倍数(不要太大,它将计入您的二进制大小)。

关于c - 在 x86 Qemu 中启用分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40705695/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com