# Сборочная система --- ## Cargo.toml **Файл**: `Cargo.toml` ```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` ```rust 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` ### Переменные ```makefile 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` ```toml [toolchain] channel = "nightly" targets = ["x86_64-unknown-none"] # aarch64-unknown-none, riscv64gc-unknown-none-elf, loongarch64-unknown-none (для будущего) ``` --- ## .gitignore **Файл**: `.gitignore` ``` /kernel # бинарный файл ядра /target # артефакты сборки Cargo ```