I recently read Linux Kernel Development by Robert Love
Loved the book. I’d read The Design of the Unix Operating System by M.J.Bach when I was a student many years ago, but I’d recently come along some tutorial articles describing how you’d go about building your own operating system and wanted to see how these ideas were used to write Linux. You can easily get the Unix sources out of git, but it is useful to have some idea of the kernel’s design before you start exploring.
This books serves the purpose really well. It doesn’t go into detail about the actual kernel boot process, but does cover how to get the Linux sources from git. It then covers the various parts of the kernel architecture, starting with processes and the scheduler, the process for making system calls, the various important kernel data structures and their implementation. It moves on to interrupt handling, discussing top and bottom halves, the former being the code that runs in a fairly uninterruptible state in order to service the device, often by recording information that is later processed by a lower priority bottom half.
Kernel synchronisation and time management are covered in detail followed by information on devices and their interface, followed by a discussion of memory management and the process address space.
The book is really well written, and gives the reader a really good idea of the implementation of Linux. There are a few questions that weren’t covered: how are signals delivered to a process (and how does the process handle them), and how is paging implemented, but this book is well worth reading if you want to start experimenting with the Linux kernel. I went out and grabbed Ubuntu and installed it on a virtual machine, and have been trying a copy of the kernel from a git checkout, which isn’t a pain free process which I will cover in another blog post.