Когда я пытаюсь напечатать символы на RISCV32 QEMU, программа зависает - PullRequest
0 голосов
/ 14 апреля 2020

Я написал голую металлическую программу, которая печатает Hello from Rust! в ржавчине.

#[no_mangle]
pub extern "C" fn __start_rust() -> ! {
    let uart = 0x1001_3000 as *mut u8;
    for c in b"Hello from Rust!".iter() {
        unsafe {            
            *uart = *c as u8;
        }
    }

    unsafe { asm!("wfi" :::: "volatile"); }
    loop {}
}

Однако, когда я запускаю эту программу на qemu с помощью команды ниже, эта программа просто зависает, и на консоли не отображаются никакие символы .

qemu-system-riscv32 -nographic -machine sifive_u -kernel target/riscv32imac-unknown-none-elf/debug/qemu-riscv-hello

Я искал, где произошло зависание, и обнаружил, что это зависание происходит при записи символа в uart.

Как мне сделать, чтобы печатать символы на консоли?

Среда

qemu-system-riscv32 --version
QEMU emulator version 4.2.0
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
uname -a
Linux SoyaOhnishi 5.3.0-46-generic #38~18.04.1-Ubuntu SMP Tue Mar 31 04:17:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
cargo --version
cargo 1.44.0-nightly (390e8f245 2020-04-07)

Мой полный код загружен на здесь

...