xv6的buddy系统的源代码

原创 2011年01月14日 02:41:00

#include"buddy.h"

#include"defs.h"

free_area_t  free_area[MAX_ORDER];//定义free_area_t类型的free_area数组

struct Page*mem_map;

const int FreeAreaSize[MAX_ORDER]={1,2,4,8,16,32,64,128,256,512,1024};//定义数组FreeAreaSize

void test_buddy();

//check if pointer page  indicates the first page frame of a block of order_size pages

//if so ,return1 ,else return 0;

int page_is_buddy(struct Page *page,int order)//页是在buddy系统中

{

if(PageProperty(page)&&page->property==order&&!PageReserved(page))

return 1;

return 0;

void init_memmap_buddy(struct Page*base,unsigned long nr)//对初始化内存把空闲内存放到buddy系统上

{

 int i,order;

struct Page*page=base ;

mem_map=base;

for(i=0;i<MAX_ORDER;i++)

{

if(!LIST_EMPTY(&(free_area[i].free_list)))

panic("error");

}

while(nr)

{

for(order=10;order>=0;order--)//分配内存到buddy系统上

{

    if(nr>=FreeAreaSize[i])

    LIST_INSERT_HEAD(&(free_area[order].free_list),page,lru);

    free_area[order].nr_free++;

    page->property=order;

    nr-=FreeAreaSize[order];

   page+=FreeAreaSize[order];

    break;

}

}
}

//在buddy系统上寻找合适的空闲块分配给请求的大小

struct Page*alloc_pages_buddy(int nr)

{

struct Page*p;

for(i=0;i<MAX_ORDER;i++){

if(nr<frea_area[i])

{

  p=alloc_pages_buddy_bulk(i);

 dbmsg("cpu%xkalloc%x":order%d;/n",cpu(),p-pages,i);

  return p;

}

 

}

return NULL;

}

//implement  buddy system strategy for freeing page frame;

struct Page*alloc_pages_bulk_buddy(int order)

{

 int isalloc=0;

int current_order,size=0;

struct Page*page=NULL,*buddy=NULL;

for(current_order=order;current_order<MAX_ORDER;current_order++)

     if(!LIST_EMPTY(&(free_area[current_order].free_list)))

{

     isalloc=1;

     break;

}

if(!isalloc)

return NULL;

//找到空闲物理块然后分配出去

else{

 page=LIST_FIRST(&(free_area[current_order].free_list));

LIST_REMOVE(page,lru);

page->property=0;

ClearPageProperty(page);

free_area[current_order].nr_free--;

}

 

size=1<<current_order;

//从大到小进行折半操作

while(current_order>order)

{

 current_order--;

 size>>=1;

buddy=page+size;

 LIST_INSERT_HEAD(&(free_area[current_order].free_list),buddy,lru)

 buddy->property=current_order;

SetPageProperty(buddy);

free_area[current_order].nr_free++;

}

return page;

}

//按buddy系统的策略释放页框

//找到最贴近nr大小的FreeAreaSize[i],这时i是要和buddy系统上的伙伴合并的块的位置

void  free_pages_buddy(struct Page*page,int nr)

{int i;

 for(i=0;i<MAX_OEDER;i++)

  if(nr<FreeAreaSize[i])

  {

  dbmsg("kfree %x : order %d/n", page - pages, i);

   free_pages_bulk_buddy(page,i);

   return;

   }

}

}

//

void  free_pages_bulk_buddy(struct Page*page,int order)

{

 int size=1<<order;

unsigned long page_idx=page-mem_map,buddy_idx;

struct Page*buddy,*coalesced;

while(order<10)

{

  buddy_idx=size^page_idx;//找mem_map数组上page_idx的buddy;

  buddy=&mem_map[buddy_idx];//将buddy_idx为下标的数组的地址给buddy指针

 if(!page_is_buddy(buddy,order))

   break;

LIST_REMOVE(buddy,lru);//删除buddy上释放块的伙伴!

free_area[order].nr_free--;

 buddy->property=0;     //

ClearPageProperty(buddy);//

page_idx&=buddy_idx;

 order++;

size>>1;

}

coalesced=&mem_map[page_idx];
     dbmsg("free order %x,page %x/n",order,coalesced-pages);
     coalesced->property=order;
     SetPageProperty(coalesced);
     LIST_INSERT_HEAD(&(free_area[order].free_list),coalesced,lru);
     free_area[order].nr_free++;

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
  • 1746

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

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

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源码分析(一):BootLoader

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

Linux内存管理(2) - buddy系统

本文目的在于分析Linux内存管理机制中的伙伴系统。内核版本为2.6.31。 1.    伙伴系统 buddy分配器分配的最小单位是一页,并且只能分配2的幂次的页。要分配小于一页的要用到slab分配器...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2015年03月02日 20:54
  • 1764

伙伴系统和slab机制

伙伴系统 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为:  页全局...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年09月06日 12:15
  • 1462

buddy和slab那些事

说起buddy(伙伴系统)和slab的由来,我们得首先知道另外两个概念,什么叫内存的“内部碎片”什么叫内存的“外部碎片” buddy和slab的由来: 内部碎片:        内部碎片...
  • u014645605
  • u014645605
  • 2017年08月03日 13:15
  • 289

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 + Qemu 在Ubuntu下编译运行教程

一、使用工具说明 1.       xv6 源代码文件(以下三选一,我用的是第一个) 1)https://github.com/yinglang/Xv6  或 2)http://zoo.cs.yal...
  • yinglang19941010
  • yinglang19941010
  • 2015年10月21日 21:32
  • 2931
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:xv6的buddy系统的源代码
举报原因:
原因补充:

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