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 / version-1-0 / OSProject / p4 / Kernel-Starter.h < prev    next >
Text File  |  2006-04-19  |  10KB  |  300 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_IN_BUFFER_SIZE = 10
  29.     SERIAL_OUT_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 = new Thread
  56.     idleThread: Thread = new 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.     ThreadStart ()
  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.       Wait ()
  132.       Signal ()
  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.       systemStack: array [SYSTEM_STACK_SIZE] of int
  173.       isUserThread: bool
  174.       userRegs: array [15] of int    -- Space for r1..r15
  175.       myProcess: ptr to ProcessControlBlock
  176.     methods
  177.       Init (n: ptr to array of char)
  178.       Fork (fun: ptr to function (int), arg: int)
  179.       Yield ()
  180.       Sleep ()
  181.       CheckOverflow ()
  182.       Print ()
  183.   endClass
  184.  
  185.   -----------------------------  ThreadManager  ---------------------------------
  186.   --
  187.   --  There is only one instance of this class, created at startup time.
  188.   --
  189.   class ThreadManager
  190.     superclass Object
  191.     fields
  192.       threadTable: array [MAX_NUMBER_OF_PROCESSES] of Thread
  193.       freeList: List [Thread]
  194.     methods
  195.       Init ()
  196.       Print ()
  197.       GetANewThread () returns ptr to Thread
  198.       FreeThread (th: ptr to Thread)
  199.   endClass
  200.  
  201.   -----------------------------  ProcessControlBlock  ---------------------------------
  202.   --
  203.   --  There are a fixed, preset number of these objects, which are created at
  204.   --  startup and are kept in the array "ProcessManager.processTable".  When
  205.   --  a process is started, a ProcessControlBlock is allocated from this
  206.   --  array and the state of the process is kept in this object.
  207.   --
  208.   class ProcessControlBlock
  209.     superclass Listable
  210.     fields
  211.       pid: int                      -- The process ID
  212.       parentsPid: int               -- The pid of the parent of this process
  213.       status: int                   -- ACTIVE, ZOMBIE, or FREE
  214.       myThread: ptr to Thread       -- Each process has one thread
  215.       exitStatus: int               -- The value passed to Sys_Exit
  216.       addrSpace: AddrSpace          -- The logical address space
  217.       -- fileDescriptor: array [MAX_FILES_PER_PROCESS] of ptr to OpenFile
  218.     methods
  219.       Init ()
  220.       Print ()
  221.       PrintShort ()
  222.   endClass
  223.  
  224.   -----------------------------  ProcessManager  ---------------------------------
  225.   --
  226.   --  There is only one instance of this class, created at startup time.
  227.   --
  228.   class ProcessManager
  229.     superclass Object
  230.     fields
  231.       processTable: array [MAX_NUMBER_OF_PROCESSES] of ProcessControlBlock
  232.       processManagerLock: Mutex               -- These synchronization objects
  233.       aProcessBecameFree: Condition           --     apply to the "freeList"
  234.       freeList: List [ProcessControlBlock]
  235.       aProcessDied: Condition                 -- Signalled for new ZOMBIEs
  236.       nextPid: int
  237.     methods
  238.       Init ()
  239.       Print ()
  240.       PrintShort ()
  241.       GetANewProcess () returns ptr to ProcessControlBlock
  242.       FreeProcess (p: ptr to ProcessControlBlock)
  243.       --TurnIntoZombie (p: ptr to ProcessControlBlock)
  244.       --WaitForZombie (proc: ptr to ProcessControlBlock) returns int
  245.   endClass
  246.  
  247.   -----------------------------  FrameManager  ---------------------------------
  248.   --
  249.   --  There is only one instance of this class.
  250.   --
  251.   class FrameManager
  252.     superclass Object
  253.     fields
  254.       framesInUse: BitMap
  255.       numberFreeFrames: int
  256.       frameManagerLock: Mutex
  257.       newFramesAvailable: Condition
  258.     methods
  259.       Init ()
  260.       Print ()
  261.       GetAFrame () returns int                         -- returns addr of frame
  262.       GetNewFrames (aPageTable: ptr to AddrSpace, numFramesNeeded: int)
  263.       ReturnAllFrames (aPageTable: ptr to AddrSpace)
  264.   endClass
  265.  
  266.   -----------------------------  AddrSpace  ---------------------------------
  267.   --
  268.   --  There is one instance for every virtual address space.
  269.   --
  270.   class AddrSpace
  271.     superclass Object
  272.     fields
  273.       numberOfPages: int
  274.       pageTable: array [MAX_PAGES_PER_VIRT_SPACE] of int
  275.     methods
  276.       Init ()
  277.       Print ()
  278.       ExtractFrameAddr (entry: int) returns int
  279.       ExtractUndefinedBits (entry: int) returns int
  280.       SetFrameAddr (entry: int, frameAddr: int)
  281.       IsDirty (entry: int) returns bool
  282.       IsReferenced (entry: int) returns bool
  283.       IsWritable (entry: int) returns bool
  284.       IsValid (entry: int) returns bool
  285.       SetDirty (entry: int)
  286.       SetReferenced (entry: int)
  287.       SetWritable (entry: int)
  288.       SetValid (entry: int)
  289.       ClearDirty (entry: int)
  290.       ClearReferenced (entry: int)
  291.       ClearWritable (entry: int)
  292.       ClearValid (entry: int)
  293.       SetToThisPageTable ()
  294.       CopyBytesFromVirtual (kernelAddr, virtAddr, numBytes: int) returns int
  295.       CopyBytesToVirtual (virtAddr, kernelAddr, numBytes: int) returns int
  296.       GetStringFromVirtual (kernelAddr: String, virtAddr, maxSize: int) returns int
  297.   endClass
  298.  
  299. endHeader
  300.