Understanding the Linux Kernel, 2nd Edition by Marco Cesati, Daniel P. Bovet This errata page lists errors outstanding in the most recent printing. If you have technical questions or error reports, you can send them to booktech@oreilly.com. Please specify the printing date of your copy. This page was updated February 15, 2005. 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 ?page-number?: reader question or request for clarification Confirmed errors: (ix), IN PRINT: 7th line; "and the end of 2000" SHOULD BE: "at the end of 2000" (1) 2nd paragraph; "(the recent Intel's 64-bit processor)" should be "(Intel's recent 64-bit processor)". (6) 7th line; replace "nine" with "fifteen" (two occurrences) (8) IN PRINT: 3rd paragraph (line 20); "...interacts with the relative hardware components..." SHOULD BE: "...interacts with the proper hardware components..." (14) the last sentence of the section "File Types" ... and Chapter 19) Should be: ... and Chapter 19). (32) Device Drivers, line 3 -- "mouses" should be "mice" (34) 'Logical address' block; replace "80xx86" with "80x86" (46) 'Present flag' item last sentence in parentheses; replace "usea" with "uses" (57) IN PRINT: 13th line from the bottom; "a unsigned" SHOULD BE: "an unsigned" (57), 3rd paragraph: replace "and the values 4, 512, and 512, respectively, when PAE is enabled" with "and the value 512, 512, and 4, respectively, when PAE is enabled." (58) line 9 from the bottom; replace "pte_rdprotect" with "pte_rdprotect()" (66), 4th paragraph, last line -- "in" should be "to". "We'll defer ... to Chapter 7." (66), 5th paragraph, fist line -- "previous" should be "the previous" (67), last paragraph, second sentence -- "In fact, dereferencing a variable pointers requires that one memory access more than dereferencing an immediate constant address." Should say: "In fact, dereferencing a variable pointer requires one more memory access than dereferencing an immediate constant address." "pointers" should be "pointer". "more" should be deleted. "one memory" should be "one more memory". (70) footnote; replace "flush_tlb_all() macro" with "flush_tlb_all() function" (77), subsection title below 2nd paragraph: replace "Processor descriptors handling" with "Process descriptors handling" (84), 3rd paragraph replace "woekn" with "woken" (85) 1st line; replace "as well by" with "as well as by" (87) bottom line; replace "waken" with "wakes" {92} above 3rd para from the bottom; switch_to(prev, next, prev) should be switch_to(prev, next, last) (101) CLONE_THREAD, line 1 -- "of" should be "as" {114} Figure 4-1; replace "ICC" with "Interrupt Controller Communication (ICC)" (121), line 10 from the bottom replace "Page fault exception" with "Page Fault exception" (140), 3rd item replace "irc_desc[irq].action" with "irq_desc[irq].action" (148) 1st line; replace "sofirq" with "softirq" (148) 1st bullet item; replace the sentence "A __softirq_pending field that points to a softirq_action structure (the pending softirq). This field may easily be accessed through the softirq_pending macro." with the sentence "A __softirq_pending field that stores a set of flags denoting the pending softirqs; it may easily be accessed through the softirq_pending macro." (148) 3rd paragraph; replace "to implements" with "to implement" (149), 5th line from the bottom replace "mask = 0;" with "mask = ~0;" (153), 2nd numbered item replace "Disables local interrupts, saving the previous state of the IF flag." with "Disables local interrupts." (153) enumeration item a., last sentence; replace "until other tasklets" with "until no other tasklets" (158) IN PRINT: Figure 4-5; "NO" label exiting from the right of the "Virtual v86 Mode?" box SHOULD BE: "YES" label (163) line 5 from the bottom; replace "Applies to" with "Scope" (165) line 16 from the top; remove the word "single" (168) 2nd last paragraph, last sentence; replace "reacquirie" with "reacquire" (177) last paragraph; replace "enter in" with "enter" (181) 31th line replace "of all bottom halves" with "of all deferrable functions" (183) section "Disabling Deferrable Functions" 3rd paragraph 1st sentence; replace "disable" with "disables" (186) last two words on page; replace "does nothing" with "do nothing" (189) Section "Examples of Race Condition Prevention" first paragraph; replace "raised interleaving by kernel control paths" with "raised by interleaving kernel control paths" (190) First paragraph, 6th line; replace "on other hand" with "on the other hand" (195) footnote; "To avoid loosing significant..." should be "To avoid losing significant..." (212) code snippet, 1st line; replace "timeou" with "timeout" (222), 3rd paragraph, 2nd line under the Table 7-4 replace "Uniform Access Memory" with "Uniform Memory Access" (222) 4th line from the bottom; Remove the sentences: "The zones of memory are now drawn to scale; ZONE_NORMAL is usually larger than ZONE_DMA, and, if present, ZONE_HIGHMEM is usually larger than ZONE_NORMAL. Notice that ZONE_HIGHMEM starts from physical address 0x38000000, which corresponds to 896 MB." (226), Text under "__GFP_HIGHIO" item replace "in order free" with "in order to free" (227), the description of "__free_pages(page, order)" item replace "page frames starting from addr are" with "page frames starting from the one corresponding to page are" (2nd occurrence of "page" is a variable name) (231), 7th line: replace "if some other process has mapped the page, the inner loop is restarted." with "if no other process has mapped the page yet, the inner loop is restarted." (244), IN PRINT: 3rd paragraph, last sentence; "It then creates a new cache descriptor for the new cache and inserts the descriptor in the cache_cache general cache. SHOULD BE: "It then allocates a new cache descriptor for the new cache from the cache_cache general cache and inserts the descriptor in the list of cache descriptors (whose first element is cache_cache)." (247), the last line: replace "right after the" with "right before the" (267), 4th line from the bottom replace "every memory descriptor:" with "every process descriptor:" (360), IN PRINT: 13th line from botton, in last code sample; "cpu_tlbstate[this_cpu].state == TLBSTATE_LAZY;" SHOULD BE: "cpu_tlbstate[this_cpu].state = TLBSTATE_LAZY;" (361), 7th line from the bottom: replace "need_resched field of prev while it was not running." with "need_resched field of the current process." (371), 8th line from the bottom replace "system writes" with "system call writes" (373), code in Figure 12-1; replace "O_CREATE" with "O_CREAT" (381) line 2; replace "write_super_lockfs()" with "write_super_lockfs" (399) 17th line from the bottom; remove space between "(" and "parent" (405) 8th line from top; "Invokes do_kern_mount() passing, to it" should be "Invokes do_kern_mount(), passing to it" (422) 4th line from the top; replace "FL_MAND" with "LOCK_MAND" (422) Table 12-19, entry "u"; replace "u" with "fl_u" {422} last paragraph; There are no 'lock_file' structures; replace with 'file_lock' structure. (423) 10th and 11th line from the bottom; replace "has both read and write" with "has read and/or write" (429), 8th line from the bottom: replace "inb_p() inw_p()," with "inb_p(), inw_p()," (450) IN PRINT: 3rd Paragraph; "This problem is as easy" SHOULD BE: "This problem is not as easy" (451) par 1 line 1 bd_inodes should be: bd_inode (457) par 1 line 4 current_nr_sector should be: current_nr_sectors (465) line 13 unhanded should be: unhandled (539), IN PRINT: 1st line "SWP_WRITE" SHOULD BE: "SWP_WRITEOK" (540), IN PRINT: 10th line "SWP_WRITE" SHOULD BE: "SWP_WRITEOK" (614) 6th line from the top; replace "192.160.50.0" with "192.50.0.0" (619), IN PRINT: 7th and 8th line (in the code block); "addr.sin_port" "addr.sin_addr.s_addr" SHOULD BE: "addr_local.sin_port" "addr_local.sin_addr.s_addr" (619) IN PRINT: 10th line (in the code block); "...& addr_local..." SHOULD BE: "...&addr_local..." (620), IN PRINT: 18th line; "UDP protocol (IPPROTO_IP)" SHOULD BE: "UDP protocol (IPPROTO_UDP)" (622), IN PRINT: 3rd and 4th line (in the code block); "addr.sin_port" "addr.sin_addr.s_addr" SHOULD BE: "addr_local.sin_port" "addr_local.sin_addr.s_addr" (622) IN PRINT: 5th line (in the code block); "...& addr_local..." SHOULD BE: "...&addr_local..." (624), IN PRINT: 3rd paragraph; "inet_dgram_connection()" SHOULD BE: "inet_dgram_connect()" (624), IN PRINT: 1st numbered item 1, 3rd line; "collect()" SHOULD BE: "connect()" (630), IN PRINT: lines from 23th to 25th; (two occurrences) "ip_local_delivery()" SHOULD BE: "ip_local_deliver()" (637), IN PRINT: 9th line from the bottom; "the flag field" SHOULD BE: "the f_flag field" (640), IN PRINT: 8th line; "is nonblocking" SHOULD BE: "is blocking" (652), IN PRINT: 17th line; "semid_ds" SHOULD BE: "sem_array" (657), IN PRINT: 4th line under the figure 19-3: "msg_queue" SHOULD BE: "shmid_kernel" (723), IN PRINT: "inet_dgram_connect" entry: "net/af_inet.c" SHOULD BE: "net/ipv4/af_inet.c" (723), IN PRINT: "inet_stream_connect" entry: "net/af_inet.c" SHOULD BE: "net/ipv4/af_inet.c" (727), below "local_irq_count" entry add the following entries: local_irq_disable() include/asm-i386/system.h 180 local_irq_enable() include/asm-i386/system.h 180