change umake semantics

This commit is contained in:
jyy 2018-02-22 16:23:04 +08:00
parent 6172bc1aad
commit 67a83b0b0b
3 changed files with 13 additions and 12 deletions

14
SPEC.md
View File

@ -7,7 +7,7 @@
## AM中用到的数据结构
* `_Area`代表一段连续的内存,组成`[start, end)`的左闭右开区间。
* `_RegSet`代表体系结构相关的寄存器组。`GPR`系列寄存器定义了一些可以用来使用的寄存器。`GPR1`—`GPR4`为可读寄存器,`GPRx`为可写寄存器。
* `_RegSet`代表体系结构相关的寄存器组。`GPR`系列寄存器定义了一些可以用来使用的寄存器(用于ABI)。`GPR1`—`GPR4`为可读寄存器,`GPRx`为可写寄存器。例如在x86中`#define GPR1 eax`。使用`regs->GPR1`来读取寄存器的数值。
## 体系结构相关代码规范
@ -17,7 +17,7 @@
* `include/`存放相关的头文件。
* `include/arch.h`描述体系结构相关的信息,包括:
* 整数类型`size_t`, `off_t`的定义。
* `typedef struct _RegSet {}`代表所有体系结构寄存器。
* `typedef struct _RegSet {} _Regset;`代表所有体系结构寄存器。
* `src/`存放相关的源代码文件。
* `img/`存放制作镜像必要的文件。执行`img/burn target files`能将`files`对应的文件列表(.a)链接,并烧录成名为`target`的镜像。
@ -29,7 +29,7 @@
### TRM API
* `void _putc(char ch);` 调试输出一个字符。对qemu输出到串口对Linux native输出到本地控制台
* `void _putc(char ch);` 调试输出一个字符。输出到何处由具体平台决定(例如qemu将输出到串口因此使用`serial=stdio`就能在终端接收到调试信息对Linux native输出到本地控制台)
* `void _halt(int code);` 终止运行并报告返回代码。`code`为0表示正常终止。
## IO Extension (输入/输出扩展)
@ -61,7 +61,7 @@
* `_EVENT_IRQ_TIMER`:时钟中断(无cause)
* `_EVENT_IRQ_IODEV`:I/O设备中断(无cause)
* `_EVENT_ERROR`:一般错误(无cause)
* `_EVENT_PAGENP/_EVENT_PAGEPROT`:缺页/页保护错(cuase: `_PG_R`/`_PG_W`, ref: 产生缺页的地址)
* `_EVENT_PAGENP/_EVENT_PAGEPROT`:缺页/页保护错(cuase = `_PG_R`/`_PG_W`表示发生页错误的是读/写操作ref存放产生缺页的地址)
* `_EVENT_TRAP`:内核态自陷(无cause)
* `_EVENT_SYSCALL`: 系统调用(无cause)
* `_RegSet *_make(_Area kstack, void *entry, void *arg);`创建一个内核上下文,参数arg。
@ -82,10 +82,10 @@
* `void _protect(_Protect *p);` 创建一个保护的地址空间。
* `void _release(_Protect *p);` 释放一个保护的地址空间。
* `void _map(_Protect *p, void *va, void *pa, int mode);`将地址空间的虚拟地址va映射到物理地址pa。单位为一页。
* `void *_query(_Protect *p, void *va, int *mode);` (writes to `mode` if non-NULL)
* `void _unmap(_Protect *p, void *va);`释放虚拟地址空间va的一页。
* `void *_query(_Protect *p, void *va, int *mode);` 获取虚拟地址va所对应的物理页。相应的权限(`_PG_R`/`_PG_W`/`_PG_X`保存在`mode`中,如果`mode==NULL`则不保存)。
* `void _unmap(_Protect *p, void *va);`释放虚拟地址空间va对应的映射页。
* `void _switch(_Protect *p);`切换到一个保护的地址空间。注意在内核态下,内核代码将始终可用。
* `_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, void *arg);`创建一个用户进程(地址空间p用户栈地址ustack内核栈地址kstack入口地址entry参数arg).
* `_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, int argc, char **argv, char **envp);`创建一个在低权限运行的地址空间。`p`必须被`_protect``argv`, `envp`必须指向用户栈中的内容。(地址空间p用户栈地址ustack内核栈地址kstack入口地址entry, 其余为用户进程参数).
## Multi-Processor Extension (多处理器扩展)

View File

@ -87,7 +87,7 @@ void _map(_Protect *p, void *va, void *pa, int mode);
void *_query(_Protect *p, void *va, int *mode);
void _unmap(_Protect *p, void *va);
void _switch(_Protect *p);
_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, void *arg);
_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, int argc, char **argv, char **envp);
// =======================================================================
// [4] Multi-Processor Extension (MPE)

View File

@ -15,9 +15,10 @@ struct _RegSet {
ss0, esp0;
};
#define REG1(regs) ((regs)->eax)
#define REG2(regs) ((regs)->ebx)
#define REG3(regs) ((regs)->ecx)
#define REG4(regs) ((regs)->edx)
#define GPR1 eax
#define GPR2 ebx
#define GPR3 ecx
#define GPR4 edx
#define GPRx eax
#endif