Mercurial > hg > Members > kono > Cerium
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 */