Auto link multiple applications in kernel.

This commit is contained in:
Yifan Wu 2020-11-19 04:33:06 +08:00
parent f613fa122c
commit 0d0c7255b6
5 changed files with 64 additions and 9 deletions

View File

@ -20,13 +20,30 @@ fn insert_app_data() -> Result<()> {
}) })
.collect(); .collect();
writeln!(f, r#"
.align 4
.section .data
.global _num_app
_num_app:
.quad {}
"#, apps.len())?;
for i in 0..apps.len() {
writeln!(f, r#"
.quad app_{}_start
"#, i)?;
}
writeln!(f, r#"
.quad app_{}_end
"#, apps.len() - 1)?;
for (idx, app_with_extension) in apps.iter().enumerate() { for (idx, app_with_extension) in apps.iter().enumerate() {
writeln!(f, r#" writeln!(f, r#"
.section .data .section .data
.global app_{0}_start .global app_{0}_start
.global app_{0}_end .global app_{0}_end
app_{0}_start: app_{0}_start:
.incbin "{2}{1}" .incbin "{2}{1}.bin"
app_{0}_end: app_{0}_end:
"#, idx, app_with_extension, TARGET_PATH)?; "#, idx, app_with_extension, TARGET_PATH)?;
} }

View File

@ -26,12 +26,19 @@ fn clear_bss() {
#[no_mangle] #[no_mangle]
pub fn rust_main() -> ! { pub fn rust_main() -> ! {
extern "C" {
fn app_0_start();
fn app_0_end();
};
clear_bss(); clear_bss();
println!("Hello, world!"); println!("Hello, world!");
println!("app_0 [{:#x}, {:#x})", app_0_start as usize, app_0_end as usize); extern "C" {
fn _num_app();
}
let num_app_ptr = _num_app as usize as *const usize;
let num_app = unsafe { num_app_ptr.read_volatile() };
println!("num_app = {}", num_app);
let app_start: &[usize] = unsafe {
core::slice::from_raw_parts(num_app_ptr.add(1), num_app + 1)
};
for i in 0..num_app {
println!("app_{} [{:#x}, {:#x})", i, app_start[i], app_start[i + 1]);
}
panic!("Shutdown machine!"); panic!("Shutdown machine!");
} }

View File

@ -2,16 +2,20 @@ TARGET := riscv64gc-unknown-none-elf
MODE := release MODE := release
APP_DIR := src/bin APP_DIR := src/bin
TARGET_DIR := target/$(TARGET)/$(MODE) TARGET_DIR := target/$(TARGET)/$(MODE)
ELFS := $(patsubst $(APP_DIR)/*.rs, $(TARGET_DIR)/*, $(wildcard $(APP_DIR)/*.rs)) APPS := $(wildcard $(APP_DIR)/*.rs)
BINS := $(patsubst $(APP_DIR)/*.rs, $(TARGET_DIR)/*.bin, $(wildcard $(APP_DIR)/*.rs)) ELFS := $(patsubst $(APP_DIR)/%.rs, $(TARGET_DIR)/%, $(APPS))
BINS := $(patsubst $(APP_DIR)/%.rs, $(TARGET_DIR)/%.bin, $(APPS))
OBJDUMP := rust-objdump --arch-name=riscv64 OBJDUMP := rust-objdump --arch-name=riscv64
OBJCOPY := rust-objcopy --binary-architecture=riscv64 OBJCOPY := rust-objcopy --binary-architecture=riscv64
elf: elf:
@cargo build --release @cargo build --release
@echo $(APPS)
@echo $(ELFS)
@echo $(BINS)
binary: elf binary: elf
$(foreach elf, $(ELFS), $(OBJCOPY) $(elf) --strip-all -O binary $(patsubst $(TARGET_DIR)/*, $(TARGET_DIR)/*.bin, $(elf))) $(foreach elf, $(ELFS), $(OBJCOPY) $(elf) --strip-all -O binary $(patsubst $(TARGET_DIR)/%, $(TARGET_DIR)/%.bin, $(elf));)
build: binary build: binary

27
user/src/bin/power.rs Normal file
View File

@ -0,0 +1,27 @@
#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
const SIZE: usize = 10;
const P: u32 = 3;
const STEP: usize = 10000000;
const MOD: u32 = 10007;
#[no_mangle]
fn main() -> i32 {
let mut pow = [0u32; SIZE];
let mut index: usize = 0;
pow[index] = 1;
for i in 1..=STEP {
let last = pow[index];
index = (index + 1) % SIZE;
pow[index] = last * P % MOD;
if i % 10000 == 0 {
println!("{}^{}={}", P, i, pow[index]);
}
}
println!("Test power OK!");
0
}