Virginia Tech® home

ECE 5414- Advanced Linux Kernel Programming (3C)

Course Description

Design and internal organization of the Linux operating system kernel. Kernel subsystems, boot process, memory management, process and thread model, scheduling, interrupt and exception handling, virtual file system and the concrete file system, block I/O and I/O scheduler, network stack, and device drivers. Modification of existing kernel code. Design, implementation, test and evaluation of new kernel modules. Kernel and full software stack debugging techniques, and virtualization as an aid for operating system development and debug. Software engineering techniques to analyze, modify and run a large, complex open-source code base.

Why take this course?

The Linux kernel is one of the most advanced (and heavily optimized) operating system kernels with wide acceptance in the industry and is used on a wide spectrum of computer hardware, from embedded devices to servers, and from portable devices to HPC platforms. Due to its diverse properties, many industrial projects are based on Linux (e.g., Google Android) and much of systems software research is conducted on Linux. Linux kernel skills are highly useful for a software engineer, especially those involved with systems software, but also for a hardware engineer to test new features or devices.

Students exposed to this course will learn how to program the Linux kernel, implement new, or modify existing kernel subsystems, how to performance-optimize kernel modules and subsystems by exploiting various time/space tradeoffs, and will build experience in working with a large-scale open-source project. In addition, they will learn the differences between designing, implementing, and debugging application-level and system-level software. These skills are highly desirable not only for developing operating systems, virtualization infrastructures, and RTOSes, but also for application software development.

Learning Objectives

  • Analyze the functionality, architecture, and implementation of Linux kernel subsystems and modules, including the memory subsystem, process subsystem, scheduling, interrupt handling, virtual file system, block layer, network software stack, and device drivers.
  • Design, implement and modify Linux kernel modules for these subsystems.
  • Test, debug and evaluate systems software in kernel or user space, including virtualization-based debugging and full software stack debugging and tracing.
  • Critique recent design challenges in Linux kernel to enhance performance, scalability, and security and to support new types of hardware devices.