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();
}

 

 

 

 

xv6启动源码阅读

最近在学习MIT的6.828操作系统课程,课程地址:  https://pdos.csail.mit.edu/6.828/2016/ 。6.828的课程自带了一个简单的基于unix的操作系统。打算...
  • vally1989
  • vally1989
  • 2017年05月13日 12:57
  • 1178

xv6源码分析(四):内存管理

xv6通过页表机制实现了对内存空间的控制。页表使得 xv6 能够让不同进程各自的地址空间映射到相同的物理内存上,还能够为不同进程的内存提供保护。 除此之外,我们还能够通过使用页表来间接地实现一些特殊功...
  • qq_25426415
  • qq_25426415
  • 2017年01月21日 15:15
  • 1744

xv6源码分析(六):进程调度

xv6是支持多处理器多进程的操作系统,每个CPU都能够并行地运行不同的进程,同一个CPU也能通过不断地切换进程达到并发的效果,xv6在时钟中断机制下,在很短的时间内完成进程切换操作使得宏观上感觉在同一...
  • qq_25426415
  • qq_25426415
  • 2017年01月23日 15:12
  • 1152

xv6源码分析(一):BootLoader

BootLoader是操作系统启动时的重要一环,负责从实模式切换到保护模式并且将存在存储设备的操作系统二进制文件读入内存,最后将控制权交给操作系统。 一、计算机启动时的硬件动作 PC机上电时运行的...
  • qq_25426415
  • qq_25426415
  • 2017年01月17日 16:09
  • 2561

xv6 一个简单的,类unix适于教学的操作系统

Contents 0  操作系统接口 1 第一个进程 2 页表 3 陷阱(traps), 中断,以及驱动 4 锁 5 调试 (scheduling) 6 文件系统 A PC 硬件 B boot loa...
  • robinsongsog
  • robinsongsog
  • 2014年02月18日 12:31
  • 3838

xv6之添加alarm CPU中断检测

第三次修改了。再次记录下。 作业要求: In-class: xv6 CPU alarm We encourage you to collaborate with others on these...
  • hehe1527
  • hehe1527
  • 2013年11月18日 00:50
  • 2411

xv6 + Qemu 在Ubuntu下编译运行教程

一、使用工具说明 1.       xv6 源代码文件(以下三选一,我用的是第一个) 1)https://github.com/yinglang/Xv6  或 2)http://zoo.cs.yal...
  • yinglang19941010
  • yinglang19941010
  • 2015年10月21日 21:32
  • 2931

【xv6学习之HW1】shell

第一次的作业就把我难倒了。在此十分感谢JasonLeaster,没有这一系列的博文,我可能就要放弃了。希望能坚持下去,虽然比较难,但是我肯定能学到很多东西。 传送在此:http://blog.csdn...
  • woxiaohahaa
  • woxiaohahaa
  • 2015年10月23日 20:44
  • 3212

XV6操作系统的安装与使用

1.1  XV6操作系统的安装与使用     麻省理工大学的网站上 http://pdos.csail.mit.edu/6.828/2011/xv6.html,已经对XV6的来龙去脉及如何下载做了较详...
  • SheIsC
  • SheIsC
  • 2015年06月27日 22:07
  • 2661

基于XV6操作系统实验平台建设和哈工大操作系统实验 的搭建实验环境

基于XV6操作系统实验平台建设和哈工大操作系统实验 的搭建实验环境参加实验平台建设的第一步就是搭建操作系统平台: 说白了就是在linux系统下搭建一个虚拟机运行xv6这个操作系统 配置环境 Ubun...
  • junruitian
  • junruitian
  • 2017年11月28日 20:09
  • 136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:xv6中的pmap.c源代码
举报原因:
原因补充:

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