arm qemu可视化烦恼

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

想要在arm架构中制作微型操作系统。 我有asm文件:

.globl _start
_start:
    mov sp,#0x20000
    bl kernel
hang:
    b hang

.globl PUT32
PUT32:
    str r1,[r0]
    bx lr

并且不是main.c

void kernel(void) {
    const char *msg = "Hello, ARM world!\n";
    unsigned int *vga_buffer = (unsigned int *)0xB8000; // VGA text mode buffer
    unsigned int color = 0x0F00; // White text on black background
    int i = 0;

    // Clear the screen
    for (i = 0; i < 80 * 25; ++i) {
        vga_buffer[i] = color | ' ';
    }

    // Print the message
    i = 0;
    while (*msg) {
        vga_buffer[i++] = color | *msg++;
    }

    while (1);
}

我希望在 qemu 模拟器中看到

Hello, ARM world!
,但我看到: enter image description here

我如何管理 qemu 模拟器中的可视化代码?

这是我的编译阶段:

arm-none-eabi-as --warn --fatal-warnings -march=armv5t strap.s -o strap.o
arm-none-eabi-gcc -c -Wall -O2 -nostdlib -nostartfiles -ffreestanding -march=armv5t notmain.c -o notmain.o
arm-none-eabi-ld strap.o notmain.o -T memmap -o notmain.elf
arm-none-eabi-objcopy notmain.elf -O binary notmain.bin

这里 qemu 启动(没有模拟器)

qemu-system-arm -M versatilepb -m 128M -nographic -kernel os.bin
c assembly arm qemu
1个回答
0
投票

您的代码假设地址 0xB8000 处有一个 VGA 显示设备。但是,您在Versatilepb 机器类型上运行它,并且该机器类型在任何地方都没有 VGA 显示设备。

您需要编写与运行该代码的机器实际具有的图形显示配合使用的代码。对于作为 PL110/PL111 帧缓冲区的Versatilepb: https://developer.arm.com/documentation/ddi0161/e

该硬件不支持 ASCII 文本打印——它有一个用于绘制像素的帧缓冲区。

如果您只想在VersatilePb上打印文本,那么您最好使用UART(串行端口),而不是图形显示器。否则,您将需要实现自己的字体和文本绘制处理。

如果您确实想要 VGA 设备,那么您需要通过 QEMU 命令行插入 PCI VGA 设备。但是,您的操作系统至少需要足够的 PCI 支持来探测、启用和映射 PCI BAR,因为(与 x86 PC 机器类型不同)在您的操作系统之前没有运行 BIOS 代码来为您设置 PCI。

© www.soinside.com 2019 - 2024. All rights reserved.