Files
Elyz/kernel/docs/build-system.md
2026-07-06 00:25:49 +03:00

3.1 KiB
Raw Blame History

Сборочная система


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