登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書

『簡體書』Unix内核源码剖析【精读1万行代码,深入理解操作系统原理,超级计算机“京”的L1缓存设计者青柳隆宏经典著作 】

書城自編碼: 2241117
分類:簡體書→大陸圖書→計算機/網絡操作系統/系統開發
作者: 青柳隆宏 著,殷中翔 译
國際書號(ISBN): 9787115345219
出版社: 人民邮电出版社
出版日期: 2014-03-10
版次: 1 印次: 1
頁數/字數: 368/433000
書度/開本: 16开 釘裝: 平装

售價:HK$ 205.4

我要買

 

** 我創建的書架 **
未登入.


新書推薦:
四时如意 国风纹样线描涂色集
《 四时如意 国风纹样线描涂色集 》

售價:HK$ 59.8
活下去才是硬道理:华为的36条生存法则 一本书读懂任正非和华为的心法、做法、战法、阵法、活法,许小年、刘亚东、穆瑞澜、水皮倾情荐读
《 活下去才是硬道理:华为的36条生存法则 一本书读懂任正非和华为的心法、做法、战法、阵法、活法,许小年、刘亚东、穆瑞澜、水皮倾情荐读 》

售價:HK$ 93.6
森林:保护6万种树木的家
《 森林:保护6万种树木的家 》

售價:HK$ 86.4
数字经济:“数字中国”顶层规划与实践路径
《 数字经济:“数字中国”顶层规划与实践路径 》

售價:HK$ 82.8
算者生存:商业分析的方法与实践
《 算者生存:商业分析的方法与实践 》

售價:HK$ 95.8
共享现实:是什么让我们成为人类
《 共享现实:是什么让我们成为人类 》

售價:HK$ 153.6
女佣异闻:乙一出道25周年纪念短篇集
《 女佣异闻:乙一出道25周年纪念短篇集 》

售價:HK$ 59.9
生活观察图鉴 中国常见鸟类观察图鉴
《 生活观察图鉴 中国常见鸟类观察图鉴 》

售價:HK$ 179.8

 

建議一齊購買:

+

HK$ 153.4
《 大规模分布式系统架构与设计实战(系统讲解构建大规模分布式系统的核心技术和实现方法,包含开源的代码,手把手教你掌握分布式技术) 》
+

HK$ 231.4
《 算法心得:高效算法的奥秘(原书第2版,由在IBM工作50余年的资深计算机专家撰写,算法领域最有影响力的著作之一) 》
+

HK$ 127.4
《 算法谜题 》
+

HK$ 205.4
《 独辟蹊径的编程思维——“拿来主义”编程(编程新思路,教你如何从系统、程序、网络等中“拿来”。源码公开。) 》
+

HK$ 179.4
《 Nagios系统监控实践(原书第2版,Nagios创始人深度阐述系统监控的最佳实践和运作原理,为构建高效的企业级监控平台提供有效指导) 》
編輯推薦:
精读1万行代码,深入理解操作系统原理!
超级计算机“京”的L1缓存设计者青柳隆宏经典著作!
彻底读懂Unix源代码!
內容簡介:
为什么要阅读内核源代码
● 对计算机系统的全貌有更深入的了解
● 对学到的算法和思路举一反三
● 加深对操作系统的理解
● 提升自身的技术水平

为什么选择UNIX V6?
● 代码行数约为1 万行
● 有充实的资料可参考
● 网罗了操作系统的基本功能
● 简化的设计
● 便于读者对系统有完整的了解
● 有模拟器可供参考

本书是一本Unix内核源代码的阅读指南。作者结合UNIX V6已公开的相关文档,对其内核源码进行详细剖析,旨在让读者更深入地理解进程、中断、块IO系统、文件系统、字符IO系统、启动系统等操作系统的基本原理。

本书适合操作系统的初中级学习者阅读,特别适合通过大学课程和其他入门书对操作系统有所了解,但是对具体细节缺乏深入理解的读者,以及那些对操作系统的具体实现有兴趣的读者。
關於作者:
青柳隆宏
日本资深程序员,现在硅谷从事计算机处理芯片的设计工作。曾设计了超级计算机“京”的L1缓存,该计算机在2011年排名世界Top 500超级计算机的第1位,也是人类历史上第一台计算能力跨越1亿亿次每秒的计算系统。

