Skip to content

编译配置

yufeng edited this page May 11, 2024 · 1 revision

编译配置

polyhal 为了支持更多的架构和不同的开发板,以及考虑到未来的扩展能力,目前采用 rustcfg 来传递参数,关于 cfg 的介绍可以参考 https://doc.rust-lang.org/rustc/command-line-arguments.html#option-cfg。

目前 polyhal 支持的参数为 board ,如果需要使用 polyhal 则需要利用 RUSTFLAGS 传递参数 --cfg=board="qemu",可以参考 https://github.com/Byte-OS/polyhal/blob/main/example/.cargo/config.toml 。写在 Cargo.toml 配置文件里

[build]
target = "riscv64gc-unknown-none-elf"

[target.riscv64gc-unknown-none-elf]
rustflags = [
    '--cfg=board="qemu"',
]

也可以通过环境变量的形式传递,例如以下形式。

RUSTFLAGS='--cfg=board="qemu"' make run
# or
RUSTFLAGS='--cfg=board="qemu"' cargo build

我们也有额外的工具来完成这些事情——kbuild, 您可以通过 cargo install kbuild 来安装这个工具。kbuild 可以将我们编写的 yamltoml 文件转换为相应的 cfgenv,但是目前文档和相关的介绍并不全面,只有在 ByteOS 中有使用,https://github.com/Byte-OS/ByteOS/blob/main/Makefile。

链接脚本

您需要添加一个比较合适的链接脚本,可以参考 example 中的链接脚本。https://github.com/Byte-OS/polyhal/tree/main/example/linker

下面是 riscv64 架构的参考:

OUTPUT_ARCH(riscv)
ENTRY(_start)

BASE_ADDRESS = 0xffffffc080200000;

SECTIONS
{
    /* Load the kernel at this address: "." means the current address */
    . = BASE_ADDRESS;
    start = .;
    _skernel = .;

    .text ALIGN(4K): {
        stext = .;
        *(.text.entry)
        *(.text .text.*)
        etext = .;
    }

    .rodata ALIGN(4K): {
        srodata = .;
        *(.rodata .rodata.*)
        . = ALIGN(4K);
        erodata = .;
    }

    .data ALIGN(4K): {
        . = ALIGN(4K);
        *(.data.prepage .data.prepage.*)
        . = ALIGN(4K);
        _sdata = .;
        *(.data .data.*)
        *(.sdata .sdata.*)
        _edata = .;
    }

    .sigtrx ALIGN(4K): {
        *(.sigtrx .sigtrx.*)
    }

    _load_end = .;

    .bss ALIGN(4K): {
        *(.bss.stack)
        _sbss = .;
        *(.bss .bss.*)
        *(.sbss .sbss.*)
        _ebss = .;
    }

    . = ALIGN(4K);
    _percpu_start = .;
    .percpu 0x0 : AT(_percpu_start) {
        _percpu_load_start = .;
        *(.percpu .percpu.*)
        _percpu_load_end = .;
        . = ALIGN(64);
        _percpu_size_aligned = .;

        . = _percpu_load_start + _percpu_size_aligned * 1;
    }
    . = _percpu_start + SIZEOF(.percpu);
    _percpu_end = .;

    PROVIDE(end = .);
    /DISCARD/ : {
        *(.comment) *(.gnu*) *(.note*) *(.eh_frame*)
    }
}

上述链接脚本用于不同架构的时候需要修改 OUTPUT_ARCHBASE_ADDRESS

如果您是自己在编写链接脚本,您需要确保自己您拥有 .percpu 段,有 _sbss_ebss 符号,BASE_ADDRESS 为正确的值。