xv6中的pmap.c源代码

原创 2011年01月14日 15:54:00

#include"param.h"

#include"pmap.h"

#include"phymem_manager.h"

#include"spinlock.h"

#include"assert.h"

uint npages;                 //number of avaiable pages//内存以页(4k大小)的形式的数量,这里的得到的是总的页数

char *start;                  //指向kernel后的内存地址

struct e820map *e820_memmap;

const struct phymem_manager_class *pmmc;//物理内存管理策略(buddy策略,first策略等等)的指针

struct Page *pages;//

struct spinlock kalloc_lock;

void init_pages_list (paddr_t start_addr,uint len,uint flags)//初始化内存页的标志位

{

paddr_t addr;

if(start_addr>=0xfec00000)

return;

assert (PGOFF(start_addr)==0,"error in init_pages_list");

for(addr=start_addr;addr<start_addr+len;addr+=PAGE)

{

page_frame(addr)->flags=flags;

}

}

void init_phypages(void)

{

int i;

uint len;

paddr_t  base;

npages=0;

e820_memmap=(struct e820map*)(0x8000);//根据中断int 15h所提供的内存的信息(有e820__memmap->map[i]数据结构数组保存内存的信息),

for(i=0;i<e820_memmap->nr_map;i++)

{

npages+=e820_memmap->map[i].size/PAGE;//计算的内存的总页数

cprintf("total available memory pages",npages);

pages=(struct Page*)start;//设置紧跟kernel后的地址

memset(pages,0,sizeof(struct Page)*npages);//初始化pages所指的内存大小的块

start+=ROUNDUP(sizeof(struct Page)*npages,PAGE);//已PAGE向上对齐start

cprintf("start%x/n",(uint )start);

for(i=0;i<e820_memmap->nr_map;i++)//

{

base=(paddr_t)e820_memmap->map[i].addr;

base=ROUNDUP(base,PAGE);

len=(uint )e820_memmap->map[i].size;

switch(e820_memmap->map[i].type)

{

 

case E820_ARM://类型ARM

if (base+len<(uint)start)

{

init_pages_list(base,(uint)start-base,PG_reserved);//初始化页标志

cprintf("reserved for kernel %x,size%x/n",base,(uint)start-base);

else

{

 if(base<(uint )start)//当base 在start前面

{

init_pages_list(base,(uint)start-base,PG_reserved);//这段内存设置成保留区(reserved)

cprintf("reserved for kernel %x,size,%x/n",base,(uint)start-base);

init_pages_list((paddr_t)start,len+base-(uint)start,0);//这段设置成可用区

pmmc->init_memmap(page_frame((paddr_t)start),(len+base-(uint)start)/PAGE);//调用init_memmap函数把可用内存段加入buddy系统中;

cprintf("free memory%x,size%x/n",(paddr_t)start,len+base-(uint)start);

}

else

{

init_pages_list(base,len,0);

pmmc->init_memmap(page_frame(base),len/PAGE);

cprintf("free memory %x,size%x/n",base,len);

}

}

break;

case E820_ARR:

 init_pages_list(base,len,PG_reserved);

cprintf("reserved memory %x,size%x/n,base,len);

break;

default:

break;

}

}

}

 

//allocate n bytes of physical memory;

//return a kernel-segment pointer

//return 0 if the memory can not be allocated

char *kalloc(int n) //分配n个字节的物理内存

{

 int nr;

struct Page*p;

if(n<=0||n%PAGE)

panic("kalloc");

nr=n/PAGE;

if(nr>1024)

panic("kalloc:exceed maxium pages that kalloc can  handle/n");

acquire(&kalloc_lock);

p=alloc_pages(nr);//调用alloc_pages函数为请求物理内存的需求做内存分配;

release(&kalloc_lock);

if(p)

return (char*)page_addr(p);//返回物理地址

else

{

cprintf("kalloc:out of memory");

return 0;

}

}

// Free the len bytes of memory pointed at by v,
// which normally should have been returned by a
// call to kalloc(len).  (The exception is when
// initializing the allocator; see pmm_init above.)
void kfree(char *v, int len)
{
    int nr;
    if (len <= 0 || len % PAGE)
        panic("kfree");
    nr = len / PAGE;
    if (nr > 1024)
        panic("kree : exceed maximum pages that kfree can handle/n");
    acquire(&kalloc_lock);
    //cprintf("free %x/n", (uint)v);
    free_pages(page_frame(v), nr);
    release(&kalloc_lock);
}

void pmm_init(void)

{

extern int end;

start =(char*)&end;//把end指针付给start指针

start=(char*)(((uint)start+PAGE)&~(PAGE-1));//对齐

cprintf("mm_init: kernel end is at %x, new free phy mem start at %x/n", end, start);

#ifdef BUDDY
    pmmc = &pmmc_buddy;
#endif
#ifdef FIRSTFIT
    pmmc = &pmmc_firstfit;
#endif
#ifdef BESTFIT
    pmmc = &pmmc_bestfit;
#endif
#ifdef WORSTFIT
    pmmc = &pmmc_worstfit;
#endif

    init_phypages();

    pmmc->test_phymem_manager();
}

 

 

 

 

相关文章推荐

assert(pMap != NULL)错误的解决办法

最近在使用mfc进行多线程程序开发的过程中,由于需要实时在某个控件上进行数据更新操作,因此将某个控件进行了变量绑定,通过改变变量进行数据更新操作,但是每次都显示错误导致程序不能运行,具体指向winco...

xv6分析--mkfs源代码注释

xv6中mkfs.c的作用是构建一个跟文件系统镜像,添加用户指定的文件到这个镜像, 本人水平有限,分析难免有错,各位大神指正,分析如下: #include #include #include ...
  • Mumu3w
  • Mumu3w
  • 2017年01月07日 13:46
  • 463

XV6源代码阅读--进程与内存管理

由于工作和兴趣爱好的关系,接触了不少实时操作系统, 一般来说实时操作系统基本没有进程的概念了,无非是任务堆栈的切换。 一直对Linux,Windows这种带有进程的OS,很好奇,无奈,LINUX...

yale_OS(2)——OS-xv6的源代码的调试

xv6源代码的调试(源代码的下载,编译,运行如:yale_OS(1)——OS-xv6的源代码的下载,编译和运行所示) 在QEMU下远程调试xv6.(学习课程地址如下:http://zoo.cs....

xv6的buddy系统的源代码

#include"buddy.h"#include"defs.h"free_area_t  free_area[MAX_ORDER];//定义free_area_t类型的free_area数组stru...

xv6的lab1中的proj1的bootmain.c

//boot loader //Part of the boot sector ,along with bootasm.S which calls bootmain(),//bootasm.S has...

xv6的bootloader之bootmain.c

xv6 系统中的bootloader 程序的组成之一是bootmain.c部分的功能:加载硬盘的kernel部分到内存中;#include"type.h"#incude"xv6.h"#include"...

xv6的main.c

//Bootloader////Part of the boot sector ,along with  bootasm.s which calls bootmain()//bootasm.S has...

xv6 源代码

  • 2015年10月21日 22:48
  • 113KB
  • 下载

xv6操作系统源代码

  • 2010年11月06日 00:20
  • 155KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:xv6中的pmap.c源代码
举报原因:
原因补充:

(最多只允许输入30个字)