Understanding the Linux Kernel By Daniel P. Bovet and Marco Cesati Following are the changes made in the 4/01 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 ?page-number?: reader question or request for clarification {1} In the first paragraph: "which is now owned by Novell;" has been replaced with: "which is now owned by Santa Cruz Operation, Inc.;" (17) In the seventh paragraph: "the create() system call" has been replaced with: "the creat() system call" {44} In the second paragraph: "we described the six main Segment Descriptors" has been replaced with: "we described the four main Segment Descriptors" {44} In the second paragraph: "for a grand total of 14" has been replaced with: "for a grand total of 12". {44} In the third paragraph: "Since 14 are either unused" has been replaced with: "Since 12 are either unused". (55) In the fifth paragraph: "Determines the number of bits in an address that are mapped by the second-level page table. It yields the value 22 (12 from Offset plus 10 from Table)." has been replaced with: "Determines the logarithm of the size of the area a Page Middle Directory entry can map. It yields the value 22 (12 bits from Offset plus 10 bits from Table)." (55) In the sixth paragraph: "Determines the logarithm of the size of the area a first-leve page table can map." has been replaced with: "Determines the logarithm of the size of the area a Page Global Directory entry can map." {56} In the second paragraph: "Four type-conversion macros (pte_val(), pmd_val(), pgd_val(), and pgprot_val()) cast a 32-bit unsigned integer into the required type. Four other type-conversion macros (__pte(), __pmd(). __pgd(), and __pgprot()) perform the reverse casting from one of the four previously mentioned specialized types into a 32-bit unsigned integer." has been replaced with: "Four type-conversion macros (__pte(), __pmd(). __pgd(), and __pgprot()) cast a 32-bit unsigned integer into the required type. Four other type-conversion macros (pte_val(), pmd_val(), pgd_val(), and pgprot_val()) perform the reverse casting from one of the four previously mentioned specialized types into a 32-bit unsigned integer." {64} In the code example: "address = 0;" has been replaced with: "address = PAGE_OFFSET;" (66) In Figure 3-1: "Pointers to Memory Areas Descriptors" has been replaced with: "Pointers to Memory Regions Descriptors" (74) In Figure 3-5: "Task Descriptor" has been replaced with: "Process Descriptor" (two occurrences) [76] In the second paragraph: "The dummy's next field contains the address of the variable or field that identifies the wait queue minus the size of a pointer (on Intel platforms, the size of the pointer is 4 bytes)." has been replaced with: "If the wait queue is empty, the dummy's next field contains the address of the variable or field that identifies the wait queue minus the size of a pointer (on Intel platforms, the size of the pointer is 4 bytes). Otherwise, the dummy's next field points to the first non-dummy element." [82] In the first paragraph: "if the IOPL field in the eflags register is set to 3, the User Mode process is allowed to access any of the I/O ports whose corresponding bit in the I/O Permission Bit Map is cleared." has been replaced with: "if the IOPL field in the eflags register is set to 3, the User Mode process is allowed to access all I/O ports. Otherwise, the User Mode process is allowed to access any of the I/O ports whose corresponding bit in the I/O Permission Bit Map is cleared." [82] In the seventh paragraph: "1. It checks the IOPL field in the EFLAGS register. If it is set to 3 (User Mode process enabled to access I/O ports), it performs the next check; otherwise, it raises a '"General protection error"' exception." has been replaced with: "1. It checks the IOPL field in the EFLAGS register. If it is set to 3, the control executes the I/O instruction. Otherwise, it performs the next check." {129} In line 18: "bh_active &= active;" has been replaced with: "bh_active &= ~active;" (131) In the 2nd enumerate: "The kernel activates the IMMEDIATE_BH bottom half" has been replaced with: "The kernel invokes mark_bh() to activate the IMMEDIATE_BH bottom half" (205) In line 27 from the top: "do_map() and ddo_unmap()" has been replaced with: "do_mmap() and do_munmap()" {238} In the first paragraph: "the eax register is set to 5" has been replaced with: "the eax register is set to 2 (however system call numbers are subject to change so check the actual number in your source code)" (258) In lines 22-23 from the top; All four occurrences of "[supscrsym]" have been replaced with "^" {265} In line 18 from the top: "the handle_signal() function" has been replaced with: "the sys_sigreturn() function" {273} In the seventh paragraph: "For compatibility with BSD Unix variants, Linux provides the signal() system call, which is still widely used by programmers. The corresponding sys_signal() service routine just invokes do_sigaction():" has been replaced with: "Older System V Unix variants offered the signal() system call, which is still widely used by programmers. Recent C libraries implement signal() by means of sigaction(). However, Linux still supports old C libraries and offers the sys_signal() service routine:" (275) In the 2nd paragraph from the bottom: "the do_signal() system call" has been replaced with: "the do_signal() function" {302} In Table 11-1: "Subtract 1 from *v and return 1 if the result is non-null, 0 otherwise." has been replaced with: "Subtract 1 from *v and return 1 if the result is null, 0 otherwise." (353) In Table 12.9: "Ignore setuid and setgid flags" has been replaced with: "Forbid setuid and setgid flags" (360) In the last paragraph: "Since the flag is set by lnamei()," has been replaced with: "Since the flag is not set by lnamei()," {545} In the 3rd item in the 2nd itemize: "The size of this buffer" has been replaced with: "The size of the message text" (594) In the fifth line (asm-68k): "Motorola-IBM's PowerPC-based architectures" has been replaced with: "Motorola's MC680x0-based architecture" {597} In the third paragraph: "linux-kernel@vger.rutgers.edu" has been replaced with: "linux-kernel@vger.kernel.org" (637) In line 23: "do_map()" has been replaced with: "do_mmap()" Also this index entry has been merged with the next one.