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

简介: Steve,请见答复。From: quntmec@hotmail.comTo: qf.hao@hotmail.comSubject: 关于《UNIX技术内幕》的勘误及遇到的问题_17Date: Sun, 18 Dec 2011 18:24:23 +0800 郝先...
Steve,
请见答复。

From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_17
Date: Sun, 18 Dec 2011 18:24:23 +0800

郝先生,

我碰到的问题如下:

1、307页,ialloc()函数的第51、52行代码,即:

if (fp->s_ninode > 0)
 goto loop;

问题:ialloc()为何会有上面这个判断?ialloc()是“后台自动运行的“还是”手工执行的“?
[郝]:首先我想,先要弄清楚代码何时会执行到底51行,也就是内存里面记录的节点已经用完了(fp->s_ninode =0),这样从第27行开始读取磁盘上的可用节点到内存中
但问题在于磁盘上的节点也有可能分配光了,所以到第51行依然要判断是否内存中有可用节点。如果有,则跳回到loop继续分配。ialloc是被其他函数所调用的,比如创建文件creat,具体你可以检查代码。我不明白“手工”和“自动”的意思?


2、308页,第3行:”...除i_atime[2]和i_mtime[2]是应为...“。这里的解释似乎有点不太恰当,因为iget()已将节点读入内存,所以ip使用的应是第253页里的inode结构,但该结构里没有i_atime[]和i_mtime[]。
[郝]:非常好,这里确实是缓存节点结构!我会在下一版加以更正。
3、311页,iupdat()函数第15行代码,即:

while(ip2 i_addr[8])

问题:这是应是指数组的最后一个元素,即应是 i_addr[7]。难道我记错了?(同样的问题在307页第3行(即第15行代码处))。
[郝]:这是C语言中的一个基本概念,如果用i_addr[7],那就应该写成 ip2i_addr[7],不是吗?

4、317页,readi()函数的37行,即

iomove(bp,on,n,B_READ);

问题:我不太明白这句代码的必要性,即为何需要将数据复制到 u.u_base缓存中?
[郝]: 事实上这个函数独来看确实有点不太好懂,因为它是系统调用read的内核实现部分(具体参照12.3.1节),iomove的必要性在于把读取出来的数据 拷贝到u.u_base通常是用户空间中,也就是read(fd, buf, len)中的buf指针。因为readi运行在内核空间,它所读出的数据也在内核空间中。没有这一步操作,用户根本无法获得数据。

5、325页,第2段第1行:“...所有的块设备也被作为字符设备列入...“。不太明白这里的意思。因为如果所有的块设备都按字符设备处理,那为何还需要 bdevsw[](里包含了所有的块设备驱动) ?
[郝]:rk11磁盘既可以作为块设备也可以作为字符设备 访问,用块设备访问的好处在于性能比较好。作为字符设备访问的好处在于可以顺序按字节流读写。

6、建议:可否增加minix3文件系统或EXT3文件系统的介绍(类似FAT16的介绍)?
[郝]:好建议。甚至IBM的JFS文件系统。我可以考虑在下一版中加入,如果你有什么好的材料或者代码可以告诉我。谢谢!

此外,勘误如下:

313

倒数第3段第1行:“...在6.2节...“,应是8.2.2

[郝]:是的,谢谢!


最后,对于你所发现的这么多问题,我会尽快在我的博客上发表注解(chinaunix.com),再一次感谢你的辛勤劳动和帮助!
Steve
目录
相关文章
|
网络协议 Unix Go
Go unix domain socket通信
Go unix domain socket通信
|
Unix
和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_4
Steve,应该是第2中情况,u变量就是一个user结构体,并且该变量地址固定在0o140000处,其所占空间长度就是结构体的长度。至于为什么要固定地址是0o140000,因为它是第6号虚拟寄存器映射的。
778 0
|
Unix
和Steve之间的通信--关于《UNIX技术内幕》的勘误及遇到的问题_3
From: quntmec@hotmail.comTo: qf.hao@hotmail.comSubject: 关于《UNIX技术内幕》的勘误及遇到的问题_3Date: Thu, 6 Oct 2011 19:24:10 +0800 郝先生,对于启动模块这一章...
778 0
|
Unix
《返璞归真--UNIX技术内幕》--第14章 多线程的实现
14.1  概述 现代操作系统引入了线程的概念。线程是CPU执行的最小单元,相对于进程而言,它具有轻捷、高效、开销小等优点。 14.2  线程和经典进程的比较 线程和经典进程的主要区别如下。
883 0
|
存储 缓存 Unix
《返璞归真--UNIX技术内幕》--第9章 字符设备驱动
本系统中的输入输出设备都是字符设备,它们包括:KL-11/DL-11A——电传串行接口、PC-11——纸带打孔机和LP-11——行打印机。其中KL-11用于连接终端(terminal),作为用户键盘输入和显示输出的交互接口。
961 0
|
Unix
《返璞归真--UNIX技术内幕》--源代码
本源代码经宁希波帮助整理,去除了''和'&'符号,在此表示诚挚的谢意!源码中除/usr/personal目录外,均由Bell Labs(贝尔实验室)开发。
698 0
|
Unix
《返璞归真--UNIX技术内幕》-- 第11章 UNIX可执行文件
11.1  .out文件 本版UNIX的可执行文件是.out格式,如果你在UNIX下用gcc编译程序,它默认会生成一个名为“a.out”的可执行文件。
902 0
|
Unix
《UNIX技术内幕》--第3章 虚拟内存
Normal 0 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.
618 0
|
Unix C语言
《返璞归真--UNIX技术内幕》--第6章 中断处理过程
6.4  PDP 11/40的中断类型 系统中的中断主要有下面几种。 6.4.1  电传终端接口输入中断 电传终端接口用于链接PDP 11/40的总线和主要的输入、输出终端,当时该终端是电传打字机,这也是UNIX中用tty(teletypewriter)表示进程所使用的终端类型的原因,事实上电传接口还可以连接彩色显示器(CRT)等。
918 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来释放它,那么就不会有内存泄漏。
946 0