UOS Technical Specification

Preface
This document is intended to briefly list the UOS features which have not yet been (completely) implemented. The UOS documentation can be referred to for those features which have been implemented. It is less of a specification and more of a general guideline for features of UOS. The OpenVMS documentation provides the specification from which UOS is being developed.

1 Goals
The goals of UOS are as follows:

1) An operating system where the basic components are free and freely available.
2) Well documented for general users, programmers, and system administrators.
3) Reliable.
4) Secure.
5) Portable across diverse hardware platforms.
6) Able to run popular software under emulators.
7) Multi-user, multi-tasking.
8) Component architecture.
9) Scalable.

Other desried specific features:

1) Easily customizable by the end user.

2) Native network and cluster support.
3) Native disk shadowing and RAID support.
4) Support for both symmetrical and asymmetrical multiprocessing.

2 Introduction
UOS is a public-domain general-purpose, multi-user, multi-tasking, multi- threading, resource-sharing operating system. The design of the operating system is one of interchangable components. The kernel is the one unchanging piece. Components may be connected to the kernel to customize the system. However, the MMC (memory manager) and SHMC can only be changed at startup time. The kernel provides a consistent environment regardless of the customizations.

The following are the components and sub-components of UOS:

3 Architecture
UOS consists of several layers of software, each one abstracting above the lower levels. The lowest level is the Hardware Abstraction layer and consists of the hardware interface. The Executive (Operating System proper) sits on top of the Hardware Abstraction layer. The Executive consists of the Kernel, which interfaces the Hardware Abstraction layer to the OS components, and the components themselves. The Kernel also coordinates the activities of the various components.

4 Hardware Abstraction Layer
The Hardware Abstraction Layer (HAL) is a series of objects which encapsulate the various hardware functions. A pointer to the HAL object is passed to the Kernel by the Initializer at system startup. The Kernel can then request handles to the other objects and use them as desired. See the HAL document for details.

5 Memory and MMU
The MMU is used to allocate and manage memory. It is used by drivers and other parts of the O/S. When something requests a buffer, the MMU can refuse, in which case the caller can try again (after deleting other buffers) or abort.

I/O Buffers:
Drivers only request I/O buffers for unsolicited input. Solicited input always provides a buffer address. Solicited input is that which is requested via an I/O request. Unsolicited input is an asynchronus event (key click, mouse movement, etc).
Each I/O buffer has an ID and flags to synchronize multi-processor access. The ID is 0 if the buffer is not being accessed. It is the processor ID otherwise. Flags indicate how other processors can access the buffer:

Flag bitMeaning
1Read allowed
2Write allowed
4-128reserved
Paging:
The MMU supports paging on hardware with paging support. Pages are assigned a priority level of 0-127, with 0 being lowest priority. The MMU maintains 128 lists of pages. When pages need to be moved out of memory, the lowest priority pages are moved first. Among pages at a given level, the "oldest" page is removed first. Pages may also be locked. While locked, a page cannot be removed, regarless of its priority or age.

6 Interrupts
In order to provide emulation capabilities for other operating systems, the Kernel provides interrupt redirection. A process may associate any interrupt with a call-back routine. It may also set the interrupt to be used for accessing the UOS Kernel.

Interrupt Services:
function Set_OS_Interrupt( integer ) : integer
Sets the interrupt this process will use to access the Kernel. Returns 0 if success, an error code otherwise. Errors can occur if the requested interrupt is reserved for hardware. Only one Kernel interrupt can be set at a time, so this overrides any previous call. Only affects the calling process.

function Set_Interrupt( integer, procedure ) : integer
Sets the specified interrupt to call back to the specified procedure. Returns 0 if success, an error code otherwise. Errors can occur if the requested interrupt is reserved for hardware. Only affects the calling process.

procedure Clear_Interrupt( integer )
Unmaps the specified interrupt from any associated callback for this process.

7 Timers
The kernel timer routines provide ways to time events. Drivers can call the timer routines to time-out I/O requests. Timers may be one-shot or repeating.

8 Multiprocessing
The kernel supports two types of multiprocessing:

Network - uncoupled processors
Coupled - Two types:
- Loose (like VAX Cluster)
- Tight (multiple CPUs)
Each cluster has an ID (CID) which is generated by the first member of the cluster. A processor may join or leave a cluster at any time. Each task on a system has a CID matching the cluster type. When the task starts, the current CID is assigned. If the system is not part of a cluster, the CID is 0. When a system joins a cluster, the CID will not match the CID of existing tasks, thus the tasks do not automatically become part of the new cluster - that is, they cannot access cluster resources not located on the current processor.

9 System Startup
UOS startup has three distinct steps. 1. Bootstrap execution. The bootstrap program is written to the media when a bootable device is desired. The bootstrap is responsible for loading the UOS initializer and the File System component into memory. The File System component must be compatible with the file system on the boot media. The Kernel and File System component must be on the media, and must be contiguous. The bootstrap is written to the media with the logical block of the start of the Kernel and File System component, and the length of them, in bytes. The bootstrap loads these components into the lowest available memory address, writes the starting address of the File System component to a known memory address, which the initializer will then use to marshall the File System Component. This address will immediately follow the last address of the Initializer. The bootstrap also writes the last used address to a known memory location. Then the bootstrap transfers control to the initializer. 2. Initialization. The initializer has a standard version of all of the components built in, except for the File System. The Initializer does the following steps:

3. UOS Execution

10 The System Console
The first unit of the first physical terminal controller (TermA0:) is, by definition, the system hardware console (SHC). Any type of terminal device can be designated as the System Console. Unless otherwise defined, the SHC is the system console. If a designated system console becomes disabled or stalls long enough to fill its output buffer, it is unassigned as the system console and the SHC is used as the system console. All system messages are directed to the system console.

11 Data Integrity
Data integrity is provided with the following options:
- Verify on read
- Verify on write
- Verify on read and write
- No verification

Verification can be set at the following levels:
- System
- User
- Process
- File
- Disk

