Understanding the Linux Kernel, 2nd Edition by Marco Cesati, Daniel P. Bovet The following errata were *corrected* in the 6/04 reprint: Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem {3}, line 2: "SVR4" NOW READS: "SVR2" {24} 2nd line from the bottom; "is greater than or equal to 0" NOW READS: "is less than or equal to" {36} 8th and 7th line from the bottom (3rd bullet item); "A 20-bit limit field that denotes the segment length in bytes (segments that have a Limit field equal to zero are considered null). When G is set to zero, the size of a non-null segment ..." NOW READS: "A 20-bit limit field that binds the segment length. When G is set to zero, the size of a segment ..." {50} last sentence; "The Page Size Extension (PSE) flag in the cr4 control register enables large page sizes (2 MB when PAE is enabled)." NOW READS: "The Page Size (PS) flag in the page directory entry enables large page sizes (2 MB when PAE is enabled)." {56} 9th line from the bottom (first sentence of "PMD_SHIFT" item); "Middle Directory" HAS BEEN REPLACED by "Offset" {57} 3rd paragraph, 2nd sentence; "They are 32-bit data types, except for pte_t, which is a 64-bit data type when PAE is enabled and a 32-bit data type otherwise." NOW READS: "They are 32-bit data types when PAE is disabled, and 64-bit data types when PAE is enabled." {65} 3rd numbered item; "flush_tlb_all()" NOW READS: "__flush_tlb_all()" {67} 2nd line from the top; "0xe8000000" NOW READS: "0xf8000000" {79} 4th paragraph; The words "referenced by the first element of the task array" HAVE BEEN REMOVED. {160}, 2nd paragraph, 1st line "the ebx register stores the address of the parent's process descriptor;" NOW READS: "the ebx register stores the address of the descriptor of the process being replaced by the child (usually, the parent's process descriptor);" {166} Table 5-3, description of "atomic_clear_mask(mask, addr)" and "atomic_set_mask(mask, addr)"; "addr" NOW READS "*addr" (two occurrences) {169} Table 5-5, entry "spin_is_locked()"; "Return 0 if the spin lock is set to 1 (unlocked); 0 otherwise" NOW READS: "Return 0 if the spin lock is set to 1 (unlocked); 1 otherwise" {183} 16th line from the bottom; The sentence "In fact, recall that the do_softirq() function refuses to execute the softirqs when the global_irq_lock spin lock is closed" HAS BEEN DELETED. {188} 2nd paragraph; The whole paragraph starting with "Notice that ..." HAS BEEN DELETED.