2. OS Architecture, Interfaces, and Kernel DesignIntroduction and ContextAn operating system is not merely a collection of utilities that starts before application programs. It is a carefully engineered software system that mediates between hardware, applications, users, and other system software. Its architecture determines where responsibilities are placed, how components communicate, how failures are contained, and how efficiently the system can evolve. Kernel design is therefore an architectural problem as much as an implementation problem. The central design tension is straightforward to state but difficult to resolve: operating-system services should be powerful and efficient, yet the mechanisms that provide those services should be understandable, maintainable, portable, and resistant to failure. A design that places all services inside one privileged kernel may achieve excellent performance, but a defect in one component can compromise the entire system. A highly decomposed design may provide stronger isolation, but communication costs and implementation complexity can increase. This chapter examines major operating-system architectures—monolithic, layered, modular, microkernel, hybrid, and exokernel designs—and relates them to interfaces, system calls, kernel modules, portability, security, and performance. The discussion also distinguishes APIs from ABIs, because source-level compatibility and binary-level compatibility create different engineering obligations. Case studies involving Unix-like systems, Linux, Windows NT, and microkernel-based systems illustrate how architectural principles appear in production platforms. Learning ObjectivesAfter completing this chapter, the learner should be able to: - explain the purpose and structure of an operating-system architecture;
- distinguish APIs, ABIs, system calls, libraries, and kernel entry points;
- compare monolithic, layered, modular, microkernel, hybrid, and exokernel architectures;
- describe how a system call is implemented from application invocation to kernel return;
- evaluate kernel modules in relation to extensibility, security, and reliability;
- analyze portability and performance trade-offs in kernel design;
- select an appropriate architecture for a given technical or organizational context;
- apply these ideas to real operating-system case studies.
The Architecture of an Operating SystemAn operating-system architecture is the arrangement of responsibilities and communication paths among kernel subsystems, device drivers, libraries, system services, and applications. Typical kernel responsibilities include process and thread management, virtual memory, interrupt handling, scheduling, interprocess communication, file systems, networking, protection, and device management. The architecture specifies not only which services exist but also where they execute and how they interact. Two distinctions are especially important. First, user mode and kernel mode provide different privilege levels. Application code normally executes in user mode and cannot directly manipulate page tables, interrupt controllers, or device registers. Kernel code executes with elevated privileges and performs operations that require hardware authority. Second, an operating system has both internal interfaces and external interfaces. Internal interfaces connect kernel subsystems; external interfaces expose services to applications, administrators, device developers, and virtual machines. A good architecture attempts to establish clear abstractions. A file system hides the physical layout of storage; virtual memory hides the details of physical frames; a process abstraction hides the scheduling and protection mechanisms used to execute a program. Abstraction reduces application dependence on hardware, but every abstraction has cost. It consumes memory, introduces translation or validation, and may conceal information needed for specialized optimization. Protection Boundaries and PrivilegeThe protection boundary between user and kernel is enforced through processor mechanisms such as privileged instructions, page-table permissions, system-call instructions, and interrupt gates. A system call is not simply a function call. A normal function call remains within the current address space and privilege level, whereas a system call transfers control through a controlled entry point into the kernel. Protection boundaries can also exist between kernel components. In a traditional monolithic kernel, most kernel subsystems share one privileged address space. In a microkernel, many services execute as separate user-space servers. Virtual machines add another boundary, allowing a hypervisor to mediate between guest operating systems and hardware. The number and strength of boundaries influence fault containment, performance, debugging, and security. Architectural FamiliesMonolithic KernelsIn a monolithic architecture, major operating-system services execute in kernel mode within one large kernel address space. Process management, memory management, file systems, networking, and device drivers may all invoke one another through direct procedure calls and shared data structures. The principal advantage is efficiency. A file-system operation can call the buffer cache directly, and a network protocol can interact with the memory manager without crossing a user-kernel boundary. Data need not be repeatedly copied between isolated servers. Monolithic designs also permit global optimization because developers can coordinate policies across subsystems. The principal weakness is weak fault isolation. A defective driver can overwrite kernel memory, corrupt a file-system data structure, or crash the entire machine. The architecture may also become difficult to understand as dependencies accumulate. Changes to one subsystem can have unexpected effects elsewhere, and testing the complete privileged code base is demanding. The term monolithic does not necessarily mean unstructured. Modern monolithic kernels can use disciplined internal interfaces, dynamic modules, reference counting, namespaces, and formal coding rules. Linux is commonly described as a modular monolithic kernel: its core services execute in kernel space, but many drivers and subsystems can be loaded dynamically. Layered SystemsA layered architecture organizes the operating system into levels. A lower layer provides services to the layer above it, while depending only on lower layers. Hardware is usually placed at the bottom, followed by low-level process and memory mechanisms, device management, file systems, system-call handling, and user-level services. Layering offers conceptual clarity and supports verification. If layer boundaries are strict, each component can be reasoned about in terms of a limited set of services. Porting to new hardware may require replacing only the hardware-dependent layer. However, strict layering can be inefficient or artificial. Some operations naturally require information from several levels. For example, a file-system cache policy may interact with virtual-memory pressure, while scheduling decisions may depend on I/O behavior. Many practical operating systems use partial layering rather than a perfect hierarchy. Layers may bypass one another for performance, or a lower subsystem may provide callbacks to a higher subsystem. Thus, layering is best understood as a design discipline rather than a claim that all dependencies form a simple stack. Modular KernelsA modular kernel has a relatively stable core and dynamically loadable components. Modules may implement device drivers, file systems, network protocols, security mechanisms, or virtualization support. A module is typically compiled against a kernel-defined interface and linked or registered when loaded. Modularity separates two concerns. The system can be extended without rebuilding the complete kernel, and unnecessary components need not occupy memory. It also supports hardware discovery and specialized deployments. A server can load a storage driver only when the relevant hardware is present. Modules do not automatically provide the isolation associated with microkernels. A module executing in kernel mode generally has the same privileges as the core kernel. A malicious or defective module can therefore undermine confidentiality, integrity, or availability. Module signatures, permission controls, interface validation, build compatibility checks, and careful review are important safeguards. MicrokernelsA microkernel retains only a minimal set of mechanisms in privileged mode. These commonly include address-space management, thread scheduling, interrupt handling, and interprocess communication. File systems, network stacks, device drivers, and other services run as user-space servers. The microkernel approach emphasizes mechanism-policy separation and fault isolation. A driver failure may terminate one server rather than the entire operating system. Services can be restarted, replaced, or subjected to separate access controls. The small privileged core may also be easier to audit and formally verify. The cost is communication. A request may require multiple transitions among user-space servers and the microkernel. Messages may involve context switches, capability checks, address-space changes, and data movement. Careful design—such as direct memory sharing, efficient message passing, batching, and strategically placed servers—can reduce this cost. Microkernels therefore illustrate an important principle: architectural purity is not sufficient; the communication mechanism must support the performance demands of the target workload. Examples include MINIX 3 and seL4, although their goals differ. MINIX 3 emphasizes reliability and service isolation, while seL4 is notable for formal verification of substantial parts of its microkernel and its security model. Microkernel ideas also appear in embedded, automotive, avionics, and security-sensitive systems. Hybrid KernelsHybrid kernels combine mechanisms associated with monolithic and microkernel systems. They may retain a microkernel-inspired organization or message-passing model while executing selected services in kernel mode for performance. Windows NT, for example, uses a layered and modular design containing a hardware abstraction layer, executive services, a kernel component, device drivers, and subsystems. Although influenced by microkernel research, much of its performance-critical functionality executes in kernel space; it is consequently usually classified as hybrid rather than a strict microkernel. Hybrid designs recognize that different services have different requirements. A highly trusted, frequently used path may remain in the kernel, while less critical or more isolated services may execute outside it. This flexibility can provide a practical balance, but it also creates architectural ambiguity. If too many services are moved into privileged mode, the benefits of isolation diminish. If too many remain external, communication overhead may become unacceptable. ExokernelsAn exokernel minimizes abstractions imposed by the kernel. Rather than presenting a universal file system or process abstraction as the primary interface, it securely multiplexes hardware resources and allows application-level library operating systems—often called libOS components—to implement specialized abstractions. The exokernel approach seeks application-specific efficiency. A database may manage storage blocks according to its own access pattern, while a scientific application may use a specialized memory or scheduling policy. The kernel remains responsible for protection and resource allocation, but it does not unnecessarily dictate policy. This flexibility increases application and library complexity. Programs must understand more about resource management, and interoperability among different libOS environments can be difficult. Exokernel ideas are especially relevant to research systems, high-performance computing, unikernels, and specialized cloud workloads, where a narrow application image can be optimized for a known purpose. Interfaces: API, ABI, and System Call BoundaryAn application programming interface (API) is a source-level contract. It specifies functions, data types, error conventions, and semantics that programmers can use. The POSIX API, for instance, defines widely used interfaces for processes, files, signals, and threads. A C library may implement these functions by invoking system calls, performing user-space work, or combining several kernel operations. An application binary interface (ABI) is a binary-level contract. It specifies calling conventions, register usage, stack layout, data alignment, object-file formats, system-call numbering and conventions, binary data representations, and rules for linking and dynamic loading. Two systems may expose similar APIs yet have incompatible ABIs. Conversely, an ABI may remain stable while the internal kernel implementation changes. The distinction matters for portability. Source portability requires that a program compile against a compatible API. Binary portability requires that an existing executable run with compatible instruction-set, library, loader, and operating-system conventions. Containerization often preserves user-space expectations but does not provide a different kernel ABI by itself; containers generally share the host kernel. How a System Call WorksConsider an application that reads bytes from a file. The application invokes a library function such as `read`. The library places arguments in the platform-defined registers or stack locations and executes a system-call instruction. The processor switches to a privileged entry point, saves relevant user context, and changes to a kernel stack. The kernel entry code identifies the requested operation, validates the system-call number and arguments, checks the process's permissions, and copies or maps data safely between user and kernel address spaces. The file descriptor is resolved to an open-file object, which refers to a file-system object and possibly a device. The file system may consult caches, issue block-device requests, or block the calling thread while I/O completes. The scheduler may run another thread during this wait. When the operation finishes, the kernel places the result or error code in the defined return location, restores the user context, and executes the return-from-system-call mechanism. The library converts the result into the API's conventions, possibly setting an error indicator. This path demonstrates why a system call is both a protection mechanism and a performance event. Validation, privilege transitions, cache effects, scheduling, and data movement all contribute to its cost. System calls should be distinguished from interrupts and traps. An interrupt is usually an asynchronous event generated by hardware, such as completion of a device operation. A trap or exception is a synchronous event caused by the current instruction, including a system-call instruction or a page fault. Modern processors provide specialized instructions and mechanisms to reduce system-call overhead while preserving protection. Kernel Modules and ExtensibilityKernel modules are useful when hardware, file systems, or security policies cannot be predicted at build time. A module typically exports initialization and cleanup routines and registers operations with a kernel subsystem. A device driver may register file operations; a file-system module may register a superblock or inode implementation; a networking module may register protocol handlers. The module interface must address symbol versioning, object lifetime, concurrency, memory ownership, and failure recovery. A module that unregisters an object while another thread is using it can cause a use-after-free vulnerability. Incorrect locking can create deadlocks or data races. Because module code is privileged, ordinary application-level testing is insufficient. Dynamic extensibility also creates governance issues. Organizations should control who can load modules, record module provenance, verify signatures, and restrict production systems to approved builds. Secure boot can establish a chain of trust for early software, but it does not eliminate the need for runtime policy and vulnerability management. Portability and Kernel DesignPortability is the ability to move an operating system or application across processor architectures, boards, devices, or environments with limited redesign. A portable kernel isolates hardware-dependent code through a hardware abstraction layer, machine-dependent directories, architecture-specific interrupt and memory-management code, and standardized internal interfaces. Portability has several dimensions. Source portability concerns recompilation; binary portability concerns execution without recompilation; behavioral portability concerns whether equivalent programs observe equivalent semantics. Endianness, word size, alignment, memory-ordering rules, atomic instructions, interrupt controllers, and device models all complicate portability. Abstraction improves portability but may hide hardware capabilities. A portable scheduler may not exploit a processor's specialized energy states. A portable file interface may not expose a storage device's unusual parallelism. Successful designs therefore isolate nonportable mechanisms while exposing carefully chosen optional capabilities. Conditional compilation, architecture-neutral data structures, capability detection, conformance tests, and continuous testing on multiple architectures are practical techniques. Comparing the ArchitecturesNo architecture is universally superior. The appropriate choice depends on workload, threat model, hardware constraints, development resources, and maintenance expectations. A monolithic design generally offers low communication overhead and broad opportunities for optimization, but it has a large trusted computing base and limited fault isolation. Layering improves reasoning and portability, but strict boundaries may impose overhead or fail to reflect real dependencies. Modular kernels support evolution and deployment flexibility, yet modules normally retain full kernel privilege. Microkernels provide strong isolation and potentially easier assurance, but require efficient communication and careful service design. Hybrid systems offer pragmatic flexibility, while their mixed structure can make security analysis and architectural reasoning more difficult. Exokernels maximize specialized control, but shift substantial responsibility toward application-level software. A useful evaluation should ask: 1. What must be trusted to protect the system? 2. Which failures must be contained rather than allowed to crash the system? 3. How frequently do components communicate across boundaries? 4. Is the workload general-purpose or highly specialized? 5. What level of binary and source compatibility is required? 6. How will drivers and third-party extensions be governed? 7. Can the organization test, update, and audit the resulting design? These questions are more informative than labeling an architecture simply “fast” or “secure.” Performance depends on workload and implementation, while security depends on interfaces, configuration, isolation, update practices, and the quality of privileged code. Case Study: Choosing an Architecture for an Automotive Control PlatformBackgroundConsider an illustrative automotive supplier designing a control platform for braking assistance, sensor processing, diagnostics, and infotainment. The platform must support real-time behavior, hardware diversity, secure updates, and long operational lifetimes. Situation and ProblemA single monolithic kernel would simplify direct communication between drivers and control services. However, a defect in an infotainment driver could threaten safety-related functions. A pure microkernel could isolate services, but sensor processing may require predictable, low-latency data exchange. The supplier must choose an architecture rather than merely select a commercial product. AnalysisSafety-related control tasks require strong separation, bounded timing, and evidence that privileged mechanisms behave correctly. Infotainment and diagnostic components have larger, more frequently changing software bases and are exposed to more external input. Hardware abstraction is also important because the product will use different processors and sensor interfaces over time. The architecture should therefore distinguish safety-critical and noncritical domains. A minimal privileged core can provide scheduling, memory protection, interrupt handling, and communication. Safety-critical drivers and control services can run in isolated partitions or protected servers. High-throughput services may use shared memory with controlled ownership and notification mechanisms rather than copying every data item. Less trusted infotainment components should not receive unrestricted access to safety-critical devices. Approach and SolutionThe illustrative design adopts a microkernel-oriented partitioning strategy with carefully selected performance mechanisms. A hardware abstraction layer isolates processor-specific interrupt controllers and memory-management units. Drivers are separated by criticality. Capability-based access controls restrict which service may communicate with a device or memory region. Some validated, high-frequency components may execute in a privileged partition if timing measurements and assurance arguments justify that choice. System-call and IPC interfaces are kept narrow and versioned. Diagnostic updates are authenticated, logged, and subject to rollback rules. Module loading is disabled or tightly restricted in the safety partition, while a separate noncritical environment permits controlled extensibility. OutcomeThe design increases isolation and supports independent testing of services. It also introduces costs: engineers must define communication protocols, analyze worst-case latency, manage partition resources, and develop recovery procedures for failed services. The result is not automatically safer merely because it uses a microkernel; safety depends on requirements, verification, implementation quality, and operational controls. Learning Points- Architecture should follow failure and assurance requirements, not fashion.
- Isolation is valuable only when boundaries are enforced and tested.
- Shared-memory optimization must preserve ownership and synchronization rules.
- Portability requires deliberate hardware abstraction rather than accidental similarity.
- Security, safety, timing, and maintainability must be evaluated together.
Challenges, Risks, and Common Design ErrorsA common mistake is treating architectural labels as performance guarantees. A microkernel can perform well with an efficient IPC design, and a monolithic kernel can perform poorly because of contention or inefficient data paths. Measurement under representative workloads is essential. Another error is confusing a module boundary with a protection boundary. Dynamically loading a driver may improve organization but does not protect the kernel from that driver. Similarly, separating code into directories or processes without controlling privileges and memory access provides little security. Interface instability is another major risk. If internal kernel interfaces change without disciplined versioning, modules and tools become fragile. If a public ABI changes unexpectedly, applications may fail after an update. Compatibility policies should identify which interfaces are stable, which are experimental, and which are private. Large trusted computing bases increase the consequences of vulnerabilities. Kernel attack surfaces include system calls, device drivers, file systems, network protocols, module loaders, and debugging interfaces. Least privilege, input validation, memory-safe implementation where feasible, fuzz testing, code review, privilege separation, and rapid patching reduce risk but cannot eliminate it. Concurrency creates additional difficulty. Interrupt handlers, deferred work, preemption, multicore scheduling, lock-free structures, and memory ordering must be designed together. A theoretically elegant architecture can fail in practice through deadlocks, priority inversion, starvation, or cache-coherence costs. Professional and Governance ConsiderationsKernel engineering is an organizational activity as well as a technical one. Decisions about architecture determine who can modify privileged code, how suppliers deliver drivers, how vulnerabilities are disclosed, and how long compatibility must be maintained. Product teams should define security and safety ownership, review third-party code, maintain software bills of materials, and establish update and rollback procedures. Licensing and intellectual-property obligations also matter when kernels or modules incorporate open-source components. Compliance teams must track licenses, source-distribution obligations, and modification notices. In regulated environments, evidence of testing, traceability, risk assessment, and controlled change may be required. AI-assisted code generation and automated analysis can help produce tests, identify suspicious patterns, or summarize dependencies, but generated code must not be trusted merely because it compiles. Privileged software requires human review, threat modeling, reproducible builds, and validation against architectural and security requirements. Current DevelopmentsSeveral contemporary trends build on the architectures discussed here. Virtual machines and containers use different forms of isolation: virtual machines mediate an entire guest operating system through a hypervisor, whereas containers generally isolate processes while sharing a kernel. Unikernels package an application with a specialized library operating system, reflecting exokernel and library-OS ideas. Capability-based systems make authority explicit rather than relying solely on ambient process privileges. Memory-safe systems programming languages are increasingly considered for drivers and kernel-adjacent components because they can prevent classes of memory errors. Formal verification is advancing from isolated algorithms toward kernels, hypervisors, and security-critical components. Hardware mechanisms such as trusted execution environments, IOMMUs, control-flow protection, and confidential-computing features add further protection boundaries, although they introduce new assumptions and operational complexity. Cloud platforms also encourage modularity and narrow interfaces. A provider may separate control-plane and data-plane functions, use specialized kernels for networking or storage, and deploy minimal images to reduce attack surface. These developments do not eliminate classical architecture choices; they make the consequences of those choices more visible. Best Practices for Kernel and Interface Design- Keep privileged mechanisms as small and explicit as practical.
- Define interfaces by semantics, not merely by function names.
- Distinguish stable public APIs from private internal interfaces.
- Validate all user-supplied addresses, lengths, identifiers, and permissions.
- Treat drivers and modules as high-risk privileged components.
- Use isolation where failure or compromise must be contained.
- Measure boundary-crossing, copying, scheduling, and cache costs.
- Separate policy from mechanism when doing so does not create unacceptable overhead.
- Use architecture-neutral code and isolate hardware-dependent operations.
- Test on multiple processor architectures and under fault conditions.
- Apply secure boot, signed modules, least privilege, logging, and controlled updates where appropriate.
- Document assumptions about concurrency, memory ordering, ownership, and lifetime.
Chapter SummaryOperating-system architecture determines how services are organized, protected, extended, and optimized. Monolithic kernels emphasize direct communication and performance but provide limited fault isolation. Layered systems improve reasoning and portability, although strict layering can be inefficient. Modular kernels support dynamic extension but generally leave modules with kernel privilege. Microkernels place a minimal mechanism set in privileged mode and move services into isolated processes, improving fault containment at the cost of communication complexity. Hybrid kernels combine approaches pragmatically, while exokernels minimize imposed abstractions and shift policy toward application-level library operating systems. APIs are source-level contracts, whereas ABIs govern binary interaction. System calls cross a protected boundary through processor-supported entry and return mechanisms, involving validation, permission checks, scheduling, and data transfer. Kernel modules improve extensibility but enlarge the privileged attack surface. Portability depends on hardware abstraction, stable interfaces, architecture-neutral design, and testing across platforms. The case study shows that architecture must be selected according to safety, security, timing, performance, maintainability, and governance requirements rather than by a single universal criterion. Key TermsAPI: A source-level interface defining callable operations, data types, and behavioral conventions. ABI: A binary-level contract covering calling conventions, data layout, linking, and low-level operating-system interaction. Application binary compatibility: The ability of an existing executable to run under a compatible platform without recompilation. Exokernel: A kernel that securely multiplexes hardware while leaving many abstractions to application-level library operating systems. Hardware abstraction layer: A software layer that isolates hardware-dependent mechanisms from more portable kernel code. Hybrid kernel: An architecture combining selected monolithic and microkernel techniques. Interprocess communication: Mechanisms that allow processes or services to exchange data and synchronize. Kernel: The privileged core of an operating system that manages hardware and provides fundamental services. Kernel module: A dynamically loadable component that extends kernel functionality. Layered architecture: An organization in which higher levels use services supplied by lower levels. Microkernel: A kernel that keeps only essential mechanisms privileged and places many services in user space. Monolithic kernel: A kernel in which major operating-system services execute within one privileged address space. Privilege level: A hardware-enforced execution authority that restricts access to protected operations and memory. System call: A controlled request by user software for a service provided by the kernel. Trusted computing base: The set of hardware and software components that must be trusted to enforce security. User mode: A restricted processor execution mode used by ordinary application code. Kernel mode: A privileged processor execution mode used for operations requiring hardware authority. Portability: The ability to move software across platforms with limited modification. Capability: An unforgeable or protected reference representing authority to access a resource. Review QuestionsShort Answer Questions1. What is the main architectural distinction between user mode and kernel mode? 2. How does an ABI differ from an API? 3. Why does loading a kernel module not necessarily create a protection boundary? 4. Identify two mechanisms commonly retained by a microkernel. 5. What role does a hardware abstraction layer play in portability? Long Answer Questions1. Compare monolithic, layered, modular, microkernel, hybrid, and exokernel architectures in terms of performance, extensibility, fault isolation, and security. 2. Describe the complete path of a file-read system call from application invocation to return to user mode. 3. Explain the advantages and limitations of microkernel design, including the role of interprocess communication. 4. Discuss how API and ABI stability affect operating-system evolution and application portability. 5. Explain the risks associated with kernel modules and propose a governance and security strategy for managing them. Analytical / Application Questions1. A high-performance storage appliance requires specialized I/O policies but must run on several processor architectures. Which architectural ideas would you combine, and why? 2. A third-party device driver frequently crashes a production system. Analyze whether modularity alone solves the problem and recommend a stronger architecture or control mechanism. 3. Design an architecture for a safety-critical embedded platform that also contains a large, frequently updated infotainment environment. Justify your choices concerning privilege, communication, portability, and update governance. 22. Multiple Choice Questions with AnswersQuestion 1Which statement best distinguishes an API from an ABI? A. An API defines source-level usage, while an ABI defines binary-level conventions. B. An API is used only by kernels, while an ABI is used only by applications. C. An API controls hardware privileges, while an ABI schedules processes. D. An API is always more stable than an ABI. Correct Answer: A. An API defines source-level usage, while an ABI defines binary-level conventions. Question 2Why can a defective driver in a traditional monolithic kernel crash unrelated services? A. Drivers cannot access hardware in monolithic systems. B. The driver executes in a shared privileged address space. C. The driver is always executed by a user process. D. Monolithic kernels do not support memory protection. Correct Answer: B. The driver executes in a shared privileged address space. Question 3Which activity normally occurs during system-call processing? A. The application directly modifies page tables. B. The kernel validates arguments and permissions. C. The processor disables all future interrupts permanently. D. The library bypasses the kernel and accesses the device directly. Correct Answer: B. The kernel validates arguments and permissions. Question 4A microkernel moves file systems and device drivers to user space primarily to improve what property? A. Fault isolation B. Instruction-set compatibility C. Source-code size of applications D. Physical storage capacity Correct Answer: A. Fault isolation Question 5Why might a strict layered architecture be inefficient for some operating-system operations? A. Layers prevent any form of abstraction. B. Some operations require information or coordination across several levels. C. Layered systems cannot execute in kernel mode. D. Layers eliminate hardware protection. Correct Answer: B. Some operations require information or coordination across several levels. Question 6What is a major security limitation of a dynamically loadable kernel module? A. It cannot interact with kernel services. B. It generally executes with substantial kernel privilege. C. It must always run in a virtual machine. D. It is unable to access device registers. Correct Answer: B. It generally executes with substantial kernel privilege. Question 7Which design best reflects an exokernel approach? A. The kernel imposes one universal file-system policy on every application. B. Applications use specialized library operating systems while the kernel securely multiplexes resources. C. All services execute in one unprotected user process. D. Only device drivers are allowed to define policies. Correct Answer: B. Applications use specialized library operating systems while the kernel securely multiplexes resources. Question 8A company needs strong service isolation but also very low-latency communication between selected components. Which approach is most appropriate? A. Use isolation boundaries generally and optimize selected paths with shared memory or efficient IPC. B. Remove all protection boundaries to guarantee speed. C. Use only strict layers and prohibit interprocess communication. D. Place every component in a separate virtual machine regardless of workload. Correct Answer: A. Use isolation boundaries generally and optimize selected paths with shared memory or efficient IPC. Question 9Which practice most directly supports portability across processor architectures? A. Embedding processor-specific assumptions throughout the file system. B. Isolating hardware-dependent code behind defined abstraction interfaces. C. Using undocumented system-call numbers in applications. D. Avoiding conformance testing. Correct Answer: B. Isolating hardware-dependent code behind defined abstraction interfaces. Question 10In the automotive case study, why should infotainment software be separated from safety-critical control services? A. Infotainment software never requires operating-system services. B. Separation limits the effect of faults or compromise in a less trusted environment. C. Safety-critical software cannot use interrupts. D. Separation guarantees that no software defect can occur. Correct Answer: B. Separation limits the effect of faults or compromise in a less trusted environment.
|