12 Files
There are three types of files: Persistent, Permanent, and Temporary. Persistent files are those on a volume which are created by the user. Permanent files are those which are open only for the duration of a process. Standard permanent files are INPUT, OUTPUT, ERROR, etc. Temporary files are those which are deleted when the image runs down.

13 Statistics
Four types of statistics are kept by the system:

Kernelstatistics by service (CPU time, call count, etc)
ProcessStatistics for the process (paging, I/O, CPU, etc.)
ImageStatistics for a run of an executable (paging, I/O, CPU, etc.)
I/OStatistics for I/O operations (max simultaneous users, locks, caching, opens, reads, writes, etc). Two categories:
File - Statistics for individual files
Overall - For the system as a whole since last startup

14 Command-line processor
The default command-line processor (shell) is called UCL.
A single colon (":") can be used to reference the last directory/file specification that was used in UCL.

15 System Utilities
The following standard utilities are provided with UOS:

NameSynopsis
ALLOCATEAllocate device access
APPENDConcatenate files together
ARCHIVEInvokes file compressor/archiver
ATTACHAttach to detached process
BackupFile backup/restore.
BASICBASIC interpreter.
BatchBatch queues.
BROADCASTSend message to terminal(s)
BrowserInternet browser (WWW, FTP, Gopher).
CDDCommon Data Dictionary.
CREATECreate an empty file
DebugSymbolic debugger (shell).
DELETEFile deletion
DETACHDetach from process
DEALLOCATEDeallocate device
DEPOSITWrite to virtual memory. UCL command. Only if current image <= current privilege.
DIRDirectory listing
DISMOUNTDismount a device
DUMPOutput contents of file or device in hex and decimal
EXAMINEExamine virtual memory. UCL command. Only if current image <= current privilege.
FORMATFormat media and/or hook a bootstrap to it.
FTPFTP utility
LinkExecutable linker.
MailElectronic mail (web and local).
MediaMedia player.
MOUNTMount a device
MOVEFile move
PhoneMulti-user communication (VOIP, IM, Chat).
PrintPrinter queues.
PURGERemoves old versions/backups of files
QUEInvokes the print/batch queue manager
RENAMERename a file
REQUESTSend request to system operator
SearchText search (simple, regular expression)
SETSet user preferences or file/device settings
SHOWShow user preferences or file/device settings
SortFile sort.
SPAWNSpawn a process
SUBMITSubmit a batch file to queue
SYNCHRONIZEPause process until another process completes
SVMSirius Virtual Machine.
SysConfigSystem configuration.
TaskTask manager.
TYPEOutput contents of file
UEUFile Editor.
UDBBasic relational database.
USSSimple spreadsheet.
WAITPause process for a specific amount of time


Batch support is also built in, providing the following operation

NameSynopsis
JOBMarks start of job

16 I/O Processing
Kernel I/O routines are routed through the File Processor. The general procedure for an I/O operation is as follows:

17 File Processor
The File Processor handles all file and device operations for the O/S. It can connect to multiple file systems and/or devices. A file system is a driver which is associated with one or more device drivers. The File Processor also allows direct device access from applications, but only when mounted in NFS (Non-file-structured) mode. At open time, file access is determined. Files can have the following access modes:

Single userOnly first user to open can access.
Mutli-StreamOnly a single process can open, but multiple streams can simultaneously access it.
Multi-UserThere are two types, based on locking:
No locking (default) The user must explicitly lock individual records.
LockingInitial open determines how others can access. Modes:
Read
Write
Update (records)
Delete (records)

Diagram of FPC:

The FPC keeps a list of file systems and the devices they serve. Each file system directly accesses a device. The device may be logical, in which case it maps I/O requests back through the FPC for file systems in files, or through the heap for memory-resident file systems. The device driver can directly map to a specific device, or it may map several devices (for shadowing, RAID, striping, etc).

A default file mask may be set up for a process, user, or group. This mask is used to default parts of the filename which are missing when files are opened. For example, a mask of "X:.BAS" and a filename of "T" would cause "X:T.BAS" to be opened. See Security for details on File System security.

All I/O requests are routed through the File Processor by the Kernel. The File Processor checks for protection and lock conflicts. The request is then passed on to the appropriate file system (if no conflicts). Services provided by the File Processor:

FunctionDescription
AppendAppends to a file.
Compare WCCompares a string and a wildcard and returns true/false if a match. Always false if string contains any wildcard characters.
CloseCloses a file or device.
Create DirectoryCreates a directory.
Create FileCreates a file.
Delete DirectoryDeletes a directory.
Delete FileDeletes a file.
Delete RecordDeletes a record from a file.
ExtendExtends the file length.
FlushFlush data to file or device.
LocateLocates a record by key (indexed files only).
LockLocks records in a file. This can be write locks (others can still read) or complete locks (only this process can access).
OpenOpens a file or device.
ReadReads from a file or device. For files, the read can specify whether and how to lock. It can Wait-For-Locks which will wait until a lock on the requested record is released and then read it (a potential deadlock situation). A time-out for the read operation to complete is allowed.
RenameChanges name of file. If file is renamed across devices, the file is copied first, then the old copy is deleted.
ResetInitializes file or device access.
Translate WCGiven a string and a wildcard, returns the string translated via the wildcard.
TruncateTruncates a file.
UnlockUnlocks records in a file.
UpdateUpdates a record in a file.

Further, the File Processor is responsible for caching data for performance. The store to use for caching can be set by the system. It defaults to memory, but can use other devices in addition to/in place of memory. If multiple stores are used for caching, the File Processor will use the one(s) with the fastest access speed and sufficient free space. If instructed, the File Processor can use a multi-level caching scheme, where older data is moved to lower-level stores (usually the lower the level, the slower the store).

File Properties
File Properties are an optional part of file systems. The native UOS file system supports them. Properties are text values with associated text names (both of any given length) which are associated with the file, but not considered part of the file's contents. Property names beginning with $ are reserved by UOS. Reading a property requires file Read privilege. Deleting or modifying a property requires Write privilege for the file. Standard UOS properties:

