mirror of
https://github.com/rcore-os/rCore-Tutorial-v3.git
synced 2024-11-22 09:26:26 +04:00
Auto link multiple applications in kernel.
This commit is contained in:
parent
f613fa122c
commit
0d0c7255b6
19
os/build.rs
19
os/build.rs
@ -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)?;
|
||||||
}
|
}
|
||||||
|
@ -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!");
|
||||||
}
|
}
|
@ -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
27
user/src/bin/power.rs
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user