December 28th, 2017 by
Most operating systems are put together based on kernel designs. Kernel design has been used for almost 4 decades because it separates the operating system from the different applications running on it. The different applications are allocated in different memory locations. The OS processes utilize kernel functionality through conducting system calls. System calls are software interrupts that allow users to switch from the operating system to applications and vice versa. Therefore, the kernel must install an interrupt handler that tackles different modes of operation in order to ensure effective switches. The interrupt handler is enabled in the program status (i.e., the supervisor mode and user mode). As such, protection is conducted on the modern system on a chip (SoCs) at the peripheral side. However, some processor registers can be changed if the CPU indicates a particular execution mode like master mode through additional HW signals.
All processes outside the operating system are implemented within the user mode and cannot execute any instructions availed in supervisor mode only. Meaning that user mode instructions hold a non-critical subset of instructions under the supervisor mode. During a process runtime, the supervisor mode under the PSW is disabled and only gets enabled once an interrupt like external interrupt or system call occurs. The OS activates the user mode once the user process is activated. Note that, a user process contains a virtual memory address space that separates it from the kernel entirely. However, this feature is only available to embedded microcontrollers that constitute a memory management unit that allows the use of virtual memory. Virtual memory usage must be upheld without other unbound memory accesses such as swapping on an external disk or changing (TLB) translation lookaside buffer entries by examining a dynamically sized page table.
To utilize the functionality offered by the OS kernel design, you must identify an interface that allows applications to run effectively while using it. The interface is known as the application binary interface (ABI). ABI delineates a registered usage convention, a set of system calls, a stack layout and facilitates binary compatibility. On the other hand, an API (application programming interface) facilitates source code compatibility by defining a set of function signatures that offer a fixed interface for calling the required functions. The kernel can have many designs, but it must provide basic activities like; process communication, process synchronization, process management and interrupt handling.
Process management ensures that process termination, creation, dispatching, scheduling, and switching context among other related activities run as required. In a real-time operating system, interrupt handling differs from the standardized implementation of a regular operating system. Interrupts in regular operating systems can preempt all running processes unexpectedly. This leads to unbound delays that are intolerable in a real-time operating system. As such, handling of interruptions is assimilated into the scheduler so that it is scheduled along with other important processes and feasibility is guaranteed even when interruption requests are made.
Real-time operating systems rely on kernel designs to expedite process communication and synchronization functionalities. Note that, ordinary semaphores cannot be used within a real-time operating system because the caller may experience unacceptable delays in case a priority inversion problem occurs. Hence, the synchronization mechanism must support a resource access protocol like; priority ceiling, priority inheritance or stack resource policy. You can use a microkernel, monolithic kernel or hybrid kernel based on your RTOS needs.