diff TaskManager/kernel/schedule/Scheduler.cc @ 386:6113af8f183b

MemHash...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 06 Aug 2009 19:31:51 +0900
parents eab18aa0c7f6
children 5e2d30bfbf23
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/Scheduler.cc	Thu Aug 06 12:11:47 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Thu Aug 06 19:31:51 2009 +0900
@@ -3,6 +3,7 @@
 #include "Scheduler.h"
 #include "SchedNop.h"
 #include "error.h"
+#include <assert.h>
 
 /*
  * Edit kernel/schedule/xx.cc, Cell/spe/xx.cc will be over writen by this.
@@ -283,6 +284,10 @@
     return group->status();
 }
 
+/*
+    ここから下は、memory 以下にあるべき
+ */
+
 void*
 Scheduler::global_alloc(int id, int size)
 {
@@ -331,6 +336,9 @@
 }
 
 /*!
+
+  size 単位のMemory Segment を count 個作る
+
   @param [size] リストの要素1つのサイズ
   @param [count] 要素数
   @return allocate した領域のポインタ
@@ -348,8 +356,86 @@
         MemorySegment* next = (MemorySegment*)(mseg+seg_size*i);
         char* data = (char*)next+head_size;
         next->data = (void*)data;
+        next->size = size;
         mlist->addLast(next);
     }
 
     return mlist;
 }
+
+/*!
+
+    Main Memory のSegmentを取得する
+
+  @param [addr] Main Memory のアドレス
+  @param [m]    Mem List
+  @return allocate した領域のポインタ
+
+    memory directory にあるべきだが...
+
+ */
+MemorySegement * 
+Scheduler::get_segment(memaddr addr, MemList *m) 
+{
+    MemorySegment *s = hash->get(addr);
+    if (s) {
+	/* 既に load されている */
+	return s;
+    }
+   
+    /* LRU なので、もっとも使われてない segment を上書きする */ 
+    s = m->getLast();
+    m->moveToFirst(s);
+
+    memaddr old_addr = s->address;
+    s->tag = getTag();
+    smanager->dma_load(s->data, addr,
+                       s->size, s->tag);
+    /* 前のをhashから削除 */
+    hash->remove(old_addr);
+    /* 新しいaddress を登録 */
+    s->address = addr;
+    hash->put(s->address, s);
+
+    return s;
+}
+
+uint32
+Scheduler::get_tag()
+{
+    return 0;
+}
+
+/*!
+
+    Main Memory のSegmentを書き出す
+    Segment は get_segement されていて、
+    追い出されていてはいけない。
+       それを保証するのは難しい?
+
+  @param [addr] Main Memory のアドレス
+  @param [m]    Mem List
+  @return allocate した領域のポインタ
+
+ */
+void
+Scheduler::put_segment(MemorySegment *s)
+{
+    smanager->dma_store(s->data, s->addr,
+                       s->size, s->tag);
+}
+
+/*!
+
+    Main Memory のSegmentを読込、書き出しを待つ
+
+  @param [id]    MemorySegment のid
+
+ */
+void
+Scheduelr::wait_segment(MemorySegment *s)
+{
+    smanager->dma_wait(s->tag);
+}
+
+/* end */