135 lines
3.1 KiB
Markdown
135 lines
3.1 KiB
Markdown
# Сборочная система
|
||
|
||
---
|
||
|
||
## 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
|
||
```
|