3.1 KiB
3.1 KiB
Сборочная система
Cargo.toml
Файл: Cargo.toml
[package]
name = "LISA"
version = "0.1.0"
edition = "2024"
[lib]
# н/д — только бинарный крейт
[[bin]]
name = "kernel"
path = "src/main.rs"
[dependencies]
limine = "0.5" # Limine boot protocol
embedded-graphics = "0.8" # 2D фреймбуфер рисование
bitflags = "2.11.0" # bitflags макрос
[profile.dev]
panic = "abort" # без раскрутки стека
[profile.release]
panic = "abort"
build.rs
Файл: build.rs
fn main() {
let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
println!("cargo:rustc-link-arg=-Tlinker-{}.ld", arch);
println!("cargo:rerun-if-changed=linker-{}.ld", arch);
}
Передаёт линкер-скрипт в зависимости от архитектуры: -Tlinker-x86_64.ld, -Tlinker-aarch64.ld, etc.
Linker скрипты
Общая структура (все 4 архитектуры)
- Entry:
kmain - Base address:
0xFFFFFFFF80000000— высшие 2 GiB, по спецификации Limine - Program headers:
PT_LOADдля.text,.rodata,.data
Секции
SECTIONS {
.text : { *(.text .text.*) } → код
.rodata : { *(.rodata .rodata.*) } → только чтение (page-aligned)
.data : {
*(.requests_start_marker) → Limine requests
*(.requests)
*(.requests_end_marker)
*(.data .data.*)
}
.bss : { *(.bss .bss.*) } → нули
/DISCARD/ : { *(.eh_frame*) *(.note.*) }
}
Архитектурные различия
| Архитектура | OUTPUT_FORMAT | Особенности |
|---|---|---|
| x86-64 | elf64-x86-64 |
Стандартный |
| aarch64 | elf64-littleaarch64 |
Стандартный |
| riscv64 | elf64-littleriscv |
.data + .sdata, .bss + .sbss |
| loongarch64 | elf64-loongarch |
Стандартный |
GNUmakefile
Файл: GNUmakefile
Переменные
OUTPUT := kernel
KARCH ?= x86_64
RUST_TARGET := $(KARCH)-unknown-none
# riscv64 -> riscv64gc-unknown-none-elf
RUST_PROFILE ?= dev
Цели
| Цель | Действие |
|---|---|
all |
RUSTFLAGS="-C relocation-model=static" cargo build --target ... + копирование target/.../kernel → ./kernel |
clean |
cargo clean + rm ./kernel |
distclean |
То же, что clean |
relocation-model=static — запрещает позиционно-независимый код (ядро загружается по фиксированному адресу).
rust-toolchain.toml
Файл: rust-toolchain.toml
[toolchain]
channel = "nightly"
targets = ["x86_64-unknown-none"]
# aarch64-unknown-none, riscv64gc-unknown-none-elf, loongarch64-unknown-none (для будущего)
.gitignore
Файл: .gitignore
/kernel # бинарный файл ядра
/target # артефакты сборки Cargo