OS  Homework 1

                                                                                   四資工三 B9715017 廖偉發

Part Ⅰ:

     Install nachos 4.0 on RedHat 9.0 & Ubuntu 10.10

Part Ⅱ:

     Process ( Thread ) 部分以state transition diagram描述程式

     Memory部分以sequence diagram描述程式

Part Ⅲ:

    分組分工說明:

Install nachos 4.0 on RedHat 9.0: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\redhat.jpg                          (Top)

#download NachOS
wget http://neuron.csie.ntust.edu.tw/homework/99/os/materials/nachos-4.0.tar.gz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\01.png

#unzip NachOS
tar -zxvf nachos-4.0.tar.gz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\02.png

#download cross-compiler
wget http://neuron.csie.ntust.edu.tw/homework/99/os/materials/mips-decstation.linux-xgcc.gz

#move cross-compiler to root directory(/)
#It can be changed by modify nachos/code/test/Makefile: GCCDIR
mv ./mips-decstation.linux-xgcc.tgz /
cd /

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\03.png

#cross-compiler need not unzip, it’s already an executable file
tar zxvf mips-decstation.linux-xgcc.tgz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\04.png

#Now compile NachOS. If you don’t have cross-compiler, compile will error.
cd root/nachos-4.0/code/
make

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\05.png

cd userprog/

ls

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\06.png

#execute a test file
./nachos -e ../test/test1

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os\07.png

 

Install nachos 4.0 on Ubuntu 10.10: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\Qref_Ubuntu_Logo.png [不降gcc板本,修改source code]                       (Top)

由於有一陣子沒有使用linux以及最近Ubuntu 10.10的釋出,不由得手癢,於是想在Ubuntu上安裝nachos試試!   

 

由於Ubuntu基於安全性的考量把root帳號給拿掉了…

所以只能用su or sudo指令來代替root的權限…@@

#download NachOS
wget http://neuron.csie.ntust.edu.tw/homework/99/os/materials/nachos-4.0.tar.gz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (1).png

#unzip NachOS
tar -zxvf nachos-4.0.tar.gz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (2).png

#download cross-compiler
wget http://neuron.csie.ntust.edu.tw/homework/99/os/materials/mips-decstation.linux-xgcc.gz
#move cross-compiler to root directory(/)
#It can be changed by modify nachos/code/test/Makefile: GCCDIR
mv ./mips-decstation.linux-xgcc.tgz /
cd /

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (3).png

#cross-compiler need not unzip, it’s already an executable file
tar zxvf mips-decstation.linux-xgcc.tgz

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (4).png

#Now compile NachOS. If you don’t have cross-compiler, compile will error.
cd root/nachos-4.0/code/
make

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (5).png

問題來了…使用make指令出現error

看來貼心助教群,叫我們用Redhat 9不是沒有原因的…

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (6).png

在這裡需要一點小修改…

vi指令去修改Makefile檔案

將裡面的gmake改成make,如下圖所示

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (7).png

繼續make試試,

可以用了…不還還是error

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (9).png

一樣用vi去修改下層目錄lib中的sysdep.h檔案

#include "iostream.h"

修改成

#include "iostream"

using namespace std

如下圖所示

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (10).png

繼續try 看看make

……還是錯誤…

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (11).png

一樣用vi去修改Makefile.common

-fwritable-strings去掉,如下圖所示…

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (12).png

並用vi修改lib/list.cc

將有產生error的變數都加上this->指針

描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\26.gif修改的東東太多就沒拍圖了…拍謝

再試試看make

Ok可以編譯了!

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (14).png

cd userprog/
ls

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (15).png

#execute a test file
./nachos -e ../test/test1

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\os ubn\Nachos (16).png

 

Process ( Thread ) 部分以state transition diagram描述程式:     (Top)                            

描述: 描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\image023.png

Tracing of Process (Thread) Management描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\0efc4d55d28704f4370ef874ae906161.gif

threads/main.cc

        Driver code to initialize, self test, and run operating system kernel.

static void Cleanup (int x):

1.      在螢幕上顯示 Cleaning

2.      delete process.

Int main (int argc, char **argv):

1.      比對輸入字串是否有-d –u –z參數

2.      create 一個kernelinitialize來存放kernel

3.      呼叫CallOnUserAbort(Cleanup),判斷user是否有輸入ctrl+c ,有則中斷/結束process.

4.      SelfTest of Kernel.

5.      Run of kernel.

threads/thread.cc

        Routines to manage threads.

Thread::Thread(char* threadName):

create 一個新的thread.

status = JUST_CREATED; 

Thread::~Thread():

Delete 一個thread.

Deallocated memory空間

 

