You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QEMU模拟器中Rust代码调用print函数触发无限循环及BIOS启动方式异常问题求助

QEMU模拟器中Rust代码调用print函数触发无限循环及BIOS启动方式异常问题求助

大家好,我最近在QEMU模拟器上运行自己写的Rust内核程序时,碰到了两个百思不得其解的问题,想过来请教下各位:

问题1:调用print函数触发无限打印ABC

我写了一个print函数用来通过UART输出内容,但是当我在_start里调用这个函数时,不管传空字符串还是非空字符串进去,程序都会无限打印ABC,根本停不下来。

有问题的代码如下:

#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
    print(""); // 或者传"abc"也一样
    loop {}
}

pub fn print(text: &str) {
    let mut uart: &mut u8;
    unsafe {
        uart = &mut *(0x10000000 as *mut u8);
    }
    *uart = 65;
    *uart = 66;
    *uart = 67;
}

但奇怪的是,如果我把print函数里的代码直接内联到_start函数里,程序就正常工作了,只会输出一次ABC:

#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
    let mut uart: &mut u8;
    unsafe {
        uart = &mut *(0x10000000 as *mut u8);
    }
    *uart = 65;
    *uart = 66;
    *uart = 67;
    loop {}
}

问题2:使用-bios直接启动时两种方式都失效

上面两种写法,在我用-bios default -kernel my_kernel启动QEMU时,内联代码的版本是正常的;但如果我换成直接用-bios my_kernel的方式启动,不管是调用print函数还是内联代码的版本,都完全失效了,根本看不到输出。

我现在完全搞不懂这两个问题的原因,为什么提取成函数就会无限循环?为什么BIOS启动方式下两种写法都不管用?有没有大佬能帮忙分析下呀?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:38:00