-
Notifications
You must be signed in to change notification settings - Fork 10
编译配置
polyhal
为了支持更多的架构和不同的开发板,以及考虑到未来的扩展能力,目前采用 rust
的 cfg
来传递参数,关于 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
可以将我们编写的 yaml
、toml
文件转换为相应的 cfg
和 env
,但是目前文档和相关的介绍并不全面,只有在 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_ARCH
和 BASE_ADDRESS
。
如果您是自己在编写链接脚本,您需要确保自己您拥有 .percpu
段,有 _sbss
和 _ebss
符号,BASE_ADDRESS
为正确的值。