Property nameDescription
$COMMANDFile specification of Command completion interface. When a shell command is associated with this file, this is the program which provides command completion for the shell.
$COMMENTSUser comments associated with file.
$CONVERTER(List of) file specification(s) of program(s) used to convert file to another format (see Data Converters).
$DATAThe file's contents.
$DEFAULT(List of ) file specification(s) of file(s) with default properties for this file. If desired property is not defined for this file, the files in this list will be used, in order, to find the property. When found, that property value is used for this file.
$DELETEFile specification of program called to delete file. One standard program is File_Erase which overwrites all data and properties when deleting the file.
$EDITFile specification of program used to open the file for editing.
$FILE_SYSTEMFile specification of program used to interface to this file as a self-contained file-system.
$HELPFile specification of help file for this file.
$NAMEThe file's full name (not including path).
$OPENFile specification of program that provides a file interface to the file (non-raw access) for other programs.
$SEARCHFile specification of program used to search this file for text.

The following properties apply to user-defined properties (which can never contain "$"). "x" indicates the user-property name.
$x$DELETE
$x$EDIT

Usage notes:
UCL detects a space following a command (whether CCL or filename) and checks for a $COMMAND property for the associated file. If present, the $COMMAND program is executed and used to provide the user with command completion information.

18 Locking
Locking of file records and other resources is accomplished by the Lock Database Manager. It also detects deadlocks. File record locking has the following modes:

None (Explicit)user must specifically lock/unlock each record
Implicit (default)Current record is write-locked for other processes/streams. Any read operation causes this lock (unless read specifies otherwise - read regardless). An implicit lock is released on any of the following conditions:
  • Another record is accessed (locate or read) since only one implicit lock can exist on a stream at a time.
  • Record is updated
  • Record is deleted
  • Processes terminated (closes file)
  • File is closed
  • File is reset
  • Explicit unlock
  • New record is written to file
  • Errors during record operations

Types of locks:
Write lock against other processes/streams
Lock all access from other processes/streams
Lock read and writes (default)

A process can have multiple streams active for a given file. Each stream is treated separately for locking purposes.

19 File Systems
A file system is a collection of files, directories, etc. on a device. A device may be a physical device (disk), or a logical device (partition, file, etc.) An executable may be associated with a file system so that it is executed when the device is booted from. Only physical devices may be booted. A file system on a logical device with a "boot" executable can be executed as any executable file, in which case the associated executable file is executed. Thus, a package of one or more executables and files may be placed into a file system file, resulting in a single file for installation.

Files have version numbers. If a directory has a 0-version limit (the default), then files have no versions and utilities create .BAK files when changes are made.

19.1 File System Drivers
A File System is defined by a File System driver and an associated device. The following defines the procedures and functions required for a UOS File System driver:

function Driver_Version : word ;
This indicates the version of this device driver. Drivers conforming to this specification must return 0.

function Get_Capabilities : longint ;
Returns flags indicating the capabilities of this file system: FSCapable_Indexed Capable of Indexed I/O. FSCapable_Records Capable of record I/O.

function Append : longint ;
Appends to a file. Returns 0 for success or error code.

procedure Close( Handle : longint ) ;
Closes the specified file.

function Create_Directory( Path : string ) : longint ;
Creates the specified directory. Returns 0 for success or error code.

function Create_File( Name : string ; var Handle : longint ) : longint ;
Creates a file with the specified name (including path). Returns 0 for success or error code. Handle is ignored when passed, and the file handle on return, if successful. If the file already exists, it is deleted before the file is recreated.

function Delete_File( Path : string ) : longint ;
Deletes the specified file or directory. Returns 0 for success or error code.

function Delete_Record( Handle : longint ) : longint ;
Deletes the current record from the specified indexed file. Returns 0 for success or error code.

function Extend( Path : string ; Size : longint ) : longint ;
Extends the specified file to the specified length. Returns 0 for success or error code. If the file is already larger than the requested size, nothing happens.

function Get_Attributes( Path : string ; var Result : tDirectory_Entry ) : longint ;
Returns the attributes for the specified file, in Result. Returns 0 for success or error code.

function Get_Handle_Attributes( Handle : longint ; var Result : tDirectory_Entry ) : longint ;
Returns the attributes for the specified file, in Result. Returns 0 for success or error code.

function Get_Position( Handle : longint ; var Position : longint ) : longint ;
Returns the current position, in the specified file, in Position. Returns 0 for success or error code.

function Locate( Handle : longint ; var Key ) : longint ;
Locates a record in the specified indexed file by the specified key. Returns 0 for success or error code.

function Open( Name : string ; var Handle : longint ; Flags, Mode : longint ) : longint ;
Opens the specified file. Returns 0 for success or error code. If successful, the file handle is returned. Modes: Value Meaning ----- ------- OpenMode_Output Delete existing file, if any, and create new one. OpenMode_Input Open existing file. Error if it does not exist. OpenMode_Normal Open existing file. If it doesn't exist, create a new one. Flags: Value Meaning ----- ------- OpenF_Append Opens file in append mode.

function Read( Handle : longint ; var Buffer ; Size : longint ; Flags : longint ) : longint ;
Reads from the current position in the specified file into the specified buffer with the specified length. Returns 0 for success or error code.

function Rename( Old, New : string ) : longint ;
Changes name of the specified file. Returns 0 for success or error code. Files may be renamed across directories.

procedure Reset( Handle : longint ) ;
Initializes access for the specified file.

function Set_Attributes( Path : string ; Values : tDirectory_Entry ) : longint ;
Sets the attributes for the specified file. Certain fields and flags may be ignored, or may result in error. Returns 0 for success or error code.

function Set_Position( Handle, Position : longint ) : longint ;
Sets the current position, in the specified file, to Position. Returns 0 for success or error code.

function Truncate( Name : string ; Size : longint ) : longint ;
Truncates the specified file to the specified length. Returns 0 for success or error code. If the file is smaller than the specified size, nothing happens.

function Update( Handle : longint ) : longint ;
Updates the current record in the specified indexed file. Returns 0 for success or error code.

function Wildcard_Lookup( var Path : string ; var Context : longint ) : longint ;
Perform wildcard lookup. Returns 0 for success or error code. If Context is 0, the wildcard passed in Path is looked up. Path is set to the path and name of the located file and context is set to an internal non-zero value. For the same set of lookups, the context should be set to zero for the first call and unmodified by the user for subsequent calls. On subsequent calls, the passed Path is ignored and contains the next matching wildcard on return.

