v2 版本:
肯定是你约定一个地方, 我去那个地方找你。
没有开启分页之前,都是用物理地址。 直接写死一个地址就行了。
开启分页之后, 也可以写死。但是,不同的是, 分页就像y=f(x)。 把同一个BASE_ADDRESS ,映射成不同的地址。所有大家还是不会冲突的。
OUTPUT_ARCH(riscv)
ENTRY(_start)
BASE_ADDRESS = 0x10000;
SECTIONS
{
. = BASE_ADDRESS;
.text : {
*(.text.entry)
*(.text .text.*)
}
. = ALIGN(4K);
.rodata : {
*(.rodata .rodata.*)
*(.srodata .srodata.*)
}
. = ALIGN(4K);
.data : {
*(.data .data.*)
*(.sdata .sdata.*)
}
.bss : {
*(.bss .bss.*)
*(.sbss .sbss.*)
}
/DISCARD/ : {
*(.eh_frame)
*(.debug*)
}
}
下面的配置用来加载应用的。 一个模版,可以用代码生成。
.incbin 会把代码嵌入进来。
拿 app_0_start 来说,app_0_start是一个声明的变量, 插入一段, 在声明一个变量app_0_end
就能知道app0的位置了。
.align 3
.section .data
.global _num_app
_num_app:
.quad 7
.quad app_0_start
.quad app_1_start
.quad app_2_start
.quad app_3_start
.quad app_4_start
.quad app_5_start
.quad app_6_start
.quad app_6_end
.section .data
.global app_0_start
.global app_0_end
.align 3
app_0_start:
.incbin "../user/target/riscv64gc-unknown-none-elf/release/00power_3"
app_0_end:
.section .data
.global app_1_start
.global app_1_end
.align 3
app_1_start:
.incbin "../user/target/riscv64gc-unknown-none-elf/release/01power_5"
app_1_end:
接下来就可以加载这个app, 这是一个二进制的代码, elf文件格式的。
pub fn get_app_data(app_id: usize) -> &'static [u8] {
extern "C" {
fn _num_app();
}
let num_app_ptr = _num_app as usize as *const usize;
let num_app = get_num_app();
let app_start = unsafe { core::slice::from_raw_parts(num_app_ptr.add(1), num_app + 1) };
assert!(app_id < num_app);
unsafe {
core::slice::from_raw_parts(
app_start[app_id] as *const u8,
app_start[app_id + 1] - app_start[app_id],
)
}
}
解下来就可以解析elf文件格式了。在内核的眼里就是一个任务, 由任务控制块来表示。
相当于你的一段代码逻辑编程了task.
impl TaskControlBlock {
pub fn get_trap_cx(&self) -> &'static mut TrapContext {
self.trap_cx_ppn.get_mut()
}
pub fn get_user_token(&self) -> usize {
self.memory_set.token()
}
pub fn new(elf_data: &[u8], app_id: usize) -> Self {
// memory_set with elf program headers/trampoline/trap context/user stack
let (memory_set, user_sp, entry_point) = MemorySet::from_elf(elf_data);
//未完。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。