Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57683
  • 博文数量: 12
  • 博客积分: 1480
  • 博客等级: 上尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-20 10:01
文章分类
文章存档

2010年(1)

2008年(11)

我的朋友
最近访客

分类:

2008-10-12 13:45:07

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) |
给主人留下些什么吧!~~