home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.pdx.edu / 2014.02.ftp.ee.pdx.edu.tar / ftp.ee.pdx.edu / pub / users / Harry / Blitz / OSProject / p4 / Kernel.h < prev    next >
Text File  |  2009-03-26  |  10KB  |  302 lines

  1. header Kernel
  2.  
  3.   uses System, List, BitMap
  4.  
  5.   const
  6.  
  7.     SYSTEM_STACK_SIZE = 1000       -- in words
  8.     STACK_SENTINEL = 0x24242424    -- in ASCII, this is "$$$$"
  9.  
  10.     -- The kernel code will load into the first megabyte of physical memory.  This
  11.     -- should be more than enough.  We will use the second megabyte for page frames.
  12.     -- Thus, the frame region is 128 page frames of 8K each.
  13.  
  14.     PAGE_SIZE = 8192                                  -- in hex: 0x0000 2000
  15.     PHYSICAL_ADDRESS_OF_FIRST_PAGE_FRAME = 1048576    -- in hex: 0x0010 0000
  16.     --NUMBER_OF_PHYSICAL_PAGE_FRAMES = 512              -- in hex: 0x0000 0200
  17.     NUMBER_OF_PHYSICAL_PAGE_FRAMES = 27               -- for testing only
  18.  
  19.     MAX_NUMBER_OF_PROCESSES = 10
  20.     MAX_STRING_SIZE = 20
  21.     MAX_PAGES_PER_VIRT_SPACE = 20
  22.     MAX_FILES_PER_PROCESS = 10
  23.     MAX_NUMBER_OF_FILE_CONTROL_BLOCKS = 10
  24.     MAX_NUMBER_OF_OPEN_FILES = 10
  25.     USER_STACK_SIZE_IN_PAGES = 1
  26.     NUMBER_OF_ENVIRONMENT_PAGES = 0
  27.  
  28.     SERIAL_GET_BUFFER_SIZE = 10
  29.     SERIAL_PUT_BUFFER_SIZE = 10
  30.  
  31.   enum JUST_CREATED, READY, RUNNING, BLOCKED, UNUSED      -- Thread status
  32.   enum ENABLED, DISABLED                                  -- Interrupt status
  33.   enum FILE, TERMINAL, PIPE                               -- Kinds of OpenFile
  34.  
  35.   -- Syscall code numbers for kernel interface routines
  36.   -- NOTE: These codes must exactly match an identical enum in UserSystem.h
  37.   enum SYSCALL_EXIT = 1,
  38.        SYSCALL_SHUTDOWN,
  39.        SYSCALL_YIELD,
  40.        SYSCALL_FORK,
  41.        SYSCALL_JOIN,
  42.        SYSCALL_EXEC,
  43.        SYSCALL_CREATE,
  44.        SYSCALL_OPEN,
  45.        SYSCALL_READ,
  46.        SYSCALL_WRITE,
  47.        SYSCALL_SEEK,
  48.        SYSCALL_CLOSE
  49.   enum
  50.     ACTIVE, ZOMBIE, FREE     -- Status of a ProcessControlBlock
  51.  
  52.   var
  53.     readyList: List [Thread]
  54.     currentThread: ptr to Thread
  55.     mainThread: Thread
  56.     idleThread: Thread
  57.     threadsToBeDestroyed:  List [Thread]
  58.     currentInterruptStatus: int
  59.     processManager: ProcessManager
  60.     threadManager: ThreadManager
  61.     frameManager: FrameManager
  62.     --diskDriver: DiskDriver
  63.     --serialDriver: SerialDriver
  64.     --fileManager: FileManager
  65.  
  66.   functions
  67.  
  68.     -- These routines are called from the Runtime.s assembly code when
  69.     -- the corresponding interrupt/syscall occurs:
  70.  
  71.     TimerInterruptHandler ()
  72.     DiskInterruptHandler ()
  73.     SerialInterruptHandler ()
  74.     IllegalInstructionHandler ()
  75.     ArithmeticExceptionHandler ()
  76.     AddressExceptionHandler ()
  77.     PageInvalidExceptionHandler ()
  78.     PageReadonlyExceptionHandler ()
  79.     PrivilegedInstructionHandler ()
  80.     AlignmentExceptionHandler ()
  81.     SyscallTrapHandler (syscallCodeNum, arg1, arg2, arg3, arg4: int) returns int
  82.  
  83.     -- These routines are invoked when a kernel call is made:
  84.  
  85.     Handle_Sys_Fork () returns int
  86.     Handle_Sys_Yield ()
  87.     Handle_Sys_Exec (filename: ptr to array of char) returns int
  88.     Handle_Sys_Join (processID: int) returns int
  89.     Handle_Sys_Exit (returnStatus: int)
  90.     Handle_Sys_Create (filename: String) returns int
  91.     Handle_Sys_Open (filename: String) returns int
  92.     Handle_Sys_Read (fileDesc: int, buffer: ptr to char, sizeInBytes: int) returns int
  93.     Handle_Sys_Write (fileDesc: int, buffer: ptr to char, sizeInBytes: int) returns int
  94.     Handle_Sys_Seek (fileDesc: int, newCurrentPos: int) returns int
  95.     Handle_Sys_Close (fileDesc: int)
  96.     Handle_Sys_Shutdown ()
  97.  
  98.     InitializeScheduler ()
  99.     Run (nextThread: ptr to Thread)
  100.     PrintReadyList ()
  101.     ThreadStartMain ()
  102.     ThreadFinish ()
  103.     FatalError_ThreadVersion (errorMessage: ptr to array of char)
  104.     SetInterruptsTo (newStatus: int) returns int
  105.     ProcessFinish (exitStatus: int)
  106.  
  107.     -- Routines from Switch.s:
  108.  
  109.     external Switch (prevThread, nextThread: ptr to Thread)
  110.     external ThreadStartUp ()
  111.     external GetOldUserPCFromSystemStack () returns int
  112.     external LoadPageTableRegs (ptbr, ptlr: int)  -- Execute "LDPTBR" and "LDPTLR"
  113.     external SaveUserRegs (p: ptr to int)         -- Execute "readu" instructions
  114.     external RestoreUserRegs (p: ptr to int)      -- Execute "writeu" instructions
  115.  
  116.     -- The following routine sets the "InterruptsEnabled" bit, sets the
  117.     -- "PagingEnabled" bit, clears the "SystemMode" bit, and jumps to the
  118.     -- address given by "initPC".
  119.     external BecomeUserThread (initStack, initPC, initSystemStack: int)
  120.  
  121.  
  122.   ---------------  Semaphore  ---------------
  123.  
  124.   class Semaphore
  125.     superclass Object
  126.     fields
  127.       count: int
  128.       waitingThreads: List [Thread]
  129.     methods
  130.       Init (initialCount: int)
  131.       Down ()
  132.       Up ()
  133.   endClass
  134.  
  135.   ---------------  Mutex  ---------------
  136.  
  137.   class Mutex
  138.     superclass Object
  139.     fields
  140.       heldBy: ptr to Thread           -- Null means this mutex is unlocked.
  141.       waitingThreads: List [Thread]
  142.     methods
  143.       Init ()
  144.       Lock ()
  145.       Unlock ()
  146.       IsHeldByCurrentThread () returns bool
  147.   endClass
  148.  
  149.   ---------------  Condition  ---------------
  150.  
  151.   class Condition
  152.     superclass Object
  153.     fields
  154.       waitingThreads: List [Thread]
  155.     methods
  156.       Init ()
  157.       Wait (mutex: ptr to Mutex)
  158.       Signal (mutex: ptr to Mutex)
  159.       Broadcast (mutex: ptr to Mutex)
  160.   endClass
  161.  
  162.   ---------------  Thread  ---------------
  163.  
  164.   class Thread
  165.     superclass Listable
  166.     fields
  167.       -- The first two fields are at fixed offsets, hardwired into Switch!
  168.       regs: array [13] of int        -- Space for r2..r14
  169.       stackTop: ptr to void          -- Space for r15 (system stack top ptr)
  170.       name: ptr to array of char
  171.       status: int                    -- JUST_CREATED, READY, RUNNING, BLOCKED, UNUSED
  172.       initialFunction: ptr to function (int)    -- The thread's "main" function
  173.       initialArgument: int                      -- The argument to that function
  174.       systemStack: array [SYSTEM_STACK_SIZE] of int
  175.       isUserThread: bool
  176.       userRegs: array [15] of int    -- Space for r1..r15
  177.       myProcess: ptr to ProcessControlBlock
  178.     methods
  179.       Init (n: ptr to array of char)
  180.       Fork (fun: ptr to function (int), arg: int)
  181.       Yield ()
  182.       Sleep ()
  183.       CheckOverflow ()
  184.       Print ()
  185.   endClass
  186.  
  187.   -----------------------------  ThreadManager  ---------------------------------
  188.   --
  189.   --  There is only one instance of this class, created at startup time.
  190.   --
  191.   class ThreadManager
  192.     superclass Object
  193.     fields
  194.       threadTable: array [MAX_NUMBER_OF_PROCESSES] of Thread
  195.       freeList: List [Thread]
  196.     methods
  197.       Init ()
  198.       Print ()
  199.       GetANewThread () returns ptr to Thread
  200.       FreeThread (th: ptr to Thread)
  201.   endClass
  202.  
  203.   -----------------------------  ProcessControlBlock  ---------------------------------
  204.   --
  205.   --  There are a fixed, preset number of these objects, which are created at
  206.   --  startup and are kept in the array "ProcessManager.processTable".  When
  207.   --  a process is started, a ProcessControlBlock is allocated from this
  208.   --  array and the state of the process is kept in this object.
  209.   --
  210.   class ProcessControlBlock
  211.     superclass Listable
  212.     fields
  213.       pid: int                      -- The process ID
  214.       parentsPid: int               -- The pid of the parent of this process
  215.       status: int                   -- ACTIVE, ZOMBIE, or FREE
  216.       myThread: ptr to Thread       -- Each process has one thread
  217.       exitStatus: int               -- The value passed to Sys_Exit
  218.       addrSpace: AddrSpace          -- The logical address space
  219.       -- fileDescriptor: array [MAX_FILES_PER_PROCESS] of ptr to OpenFile
  220.     methods
  221.       Init ()
  222.       Print ()
  223.       PrintShort ()
  224.   endClass
  225.  
  226.   -----------------------------  ProcessManager  ---------------------------------
  227.   --
  228.   --  There is only one instance of this class, created at startup time.
  229.   --
  230.   class ProcessManager
  231.     superclass Object
  232.     fields
  233.       processTable: array [MAX_NUMBER_OF_PROCESSES] of ProcessControlBlock
  234.       processManagerLock: Mutex               -- These synchronization objects
  235.       aProcessBecameFree: Condition           --     apply to the "freeList"
  236.       freeList: List [ProcessControlBlock]
  237.       aProcessDied: Condition                 -- Signalled for new ZOMBIEs
  238.       nextPid: int
  239.     methods
  240.       Init ()
  241.       Print ()
  242.       PrintShort ()
  243.       GetANewProcess () returns ptr to ProcessControlBlock
  244.       FreeProcess (p: ptr to ProcessControlBlock)
  245.       --TurnIntoZombie (p: ptr to ProcessControlBlock)
  246.       --WaitForZombie (proc: ptr to ProcessControlBlock) returns int
  247.   endClass
  248.  
  249.   -----------------------------  FrameManager  ---------------------------------
  250.   --
  251.   --  There is only one instance of this class.
  252.   --
  253.   class FrameManager
  254.     superclass Object
  255.     fields
  256.       framesInUse: BitMap
  257.       numberFreeFrames: int
  258.       frameManagerLock: Mutex
  259.       newFramesAvailable: Condition
  260.     methods
  261.       Init ()
  262.       Print ()
  263.       GetAFrame () returns int                         -- returns addr of frame
  264.       GetNewFrames (aPageTable: ptr to AddrSpace, numFramesNeeded: int)
  265.       ReturnAllFrames (aPageTable: ptr to AddrSpace)
  266.   endClass
  267.  
  268.   -----------------------------  AddrSpace  ---------------------------------
  269.   --
  270.   --  There is one instance for every virtual address space.
  271.   --
  272.   class AddrSpace
  273.     superclass Object
  274.     fields
  275.       numberOfPages: int
  276.       pageTable: array [MAX_PAGES_PER_VIRT_SPACE] of int
  277.     methods
  278.       Init ()
  279.       Print ()
  280.       ExtractFrameAddr (entry: int) returns int
  281.       ExtractUndefinedBits (entry: int) returns int
  282.       SetFrameAddr (entry: int, frameAddr: int)
  283.       IsDirty (entry: int) returns bool
  284.       IsReferenced (entry: int) returns bool
  285.       IsWritable (entry: int) returns bool
  286.       IsValid (entry: int) returns bool
  287.       SetDirty (entry: int)
  288.       SetReferenced (entry: int)
  289.       SetWritable (entry: int)
  290.       SetValid (entry: int)
  291.       ClearDirty (entry: int)
  292.       ClearReferenced (entry: int)
  293.       ClearWritable (entry: int)
  294.       ClearValid (entry: int)
  295.       SetToThisPageTable ()
  296.       CopyBytesFromVirtual (kernelAddr, virtAddr, numBytes: int) returns int
  297.       CopyBytesToVirtual (virtAddr, kernelAddr, numBytes: int) returns int
  298.       GetStringFromVirtual (kernelAddr: String, virtAddr, maxSize: int) returns int
  299.   endClass
  300.  
  301. endHeader
  302.