inc/memlayout.h中对内存的映射与使用如下:
1. 将虚拟内存共计4G的空间的最高位置的256M预留,用来作为物理内存的映射,在JOS的内存使用中不会直接使用这段空间。在JOS中使用的某个页面,会通过mmu映射到这段空间,再通过映射和实际的物理内存相对应。这也是JOS最多只能管理256M物理内存的原因。
2. ULIM是区分内核和用户空间的位置。该位置以上为内核空间,用户程序不可见;而紧随其下的空间保存了用户空间的虚拟页表(UVPT)与环境参数,然后是异常处理栈,再其下为用户栈,向下增长。
3. 用户的程序数据与堆的位置从UTEXT=0x00800000=8M处开始。其下用于用户程序的临时页面映射时使用。同时避开了最下面的1M空间,因为该空间内640K-1M处为系统预留空间,无法使用,因此0-640K的内存与其上无法连续,使用起来会比较复杂。
4. 用于用户临时页面映射的空间为4M-8M处。而8M位置向下的4K为PFTEMP的空间,用于用户页面分配出错(page-fault)处理时作为映射空间。
5. 内核栈大小为KSTKSIZE=(8*PGSIZE)=32KB.
结合inc/queue.h可知,memlayout.h文件还定义了几个结构:
typedef struct {
struct Page *le_next; /* next element */
struct Page **le_prev; /* ptr to ptr to this element */
} Page_LIST_entry_t;
struct Page {
Page_LIST_entry_t pp_link; /* free list link */
uint16_t pp_ref;
};
struct Page_list {
struct Page *lh_first; /* first element */
}
简言之,即定义了结构Page_list, 它的作用是一个指向struct Page的指针,始终指向由struct Page组成的list的头部。而Page组成的list是一个双向链表,除了向前和向后的指针外,还定义了一个成员pp_ref, 用于记录某个已被分配的页面的被引用数。
(转贴请注明: by: chunchengfh, from: chunchengfh.cublog.cn)
阅读(1300) | 评论(0) | 转发(0) |