和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


在全国各大书店及网城均有销售:
                         
                       
目录
相关文章
|
9月前
|
网络协议 Unix Go
Go unix domain socket通信
Go unix domain socket通信
|
存储 缓存 Unix
《返璞归真--UNIX技术内幕》--第9章 字符设备驱动
本系统中的输入输出设备都是字符设备,它们包括:KL-11/DL-11A——电传串行接口、PC-11——纸带打孔机和LP-11——行打印机。其中KL-11用于连接终端(terminal),作为用户键盘输入和显示输出的交互接口。
945 0
|
Unix
《返璞归真--UNIX技术内幕》--源代码
本源代码经宁希波帮助整理,去除了''和'&'符号,在此表示诚挚的谢意!源码中除/usr/personal目录外,均由Bell Labs(贝尔实验室)开发。
685 0
|
Unix
《返璞归真--UNIX技术内幕》-- 第11章 UNIX可执行文件
11.1  .out文件 本版UNIX的可执行文件是.out格式,如果你在UNIX下用gcc编译程序,它默认会生成一个名为“a.out”的可执行文件。
876 0
|
Unix
《UNIX技术内幕》--第3章 虚拟内存
Normal 0 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.
609 0
|
Unix C语言
《返璞归真--UNIX技术内幕》--第6章 中断处理过程
6.4  PDP 11/40的中断类型 系统中的中断主要有下面几种。 6.4.1  电传终端接口输入中断 电传终端接口用于链接PDP 11/40的总线和主要的输入、输出终端,当时该终端是电传打字机,这也是UNIX中用tty(teletypewriter)表示进程所使用的终端类型的原因,事实上电传接口还可以连接彩色显示器(CRT)等。
900 0
|
4月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
153 0
|
4月前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
57 2
|
1月前
|
Unix Linux 程序员
Unix:Linux的“逗趣祖师爷”与它的不凡传承
在科技长河中,Unix犹如一颗恒星,既是历史见证者也是未来的启发者。1969年,因程序员肯·汤普森想在他的PDP-7上玩“Space Travel”游戏,意外创造了Unix,以简洁优雅的代码改变了操作系统的世界。进入90年代,林纳斯·托瓦兹受Unix启发,开发了开源免费的Linux,像是Unix调皮的孙子,不仅继承其精髓还增添了开放共享的精神。Unix与Linux之间的传承,就像是智者与追蝶孩童的故事,充满了岁月的智慧与新生的活力,提醒我们科技传奇往往源于不起眼的小事。下次使用Linux时,不妨会心一笑吧!
37 0
|
1月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
35 0