《Linux内核设计与实现》勘误
Robert Love的《Linux Kernel Development》一书,比较适合内核入门。而且对某些方面的解说,比如各种下半部,非常到位。承蒙一位陌生朋友的慨然相助,我有幸得到了本书的英文第二版,把中文不好理解的地方对照英文订正一下。只订正有碍理解的,当然可能有些是我理解错误,朋友们指正。多谢了。
L+7 表示从上往下数第7行;L-7表示从底向上数第7行。
P8
L+7:练习中一般在头文件中定义内联函数
订正:实践中一般在头文件中定义内联函数
P9
L-13:Linux内核支持多处理器并发处理
订正:原文是“The Linux Kernel supports multiprocessing”,译为“Linux内核支持多处理器系统”似乎好些,而且这里不能说成是并发(concurrent),应该是并行(parallel)
P15
图2-2中的thread_struct应改为thread_info,这个原书就印刷错了。
P31
L+9:每个优先级数组还包含一个叫做struct list_head的队列。
订正:翻译错误。原文是:“Each priority_array also contains an array named queue of struct list_head queues.”应译为:“每个priority_array包含一个叫作queue的数组,该数组每个元素都是一个struct list_head类型的队列”。其实这个从左边那页给出的priority_array的结构定义也能看出来。
P51
L+1:将系统调用号和参数压入寄存器并出发软中断来陷入内核
订正:应该是“触发软件中断”,原文是software interrupt而不是softirq。这跟作为一种下半部机制的softirq根本不是一回事。
P61
L-4:首先,因为处理器禁止中断,这里要把它们打开,就必须在处理程序注册期间指定SA_INTERRUPT标志。
订正:“必须”应该改成“不能”。如果注册时指定了SA_INTERRUPT标志,这里能打开吗?显然不能。译者误解了原著的意思。
P63
L-17:cli和sti分别是对clear和set允许中断(allow interrupts)标志的汇编指令
订正:译的真别扭。改为:“cli和sti分别是对允许中断标志的clear和set操作的汇编指令的调用。”(好象一样别扭 )
P73
第6.3节
订正:这节中所有“挂起”字样,原文统统是pending,意思是悬而未决的、未处理的、待处理的,用过UNIX信号的人都知道,pending跟suspended根本不是一个意思。
P87
这里本来正确的,我说错了,多谢richardhesidu兄的指正
P116
第9.2节
订正:排版太不负责任了,作为节拍的倒数的HZ变量,全都给印刷成了Hz,好象频率单位赫兹一样。大家自己改改吧。
P155
L+8:struct super_operations s_op;
订正:struct super_operations *s_op; 原书也印刷错了。(可别小看这个星星,VFS的面向对象全靠它)
P170
L+4:有三个数据结构将VFS层和文件的进程紧密联系在一起
订正:“文件的”这三个字不知道从哪里来的,原书没有,也不该有。
P175
L+10~L+11:可以在文件<linux/buffer_head.h>;中找到包含所有合法标志的bh_state_bite列表。
订正:误译。原文是:The legal flags are stored in the bh_state_bits enumeration,which is defined in <linux/buffer_head.h>;。其实看见enumeration的前4个字母就能猜到是枚举,改成:“合法的标志存储在bh_state_bits枚举中,该枚举在<linux/buffer_head.h>;中定义。”
P176
L-3:struct bio_vec *bi_io_vecs
订正:struct bio_vec *bi_io_vec。还有下页图12-2和解说的文字,都印刷错了。
P191
L-11:记住根节点总为红色。
订正:这话怎么跟我看的数据结构的书矛盾啊。Mark Allen Weiss的《数据结构与算法分析──C语言描述》2nd第十二章《高级数据结构及其实现》就说:“根总是黑色的。”(P.S. Weiss可是Robert Love的老师哦)其实Love的话自相矛盾,他这么说的:“(红色和黑色)分派的规则为:1)红节点的子节点为黑色,并且2)树中任何一条从节点到叶子的路径必须包含同样数目的黑色节点。记住根节点总为红色。” 我们可以做个反证。假设根节点为红色,考虑一棵只有2个节点的二叉树,既然根节点是红色,那么根据Love说的第一条规则,叶节点必定为黑色,这将导致从根节点到左右NULL指针的路径包含的黑色节点个数不同(左边是0,右边是1),与第二条规则矛盾。Love本科是在佛罗里达大学读的数学专业,不可能犯这种错误,要不就是印刷问题,要不就是我理解错了。
P237
L+1:如果你希望得到一个单独的文件
订正:原文是“If you need to diff only a single file”,明显是说,diff程序的输入是两个单一文件(而不是两个目录),并非指diff生成一个单一补丁文件。(再说,diff程序能生成1个以上的文件吗?很怀疑的说 )
OK,大体这么多吧,其他的基本不影响阅读。Happy Reading!!
(趁着五一熬夜,5日凌晨7点半 )
续补:
十一时候翻译文档,发现有些知识理解还不到位,于是重读,又勘出几条错误。补在这里:
P246,B.1.2,
原书:它的原型在<linux/percpu.h>;中:
void *kmalloc_percpu(size_t size, int flags);
void kfree(const void *);
勘误:注意第一行存在严重印刷错误。应该把第一行改正为下面的两行:
void *alloc_percpu(type);
void * __alloc_percpu(size_t size, size_t align);
P246, L-5
原书:函数kfree_percpu()将返回一个指向动态生成的单CPU数据的间接引用。
勘误:“函数kfree_percpu()”改正为“函数alloc_percpu()或者__alloc_percpu()”。
P111, “8.9禁止抢占”上方那段话
原书:只要没有其他写者,写锁总是能够被成功获得。读者不会影响写锁,这点和读者-写者自旋锁及信号量一样。
勘误:译者理解错误。本书英文版原文是“The write lock always succeeds in being obtained so long as there are no other writers. Readers do not affect the write lock, as in the case with reader-writer spin locks.” 这句话的意思是说,seqlock这种锁,如果你想对它加写锁,只要此时没有别的写锁,那么不管有没有、有多少读锁加在它上面,你都会加锁成功。这与读写锁、读写信号量不同,读写锁和读写信号量当存在读锁的时候,写锁不可能成功,它会使调用者一致自旋,直到所有的写锁都被释放为止。其实这些知识你在本书P104和P108对读写锁和读写信号量的讲解中也能得到印证。 因此,这句话改正为:“只要没有其它写者,获取写锁总会是成功的。读者并不象读写锁与读写信号量那样会影响写锁。”
P109, “8.7 BKL”上面那段讲述“完成变量”的话
原书:完成变量的通常方法是,将完成变量作为数据结构中的一项动态创建,而完成数据结构初试化工作的代码将调用wait_for_completion()进行等待。
勘误:译者理解错误。本书英文版原文是“Kernel code waiting for the initialization of the data structure calls wait_for_completion(). When the initialization is complete, the waiting tasks ared awakened via a call to completion().” 译文改正为:“那些等待数据结构被初试化的内核代码调用wait_for_completion()函数进行等待,当初试化完成之后,执行初试化的线程会调用completion()函数来唤醒所有正在等待的任务。”
P74,“2. 调度tasklets”上面那一行
原书:tasklets才被激活,并且在被设置为挂起状态时,该tasklet才能够执行。
勘误:“被设置为挂起状态”原文是“if marked pending”,更准确的译法是“被标记为待处理的”。 另外再重复一遍,本章出现的所有“挂起”字样,其英文原文都是pending,意为未处理的、待处理的、待决的。大家自己做相应的改动,不一一给出了。