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

简介:   From: quntmec@hotmail.comTo: qf.hao@hotmail.comSubject: 关于《UNIX技术内幕》的勘误及遇到的问题_18Date: Sat, 31 Dec 2011 17:09:43 +0800郝先生,新年快到了,先预祝你在新的一年里身体健康,心想事成。

 
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


在全国各大书店及网城均有销售:
                         
                       
目录
相关文章
|
6月前
|
网络协议 Unix Go
Go unix domain socket通信
Go unix domain socket通信
|
存储 缓存 Unix
《返璞归真--UNIX技术内幕》--第9章 字符设备驱动
本系统中的输入输出设备都是字符设备,它们包括:KL-11/DL-11A——电传串行接口、PC-11——纸带打孔机和LP-11——行打印机。其中KL-11用于连接终端(terminal),作为用户键盘输入和显示输出的交互接口。
922 0
|
Unix
《返璞归真--UNIX技术内幕》--源代码
本源代码经宁希波帮助整理,去除了''和'&'符号,在此表示诚挚的谢意!源码中除/usr/personal目录外,均由Bell Labs(贝尔实验室)开发。
664 0
|
Unix
《返璞归真--UNIX技术内幕》-- 第11章 UNIX可执行文件
11.1  .out文件 本版UNIX的可执行文件是.out格式,如果你在UNIX下用gcc编译程序,它默认会生成一个名为“a.out”的可执行文件。
844 0
|
Unix
《UNIX技术内幕》--第3章 虚拟内存
Normal 0 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.
597 0
|
Unix C语言
《返璞归真--UNIX技术内幕》--第6章 中断处理过程
6.4  PDP 11/40的中断类型 系统中的中断主要有下面几种。 6.4.1  电传终端接口输入中断 电传终端接口用于链接PDP 11/40的总线和主要的输入、输出终端,当时该终端是电传打字机,这也是UNIX中用tty(teletypewriter)表示进程所使用的终端类型的原因,事实上电传接口还可以连接彩色显示器(CRT)等。
883 0
|
Unix Linux 调度
《UNIX技术内幕》勘误及问题解答_26
From: quntmec@hotmail.com To: qf.hao@hotmail.com Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_26 Date: Sun, 26 Feb 2012 16:34:18 +0800 郝先生, 线程方面碰到的问题如下: 1、689页,倒数第2、3行,里面提到第14章所实现的线程在退出时只会将线程栈释放、而不会释放该线程所分配的堆空间,这是否会造成内存泄漏?[郝]:如果用户线程在每次调用malloc后,都会调用free来释放它,那么就不会有内存泄漏。
920 0
|
Unix
《UNIX技术内幕》勘误及问题解答_25
From: quntmec@hotmail.com To: qf.hao@hotmail.com Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_25 Date: Fri, 17 Feb 2012 11:08:10 +0800 郝先生, 对...
782 0
|
18天前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
117 0
|
18天前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
32 2