殷中翔
日本国立九州大学系统信息专业硕士学位。具有十余年软件开发经验,现主要从事企业Web系统服务器端的开发及维护工作。

黄炎
同济大学本科毕业,现供职于上海爱可生,从事数据库高可用软件开发。大学有幸师从陈闳中教授,一窥UNIX V6代码的门径。

周金杰
同济大学硕士,法国国立高等电信学院(TELECOM PARIS)硕士。曾通读并研究UNIX V6源代码,同时参与了面向对象操作系统的移植以及操作系统调试器的开发工作,熟悉系统底层相关的技术知识。崇尚设计,享受编程给生活带来的乐趣。
目錄
第I部分
什么是UNIX V61
第1章 UNIX V6的全貌2
1.1  什么是UNIX  V62
1.2  UNIX的历史2
1.3  UNIX  V6内核4
1.4  构成UNIX V6运行环境的硬件4
PDP-115
1.5  代码9
1.6  手册9
1.7  小结10
第II部分
进程11
第2章 进程12
2.1  进程的概要12
什么是进程12
进程的并行执行12
进程的执行状态14
用户模式和内核模式14
交换处理15
2.2  proc结构体和user结构体15
proc结构体16
user结构体17
2.3  为进程分配的内存21
代码段21
数据段21
虚拟地址空间22
变换地址24
2.4  小结26
第3章 进程的管理I27
3.1  进程的生命周期27
3.2  创建进程28
进程的复制28
父进程和子进程29
系统调用fork29
newproc32
panic36
3.3  切换执行进程37
中断执行进程37
进程的执行状态37
选择执行进程的算法38
上下文切换39
系统调用wait39
sleep39
swtch41
swtch  的返回位置44
setpri51
wakeup  51
setrun52
3.4  执行程序53
程序执行文件的格式  53
系统调用exec54
estabur62
sureg65
expand66
3.5  进程的终止68
系统调用exit69
系统调用wait71
3.6  数据区域的扩展73
系统调用break73
3.7  管理内存和交换空间76
map结构体76
获取未使用区域77
释放区域  79
3.8  小结81
第4章 交换处理  82
4.1  什么是交换处理82
代码段和数据段82
sched83
xswap87
4.2  共享代码段的处理88
xalloc90
xfree93
xccdec93
4.3  小结94
第III  部分
中断  95
第5章 中断与陷入  96
5.1  什么是中断与陷入96
什么是中断96
什么是陷入97
5.2  优先级与向量(Vector)98
中断优先级和处理器优先级98
中断和陷入向量100
5.3  中断和陷入的处理流程100
发生中断或陷入101
执行call和trap104
5.4  时钟中断处理函数107
时钟设备的规格107
时钟中断处理函数的内容108
clock113
5.5  陷入处理函数117
trap117
grow122
5.6  系统调用的处理流程123
传递参数的方法123
sysent结构体124
trap126
5.7  小结128
第6章 信号129
6.1  什么是信号129
信号的发送方法129
确认接收信号129
信号的种类130
ssig131
kill132
signal133
psignal133
issig134
psig134
core136
在系统调用处理中处理信号136
6.2  跟踪功能137
什么是跟踪137
ipc结构体138
跟踪的处理流程138
stop139
ptrace140
procxmt142
wait143
6.3  小结144
第IV  部分
块IO  系统145
第7章 块设备子系统146
7.1  设备的基础146
设备的种类146
设备驱动146
类别和设备编号147
特殊文件147
7.2  块设备子系统148
缓冲区148
b-list和av-list150
RAW  输入输出151
7.3  缓冲区的初始化152
binit152
clrbuf153
7.4  缓冲区的获取和释放154
getblk154
notavail156
brelse157
7.5  读取158
读取的种类158
bread159
iowait160
iodone160
geterror161
breada161
incore162
7.6  写入163
写入的种类163
bwrite164
bawrite165
bdwrite165
bflush166
7.7  RAW输入输出167
physio167
swap169
7.8  小结171
第8章 块设备驱动172
8.1  什么是块设备驱动172
块设备驱动表172
设备处理队列173
处理流程173
8.2  RK-11磁盘驱动174
RK11-D175
特殊文件175
设定bdevsw[]176
中断处理函数176
RK11-D  的寄存器177
rkstrategy179
rkstart180
rkaddr180
devstart181
rkintr182
RAW  输入输出184
8.3  小结184
第V  部分
文件系统185
第9章 文件系统186
9.1  什么是文件系统186
inode186
树状结构的命名空间187
挂载187
访问权限188
根磁盘189
9.2  块设备的区域189
用于启动的区域190
超级块190
inode区域191
存储区域193
9.3  挂载193
mount结构体193
系统调用mount194
getmdev196
系统调用umount197
9.4  inode的获取和释放198
inode[]198
iget201
iput203
iupdat204
9.5  inode与存储区域的对应关系205
bmap208
itrunc211
9.6  分配块设备中的块213
ialloc213
ifree216
alloc217
free220
getfs222
badblock222
9.7  将路径变为inode223
目录的内容223
namei224
access230
9.8  初始化与同步232
iinit232
update232
9.9  小结234
第10章 文件处理235
10.1  用户程序对文件的处理235
10.23  个结构体235
标准输入输出237
10.3  文件的生成和打开处理237
系统调用creat238
maknode238
wdir239
系统调用open240
open1241
falloc242
ufalloc243
openi243
10.4  文件的读取和写入244
系统调用read、write244
rdwr245
readi246
writei248
iomove250
getf252
10.5  指定文件的读写位置252
系统调用seek252
10.6  关闭文件254
系统调用close254
closef254
closei255
10.7  目录的生成255
系统调用mknod255
10.8  文件的链接256
系统调用link257
suser258
10.9  删除文件258
系统调用unlink258
10.10  小结260
第11章 管道261
11.1  什么是管道261
使用管道的优点262
11.2  开始管道通信262
系统调用pipe262
11.3  收发数据264
writep264
readp266
plock267
prele267
11.4  结束管道通信268
closef268
11.5  建立管道通信的流程268
建立父子进程间的通信268
系统调用dup272
11.6  小结273
第VI  部分
字符IO  系统275
第12章 字符设备276
12.1  字符设备驱动276
字符设备缓冲区277
对缓冲区的操作278
初始化缓冲区池280
12.2  LP11设备驱动281
什么是LP11281
LP11设备驱动的功能282
lpopen284
lpwrite285
lpcanon285
lpoutput287
lpstart288
lpint288
lpclose289
12.3  小结289
第13章 电传终端290
13.1  什么是电传终端290
电传终端的接口290
特殊文件291
tty  结构体292
maptab[]295
partab[]295
KL11DL11296
KL11DL11设备驱动的规格297
KL11DL11设备驱动函数298
13.2  终端的开启和关闭298
klopen298
klclose300
wflushtty300
flushtty301
13.3  终端的设定302
gtty302
stty302
sgtty303
klsgtty304
ttystty304
13.4  从终端输入文字305
klrint306
ttyinput306
13.5  读取输入的数据308
klread309
ttread309
canon310
13.6  向终端输出数据313
klwrite314
ttwrite315
ttyoutput316
ttstart318
ttrstrt319
klxint320
13.7  小结320
第VII  部分
启动系统321
第14章 启动系统322
14.1  启动的流程322
start323
main326
etcinit329
14.2  小结330
附 录  参考资料等331
A.1 参考文献、网站331
A.2 pre  KR  C335
后记337
索引338
內容試閱
【前言】
本书针对1975年由贝尔实验室①发布的UNIX第6版(Sixth Edition Unix,此后简称为UNIX V6)的内核源代码进行解说。面向的读者主要是计算机专业的学生,以及从事计算机相关行业的具有初中级水平的技术人员。
考虑到一部分读者会有诸如“我对内核源代码根本不感兴趣”或者“与这种老古董相比,我喜欢更现代的操作系统”等看法,笔者想先阐述一下 阅读内核源代码的引人入胜之处,然后再解释 UNIX V6为何适合初次接触内核源代码的读者。
阅读内核源代码的意义
我们可以将操作系统(OS,Operating System)看做是一种软件(集合),它对包括硬件和软件在内的计算机系统的各个部分进行管理,并为用户提供便于使用的操作界面。 内核作为操作系统的核心部分,提供计算机系统必备的功能,因此也被称为狭义的操作系统。例如,shell之类的程序通常不是内核的一部分,而是利用内核提供的功能来实现的。内核以外的程序通常被称为用户空间(userland)程序,或用户程序。
通过阅读并理解内核源代码,我们会有如下收获。
对计算机系统的全貌有更深入的了解
掌握了作为计算机系统核心部分的内核,不仅对操作系统,对计算机的全貌也会有更为深入的认识。 对通过大学课程或其他途径学习的各种领域、各个层面的知识之间的关联性也会有更清晰的认识,让人有醍醐灌顶的感觉。
让操作计算机成为一种令人愉快的体验
理解了计算机系统的全貌,操作计算机本身也会变得更加令人愉快。比如,在计算机上执行某个程序的时候,如果能够准确把握系统内部所进行的操作,是不是一件很令人兴奋的事情呢?这种体验将加深读者对计算机的兴趣,使读者更有动力去提高自己的技术水平。
加深对知识的理解
阅读代码与否,对知识的理解程度会有云泥之差。如果只学习了概要,既 容易遗忘也难以应用。相反, 理解代码能够使你对学到的算法和思路举一反三,使之 成为可以受用一生的财富。
————
① 由美国的ATT公司和Western Electric公司于1925年设立的研究开发机构。
提升技术人员自身的水平
作为计算机行业的技术人员,阅读并理解了内核源代码有助于在专业领域里将自己提升到一个新的层次。尽管在全球范围内这个领域的从业者不断增加,但是在了解应用层面的同时, 对操作系统等底层的知识也有所了解,并且能够对系统做出整体优化的技术人员,仍是凤毛麟角。
但是恰恰是具备这种素质的人,才能在第一线发挥不可替代的作用。 如果想拉大与竞争对手的差距,是必须理解系统内核的。
为何选择UNIX V6
接下来想说明一下为什么不选择最新的操作系统,而将历史比较悠久的UNIX V6 作为本书的题材。
代码行数约为1万行
UNIX V6 的内核源代码包括设备驱动程序在内 约有1 万行,这个数量的源代码,初学者是能够充分理解的。有一种说法是一个人所能理解的代码量上限为1 万行,UNIX V6的内核源代码从数量上看正好在这个范围之内。看到这里,大家是不是也有“如果只有1万行的话没准儿我也能学会”的想法呢?
另一方面,最近的操作系统,例如Linux 最新版的内核源代码据说超过了1000 万行①。就算不是初学者,想完全理解全部代码基本上也是不可能的。
充实的资料
UNIX V6 的用户手册、相关资料和论文 都可以在网上找到。运行UNIX V6 所需的处理装置PDP-11 以及周边设备的设计文档,很大一部分也可以检索到。
① 另外, 有一本关于UNIX V6 的指南已经问世多年。此书名为《莱昂氏UNIX 源代码分析》(Lions’ Commentary on UNIX,机械工业出版社出版),由澳大利亚新南威尔士大学的约翰莱昂(John Lions)教授撰写,也被称为Lions 书(Lions Book)[3]①。这本书由于UNIX 的版权问题,据说当时只能在学生之间私下传看,后来才广泛地流传开来,现在可以从网上免费下载[4]。Lions 书对本书中基本没有涉及的PDP-1140 的汇编器及汇编代码也做了部分说明,与本书配合使用会有更好的效果。②
① 本书中以[ 数字] 形式标注的部分在书尾附录中有相对应的内容。
②  同时审校者推荐《UNIX 操作系统教程》,西安电子科技大学出版社于1985 年6 月出版,尤晋元主编。这是一本详细剖析UNIX V6 机制和源码的教材。——审校者注
网罗了操作系统的基本功能
UNIX V6 虽然比较老,但是 它实现了构成操作系统的大部分基本功能。目前最新的操作系统大部分都是以它为基础发展而来的,因此 以UNIX V6 为入门教材对我们了解最新的操作系统来说会很有帮助。
线程、网络、GUI、多核支持、虚拟机等这些UNIX V6 不具备的功能在近些年的操作系统中得以实现。这些功能当中有很多其实是以UNIX V6 实现的功能为基础的。
简化的设计
UNIX V6 作为一种早期的操作系统,功能实现比较简单。而最新的操作系统要顾及更多的问题,同时也要考虑到性能的优化,因此实现也更为复杂。 如果是首次阅读内核源代码,用相对简单的UNIX V6 更合适。
便于读者对系统有完整的了解
前面已经说过,从代码量上看,通读UNIX V6 内核源代码对个人来说是可以做到的。如果更进一步,对系统内置的用户程序集(如shell)的代码或是周边设备的设计文档也有所涉猎的话,就会 对包括内核在内的计算机系统整体有更深入细致的了解。上述系统内置的用户程序集的代码或设计文档与最新产品相比,在实现上更为简单,也更容易理解。
有模拟器可供参考
simh[7] 这款模拟器能够模拟包括PDP-11系列的许多处理器,可以用来运行UNIX V6。因此 在阅读源代码时可以随时通过模拟器确认不太明白的地方。在simh上运行UNIX V6的方法请参考附录A.1 的[8]、[21] 和[22]。
几个难点
当然,UNIX V6 也存在它特有的问题。UNIX V6 的大部分代码使用了C语言编写,而当时的C语言还处于初期阶段,在语法规格上与现在的C语言有所不同(顺便提一下,C语言就是因为编写UNIX 才诞生的)。当时的C语言使用KR①之前的语法,因此也被称为pre KR。请看下面的例子(代码清单1)。
代码清单1 当时的C 语言的示例
估计会有读者提出“为什么函数hogehoge 没有定义返回值和参数”、“为什么对int 型的hoge②可以使用hoge- 这样的写法”等疑问。这是由C 语言当时的语法决定的。
虽然存在这种语法上的差异,但pre KR C的语法规格说明书[16]可以在网上获取,而且如果是了解当代C语言的读者,应该不会很难理解。而比较特殊的pre KR C语法,请参考本书的附录。
另外,和其他很多程序一样,UNIX V6的一部分代码采用了汇编语言来编写。这对首次接触汇编语言的读者来说可能会有影响。但是,UNIX V6使用的PDP-11(参考第1章)的汇编语言的规格说明书[17]也可以在网上找到,慢慢熟悉就会适应了。
① 这里指的是C Programming Language 这部讲述C 语言的名著(Brian W. Kernighan、Dennis M. Ritchie合著)。根据两位作者姓氏的首字母,此书也被称为KR,中文版书名是《C 程序设计语言》, 由机械工业出版社出版。——译者注
② hoge 以及后文中出现的fuga 等是日语中经常使用的伪变量名,类似于英语中的foo、bar。——译者注
面向的读者
本书主要面向计算机专业的学生,以及从事计算机相关行业的具有初中级水平的技术人员。特别适合那些 通过大学课程和其他入门书对操作系统有所了解,但是对具体细节缺乏深入理解的读者,或是那些 对操作系统的具体实现有兴趣的读者。
需要具备的知识基础
UNIX V6 内核的大部分代码都是用C语言写成的,因此 读者必须具备C 语言的知识基础,也要掌握栈、队列等 基本数据结构和算法的知识。另外,如果能了解计算机的运行原理,比如程序在执行时需要首先加载到内存,然后从程序计数器指定的内存地址读取指令等,就更为理想了。
对那些完全不了解操作系统的朋友来说,本书的难度可能有点大。建议先参考在本书附录部分介绍的入门书籍(附录A.1 中的[5] 和[6]),等掌握了操作系统的基本知识后再来阅读本书,这样可能会达到事半功倍的效果。
本书的结构
第1 章介绍UNIX V6 的整体概要。
第2 章到第4 章介绍用来管理程序运行的进程(process)。第2 章概述进程。第3 章说明进程的控制方法。第4 章说明以有效利用有限内存空间为目的的交换(swap )处理。
第5 章和第6 章介绍因某种事项中断当前进程运行,并转而处理该事项的几种机制。第5 章首先介绍如何处理周边设备和CPU 内部发生的中断请求。然后介绍了系统调用(system call),系统调用是利用中断请求来连接用户程序和内核的机制。第6 章主要介绍信号(signal),信号用于实现进程间通信,会引起处理的中断或使处理 内容发生变化。
第7 章和第8 章介绍磁盘等设备的IO 处理。第7 章说明块(block)设备子系统,第8章说明块设备驱动程序。
第9 章和第10 章对文件系统进行说明。文件系统隐藏了块设备的存储细节,向用户提供访问数据的统一方法。第9 章介绍文件系统的概要,第10 章对文件的操作加以说明。第11 章介绍用来实现进程间数据通信的管道(pipe)。第12 章介绍行式打印机的IO 处理。第13 章介绍终端处理。终端处理使用户能够以会话的方式操作系统。第14 章说明系统的启动处理。
内核的整体结构和各章之间的对应关系如图1 所示。
上述章节是根据笔者认为在阅读UNIX V6 内核源代码时应该遵循的顺序而编排的,将读者可能更感兴趣的有关进程和文件系统的内容尽量安排在前半部分,其他的内容则安排在后半部分。另外,在阅读各章时所需的知识,尽量在前面的章节中加以说明。
图1 内核整体结构
关于本书的说明
因为篇幅有限,所以 本书以介绍内核的基本处理过程为主要目的,对比较少见的处理和异常处理没有进行特别细致的说明。此外,本书从所有代码中挑选出比较重要的部分(占所有代码的70%~80%),省略不是很重要的部分或非常简单无需说明的 代码。对用汇编语言编写的内容,本书只介绍了启动处理和上下文切换处理。本书中没有介绍的代码希望读者能够自己去分析理解。
另外,考虑到相关内容已经在本书中加以说明,因此在登载的代码中删除了UNIXV6 开发者加入的注释。但是为了提高可读性,笔者还是保留了一部分原注释 ,同时也加入了一部分新的注释。
本书旨在成为UNIX V6 内核源代码的阅读指南。如果想完全理解内核细节,仅阅读本书的说明部分是不够的,还需要深入理解书中涉及的甚至未涉及的代码。
关于代码的说明
本书按照下面的顺序,从抽象程度较高的内容向抽象程度较低的内容进行讲解。(1)讲解进程或文件系统等功能(2)讲解实现上述功能的函数或结构体(3)给出上述函数或结构体的代码并讲解为了便于读者阅读,本书按照下述格式讲解代码。根据需要,在有些地方调整了代码和表格的讲解顺序。
结构体的讲解
内核中定义了一些重要的结构体,用表格的形式介绍结构体的成员(代码清单2,表1)。在代码清单标题的括弧中,注明了定义该结构体的文件名。讲解的过程统一采用“结构体名. 成员”的形式表示某个构造体内的成员。
代码清单2 结构体示例(文件名)
表1 构造体示例
函数的讲解
首先以表格的形式讲解参数(表2),然后给出代码和每行的讲解(代码清单3)。在代码清单标题的括弧中,注明了定义该函数的文件名。虽然此处的例子对每行代码都做了详细(其实没有必要)的说明,但如果代码本身是无需解释的,或事先已做过介绍,那么在代码清单中就不会再做特别说明。
表2 函数参数示例
代码清单3 函数示例(文件名)
2  局部变量的定义
3~5  返回参数fuga 与10 相加的结果。
对汇编语言代码也以相同的方式说明。因为本书省略了对汇编器规格的说明,所以如果有读者需要简单确认PDP-11 指令集,请见附录A.1 的[9],需要了解汇编器详细信息的读者详见附录A.1 的[20]。
栈的说明
在涉及进程拥有的栈状态时将用表格加以说明(表3)。在第2 章中会提到,各进程的栈是从地址空间的最高位开始分配,向低位方向增长。但是在表格里位于上方的行表示较低位的地址,也就是说栈在表格里是由下向上增长的。
表3 栈的示例
寄存器
在涉及PDP-11 或周边设备的寄存器时将用表格加以说明(表4)。对未使用的比特位不做介绍。
在讲解中如果需要调用寄存器的某一位,比如说第0 位的时候,会以“寄存器名[0]”的形式标注。如果调用了多个比特位,比如说从第3 位到第1 位的时候,会以“寄存器名
[3-1]”的形式标注。
表4 寄存器示例
数字的表示形式
UNIX V6 中有很多地方采用了八进制数。为了避免混淆基数,在介绍中采用了如下的表示形式。
● 十六进制数:0x10
● 十进制数:16
● 八进制数:020
对二进制数则直接采用01 或10 的形式表示。尽管十进制数和八进制数的表示形式比较相似,容易混淆,但相信读者通过上下文还是可以区分的。
另外请注意,PDP-11 的汇编器对不带前缀的数字一律按八进制数处理。
几点有助于增进理解的建议
UNIX V6 内核源代码尽管比较适合初次阅读代码的读者,但是仍然有一定的难度。笔者在此举出几点便于读者增进理解的建议,在阅读代码遇到困难时请酌情参考。
首先通读全书
首先请从头到尾通读本书,掌握内核的全貌。在理解某个模块的代码时,往往需要对相关模块有所了解。前面已经说过,在编排章节时我尽量将相关内容靠前说明,但是这种做法毕竟还是有局限性的。在阅读中遇到难于理解的内容时,可以先跳过 它,等到读完全书后再重读这一部分,这可能是一个比较好的办法。
阅读规格说明书和程序员手册
在阅读本书的同时,阅读规格说明书和程序员手册有助于加深理解。 不要通过阅读代码去理解程序规格,而应该在理解规格的基础上再去阅读代码。特别是系统调用部分的规格非常重要。内核实现了最低限度的功能,而这些功能是通过系统调用提 供给用户程序的,从这个角度上说, 将系统调用的规格看作是内核的规格也并不过分。
在阅读设备驱动程序时,最好也读一下该设备的规格说明书。设备驱动程序是根据设备规格进行操作的,理解了设备规格后,对理解驱动程序进行的操作无疑会有帮助。
仔细阅读结构体
包括系统内核在内,程序的主要工作就是操作数据。因此,只要把握了作为处理对象的结构体,或是程序中出现的标志变量(flag),就能大致推测出该程序的处理内容。
区分内存空间地址
代码中涉及内存地址的部分,请注意区分该地址指向的是内核的地址空间,还是用户程序的地址空间。
寻找志同道合的朋友
在阅读本书、Lions 书,或是UNIX V6 内核源代码的时候,组织读书会是一个很好的方法。向他人提出自己的疑问,或是向他人介绍自己理解的内容,这都会加深 对内容的理解。在博客上写出自己的想法和心得也是一个很好的方法。
本书的写作原委和谢辞
在写本书之前,笔者对操作系统的大概情况有一定认识,但是完全不了解具体的实现方法,总希望有机会能阅读一下源代码。通过朋友的介绍接触到 Lions’ Commentary onUNIX 这本书(也就是通称的Lions 书),在了解到UNIX V6 的源代码不到1 万行等信息后,我马上就对此书产生了兴趣。
但是,Lions 书问世已久,写作的时代背景和现在相差迥异,因此对我而言很难理解,阅读速度非常缓慢。此时,又是前面提到的那位朋友向我介绍了一个关于Lions 书的读书会,我就参加了他们的读书活动。在读书会里,通过请教对内核比较熟悉的成员,或是向他人介绍自己通过预习而掌握的知识,慢慢加深了对UNIX V6 内核的理 解。
理解了系统内核之后,我上学时学到的计算机相关知识之间的联系就在头脑中逐渐清晰起来,同时也切实体会到自己在这个领域的造诣明显地提高了一个层次。
为了和他人分享这种体验,同时也作为学习的备忘录,我开始在博客上记录学习过程。读完了Lions 书后,博客的连载也告一段落后,我写了一篇总结性的文章,引起了很大反响。
当我确信读者对类似系统内核这种(与应用程序相比较)底层的知识有很大需求之后,便主动向出版社毛遂自荐,商谈以博客文章为基础出版图书的事宜,得到了技术评论社①的积极回应。
本书以笔者一人的微薄之力是难以完成的。如果没有参加读书会,是否能坚持读完Lions 书都是一个问题。借此机会对读书会的各位成员表示感谢。
读书会成员大野徹先生、小泽广先生、坂顶佑树先生、高野了成先生、丰岛隆志先生、七志先生、浜田直树先生、细川生人先生、松泽裕先生和山本英雄先生参与了本书的审阅工作,为笔者提出了很多中肯的意见。一想到如果没有这些意见的话呈 现在读者面前的将会是怎样一本书,不免有些后怕。正是因为大家的帮助,本书的品质得到了很大提高,我借此机会表示感谢。
小结
阅读内核源代码,可以提高自身的技术水平,加深对计算机的兴趣
UNIX V6的历史相对悠久,但是比较适合初次阅读内核源代码的读者
在理解规格说明书和手册的基础上,重复阅读本书和内核源代码将会加深理解
寻找志同道合的朋友十分重要
① 本书原著的出版社。——译者注

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 大陸用户 | 海外用户
megBook.com.hk
Copyright © 2013 - 2024 (香港)大書城有限公司  All Rights Reserved.