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.
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. Currently, the Computer Engineering curriculum does not cover this topic. Courses in embedded systems usually do not cover Linux kernel internals; smaller operating systems are taught instead. Courses in operating systems, similarly, teach smaller kernels or focus on only a few subsystems of the Linux kernel. This is not sufficient for students to obtain a deeper understanding of Linux, and be able to implement non-trivial components (e.g., new virtual memory managers; file systems; schedulers). Moreover, courses that are based on Unix often teach how to interact with the kernel, but not the mechanisms implemented within it. 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.
Percentage of Course
|Introduction to Linux and software tools for large projects (version control, toolchains, configure, make, kernel installation, kernel code exploration/browsing)||5%|
|Kernel debugging tools and techniques (printk, kernel traces/ftrace, kernel space debugging/gdb, QEMU/KVM debugging, gdb scripting)||5%|
|Performance profiling tools and techniques (perf, blktrace, eBPF)||5%|
|Kernel data structures and kernel module (list, hash table, trees)||10%|
|Process management and scheduling (process, thread, context switching, scheduler, system call)||15%|
|Interrupt / exception handling (interrupt paths, hardware and software interrupts, bottom halves)||10%|
|Kernel synchronization and time management (spinlock, mutex, semaphore, readcopy-update)||15%|
|Memory management (segmentation, paging, MMU, memory allocation, page cache)||10%|
|File system and block layer (virtual file system, block layer, IO scheduler, ext4 file system, crash consistency)||15%|
|Network stack (Linux network software stack, receiving/sending paths, buffering, network card driver)||10%|