对应文件:kalloc.c
物理内存布局
在Xv6中,物理内存大小是固定的,为128MB。物理内存起止也是固定的,由宏 KERNVASE 和 宏 PHYSTOP 定义。系统启动时,会把内核的代码加载到物理内存当中去;因此,可用的物理内存起始由符号 end 声明。
物理内存管理
物理内存数据结构
struct
{
struct spinlock lock;
struct run *freelist;
} kmem;
kmem 定义了一个指向链表头部的指针,外加一个保护的锁
struct run
{
struct run *next;
};
struct run 结构体变量位于每个页的最低地址处,占8字节, 指向下一个物理页
物理内存分配
物理内存分配先当与链表删除操作,即从链表头部删除一个页
void* kalloc(void)
{
struct run *r;
acquire(&kmem.lock);
r = kmem.freelist;
if (r)
kmem.freelist = r->next;
release(&kmem.lock);
if (r)
memset((char *)r, 5, PGSIZE); // fill with junk
return (void *)r;
}
物理内存释放
物理内存释放相当于链表插入操作,在链表头部插入一个页
void kfree(void *pa)
{
struct run *r;
if (((uint64)pa % PGSIZE) != 0 || (char *)pa < end || (uint64)pa >= PHYSTOP)
panic("kfree");
// Fill with junk to catch dangling refs.
memset(pa, 1, PGSIZE);
r = (struct run *)pa;
acquire(&kmem.lock);
r->next = kmem.freelist;
kmem.freelist = r;
release(&kmem.lock);
}