Я написал голую металлическую программу, которая печатает 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)
Мой полный код загружен на здесь