function Write( Handle : longint ; var Buffer ; Size : longint ; Flags : longint ) : longint ;
Writes to the current position of the specified file from the specified buffer with the specified size. Returns 0 for success or error code.

20 Devices
All devices have a software driver (see Device Drivers) through which the O/S accesses them. A device may be referred to with the construct:
<drivername><ID><unit>
where is the name of the driver class (for example, "DISK"), "ID" is the specific controller ID (single letter), and is the unit on that controller (up to 3 digits). For example, the third unit on the first disk controller is "DISKA3:".

A device can be opened as a file by specifying the above identifier. A controller can be opened by leaving the unit number off, in which case direct access to the controller functions is allowed.

Standard devices include disks, tapes, terminals, psuedo-terminals, virtual terminals, network interfaces, printers, and virtual disks. Disks may be R/W, RO, or WORM.

21 Processes
Processes are the minimum unit of resource allocation. All processes are owned either by another process, or directly or indirectly by a task. Each process has a numeric ID (PID) unique to the OS. This ID is combined with the system ID to create a cluster-wide PID, or CPID. Only one process may be attached to a physical device at a time. Thus, when spawning, the device is reattached to the spawned process (unless otherwise requested by the user). If the only process of a task is detached, then the task becomes detached. A detached task can run in the following modes, depending on user privileges, and detachment mode:

