Skip to main content

Crate tg_linker

Crate tg_linker 

Source
Expand description

这个板块为内核提供链接脚本的文本,以及依赖于定制链接脚本的功能。

build.rs 文件可依赖此板块,并将 SCRIPT 文本常量写入链接脚本文件:

use std::{env, fs, path::PathBuf};

let ld = &PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("linker.ld");
fs::write(ld, linker::SCRIPT).unwrap();

println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-link-arg=-T{}", ld.display());

内核使用 boot0 宏定义内核启动栈和高级语言入口:

linker::boot0!(rust_main; stack = 4 * 4096);

内核所在内核区域定义成 4 个部分(KernelRegionTitle):

  1. 代码段
  2. 只读数据段
  3. 数据段
  4. 启动数据段

启动数据段放在最后,以便启动完成后换栈。届时可放弃启动数据段,将其加入动态内存区。

KernelLayout 结构体定位、保存和访问内核内存布局。

Macros§

boot0
定义内核入口。

Structs§

AppIterator
应用程序迭代器。
AppMeta
应用程序元数据。
KernelLayout
内核地址信息。
KernelRegion
内核内存分区。
KernelRegionIterator
内核内存分区迭代器。

Enums§

KernelRegionTitle
内核内存分区名称。

Constants§

NOBIOS_SCRIPT
链接脚本(nobios 模式)。
SCRIPT
链接脚本。