You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
1.8 KiB
Rust
28 lines
1.8 KiB
Rust
pub const APP_BASE_ADDRESS: usize = 0x80400000; // 载入的app的起始的地址
|
|
pub const APP_SIZE_LIMIT: usize = 0x20000; // app的最大的二进制文件能够使用的大小
|
|
pub const MAX_APP_NUM: usize = 10; // 支持最大的用户应用数量
|
|
pub const KERNEL_HEAP_SIZE: usize = 0x30_0000; // 内核的堆大小 3M
|
|
pub const PAGE_SIZE_BITS: usize = 0xc; // 页内偏移的位宽(也就是每页的大小)
|
|
pub const PAGE_SIZE: usize = 0x1000; // 每个页 的字节大小为 4kb
|
|
pub const MEMORY_END: usize = 0x80800000; // 设置我们当前操作系统最大只能用到 0x80800000-0x80000000大小的内存也就是8M
|
|
|
|
pub const USER_STACK_SIZE: usize = 4096 * 2; // 每个应用用户态的栈大小为8kb
|
|
pub const KERNEL_STACK_SIZE: usize = 4096 * 2; // 每个应用的内核栈
|
|
|
|
pub const TRAMPOLINE: usize = usize::MAX - PAGE_SIZE + 1; // __alltraps对齐到了这里, (内核空间和用户空间这里虚拟地址都用这个)虚拟地址最高页 存放跳板, 跳板那一页, 被映射到 strampoline段(trap) 实际的物理地址, 即陷入时 cpu需要跳转的地址
|
|
pub const TRAP_CONTEXT: usize = TRAMPOLINE - PAGE_SIZE; // 用户 trap context开始的位置 在 每个用户程序 它本身地址空间 的次高页
|
|
|
|
pub use crate::board::*;
|
|
|
|
|
|
|
|
/// 得到 "用户程序的内核栈" 的在 内核本身栈中的虚拟位置
|
|
/// 这个在 次高页的下面的某个位置
|
|
/// 每个用户除了分配 KERNEL_STACK_SIZE 大小外, 还额外 增加 一个PAGE_SIZE 放在比栈底要高的地址 用来隔离每个用户内核栈
|
|
pub fn kernel_stack_position(app_id: usize) -> (usize, usize) {
|
|
let top = TRAMPOLINE - app_id * (KERNEL_STACK_SIZE + PAGE_SIZE);
|
|
// 栈底只需要 KERNEL_STACK_SIZE 即可,
|
|
let bottom = top - KERNEL_STACK_SIZE;
|
|
(bottom, top)
|
|
}
|