和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_18

  1. 云栖社区>
  2. 博客>
  3. 正文

和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_18

罗宾豪 2012-08-13 15:32:54 浏览785
展开阅读全文

 
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_18
Date: Sat, 31 Dec 2011 17:09:43 +0800

郝先生,

新年快到了,先预祝你在新的一年里身体健康,心想事成。

对于《UNIX技术内幕》,我还有些疑问,如下:

1、348页,cinit()函数的最下面一行:

for (cp=(ccp+07) & ~7;...)

对于这个 (ccp+07) & ~7 操作不太明白...
[郝]: 本意是取ccp按8字节对齐的下一个地址,比如ccp=8,那么cp=8,ccp=10,那么cp=16。因为cblock的大小是8字节,那么cfree应该是8字节对齐。
但是这其实应该是编译器做的事情,而不需要程序来做对齐,所以这里我也是不太明白。也许是当时编译器的限制?

2、355页,canon()函数的第30和31行,看书的注释是行删除的功能。但个人感觉有些疑惑,例如:如果 已输入多行(每行的字数不定),且已达到cannob[100]的上限了,这时如果想删除当前行,那其不是将前面所有行一并删除了?(因为第31行会跳转 回第16行(loop处),在第17行就会重置bp)。
[郝]: cannob中存储的只有一行数据,因为当用户在窗口输入回车的时候,输入到cannob中的字符才会被处理
3、369页,对于partab[],它是如何与 maptab[]中的元素一一对应?不太看的明白里面说的“partab为maptab中的每一个字符对应设置了奇偶掩码值“。
[郝]: 建议你先查一下奇偶校验的含义。这里应该不难懂。
4、371页,代码第69~74行,ctype为何是“终端类型“? 参看349页,(t_flags>>8)&03 取的应该是 t_flags 的第8位和第9位。
同时371页,代码104~106行,c应该理解为“字符”还是“延迟时间“?
[郝]: 是的,第8、9位是NLDELAY宏,也就是表示用来计算延迟时间的某个具体设备号。c是延迟时间。
 
5、405页,代码里倒数第2个if语句,即:

if(c & 0x40)
{
    printf("缺纸");
    .......
}

根据402页的 图9-32,应为0x20(第5位,即数字12处)
[郝]: 对!谢谢!
6、 406页的9.4.3节里面的打印程序,能否解释的更详细一些呢?例如,opcode[],我的理解是存放待打印数据的缓存,但为何除了存放待打印数据外 还有其他的设置信息?如:407页开头(if语句下 面),opcode[0]=0x1b,opcode[1]=0x43,opcode[2]=0x60(按照注释是设定行数用的)。是否由于篇幅所限的原因 而省略了一些有关程序内容介绍的信息?
[郝]: opcode是放置打印数据和控制字符,因为打开的是设备文件/dev/para1。事实上这里的代码SimplePrint是把驱动程序和打印数据程序揉合起来了。

7、409页,代码第8~9行,我的理解如下:
u.u_offset内存放的是 虚拟内存 的地址,因此根据 34页 图3-11,bn为BLOCKNO(块号),on为DIB(块内偏移)。是这样理解吗?
[郝]: 对。

另,第16行代码:
UISA->r[0] = (ka6-6)->r[(bn>>7)&07] + (bn & 0177);

这句代码该如何理解?为何这样设置对应内存块地址?
[郝]: 这里是设置用户虚拟寄存器UISA的值。(ka6-6)是KISA0寄存器。

8、410页,mmwrite函数的倒数第9~10行,即:

UISA->r[0];
UISD->r[0];

这2句代码是什么意思?

个人感觉,应该是:倒数第12~13行代码应改为:

a = UISA->r[0];
b = UISD->r[0];

这样先保护现场数据;而倒数第9~第10行应改为:

UISA->r[0] = bn;
UISD->r[0] = 077406;

不知道我的理解对不对?
[郝]: 对,这里是排版错误,谢谢你的纠正!如果再碰到类似错误,请参考光盘中的源文件。那里应该是正确的。

此外,勘误如下:




356 1 6 (...参见7.1.3节...)应是 9.1.4的(3)
363

代码第1行,ttinput(ac,atp),应是 ttyinput
368

最后一段第3行:“位(最高位——位8)...“,应为 位7
370
28 colp=”({})!|^~'`”,应为“({)}...”
373

中间代码处,函数名xint(dev),应为 klxint
382

在节4.prdev下面,“函数原型:void printf(...”,应为 prdev

[郝]: 谢谢纠正。
Steve


在全国各大书店及网城均有销售:
                         
                       

网友评论

登录后评论
0/500
评论
罗宾豪
+ 关注