C Programming
- C Books
- The C Programming Language (2nd edition) Kernighan, Ritchie, awesome and useful book on C programming, written by the guys who invented it.
- Advanced Programming in the UNIX Environment (2nd Edition) Stevens, Rago, the absolute bible on C programming in the Unix environment
- Expert C Programming Peter Van der Linden, a great book on advanced C programming
- C Links
x86 Emulation
- QEMU - A fast and popular x86 platform and CPU
x86 Assembly Language
- PC Assembly Language, Paul A. Carter, November 2003. (MIT copy)
-
Intel 80386 Programmer's Reference Manual, 1987
(HTML).
(MIT copy - PDF)
(MIT copy - HTML)
Much shorter than the full current Intel Architecture manuals below, but describes all processor features used in 6.828. - IA-32 Intel Architecture Software Developer's Manuals, Intel, 2007. Mit copies:
- Multiprocessor references:
- AMD64 Architecture Programmer's Manual.
Covers both the "classic" 32-bit x86 architecture and the new 64-bit extensions supported by the latest AMD and Intel processors. - Writing inline assembly language with GCC:
- Brennan's Guide to Inline Assembly, Brennan "Mr. Wacko" Underwood
- Inline assembly for x86 in Linux, Bharata B. Rao, IBM
- GCC-Inline-Assembly-HOWTO, Sandeep.S
- Loading x86 executables in the ELF format:
- Tool Interface Standard (TIS)
Executable and Linking Format (ELF).
The definitive standard for the ELF format.
- Tool Interface Standard (TIS)
Executable and Linking Format (ELF).
PC Hardware Programming
- General PC architecture information
- Phil Storrs PC Hardware book, Phil Storrs, December 1998.
- Bochs technical hardware specifications directory.
- General BIOS and PC bootstrap
- BIOS Services and Software Interrupts, Roger Morgan, 1997.
- "El Torito" Bootable CD-ROM Format Specification, Phoenix/IBM, January 1995.
- VGA display - kern/console.c
- VESA BIOS Extension (VBE) 3.0, Video Electronics Standards Association, September 1998. (MIT copy)
- VGADOC, Finn Thøgersen, 2000. (MIT copy - text) (MIT copy - ZIP)
- Free VGA Project, J.D. Neal, 1998.
- Keyboard and Mouse - kern/console.c
- 8253/8254 Programmable Interval Timer (PIT)
- inc/timerreg.h
- 82C54 CHMOS Programmable Interval Timer, Intel, October 1994. (MIT copy)
- Data Solutions 8253/8254 Tutorial, Data Solutions.
- 8259/8259A Programmable Interrupt Controller (PIC)
- kern/picirq.*
- 8259A Programmable Interrupt Controller, Intel, December 1988.
- Real-Time Clock (RTC)
- kern/kclock.*
- Phil Storrs PC Hardware book, Phil Storrs, December 1998. In particular:
- CMOS Memory Map, Padgett Peterson, May 1996.
- M48T86 PC Real-Time Clock, ST Microelectronics, April 2004. (MIT copy)
- 16550 UART Serial Port - kern/console.c
- PC16550D Universal Asynchronous Receiver/Transmitter with FIFOs, National Semiconductor, 1995.
- Technical Data on 16550, Byterunner Technologies.
- Interfacing the Serial / RS232 Port, Craig Peacock, August 2001.
- IEEE 1284 Parallel Port - kern/console.c
- Parallel Port Central, Jan Axelson.
- Parallel Port Background, Warp Nine Engineering.
- IEEE 1284 - Updating the PC Parallel Port, National Instruments.
- Interfacing the Standard Parallel Port, Craig Peacock, August 2001.
- IDE hard drive controller - fs/ide.c
- AT Attachment with Packet Interface - 6 (working draft), ANSI, December 2001.
- Programming Interface for Bus Master IDE Controller, Brad Hosler, Intel, May 1994.
- The Guide to ATA/ATAPI documentation, Constantine Sapuntzakis, January 2002.
- Sound cards
(not supported in 6.828 kernel,
but you're welcome to do it as a challenge problem!)
- Sound Blaster Series Hardware Programming Guide, Creative Technology, 1996.
- 8237A High Performance Programmable DMA Controller, Intel, September 1993.
- Sound Blaster 16 Programming Document, Ethan Brodsky, June 1997.
- Sound Programming, Inverse Reality.
- E100 Network Interface Card
Linux Resources
- Some Linux kernel programming rules, extracted from my
experiences hacking the Linux kernel and finding bugs in it.
- Never call a blocking function (e.g. a function that may call sched()) with interrupt disabled or spin_lock held, or you risk deadlock. A typical mistake is to assume kmalloc() never blocks; it can. You need the GFP_ATOMIC flag for a non-blocking kmalloc().
- Never directly dereference a user-provided pointer in kernel; use "paranoid" functions (e.g. copy_from_user) to access them instead.
- Memory allocation can fail, so you must carefully check the returns of *alloc() functions against NULL.
- Don't simply call panic() for trivial errors, because panic() panics your entire kernel! A particular bad thing to do is to panic() whenever kmalloc() returns NULL.
- When you return from a function due to an error (e.g. kmalloc() returns NULL), don't forget to release resources (e.g. spin_lock, allocated memory) you've acquired.
- Building the Linux kernel
- Linux Kernel Archives at kernel.org
- Linux
Kernel HOWTO for configuring and compiling the kernel (very
useful)
- Kernel Rebuild Guide: another source for configuring and compiling the kernel
- Debugging the Linux kernel
- Understanding the Linux kernel
- Linux 2.6 Memory Management (PDF), covering Linux 2.6
- Rusty
Russell's Unreliable
Guide to Locking
- Some Linux kernel programming rules
- More about Linux
- Linux News