22 Security Management Component
Security is implemented as protections on objects and privileges for the processes which access them. Objects for which security is managed:

  • Memory buffers
  • Tasks, Processes, and Threads
  • Files
  • Devices (including processors)
  • Processes inherit the privileges of their parent process. The top level process has the default privileges of the user which the process belongs to. Privileges can be changed after process creation.

    File protections can be set for the following: World, Group, and User. This applies to ACLs as well.

    23 Programming Services
    Programming services are system services provided to ease programming and provide a consistent set of functions.

    EBCDIC to ASCII
    ASCII to EBCDIC
    CRC computation
    BNF compiler

    24 Process Management Component
    The smallest atomic unit of processor execution allocation is the Thread. A Thread is any given stream of instructions executed on a processor. Threads can only execute on a single processor without being swapped out and back in. Each thread is owned by a Process. Except for co-processing, there is a one-to-one correspondance. Although a thread can only have a single parent process, a process can have multiple threads. Each process is owned by a task or a parent process. A task associates all of its processes, and their threads, with a user for purposes of privilege, protection, resource logging, etc. A process can only have one associated task, but a task can have multiple processes. Threads and processes have IDs, which are long integers. Processes have the high bit set (negative values), whereas threads do not. Tasks also have a long integer ID. These IDs are unique across the system. Some of the differences between tasks, processes, and threads:

    TaskProcessThread
    ProcessorOwned by OSOwned by task or parent process.Assigned to a specific processor.
    Memoryn/aSeparate address space for each.Shares code and data with process. Owns separate stack.
    OtherCan send/receive data to/from other threads.
    LifetimeUntil deleted.Until deleted or task deleted.Until termination or Process deleted.
    Terminationall resources released.All threads terminated and all memory released.Stack space released. If this is the only thread of the process, then if the process is attached to a terminal or screen, a new thread is started for the shell. Otherwise, the terminal/screen is attached to the root thread of the process.
    Exceptionsn/an/aExceptions are reported to the thread to which they apply. If a terminating exception occurs, then if this is a co-thread, the exception is reported to the first thread of the process. If the process terminates due to a terminating exception in its only thread, the exception is reported to the first process of the task.

    Process Services:
    Spawn_ThreadSpawns a thread and returns its ID. Returns a negative value if failure.
    Get_First_Task( context )Returns ID of first task in system.
    Get_Next_Task( context )Returns ID of next task in the system for this context.
    Get_First_Thread( Process, context )Returns the ID of the first thread for the specified process.
    Get_Next_Thread( context )Returns the next thread ID for the context.

    25 Errors
    Text for errors is kept in a file called UOS_ERRORS.TXT, which is always open. The Kernel supplies a routine which will return the text for an error code. If the requested code does not exist, the service returns "ERROR #n" as text. The Kernel startup code opens this file on the boot device.

    Errors which occur as a result of OS overhead (not assignable to a specific user or process) are logged in the Error Log file. Any error which occurs during error logging results in a fatal bugcheck (system reboot).

    26 I/O Filters
    Filters can be attached to a terminal in order to convert input or output.

    27 Users
    The O/S manages resources based on user identifiers (or simply, "users"), their privileges, and resource protections. User names (identifiers) are 1 to 127 alphanumeric characters. Each user is a part of one or more groups.

    When a user is deleted from the user database, all references to that user on all mounted devices are removed, including mail, ALCs (local disks only), etc. Files owned by the deleted user are set to ownership by the user who deleted the old user.

    28 Symbols
    The Kernel provides named storage in memory for processes called symbols. Using a symbol, followed by a colon, in a file specification causes that symbol name to be replaced with its associated text. Thus, if a symbol named "Sym" had a value of "X:\Y\", and a file specification was passed to the O/S as "Sym:A.B", the file referenced would actually be "X:\Y\A.B". Symbol case is insignificant.

    A special case is the executable symbol which has the executable flag set and whose value is a program which is executed when the symbol is referenced. The program's return value is used as the translation value for the symbol.

    When a symbol needs to be translated, the Kernel looks at the process table, and if not found, proceeds to the task (top-level parent process) table, and so on up to the system table (shared with all processes on the system). To specify which table to use, a symbol can include an override. Format:
    name{[override {,override...} ]}

    where "override" is the override specifier. More than one override can be specified; the tables are searched in the order specified. For example, to refer to the symbol "Sym" in the system table, use "Sym[A]". When a user belongs to multiple groups, the group-level table for the task (and all sub-processes) becomes the union of all group tables: The group table is built for the task starting with the first group and moving to the last (listed), ignoring duplicates.

    The following standard symbols are provided:

    Symbol NameTypeDescription
    SYS$CURRENTProcessCurrent directory path.
    SYS$SHUTDOWNSystemContains the date and time of the next scheduled shutdown (if one in progress). Null if none.
    SYS$PERFORMANCESystemContains the MIPs rating of the fastest (or only) available processor in the CPU.

    29 System Services
    System services are POSIX compliant. Additional system services can be loaded by the user.

    30 Groups
    Groups provide a way of assigning privileges to users. A user can be assigned to one or more groups. A group may descend from another group. Descendant groups receive the privileges and restrictions of their parent. Each group can add to the privileges or restrictions it inherits from its parent. A user can belong to multiple groups, in which case their access is based on the maxmium of all groups they belong to.
    All groups descend from the System group, which grants all privileges. System Administrators usually have user names associated with this group. The "General" group descends from the System group and grants no privileges. Most users are associated with the General group.

    31 Logicals
    While O/S initializing builds a list of devices, it also creates logicals of the form: <class><unit>
    For example: TAPE0
    Valid classes: TERMINAL
    DISK
    PRINTER
    SOUND
    TAPE
    NULL

    32 System Parameters
    The following are system parameters that are changable by users of sufficient privilege:

    Parameter NameTypeDescription
    BATCHLIMITlongDefault batch job limit (number of batch jobs simultaneously running on system).
    CPU_QUOTAlongDefault CPU seconds allowed for a process before the system terminates it. 0 (default) means unlimited.
    DATACHECKspecialVerify data from random-access devices on:
    Read
    Write
    Both
    None (off)
    DEFPRIORITYlongDefault priority for processes.
    DEFPROTECTIONspecialDefault protection for newly created files.
    DEFQUEPRIORITYlongDefault queue priority. Default value is 65,536.
    DIRCACHElongAmount of memory to reserve for directory caching. 0 (default) indicates to use whatever memory is available.
    DISK_QUOTAlongDefault diskquota upon logout, in bytes. 0 (default) means unlimited.
    DORMANTlongNumber of seconds to wait until a blocked process can be swapped out.
    EXTRA_CPUlongNumber of CPU seconds allowed a task for exiting when it is terminated due to exceeding CPU limit (CPU_QUOTA).
    EXTRA_DISKlongDisk overdraft (DISK_QUOTA + EXTRA_DISK = absolute disk quota). Default is 0.
    MAP_CACHElongAmount of memory to reserve for disk map caching. 0 (default) indicates to cache entire disk map for all devices.
    MAXQUEPRIORITYlongMaximum queue priority for non-privileged users. Default is 16,777,215.
    MEMORY_QUOTAlongDefault maximum virtual memory allowed for a process. 0 (default) means unlimited.
    MEMORY_SIZElongMaximum physical memory. 0 means autoconfigure.
    REBOOTbooleanTrue to reboot on a bugcheck crash (default). False to halt on bugcheck crash.
    REBOOT_WAITlongNumber of seconds to wait for a console response when rebooting before continuing 0 (default) means infinite.
    TASK_LIMITlongMaximum number of top-level processes allowed at one time.
    TASK_QUOTAlongDefault user task quota (number of top-level processes belonging to a given user simultaneously). 0 (default) means unlimited.
    TERM_LOGINlongNumber of times a user can try to login before hangup or evasive action.
    TERM_LIMITlongNumber of seconds terminal is disabled when evasive action occurs.
    TERM_WIDTHlongDefault terminal width. Default value is 80.
    TYPE_AHEADlongSize of terminal type-ahead buffers.

    33 Device Drivers
    Device Drivers are the lowest level software and are in direct control of the hardware. Driver API functions are described in the following text. Function vectors which are inappropriate to a specific device must be 0. Unless otherwise stated, if a function is used for a specific device type, that function must exist for a driver for that device type. Access to driver functions is through a vector table at the beginning of the driver. The vector for each function is shown at the right margin after the function definition.

    function Driver_Version : word ; 0
    This indicates the version of this device driver. Drivers conforming to this description should return 0.

    function Max_Units : word ; 1
    Returns the maximum number of units for this controller. For single-device controllers, this is 1.

    procedure Set_Status( Unit : byte ; Status, Error, Density : longint ) ; 2
    Sets the device status. See Get_Status for details.

    function Get_Status( Unit : byte ; Status, Error, Density : longint ) : longint ; 3
    Returns the current device status, error code, and density. Density is the tape drive density (in bpi); it is ignored for other devices and for tapes which cannot change density. Density should be 0 for devices which cannot change density. Error is an error code (see Errors). Status is standardized status-code used by the operating system, consisting of the following bit flags (items with asterisk cannot be set with Set_Status):

    Status_AGCAGC is on for microphone input on sound card.
    Status_AllowInteruptsInterrupts are allowed by the device.
    *Status_BOTAt beginning of tape.
    Status_BreakBreak received.
    Status_CorrectedErrorA corrected error occurred.
    Status_DataCheckA non-correctable CRC error occurred (parity error on character devices).
    Status_DoorLockedDoor is locked on CDROM.
    *Status_DualAccessDevice is in dual/multi-access mode.
    *Status_EOTAt end of tape.
    Status_FrameErrorFrame error (character devices only).
    Status_GraphicsVideo device is in graphics mode (otherwise in text mode).
    Status_InputFilterUse input filter for sound card.
    Status_InterlaceInterlaced display.
    *Status_LEOTAt/past the Logical End Of Tape.
    Status_LoadedHeads/tape loaded.
    Status_MissedTransfer missed due to prior error.
    Status_NoECCDon't perform error correction.
    Status_NoPaperNo paper in printer.
    *Status_OpenCover/door is currently open.
    Status_OnLineDevice is on-line.
    Status_OutputFilterUse output filter for sound card.
    *Status_OverrunData overrun.
    *Status_RandomDevice is random-access (sequential-access otherwise).
    *Status_ReadReads are allowed.
    *Status_ReadyDevice is ready (on-line and not busy).
    *Status_RetraceVertical retrace is ocurring.
    *Status_SeekErrorSeek to invalid sector.
    Status_SmoothScrollSmooth video scrolling.
    Status_SpeakerOnSpeaker is on.
    *Status_SplitSpeedDifferent Input and Output speeds are allowed for this character device.
    Status_StereoInput is stereo.
    Status_TimeoutDevice timed out.
    *Status_UnloadableDevice can be unloaded.
    Status_VerifyVerify writes.
    *Status_WriteWrites are allowed.


    function Get_SN( Unit : byte ) : longint ; 4 Retrieves the serial number (some disks/CDROMs only).

    function Get_UPC( Unit : byte ) : longint ; 5 Retrieves the Universal Product Code (some CDROMs only).

    function Read( Unit : byte ; Position, Size : word ; Buffer : pointer ) : word ; 6
    Reads from the specified sector on the current track or cylinder for the specified number of sectors, into the specified buffer. For tapes, the position and size are ignored and a single record is read. For character devices, the Position is ignored. In any case, the actual number of sectors (disks) or bytes (tapes) read is returned. For video, the position is ignored (use Seek). The size is for bytes (text mode), or pixels (graphics mode). In text mode, the returned data is in three-byte sets. The first byte of each set is the character, the second and third are the attributes. See Write for attribute details.

    procedure Write( Unit : byte ; Position, Size : word ; Buffer : pointer ) ; 6
    Writes to the specified sector on the current track or cylinder for the specified number of sectors, from the specified buffer. For tapes, the position is ignored and a single record of the specified size is written. For character devices, the Position is ignored. For video, the position is write mode (use Seek for positioning). Position is ignored for text mode. The size is for bytes (text mode), or pixels (graphics mode). In text mode, the data is in three-byte sets. The first byte of each set is the character, the second and third are the attributes.

    Write Mode
    ValueMeaning
    0Replace
    1AND
    2OR
    3XOR

    Text Attributes
    BitsMeaning 15Background color 112Foreground color 128Bold (high bit of foreground) 256Blinking 512Underline 1024+reserved

    procedure Cancel( Unit : byte ) ; 7
    Cancels the current operation. On a character device, this flushes the buffer (if any).

    procedure Seek( Unit : byte ; Position : word ) ; 8
    For disks only, positions the head(s) to the specific track/cylinder. For CDROMs, this positions for reading from a particular surface (for CD packs only). For video drivers, the position anded with 32767 is the pixel/character position for the next output. If the highest bit is set, the position is the row, otherwise it is the column.

    procedure Skip( Unit : byte ; Count : integer ) ; 9
    For tapes only, skips the specified number of records. If the count is negative, it skips backwards. If the count is 0, it skips to the logical End Of Tape.

    procedure Write_IRG( Unit : byte ) ; 10
    For tapes only, writes an Inter-Record Gap.

    procedure Rewind( Unit : byte ) ; 11
    For tapes only, rewinds the tape.

    procedure Unload( Unit : byte ) ; 12
    Spins down the disk or unloads the tape/CDROM. This also forces the device off-line.

    procedure Special( Unit : byte ; Operation, Size : word ; Buffer : pointer ) ; 13
    Performs an operation unique to the device. The operating system never uses this method, but applications may do so.

    function Sector_Size( Unit : byte ) : word ; 14
    For disks/CDROMs only, returns the size of a sector, in bytes. For tapes, this is the maximum record size. For character devices, this is the maxmimum buffer size (usually 1).

    function Sector_Count( Unit : byte ) : word ; 15
    Returns the number of sectors on a track for a disk, or the maximum sectors on a CDROM.

    function Head_Count( Unit : byte ) : word ; 16
    Returns the count of heads for a disk/CDROM.

    function Track_Count( Unit : byte ) : word ; 17
    Returns the count of tracks for a disk. For a CDROM, this is always the same as Head_Count.

    procedure Get_Device_Snapshot( Unit : byte ; Buffer : pointer ) ; 18
    Fills the specified buffer with a snapshot of the device's registers. The format of the data is device-specific.

    function Get_Device_Snapshot_Size( Unit : byte ) : word ; 19
    Returns the snapshot size, in bytes, for data returned via the Get_Device_Snapshot method.

    procedure Get_Error_Blocks( Unit : byte ; Offset : word ; Buffer : pointer ) ; 20
    Returns the specified factory error block in the specified buffer. The buffer must be the size of one sector. The format of the data is a stream of locations. Each location consists of Track, Cylinder, and Sector (all words). If all values are zero, the end of the factory error blocks has been reached. This is valid only for some disks/CDROMs.

    procedure Get_Metrics( Unit : byte ; var Size, Stop, Parity : byte ; var Input, Output : word ) ; 21
    Returns the character size (7 or 8 bits), stop bits, parity, and I/O transmission speeds. Stop bits are multiplied by 10 (15 = 1.5 stop bits). Input and Output are in baud rate. Parity is 0 for none, 1 for odd, and 2 for even. This is only valid for character devices. For sound cards, the parameters are as follows:
    ParameterValue
    SizeTotal number of voices
    StopNumber of polyphonic voices
    ParityNumber of percussion voices
    InputInput sampling rate
    OutputOutput sampling rate


    procedure Set_Metrics( Unit : byte Size, Stop, Parity : byte ; Input, Output : word ) ; 22
    Sets the character size, stop bits, parity, and I/O transmission speeds. Output is ignored if split-speed I/O is not supported. Only Input and Output can be set for sound cards. See Get_Metrics for details.

    procedure Reset( Unit : byte ) ; 23
    Resets the device and clears any error flags. Unit 255 indicates to reset the controller itself.

    procedure Get_Volume( Unit : byte ; Type : byte ; var Left, Right : byte ) ; 24
    Gets current volumes for sound cards. See Set_Volume for details.

    procedure Set_Volume( Unit : byte ; Type, Left, Right : byte ) ; 25
    Sets volumes for sound cards. Types:
    0 = Master
    1 = MIDI
    2 = CD
    3 = Voice
    4 = Microphone
    5 = Speaker
    6 = Input preamp
    7 = Output preamp

    Note that Right is ignored for Microphones and Speaker.

    procedure Set_Input( Unit : byte ; Source : byte ) ; 26
    Sets input source for sound cards:
    0 = Microphone
    1 = CD
    2 = Line in


    procedure Set_Speech( Unit : byte ; Sex, LowHigh, Volume, Pitch, Temp : byte ) ; 27
    For sound cards, sets the speech parameters.

    procedure Set_Bass( Unit : byte ; Left, Right : byte ) ; 28
    Sets bass levels for sound cards.

    procedure Get_Bass( Unit : byte ; var Left, Right : byte ) ; 29
    Returns bass levels for sound cards.

    procedure Set_Treble( Unit : byte ; Left, Right : byte ) ; 30
    Sets treble levels for sound cards.

    procedure Get_Treble( Unit : byte ; var Left, Right : byte ) ; 31
    Returns treble levels for sound cards.

    procedure Set_Mixer( Unit : byte ; Type, Value : byte ) ; 32
    Sets mixer inputs and outputs for sound cards. Types:
    0 = Input
    1 = Left output
    2 = Right output

    Value is a set of bit flags:
    and 1 = MIDI left
    and 2 = MIDI right
    and 4 = Line left
    and 8 = Line right
    and 16 = CD left
    and 32 = CD right
    and 64 = Microphone

    Note that Values for MIDI are ignored on input.

    function Get_Modem( Unit : byte ) : longint ; 33
    Returns modem signal status for character devices. Returns:
    and 1 = Carrier detect
    and 2 = Data Set Ready
    and 4 = Clear To Send
    and 8 = Ring Indicator


    procedure Set_Modem( Flags : longint ) ; Sets modem signal status for character devices.
    and 1 = Request to Send
    and 2 = Data Terminal Ready


    function Get_Color_Count( Unit : byte ) : longint ; 34
    Returns the number of colors simultaneously possible on the video display. 2 indicates monochrome. 0 indicates 24-bit true-color.

    procedure Set_Color_Count( Unit : byte ; Count : longint ) ; 35
    Sets the number of colors simultaneously possible on the video display. See Get_Color_Count for details.

    procedure Get_Display_Size( Unit : byte ; var X, Y : word ) ; 36
    Returns the current video display size. For character modes, these are in character cells. For graphics, these are in pixels.

    procedure Set_Display_Size( Unit : byte ; X, Y : word ) ; 37
    Sets the current video display size. See Get_Display_Size for details.

    function Get_Video_Page( Unit : byte ) : byte ; 38
    Returns currently active display page.

    procedure Set_Video_Page( Unit : byte ; Page : byte ) ; 39
    Sets the currently active display page.

    function Get_Video_Pages( Unit : byte ) : byte ; 40
    Returns the maximum number of display pages available.

    procedure Get_Raster_Position( Unit : byte ; var X, Y : word ) ; 41
    Returns the current raster input device position (pens on video devices, drawing pads, etc.).

    function Get_Characters_Size( Unit : byte ) : longint ; 42
    Returns size of buffer necessary to hold character images.

    procedure Get_Characters( Unit : byte ; var buffer ) ; 43
    Returns character images in the specified buffer.

    procedure Set_Characters( Unit : byte ; var buffer ) ; 44
    Set character images to the bit images in the specified buffer.

    procedure Set_Page( Unit : byte ; Page : byte ) ; 45
    Sets video page to the specified page number (0 based).

    function Get_Page( Unit : byte ) : byte ; 46
    Returns current video page number.

    function Get_Max_Page( Unit : byte ) : byte ; 47
    Returns the maximum page number (0 based) available.

    function Get_Cursor_Size( Unit : byte ) : longint ; 48
    Returns size of cursor image buffer, in bytes.

    procedure Set_Cursor_Image( Unit : byte ; var Buffer ) ; 49
    Sets the cursor image to the bits in the specified buffer.

    procedure Get_Cursor_Image( Unit : byte ; var Buffer ) ; 50
    Returns the cursor image to the specified buffer.

    procedure Set_Cursor_Position( Unit : byte ; X, Y : integer ) ; 51
    Sets position of upper left corner of cursor to the specified Row, Column.

    procedure Get_Cursor_Position( Unit : byte ; var X, Y : integer ) ; 52
    Returns the position of the upper left corner of the cursor (Row, Column).

    function Get_Aspect_Ratio( Unit : byte ) : word ; 53
    Returns the number of horizontal pixels per vertical pixels, times 256 (thus, 256 means a 1-to-1 ratio) for any raster device.

    procedure Get_Palette( Unit : byte ; var Buffer ) ; 54
    Places a copy of the video harware palette into the buffer. The size of the buffer must be 4 bytes per palette entry. See Get_Color_Count.

    procedure Set_Palette( Unit : byte ; var Buffer ) ; 55
    Sets the video hardware palette to the specified buffer. The buffer must contain 4 bytes per palette entry (see Get_Color_Count):
    bytedescription
    0Red value
    1Green value (or monochrome gray level)
    2Blue value
    3reserved


    procedure Get_Raster_Metrics( Unit : byte ; var Width, Height : word ) ; 56
    Returns the width of a raster device in pixels (or in characters for a video device in text mode).

    procedure Set_Raster_Metrics( Unit : byte ; var Width, Height : word ) ; 57
    Sets the width of a raster device in pixels (or in characters for a video device in text mode).

    procedure Scroll( Unit : byte ; Left, Top, Right, Bottom, X_Amount, Y_Amount : integer ) ; 58
    Scrolls a rectangular region of a video device. The values indicate pixels (graphics mode) or character cells (text mode). The amount are the number of pixels/cells to scroll. Negative amounts mean to scroll down or right by the absolute value.

    function Get_Version( Unit : byte ) : longint ; 59
    Returns the VESA version number for video. 0 is returned if non VESA.

    function Get_Name_Length : word ; 60
    Returns length of hardware manufacturer name (0 if not available).

    procedure Get_Name( var Buffer ) ; 61
    Places a copy of the hardware manufacturer's name in the specified buffer.

    procedure Arc( Unit : byte ; X, Y, Start, End, Radius : word ; R, G, B : byte ; Flags : integer ) ; 62
    Draws an arc on a raster device with the specified center position, starting and ending angle (in degrees), and radius in pixels. If the driver does not provide this function, the OS will simulate it with lower-level calls. The RGB values indicate the color of the arc. Flags indicate the line drawing mode:

    Merge mode:
    Draw_Null = Null line/fill
    Draw_AND
    Draw_OR
    Draw_XOR

    Style:
    Draw_Solid
    Draw_Dotted
    Draw_Dashed
    Draw_DotDashed
    Draw_DotDashDot
    Draw_Hatch_Horizontal
    Draw_Hatch_BackwardDiagonal
    Draw_Hatch_ForwardDiagonal
    Draw_Hatch_Vertical
    Draw_Hatch_Cross
    Draw_Hatch_CrossDiagonal

    Line width:
    (upper byte is line width in pixels)

    procedure Polygon( Unit : byte ; Count : word ; R, G, B, R1, G1, B1 : byte ; Line_Flags, Fill_Flags : integer ; var Points ) ; 63
    Draws a polygon on a raster device using the specified count of X, Y integer points in the specified buffer. RGB is the line color. RGB1 is the fill color. See Arc for Flags details. If the driver does not provide this function, the OS will simulate it with lower-level calls.

    procedure Ellipse( Unit : byte ; X, Y : integer ; XRadius, YRadius : word ; R, G, B, R1, G1, B1 : byte ; Flags : integer ) ; 64
    Draws an ellipse on a raster device with the specified center and radius' in pixels. RGB is the color for the line. RGB1 is the fill color. See Arc for flags detail. If the driver does not provide this function, the OS will simulate it with lower-level calls.

    procedure Line( Unit : byte ; X1, Y1, X2, Y2 : integer ; R, G, B : byte ; Flags : integer ) ; 65
    Draws a line on a raster device with the specified start (X1, Y1) and end (X2, Y2) points, and RGB color. See Arc for Flags details. If the driver does not provide this function, the OS will simulate it with lower-level calls.

    procedure Pie( X, Y, Start, End, Radius : integer ; R, G, B, R1, G1, B1 : byte ; Line_Flags, Fill_Flags : integer ) ; 66
    Draws a pie slice on a raster device with the specified arc center, start and end angles (in degrees), RGB line color, and RGB1 fill color. See Arc for Line_Flags and Fill_Flags details. If the driver does not provide this function, the OS will simulate it with lower-level calls.

    procedure Rectangle( Unit : byte ; Left, Top, Right, Bottom : integer ; R, G, B, R1, G1, B1 : byte ; Line_Flags, Fill_Flags : integer ) ; 67
    Draws a rectangle on a raster device with the specified corners, RGB line color, and RGB1 fill color. See Arc for Line_Flags and Fill_Flags defails. If the driver does not provide this function, the OS will simulate it with lower- level calls.

    fucntion Get_Mode( Unit : word ) : word ; 68
    Returns the sound card mode:
    0 = Other
    1 = OPL 3
    2 = Wave Table

    procedure Set_Mode( Unit, Mode : word ) ; 69
    Sets the sound card mode. See Get_Mode for details.

    function Speed( Unit : word ) : longword ; 70
    Returns the average access speed, in nanoseconds.

    33.1 Standard Device Error Codes
    Bad_Format
    Bad_Gap
    Bad_Head
    Bad_Sector
    Bad_Track
    Clock_Loss
    Controller_Parity
    Controller_Timeout
    CRC_Error
    Crease
    Data_Late
    Density_Mismatch
    Drive_Check
    Drive_Not_Found
    Drive_Select_Error
    Exceeded_Limit
    Failed_To_See_Home
    Failesafe
    Head_Current_Error
    Header_Comparison
    Hopper_Check
    Index_Error
    Invalid_Function
    Invalid_Sector
    Multiple_BOTs
    No_Data
    No_Header
    No_Preamble
    No_Write
    Not_Loaded
    Not_Ready
    Off_Cylinder
    Off_Line
    Off_Track
    Operation_Incomplete
    Parity_Error
    Past_BOT
    Past_EOT
    Plug_Missing
    Power_Loss
    Read_Only
    Rotation_Speed
    Seek_Failed
    Seek_Timeout
    Self_Check
    Spin_Speed_Fault
    Temperature
    Timing_Error
    Unsafe
    Velocity
    Write_Check
    Write_Only
    Write_Overrun

    34 Common Operating Environment
    UOS supports a Common Operating Environment that allows programs in many different languages to work cohesively. Participation is optional and applications must be flagged as COE-compliant to receive all of the benefits. These include the ability to pass string parameters in different formats, full debugger support, and other benefits.

    35 Standard utilties

    BASICBASIC interpreter
    BROWSEInternet browser
    MAILEmail (local and internet)

    36 Programmer Services
    There are various programmer services offered by the kernel and various components. Also programmer libraries are provided to ease development. The libraries support a mix of standard API calls and also COM objects, depending on the circumstances. The libraries are:

    COMLIBSupport for Common Object Model, the Common Operating Environment, and multiple string formats (including conversion to/from UNICODE).
    GRFLIBSupport for graphics and other screen-oriented processes.
    MTHLIBSupport for mathematical and vector processing, and numeric-format conversion.
    SYSLIBSupport for kernel and other system-level access, I/O, and threads.
    APPLIBGeneral program support, including HTML and XML parsing.

    Glossary

    CIDCluster ID. Unique ID for a cluster.
    ClusterA tightly coupled group of computers.
    JIDJob ID. A numeric ID for a job, unique to the OS.
    JobThe unit of execution in a spooler (batch or printer).
    MMUMemory Management Unit.
    PIDProcess ID. A numeric ID for a process, unique to the OS.
    ProcessChild processing unit of a task.
    Psuedo-terminalA sofware device that appears to UOS as a physical terminal, but whose I/O is controlled by another task.
    TaskProcessing unit which matches processes to a user.
    TerminalA user I/O interface. It may be physical, virtual, or pseudo.
    TIDTask ID. A numeric ID for a task, unique to the OS.
    UserA set of authorized access specifications protected by password.
    Virtual terminalA terminal session operating remotely, such as through telnet.