Part_One_First_Sight

Part_One_First_Sight

参考:独立式可执行程序 | Writing an OS in Rust

样例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#![no_std] // 不链接 Rust 标准库
#![no_main] // 禁用所有 Rust 层级的入口点

use core::panic::PanicInfo;

/// 这个函数将在 panic 时被调用
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
loop {}
}

#[no_mangle] // 不重整函数名
pub extern "C" fn _start() -> ! {
// 因为链接器会寻找一个名为 `_start` 的函数,所以这个函数就是入口点
// 默认命名为 `_start`
loop {}
}

cargo.toml

1
2
3
4
5
6
7
8
9
10
11
12
[package]
name = "FlowOS"
version = "0.1.0"
edition = "2021"

[dependencies]

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"

Windows 平台使用的编译命令不同

1
cargo rustc -- -C link-args="/ENTRY:_start /SUBSYSTEM:console"

也可以在 rust 目录下的 .cargo 文件夹下创建 config.toml 文件,输入

==注意;如果同时包含 config 和 config.toml 请二选一,如果同时存在,无后缀的会被加载==

1
2
3
4
5
6
7
8
[target.'cfg(target_os = "linux")']
rustflags = ["-C", "link-arg=-nostartfiles"]

[target.'cfg(target_os = "windows")']
rustflags = ["-C", "link-args=/ENTRY:_start /SUBSYSTEM:console"]

[target.'cfg(target_os = "macos")']
rustflags = ["-C", "link-args=-e __start -static -nostartfiles"]

上述只是拓展的方法,之后的编译都使用裸机,输入如下代码

1
rustup target add thumbv7em-none-eabihf

编译命令

1
cargo build --target thumbv7em-none-eabihf

另附:使用 nightly 版本


Part_One_First_Sight
http://example.com/2024/11/05/Part-One-First-Sight/
作者
Tsglz
发布于
2024年11月5日
许可协议