xv6-simplified
0.1
简化版xv6
Loading...
Searching...
No Matches
src
include
memlayout.h
Go to the documentation of this file.
1
10
/*
11
qemu -machine virt就如同这样布局
12
参考qemu的hw/riscv/virt.c文件:
13
14
0x00001000 -- 启动ROM
15
0x02000000 -- CLINT
16
0x0C000000 -- PLIC
17
0x10000000 -- uart0
18
0x10001000 -- virtio disk
19
0x80200000 -- 启动ROM后在机器模式跳到此地址,-kernel在此地址处加载内核
20
-- 在该地址后的RAM为unused
21
22
内核分布:
23
0x80200000 -- entry.S,然后是内核text和data段,然后是end
24
end -- 内核页分配的区域的开始处
25
PHYSTOP -- 内核使用RAM的尾部地址
26
*/
27
28
29
// 内核和用户使用的页表的开始地址
30
#define KERNBASE 0x80020000L
31
// 内核和用户使用的页表的结束地址
32
#define PHYSTOP (KERNBASE + 16*1024*1024)
33
34
// QEMU将UART寄存器放在物理内存的该地址
35
#define UART0 0x10000000L
36
#define UART0_IRQ 10
37
38
// virtio disk接口地址
39
#define VIRTIO0 0x10001000
40
#define VIRTIO0_IRQ 1
41
42
// 包括计时器的核本地中断器(CLINT)
43
#define CLINT 0x2000000L
44
// 计时器比较器,若MTIME > MTIMECMP,形成时钟中断
45
#define CLINT_MTIMECMP(hartid) (CLINT + 0x4000 + 8*(hartid))
46
// 中断计时器MTIME
47
#define CLINT_MTIME (CLINT + 0xBFF8)
48
49
// qemu将平台级中断控制器(PLIC)放置在这儿
50
#define PLIC 0x0c000000L
51
#define PLIC_PRIORITY (PLIC + 0x0)
52
#define PLIC_PENDING (PLIC + 0X1000)
53
54
// 核hart的Enable寄存器:针对该Hart启动或关闭某路中断源
55
#define PLIC_MENABLE(hart) (PLIC + 0x2000 + (hart)*0x100)
56
// 核hart的Enable寄存器:针对该Hart启动或关闭某路中断源
57
#define PLIC_SENABLE(hart) (PLIC + 0x2080 + (hart)*0x100)
58
// 核hart的Priority寄存器:配置中断源的优先级
59
#define PLIC_MPRIORITY(hart) (PLIC + 0x200000 + (hart)*0x2000)
60
// 核hart的Priority寄存器:配置中断源的优先级
61
#define PLIC_SPRIORITY(hart) (PLIC + 0x201000 + (hart)*0x2000)
62
// 核hart的Claim寄存器/Complete寄存器:获取最高优先级的中断源ID/通知PLIC中断处理结束
63
#define PLIC_MCLAIM(hart) (PLIC + 0x200004 + (hart)*0x2000)
64
// 核hart的Claim寄存器/Complete寄存器:获取最高优先级的中断源ID/通知PLIC中断处理结束
65
#define PLIC_SCLAIM(hart) (PLIC + 0x201004 + (hart)*0x2000)
66
67
// 对应trap处理代码页的地址,user和kernel地址空间对应的地址数值相同
68
#define TRAMPOLINE (MAXVA - PGSIZE)
69
70
// 映射trampoline下的内核栈空间
71
// 每个内核栈都无效的保护页包围
72
#define KSTACK(p) (TRAMPOLINE - (p + 1) * 2*PGSIZE)
73
74
// 用户内存布局
75
// 0地址开始:
76
// 文本
77
// 原始数据和bss段
78
// 固定大小的栈
79
// 可扩展的堆
80
// ...
81
// TRAPFRAME (p->trapframe,供trampoline使用的数据上下文)
82
// TRAMPOLINE
83
#define TRAPFRAME (TRAMPOLINE - PGSIZE)
Generated by
1.9.7