void Thread::Fork(VoidFunctionPtr func, void *arg):

func是一個同時執行的procedure

arg一個參數透過指標傳給func/procedure

可以與fork出來的可以thread concurrent的執行

1.      allocate memory空間給thread

2.      save oldLevel

3.      thread放進ready queue.

 

End. SetLevel(oldLevel)

 

Void Thread::CheckOverflow():

檢查有無overflow…….

 

void Thread::Begin ():

ThreadRoot 呼叫,當正在執行forked thread時。

1.      Deallocate 先前執行完的thread空間

2.      允許中斷

 

void Thread::Finish ():

ThreadRoot 呼叫,當forked thread執行完成時。

允許Thread Sleep. (允許而已)

 

void Thread::Yield ():

如果下一個在ready queuethread,已經準備要run的話,則放棄cpu

thread放到ready queue的尾端排隊。

 

void Thread::Sleep (bool finishing):

放棄cpu使用權,因為正在執行的thread,在等待I/O or interrupt or event ,etc.

status = BLOCKED

直到I/O or event發生,則重回readyqueue排隊.

 

threads/scheduler.cc

        Routines to choose the next thread to run, and to dispatch to that thread.

Scheduler::Scheduler():

建一個list來存放thread

 

Scheduler::~Scheduler():

刪除readylist

 

void Scheduler::ReadyToRun (Thread *thread):

thread state設為ready

thread加到readylist

 

Thread * Scheduler::FindNextToRun ():

如果下一個readylistempty的話傳回null

若不是空的,則傳回readylist的最前面的thread,並remove它從list

 

void Scheduler::Run (Thread *nextThread, bool finishing):

cpu使用權給next thread ,old threadstate 記錄下來,並讀取next threadstate.

 

threads/kernel.cc

        Initialization and cleanup routines for the Nachos kernel.

ThreadedKernel::ThreadedKernel(int argc, char **argv):

Interpret 命令(command)

 

void ThreadedKernel::Initialize():

宣告&初始化 Nachosglobal data structure

stats, interrupt, scheduler ,alarm, etc.

 

ThreadedKernel::~ThreadedKernel():

Delete Nachosglobal data structure(alarm,scheduler,interrupt,stats)

 

void ThreadedKernel::Run():

do nothing, 但在初始化data structurs後,kernel會執行user’s program.

 

void ThreadedKernel::SelfTest():

測試module是否正常工作

 

Memory部分以sequence diagram描述程式:              (Top)

描述: 描述: 描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\B9715017-hw1-1\index.files\image024.png

Tracing of Memory management描述: 描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\0efc4d55d28704f4370ef874ae906161.gif

machine/machine.cc

        Routines for simulating the execution of user programs.

Machine::Machine(bool debug):

創造一個memory 結構

將所有的register[i]mainMemory[j]設為0,i<register 個數,j<memorysize

若有define USE_TLB則使用TLB,若無Define線性page table

 

Machine::~Machine():

deallocated mainmeory

 

void Machine::RaiseException(ExceptionType which, int badVAddr):

thread發生錯誤、overflow等異常現像時,從user mode 轉換到kernel mode

 

int Machine::ReadRegister(int num):

return register[num]

 

void Machine::WriteRegister(int num, int value):

register[num]=value

 

machine/translate.cc

        Routines to translate virtual addresses to physical addresses. Software sets up a table of legal translations.

        We look up in the table on every memory reference to find the true physical memory location.

bool Machine::ReadMem(int addr, int size, int *value):

virtual addresses轉成physical addresses,並讀取value出來。

 

bool Machine::WriteMem(int addr, int size, int value):

value寫到virtuall addresses

 

ExceptionType Machine::Translate:

virtual addresses轉成physical addresses

 

userprog/addrspace.cc

        Routines to manage address spaces (executing user programs).

static void SwapHeader (NoffHeader *noffH):

little endian 轉成 big endian

 

AddrSpace::AddrSpace():

New 一個page 給使用者程式跑

 

AddrSpace::~AddrSpace():

Delete page

 

bool AddrSpace::Load(char *fileName):

將使用者程式載入到memory

 

void AddrSpace::Execute(char *fileName):

執行 使用者程式

 

void AddrSpace::InitRegisters():

初始化使用者程式的register以便之後context switched

 

void AddrSpace::SaveState:

將使用者程式目前的執行狀態存起來

 

void AddrSpace::RestoreState():

還原之前使用者程式的狀態

 

 

分組分工說明:描述: 描述: 描述: 描述: C:\Users\qkersi\Desktop\cozy.gif                                   (Top)

 

姓名

貢獻比例

貢獻內容

B9715017 廖偉發

100%

Totally