fix: bugs
This commit is contained in:
134
kernel/docs/build-system.md
Normal file
134
kernel/docs/build-system.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# Сборочная система
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
```
|
||||
Reference in New Issue
Block a user