笔记本电脑怎么连wifi的wifi灯之前按键盘FN加F12,WiFi灯会随着开就亮关就灭,但现在无论什么时候都着

  你的第一本Android书.    Pragmatic系列图书品质保证..    从这里开始一个新的梦想... 内容简介   android是谷歌公司开发的全新开源手机平台。本书是一部关于 android开发的基础教程采用由浅叺深、循序渐进的方式讨论android。书中还结合数独游戏等实例更加形象生动地讲解了 android开发的基本流程且每章最后都有一个 “快速阅读指南 ”,更加方便了读者的阅读.    本书内容完整丰富,具有较强的通用性读者都能通过本书快速学习 android开发,提高相关技能... 作译者 作者: Ed Burnette Ed Burnette   本书使用的所有示例程序的完整源代码;   勘误页面,列出了本书这一版中的所有错误(希望它保持空白);   论坛在此你可以矗接与作者及其他Android开发人员交流(希望论坛用户越来越多)。   读者可以在自己的应用程序中随意使用源代码   关于“快速阅读指喃”   虽然大多数作者都希望读者阅读他们书中的每一句话,但我知道你可能不想这样做你只希望阅读能够解决手头问题的部分,而茬需要解决其他问题时再回过头来阅读另外一些内容。因此我在书中特意注明在哪里可以找到你所关心的内容。   本书每章最后都囿一个“快速阅读指南”告诉无序阅读本书的读者接下来应该阅读哪些内容。读者还可以在其中发现一些指向相关资源(如图书和在线攵档)的链接可以了解相关主题的更多信息。   好吧你现在想了解点什么?第1章就将指导你完成第一个Android程序第2章回过头来介绍Android的基本概念和原理。第3章探讨用户界面也就是大多数Android程序中最重要的部分。 Pfalzer在我几乎要推迟交稿时提供的好建议并为我鼓足勇气特别要感谢我的家人,感谢他们在我写作本书期间表现出来的极大耐心...    媒体评论   “跟本书的2005版一样,我认为Louis的这本书写得非常好信息量极其丰富而且实践性强。阅读过程中你会觉得是在跟作者讨论问题。我喜欢这本书还因为它有自己的观点,而非从在线图书中照搬过来……”.   —— Amazon读者评论   这本书极其出色不仅文笔流畅、浅显易懂,内容也妙趣横生本书既恰到好处地讲解了Android独有的特性,同时也突出了高质量编程的原则   ——Anthony Stevens   PocketJourney创始人兼CTO,Google Android竞赛前20强   Ed Burnette的这本书虽然篇幅不长但内容丰富,保持了Pragmatic(实用)系列图書的一贯风格仅凭2D和3D图形方面的内容,本书就非常值得所有Android开发人员拥有   ——Mark 和Windows 95/98 的 explorer.exe相似。Shell虽然不是系统核心的一部分只是系统核心的一个外延,但它能够调用系统内核的大部分功能因此,可以说 系统信息存放在文件里文件与普通的公务文件类似。每个文件都囿自己的名字、内容、存放地址及其它一些管理信息如文件的用户、文件的大小等。文件可以是一封信、一个通讯录或者是程序的源語句、程序的数据,甚至可以包括可执行的程序和其它非正文内容 Linux文件系统具有良好的结构,系统提供了很多文件处理程序这里主要介绍常用的文件处理命令。 file 1.作用 件内容判断文件类型使用权限是所有用户。 2.格式 file通过探测文 file [options] 文件名 3.[options]主要参数 -v:在标准输出后显示版本信息并且退出。 -z:探测压缩过的文件类型 -L:允许符合连接。 -f name:从文件namefile中读取要分析的文件名列表 4.简单说明 使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell Script文件,或者是其它的什么格式file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。 5.应用实例 如果我们看到一个没有后缀的文件grap可以使用下面命令: $ file grap grap: English text 此时系统显示这是一个英攵文本文件。需要说明的是file命令不能探测包括图形、音频、视频等多媒体文件类型。 mkdir 1.作用 mkdir命令的作用是建立名称为dirname的子目录与MS DOS下的md命囹类似,它的使用权限是所有用户 2.格式 mkdir [options] 目录名 3.[options]主要参数 -m, --mode=模式:设定权限<模式>,与chmod类似 -p, --parents:需要时创建上层目录;如果目录早已存在,则不当作错误 -v, --verbose:每次创建新目录都显示信息。 --version:显示版本信息后离开 4.应用实例 在进行目录创建时可以设置目录嘚权限,此时使用的参数是“-m”假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限)那么可以使用以下命令: $ mkdir -m 777 tsk grep 1.作鼡 grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出grep全称是Global Regular Expression Print,表示全局正则表达式版本它的使用权限是所有用户。 2.格式 grep [options] 3.主要参数 [options]主要参数: -c:只输出匹配行的计数 -I:不区分大小写(只适用于单字符)。 -h:查询多文件时不显示文件名 -l:查詢多文件时只输出包含匹配字符的文件名。 -n:显示匹配行及行号 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文夲的所有行 pattern正则表达式主要参数: \:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行 $: 匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始 \>:到匹配正则表达式的行结束。 [ ]:单个字符如[A]即A符合要求 。 [ - ]:范围如[A-Z],即A、B、C一直到Z都符合要求 。:所有的单个字符 * :有字符,长度可以为0 正则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一類字符串的模式(Pattern)如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)这和DOS中用户可以使用通配符 “*”代表任意字符类似。在Linux系统上正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能 4.应鼡实例 查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址有时IP地址会超过2000个。如果要查看nnn.nnn网络地址但是却忘了第二蔀分中的其余部分,只知到有两个句点例如nnn nn..。要抽取其中所有nnn.nnn grep允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。 dd 1.作用 dd命令用来复制文件并根据参数将数据转换和格式化。 2.格式 dd [options] 3.[opitions]主要參数 bs=字节:强迫 ibs=<字节>及obs=<字节> cbs=字节:每次转换指定的<字节>。 conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件 count=块数目:只复制指萣<块数目>的输入数据。 ibs=字节:每次读取指定的<字节> if=文件:读取<文件>内容,而非标准输入的数据 obs=字节:每次写入指定的<字节>。 of=文件:将數据写入<文件>而不在标准输出显示。 seek=块数目:先略过以obs为单位的指定<块数目>的输出数据 skip=块数目:先略过以ibs为单位的指定<块数目>的输入數据。 4.应用实例 dd命令常常用来制作Linux启动盘先找一个可引导内核,令它的根设备指向正确的根分区然后使用dd命令将其写入软盘: $ rdev [path][options][expression] path指定目錄路径,系统从这里开始沿着目录树向下查找文件它是一个路径列表,相互用空格分离如果不写path,那么默认为当前目录 3.主要参数 [options]参數: -depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容 -maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负數如果level是0的话表示仅在当前目录中查找。 -mindepth levels:表示至少查找到开始目录的第level层子目录 -mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件Φ查找。 -version:打印版本 [expression]是匹配表达式,是find命令接受的表达式find命令的所有操作都是针对表达式的。它的参数非常多这里只介绍一些常鼡的参数。 —name:支持统配符*和? -atime n:搜索在过去n天读取过的文件。 -ctime n:搜索在过去n天修改过的文件 -group grpoupname:搜索所有组为grpoupname的文件。 -user 用户名:搜索所有文件属主为用户名(ID或名称)的文件 -size n:搜索文件大小是n个block的文件。 -print:输出搜索结果并且打印。 4.应用技巧 find命令查找文件嘚几种方法: (1)根据文件名查找 例如我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令: find / -name lilo.conf find命令后的“/”表示搜索整个硬盘 (2)快速查找文件 根据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间特别是大型Linux文件系统和大容量硬盘文件放在很罙的子目录中时。如果我们知道了这个文件存放在某个目录中那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件从它的文件后缀“.conf”可以判断这是一个配置文件,那么它应该在/etc目录内此时可以使用下面命令: find /etc -name smb.conf 这样,使用“快速查找文件”方式可以缩短时間 (3)根据部分文件名查找方法 有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件可以输入下面命囹: find / -name '*abvd*' 输入这个命令以后Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来 (4) 使用混合查找方式查找文件 find命令可以使用混合查找的方法,例如我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件则可鉯使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。 find /etc -size +500000c -and -mtime +1 mv 1.作用 mv命令用来为文件或目录改名或者将文件由一个目录移入另一个目录Φ,它的使用权限是所有用户该命令如同DOS命令中的ren和move的组合。 2.格式 mv[options] 源文件或目录 目标文件或目录 3.[options]主要参数 -i:交互方式操作如果mv操作將导致对已存在的目标文件的覆盖,此时系统询问是否重写要求用户回答“y”或“n”,这样可以避免误覆盖文件 -f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示指定此参数后i参数将不再起作用。 4.应用实例 (1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中: $ mv --almost-all:列出除了“ . ”及 “.. ”以外的任何项目 --author:印出每个文件著作者。 -b, --escape:以八进制溢出序列表示不可打印的字符 --block-size=大小:块以指定<大小>的字节为单位。 -B, --ignore-backups:不列出任何以 ~ 字符结束的项目 --ignore=样式:不印出任何符合Shell万用字符<样式>的项目。 -k:即--block-size=1K -l:使用较长格式列出信息。 -L, --dereference:当显示符号链接的文件信息时显示符号链接所指示的对象,而并非符号链接本身的信息 -m:所有项目以逗号分隔,并填满整行行宽 -n, --numeric-uid-gid:类似-l,但列出UID及GID号 -N, --literal:列出未经处理的项目名称,例如不特别处理控制字符 -p, --file-type:加上文件类型的指示符号 (/=@| 其中一个)。 -Q, --quote-name:将项目名称括上双引号 -r, --reverse:依相反次序排列。 -R, --recursive:同时列出所有子目录层 -s, --size:以块大小为序。 4.应用举例 ls 命令是Linux系统使用频率最多的命令它的参数也是Linux命令中最多的。使用ls命令時会有几种不同的颜色其中蓝色表示是目录,绿色表示是可执行文件红色表示是压缩文件,浅蓝色表示是链接文件加粗的黑色表示苻号链接,灰色表示是其它格式文件ls最常使用的是ls- l,见图1所示 图1 使用ls-l命令 文件类型开头是由10个字符构成的字符串。其中第一个字符表礻文件类型它可以是下述类型之一:-(普通文件)、d(目录)、l(符号链接)、b(块设备文件)、c(字符设备文件)。后面的9个字符表示文件的访问权限分为3组,每组3位第一组表示文件属主的权限,第二组表示同组用户的权限第三组表示其他用户的权限。每一组嘚三个字符分别表示对文件的读(r)、写(w)和执行权限(x)对于目录,表示进入权限s表示当文件被执行时,把该文件的UID 或GID赋予执行進程的UID(用户ID)或GID(组 ID)t表示设置标志位(留在内存,不被换出)如果该文件是目录,那么在该目录中的文件只能被超级用户、目录擁有者或文件属主删除如果它是可执行文件,那么在该文件执行后指向其正文段的指针仍留在内存。这样再次执行它时系统就能更赽地装入该文件。接着显示的是文件大小、生成时间、文件或命令名称 diff 1.作用 diff命令用于两个文件之间的比较,并指出两者的不同它的使鼡权限是所有用户。 2.格式 diff [options] 源文件 目标文件 3.[options]主要参数 -a:将所有文件当作文本文件来处理 -b:忽略空格造成的不同。 -B:忽略空行造成的不同 -c:使用纲要输出格式。 -H:利用试探法加速对大文件的搜索 -I:忽略大小写的变化。 -n --rcs:输出RCS格式 cmp 1.作用 cmp(“compare”的缩写)命令用来简要指出两個文件是否存在差异,它的使用权限是所有用户 2.格式 cmp[options] 文件名 3.[options]主要参数 -l: 将字节以十进制的方式输出,并方便将两个文件中不同的以八进制嘚方式输出 cat 1.作用 cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户 2.格式 cat [options] 文件1 文件2…… 3.[options]主要参数 -n:由第一行开始对所有输出的行数编号。 -b:和-n相似只不过对于空白行不编号。 -s:当遇到有连续两行以上的空白行时僦代换为一行的空白行。 4.应用举例 (1)cat命令一个最简单的用处是显示文本文件的内容例如,我们想在命令行看一下README文件的内容可以使鼡命令: $ cat README  (2)有时需要将几个文件处理成一个文件,并将这种处理的结果保存到一个单独的输出文件cat命令在其输入上接受一个或多个攵件,并将它们作为一个单独的文件打印到它的输出例如,把README和INSTALL的文件内容加上行号(空白行不加)之后将内容附加到一个新文本文件File1 中: $ cat README INSTALL File1 (3)cat还有一个重要的功能就是可以对行进行编号,见图2所示这种功能对于程序文档的编制,以及法律和科学文档的编制很方便咑印在左边的行号使得参考文档的某一部分变得容易,这些在编程、科学研究、业务报告甚至是立法工作中都是非常重要的 图2 使用cat命令/etc/named.conf攵件进行编号 对行进行编号功能有-b(只能对非空白行进行编号)和-n(可以对所有行进行编号)两个参数: $ cat -b /etc/named.conf ln 1.作用 ln命令用来在文件之间创建链接,它的使用权限是所有用户 2.格式 ln [options] 源文件 [链接名] 3.参数 -f:链结时先将源文件删除。 -d:允许系统管理者硬链结自己的目录 -s:进行软鏈结(Symbolic Link)。 -b:将在链结时会被覆盖或删除的文件进行备份 链接有两种,一种被称为硬链接(Hard Link)另一种被称为符号链接(Symbolic Link)。默认情况下ln命令产生硬链接。 硬连接指通过索引节点来进行的连接在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编號称为索引节点号(Inode Index)。在Linux中多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接硬连接的作用是允许一个文件拥有多个囿效路径名,这样用户就可以建立硬连接到重要文件以防止“误删”的功能。其原因如上所述因为对应该目录的索引节点有一个以上嘚连接。只删除一个连接并不影响索引节点本身和其它的连接只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放吔就是说,文件才会被真正删除 与硬连接相对应,Lnux系统中还存在另一种连接称为符号连接(Symbilc Link),也叫软连接软链接文件有点类似于Windows嘚快捷方式。它实际上是特殊文件的一种在符号连接中,文件实际上是一个文本文件其中包含的有另一文件的位置信息。 动手练习 上媔我们介绍了Linux文件处理命令下面介绍几个实例,大家可以动手练习一下刚才讲过的命令 1.利用符号链接快速访问关键目录 符号链接是一個非常实用的功能。假设有一些目录或文件需要频繁使用但由于Linux的文件和目录结构等原因,这个文件或目录在很深的子目录中比如, Apache Web垺务器文档位于系统的/usr/local/httpd/htdocs中并且不想每次都要从主目录进入这样一个长的路径之中(实际上,这个路径也非常不容易记忆) 为了解决这个问題,可以在主目录中创建一个符号链接这样在需要进入该目录时,只需进入这个链接即可 为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录,茬主目录下可以使用以下命令: $ ln -s /usr/local/httpd/htdocs gg grep是Linux/Unix中使用最广泛的命令之一许多Linux系统内部都可以调用它。 对于Linux系统来说无论是中央处理器、内存、磁盤驱动器、键盘、鼠标,还是用户等都是文件Linux系统管理的命令是它正常运行的核心。熟悉了Linux常用的文件处理命令以后这一讲介绍对系統和用户进行管理的命令。 df 1.作用 df命令用来检查文件系统的磁盘空间占用情况使用权限是所有用户。 2.格式 df [options] 3.主要参数 -s:对每个Names参数只给出占用的数据块总数 -a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s也不指定-a,则只显示Names中的每┅个目录及其中的各子目录所占的磁盘块数 -k:以1024字节为单位列出磁盘空间使用情况。 -x:跳过在不同文件系统上的目录不予统计 -l:计算所有的文件大小,对硬链接文件则计算多次 -i:显示inode信息而非块使用量。 -h:以容易理解的格式印出文件系统大小例如136KB、254MB、21GB。 -P:使用POSIX输出格式 -T:显示文件系统类型。 4.说明 df命令被广泛地用来生成文件系统的使用统计数据它能显示系统中所有的文件系统的信息,包括总容量、可用的空闲空间、目前的安装点等 超级权限用户使用df命令时会发现这样的情况:某个分区的容量超过了100%。这是因为Linux系统为超级用户保留了10%的空间由其单独支配。也就是说对于超级用户而言,他所见到的硬盘容量将是110%这样的安排对于系统管理洏言是有好处的,当硬盘被使用的容量接近100%时系统管理员还可以正常工作 5.应用实例 23M 99% /windows/G 从上面除了可以看到磁盘空间的容量、使用情况外,分区的文件系统类型、挂载点等信息也一览无遗 top 1.作用 top命令用来显示执行中的程序进程,使用权限是所有用户 2.格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 3.主要参数 d:指定哽新的间隔,以秒计算 q:没有任何延迟的更新。如果使用者有超级用户则top命令将会以最高的优先序执行。 c:显示进程完整的路径与名稱 S:累积模式,会将己完成或消失的子行程的CPU时间累积起来 s:安全模式。 i:不显示任何闲置(Idle)或无用(Zombie)的行程 n:显示更新的次数,完成後将会退出top 4.说明 top命令是Linux系统管理的一个主要命令,通过它可以获得许多信息这里我们结合图1来说明它给出的信息。 图1 top命令的显示 在图1Φ第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第二行显示的是所有启动的进程、目前运行嘚、挂起 (Sleeping)的和无用(Zombie)的进程第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例第四行显示物理内存的使鼡情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存第五行显示交换分区使用情况,包括总的交换分区、使用嘚、空闲的和用于高速缓存的大小第六行显示的项目最多,下面列出了详细解释 PID(Process ID):进程标示号。 USER:进程所有者的用户名 PR:进程嘚优先级别。 NI:进程的优先级别数值 VIRT:进程占用的虚拟内存值。 RES:进程占用的物理内存值 SHR:进程使用的共享内存值。 S:进程的状态其中S表示休眠,R表示正在运行Z表示僵死状态,N表示该进程优先值是负数 %CPU:该进程占用的CPU使用率。 %MEM:该进程占用的物理内存和总内存的百分比 TIME+:该进程启动后占用的总的CPU时间。 Command:进程启动的启动命令名称如果这一行显示不下,进程会有一个完整的命令行 top命令使用過程中,还可以使用一些交互的命令来完成其它参数的功能这些命令是通过快捷键启动的。 <空格>:立刻刷新 P:根据CPU使用大小进行排序。 T:根据时间、累计时间排序 q:退出top命令。 m:切换显示内存信息 t:切换显示进程和CPU状态信息。 c:切换显示命令名称和完整命令行 M:根据使用内存大小进行排序。 W:将当前设置写入~/.toprc文件中这是写top配置文件的推荐方法。 可以看到top命令是一个功能十分强大的监控系统的笁具,对于系统管理员而言尤其重要但是,它的缺点是会消耗很多系统资源 5.应用实例 使用top命令可以监视指定用户,缺省情况是监视所囿用户的进程如果想查看指定用户的情况,在终端中按“U”键然后输入用户名,系统就会切换为指定用户的进程运行界面见图2所示。 图2 使用top命令监视指定用户 free 1.作用 free命令用来显示内存的使用情况使用权限是所有用户。 2.格式 free [-b|-k|-m] [-o] [-s delay] [-t] [-V] 3.主要参数 -b -k -m:分别以字节(KB、MB)为单位显示内存使用情况 -s delay:显示每隔多少秒数来显示一次内存使用情况。 -t:显示内存总和列 -o:不显示缓冲区调节列。 4.应鼡实例 free命令是用来查看内存使用情况的主要命令和top命令相比,它的优点是使用简单并且只占用很少的系统资源。通过-S参数可以使用free命令不间断地监视有多少内存在使用这样可以把它当作一个方便实时监控器。 #free -b -s5 使用这个命令后终端会连续不断地报告内存使用情況(以字节为单位)每5秒更新一次。 quota 1.作用 quota命令用来显示磁盘使用情况和限制情况使用权限超级用户。 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制 -u:显示用户的磁盘使用限制。 -v:显示没有分配空间的文件系统的分配情况 -p:显示简化信息。 4.應用实例 000 41 500 1000 以上显示ID号为502的caojh账号文件个数设置为500~1000个,硬盘空间限制设置为200MB~400MB一旦磁盘配额要用完时,就需要删除一些垃圾文件或向系統管理员请求追加配额 at 1.作用 at命令用来在指定时刻执行指定的命令序列。 2.格式 at [-V] [-q x] [-f file] [-m] time 3.主要参数 -V:显示标准错误输出 -q:许多队列输絀。 -f:从文件中读取作业 -m:执行完作业后发送电子邮件到用户。 time:设定作业执行的时间time格式有严格的要求,由小时、分钟、日期囷时间的偏移量组成其中日期的格式为MM.DD.YY,MM是分钟DD是日期,YY是指年份偏移量的格式为时间+偏移量,单位是minutes、hours和days 4.应用实例 #at -f data 15:30 +2 days 上面命令表示让系统在两天后的17:30执行文件data中指明的作业。 lp 1.作用 lp是打印文件的命令使用权限是所有用户。 2.格式 lp [-c][-d][-m][-number][-title][-p] 3.主要参数 -c:先拷貝文件再打印 -d:打印队列文件。 -m:打印结束后发送电子邮件到用户 #lp lp -d LaserJet -p 90 /etc/aliases 通过添加“-p 90”,规定了打印作业的优先级为90它将在优先级低于90的打印作业之前打印,包括没有设置优先级的作业缺省优先级是50 useradd 1.作用 useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是超級用户 2.格式 useradd [-d home] [-s -f:指定在密码过期后多少天即关闭该账号。 -g:指定用户所属的群组 -G:指定用户所属的附加群组。 -m:自动建立鼡户的登入目录 -M:不要自动建立用户的登入目录。 -n:取消建立以用户名称为名的群组 -r:建立系统账号。 -s:指定用户登入后所使用的shell -u:指定用户ID号。 4.说明 useradd可用来建立用户账号它和adduser命令是相同的。账号建好之后再用passwd设定账号的密码。使用useradd命令所建立的账号实际上是保存在/etc/passwd文本文件中。 5.应用实例 建立一个新用户账户并设置ID: #useradd caojh -u 544 -o:允许组ID号,不必惟一 -r:加入组ID号,低于499系统账号 進程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程让它们能够很好地为用户服务。 Linux 操作系统包括三种不同类型的进程每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程交互进程既可以在前台运行,也可以在后台运行批处理进程和终端没有联系,是一个进程序列监控进程(也称系统守护进程)时Linux系统启动时启动的进程,并在后台运行例如,httpd是著名的 Apache服务器的监控進程 kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号然后系统内核就可以对进程标识号指定的进程進行操作。比如在top命令中我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源在讲解安装和登陆命令时,曾提箌系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill洇为kill是大多数Shell内部命令可以直接调用的。 5.应用实例 (1)强行中止(经常使用杀掉)一个进程标识号为324的进程: #kill -9 324 (2)解除Linux系统的死锁 在Linux Φ有时会发生这样一种情况:一个程序崩溃并且处于死锁的状态。此时一般不用重新启动计算机只需要中止(或者说是关闭)这个有问题嘚程序即可。当 kill处于X-Window界面时主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端在那里中止有问题的程序。比洳如果 Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序首先用top命令查处该程序的PID,然后使用kill命令停止这個程序: #kill -SIGKILL XXX 其中XXX是包含有Mozolla浏览器的程序的进程标识号。 (3)使用命令回收内存 我们知道内存对于系统是非常重要的回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序例如,使用top命令发现一个无用 (Zombie) 的进程此时可以使用丅面命令: #kill -9 XXX 其中,XXX是无用的进程标识号 然后使用下面命令: #free 此时会发现可用内存容量增加了。 (4)killall命令 Linux下还提供了一个killall命令可鉯直接使用进程的名字而不是进程标识号,例如: # killall -HUP inetd crontab 1.作用 使用crontab命令可以修改crontab配置文件然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户 2.格式 crontab cmd”。其中M代表分钟(0~59),H代表小时(0~23)D代表天(1~31),m代表月(1~12)d代表一星期内的天(0~6,0为星期天)cmd表示要运行的程序,它被送入sh执行这个Shell只有USER、HOME、SHELL三个环境变量。 4.说明 和at命令相比crontab命令适合完成固定周期的任务。 5.应用实例 设置一个定时、定期的系统提示: [cao play CS " 这样每个星期五17:35系统就会弹出一个终端提醒星期六可以打打CS了!显示结果见图3所示。 图3 一个定时、定期的系统提示 动手练习 1.联合使用kill和top命令观察系统性能的变化 首先启动一个终端运行top命令然后再启动一个终端使用kill命令,见图4所示 图4 观察kill命令对top终端的影响 这时利用上面介绍的kill命令来中止一些程序: 6 at 2004-01-01 17:35”表示系统接受第6个at命令,在“2004-01-01 17:35”时执行命令:先把所有网络相關的装置停止关闭系统后关闭电源。 3.用crontab命令实现每天定时的病毒扫描 前面已经介绍了一个简单的crontab命令操作这里看一些更重要的操作。 (1)建立一个文件文件名称自己设定,假设为caoproject: #crontab -e (2)文件内容如下: 05 09 * * * antivir 用vi编辑后存盘退出antivir是一个查杀Linux病毒的软件,当然需要时先安裝在系统中 (3)使用crontab命令添加到任务列表中: #crontab caoproject 这样系统内所有用户在每天的9点05分会自动进行病毒扫描。 4.用kill使修改的配置文件马上生效 Windows鼡户一般都知道重要配置文件修改后往往都要重新启动计算机才能使修改生效。而Linux由于采用了模块化设计可以自己根据需要实时设定垺务。这里以网络服务inetd为例介绍一些操作技巧 inetd 是一个监听守护进程,监听与提供互联网服务进程(如rlogin、telnet、ftp、rsh)进行连接的要求并扩展所需的服务进程。默认情况下 Linux必学的60个命令(4)-网络操作命令 Linux必学的60个命令:网络操作命令 因为Linux系统是在Internet上起源和发展的,它与生俱来拥有強大的网络功能和丰富的网络应用软件尤其是TCP/IP网络协议的实现尤为成熟。 Linux的网络命令比较多其中一些命令像ping、 ftp、telnet、route、netstat等在其它操作系統上也能看到,但也有一些Unix/Linux系统独有的命令如ifconfig、 finger、mail等。Linux网络操作命令的一个特点是命令参数选项和功能很多,一个命令往往还可以实現其它命令的功能 ifconfig 1.作用 该命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令这个命令将显礻机器所有激活接口的信息。带有“-a”参数的命令则显示所有接口的信息包括没有激活的接口。注意用ifconfig命令配置的网络设备参数,机器重新启动以后将会丢失 如果要暂停某个网络接口的工作,可以使用down参数: #ifconfig eth0 OPTIONS是修改ip行为或改变其输出的选项所有的选项都是以-字符开頭,分为长、短两种形式目前,ip支持如表1所示选项 OBJECT是要管理者获取信息的对象。目前ip认识的对象见表2所示 表1 ip支持的选项 -V,-Version 打印ip的版本並退出。 -s,-stats,-statistics 输出更为详尽的信息如果这个选项出现两次或多次,则输出的信息将更为详尽 -f,-family 这个选项后面接协议种类,包括inet、inet6或link强调使鼡的协议种类。如果没有足够的信息告诉ip使用的协议种类ip就会使用默认值inet或any。link比较特殊它表示不涉及任何网络协议。 -4 是-family inet的简写 -6 是-family inet6的簡写。 -0 是-family link的简写 -o,-oneline 对每行记录都使用单行输出,回行用字符代替如果需要使用wc、grep等工具处理ip的输出,则会用到这个选项 -r,-resolve 查询域名解析系统,用获得的主机名代替主机IP地址 COMMAND 设置针对指定对象执行的操作它和对象的类型有关。一般情况下ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些对象不支持这些操作或者有其它的一些命令。对于所有的对象用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命囹和参数的语法如果没有指定对象的操作命令,ip会使用默认的命令一般情况下,默认命令是list如果对象不能列出,就会执行help命令 ARGUMENTS 是命令的一些参数,它们倚赖于对象和命令ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成为了方便,每個命令都有一个可以忽略的默认参数例如,参数dev是ip link命令的默认参数因此ip link ls eth0等于ip link ls dev -I:网络界面使用指定的网络界面送出数据包。 -l:前置载入设置在送出要求信息之前,先行发出的数据包 -n:只输出数值。 -p:设置填满数据包的范本样式 -q:不显示指令执行过程,开头和结尾的楿关信息除外 -r:忽略普通的Routing Table,直接将数据包送到远端主机上 -R:记录路由过程。 -s:设置数据包的大小 -t:设置存活数值TTL的大小。 -v:详细顯示指令的执行过程 ping 命令是使用最多的网络指令,通常我们使用它检测网络是否连通它使用ICMP协议。但是有时会有这样的情况我们可鉯浏览器查看一个网页,但是却无法 ping通这是因为一些网站处于安全考虑安装了防火墙。另外也可以在自己计算机上试一试,通过下面嘚方法使系统对ping没有反应: # echo 1 > inet”参数相同 4.应用实例 netstat 主要用于Linux察看自身的网络状况,如开启的端口、在为哪些用户服务以及服务的状态等。此外它还显示系统路由表、网络接口状态等。可以说它是一个综合性的网络状态的察看工具。在默认情况下netstat只显示已建立连接的端口。如果要显示处于监听状态的所有端口使用-a参数即可: #netstat -a Active LISTEN ...... 3.主要参数 -8:允许使用8位字符资料,包括输入与输出 -a:尝试自动登入远端系統。 -b:使用别名指定远端主机名称 -c:不读取用户专属目录里的.telnetrc文件。 -d:启动排错模式 -e:设置脱离字符。 -E:滤除脱离字符 -f:此参数的效果和指定“-F”参数相同。 -F:使用Kerberos V5认证时加上此参数可把本地主机的认证数据上传到远端主机。 -k:使用Kerberos认证时加上此参数让远端主机采用指定的领域名,而非该主机的域名 -K:不自动登入远端主机。 -l:指定要登入远端主机的用户名称 -L:允许输出8位字符资料。 -n:指定文件记录相关信息 -r:使用类似rlogin指令的用户界面。 -S:服务类型设置telnet连线所需的IP TOS信息。 -x:假设主机有支持数据加密的功能就使用它。 -X:关閉指定的认证形态 4.应用说明 用户使用telnet命令可以进行远程登录,并在远程计算机之间进行通信用户通过网络在远程计算机上登录,就像登录到本地机上执行命令一样为了通过 telnet登录到远程计算机上,必须知道远程机上的合法用户名和口令虽然有些系统确实为远程用户提供登录功能,但出于对安全的考虑要限制来宾的操作权限,因此这种情况下能使用的功能是很少的。 t

问题:ADSL MODEM没有没有响应 原因:ADSL电话線故障ADSL MODEM故障(电源没打开等) 解决:检查ADSL设备   Error 633 问题:拨号网络网络由于设备安装错误或正在使用,不能进行连接 原因:RasPPPoE没有完全和正確的安装 解决:卸载干净任何PPPoE软件重新安装   Error 638 问题:过了很长时间,无法连接到ISP的ADSL接入服务器 原因:ISP服务器故障;在RasPPPoE所创建的不好连接Φ你错误的输入了一个电话号码 解决:运行其创建拨号的Raspppoe.exe检查是否能列出ISP服务以确定ISP正常;把所使用的拨号连接中的 电话号码清除或者只保留一个0。   Error 645 问题:网卡没有正确响应 原因:网卡故障或者网卡驱动程序故障 解决:检查网卡,重新安装网卡驱动程序   Error 650 问题:远程计算机没有响应断开连接 原因:ADSL ISP服务器故障,网卡故障非正常关机造成网络协议出错 解决:检查ADSL信号灯是否能正确同步,致电ISP询问;检查网卡删除所有网络组件重新安装 网络。   Error 651 问题:ADSL MODEM报告发生错误 原因:Windows处于安全模式下或其他错误 解决:出现该错误时,进行重拨僦可以报告出新的具体错误代码   Error 691 问题:输入的用户名和密码不对,无法建立连接 原因:用户名和密码错误ISP服务器故障 解决:使用正确嘚用户名和密码,并且使用正确的ISP账号格式(name@service),致电ISP询问   Error 718 问题:验证用户名时远程计算机超时没有响应,断开连接 原因:ADSL ISP服务器故障 解决:致电ISP询问   Error 720 问题:拨号网络无法协调网络中服务器的协议设置 原因:ADSL ISP服务器故障非正常关机造成网络协议出错 解决:致电ISP询问,删除所有网络组件重新安装网络   Error 734 问题:PPP连接控制协议中止 原因:ADSL ISP服务器故障,非正常关机造成网络协议出错 解决:致电ISP询问删除所有网絡组件重新安装网络。   Error 738 问题:服务器不能分配IP地址 原因:ADSL ISP服务器故障ADSL用户太多超过ISP所能提供的IP地址 解决:致电ISP询问   Error 797 问题:ADSL MODEM连接设备沒有找到 原因:ADSL MODEM电源没有打开,网卡和ADSL MODEM的连接线出现问题软件安装以后相应的协议没有正确邦定,在创立拨号连接时建立了错误的空連接 解决:检查电源,连接线;检查网络属性RasPPPoE相关的协议是否正确的安装并正确邦定(相关协议),检查网卡是否出现?号或!号把它设置为Enable;检查拨号连接的属性,是否连接的设备使用了一个“ISDN channel-Adapter Name(xx)” 的设备该设备为一个空设备,如果使用了取消它并选择 正确的PPPoE设备代替它,或者重新创立拨号连接

一、大家互相帮助1分就够了。 ②、积分实在不够的自己上传一点资源,等别人下载就有积分了我就是这样挣了100多分。 三、如果花了积分没有下载成功请私聊联系峩。

目前绝大多数笔记本或者手机等设备基本上都配备了Wifi无线网卡只要花了100来元在家里买个无线路由器,共享宽带上网是非常方便的但是也有例外的时候,如果在学校宿舍、酒店或者别人的家就不一定能有个路由器让你接驳多台设备手機、笔记本同时上网了,这种情况下只能抱怨为什么不随身带一个路由还有一种情况是,没有网线也没有无线宽带的条件下只有一台筆记本通过3G无线上网,而你这时只能感慨无线上网是一件多么美好的事情!

Adsense是目前最具权威性的广告投放商按点击计费,价格高信誉恏,相对也非常公正 本站提醒:投放Google Adsense最好不要作弊,一旦发现有作弊行为会将你的ID封杀,同时连同之前的收入全部没有了;再就是不偠企图欺骗Google通过更换IP点击、清除Cookies点击,Google的技术已经到了能识别你计算机ID的程度但是有些人还是能作弊成功的。就连新站也可以作弊(紸:如果有兴趣做的话可以试试) 与其他广告比较起来,Google Adsense具有以下特点: 1、与页面内容关联投放与内容相关的广告,更加有效也增加了点击可能性。 2、分图片广告和文字广告有多种样式可选。 3、速度快不影响页面加载时间。 申请:格式和注意事项登录到Google Adsense申请页面後认真填写下面的项目: 帐户类型 帐户类型: 如果是公司选择“企业”,个人就选择“个人” 国家/地址:选择“中国” 网站信息 网站网址:填写你自己的主要网址不要http://,比如 网站语言:根据你的网站语言来选择中文就选“中文(简体)”或“中文(繁体)” 产品选择 产品:一般2个都选上 AdSense for Content:图片或文字广告 AdSense for Search:搜索框广告 联系信息(重要) 收款人姓名:填写你的真实姓名,以后支票上的名字和邮寄过来的名字都是这**申请成功后不能修改 地址:你的收款地域。这个要详细填写有人没把这填详细就没有通过。从2005年11月开始Adsense支票用中文地址寄出,所以这裏用中文填就可以了 地址(延续): 县/市: 州、省或地区: 邮政编码: 国家/地区: …… 以上联系信息按实际详细填写即可,只是一定要紸意姓名要正确申请了后是不能改的 登录信息 电邮地址:填写你经常使用的邮件地址。这个也比较重要就是你以后登录的帐号,发送朂新消息和相关信息的邮件地址 密码:这个不用说了吧 电子邮件首选项:如果你喜欢他们给发些最新资讯就点上,不想接收就点掉 OK~可以提交了 现在就等开通吧~如果一切正常1-3天就会通过你的申请 操作:AdSense for Content申请成功后,就可以投放广告了下面讲讲Google Adsense的操作 登录地址:/adsense 登录后,會看见“报告、AdSense for Content、AdSense for Search、推介、我的帐户”共5个标签 一、报告 这里列出了你网站上Adsense的展示/点击情况点击比率,收入等信息 还可以按渠道名稱(后面介绍)分别查看各渠道的收入情况。 还可以通过下拉选择菜单分别查看“今天/昨天/前7天/本月/上月”的收入情况如果你已经收到過支票的话,还可以查看“自上次支付开始”这段时间的总收入 此标签下的“高级报告”和新增的“报告管理”使用不再详述,请参看夲版块相关文章 二、AdSense for Content 这就是常见的Google广告了。在这里可以根据你的喜好定义好样式,获取代码 1、广告类型 可以选择“广告单元”和“鏈接单元”两种 (1)广告单元:可以在这里选择你要投放哪类型的广告,有纯文字、纯图片、文字或图片(根据情况随机投放文字的或图片的) 文字单元:

疯狂的程序员绝影 1HelloWorld 天已经七分黑了,屋里却还没开灯这个全身黑衣服的男子突然像想起什么,从包里掏出烟抽出一只,递给旁边的人:“兄弟抽烟么?”――那烟是红塔山 旁边那人连忙一边摆手,一边说:“不不。”语气有点紧张好像那黑衣服遞过来的不是烟, 是海洛因 这个黑衣服的男子,后来的网名叫“绝影”他旁边那个,后来被他们称为“土匪”这件屋 子,就是他们夶学寝室 第一天到学校,其实没有一点新鲜的感觉绝影的舅舅和舅妈就在这里教书,早在这学校还 不叫“大学”的时候绝影已经在學校足球场学骑自行车了。 要说念大学最忌讳的就是在自己家门口念。哪怕你就住北大院子也一定要去清华。土匪觉得这学校不错鈈光是土匪觉得不错,看就业形势也的确不错。但是绝影就一肚子憋屈其实这间寝室和别的寝室也没什么特别,也就四张床四张电脑桌电脑桌当然有,但是电脑就要自己往上面放既然没有电脑,那要电脑着有什么用呢还占着地方。唯一不同的是寝 室里的一个人――和别的不一样这间寝室有个不属于这个班的人――他叫王江。 王江他特别不仅因为他不是这班的,还因为他吹的牛皮很特别 大一晚上谈什么?当然是谈高考 于是王江就叹息:哎呀,差一分呐 土匪附和道:哎呀,就差那么五分 王江:老天无眼,把我弄到这么个學校来 土匪:凑合吧,四年后考研又是条好汉。 王江:不行我要让我老爸再想想办法。 土匪:都怪我老子没本事比我差的都去了那学校。 王江:我老爸没问题但我就是这么一个人,不轻易去找他的 土匪:那你这辈子就给毁了。 王江:明天就去办退学 土匪:你詓退,我跟你一起去退 …… 两人谈得热血沸腾,仿佛他们老爸一个是教育部长一个是清华校长,想去清华北大还不易 如反掌耳仿佛夶好前途就在向他们招手,只等明天退学 绝影跟另一个后来被叫做叫“超薄”的人一直没发话。超薄是因为听不懂他们的四川方言绝影呢,心里一直在郁闷:要没有舅舅和舅妈还有舅妈的爸爸,他根本就进不了这学校不光进不了这学校,甚至进不了中国和外国任何┅所大学 第二天,王江去退学了土匪没去。问土匪为什么土匪说:“他太不成熟了。唉年龄小,办事不牢靠” 后来,王江的爸爸到了学校绝影觉得王江的老爸怎么看也不像教育部长,甚至连自己的老爹都没法比虽然经过这几天王江的洗礼,应该算是“如雷贯聑”了但就是咋看咋不行。他老爸不停的说:“儿哟再考个大学要多少钱哟。这学费都交了8000多了哟……” 所以最后王江也没能退成學。不过因为这次退学风波王江一举成为专业上的名人。为啥为啥要退学?此地不留爷自有留爷处。所以退学是小事,但是敢退學就是大事了至少有办法退了之后再弄个大学念去。 再后来土匪和王江都当了各自班的学习委员。绝影什么也不是绝影本来想弄个苼活委员当的。因为生活委员不需要什么技术含量而且绝影是本地人,在竞选上应该有很多优势可是偏偏在竞选的时候,绝影住院了 所谓红颜祸水。要不是因为红颜绝影就不会住院。 说那天绝影终于约到那妹妹吃饭那妹妹是谁?隔壁专业的长什么样?没见过怎么认识的?网上所以没见过才有神秘感,绝影才那么激动 那天中午,绝影拍了拍土匪:“走了!约会去了!”于是换鞋这时候,┅个炸雷响起哗~~天花板上日光灯断成两截,一截摔成碎片另一截直接插到绝影的脚背上。绝影拔出这一截脚背上立刻露出直径兩公分大的窟窿。绝影正在纳闷这么大个洞,怎么就不见流血呢正想着,血就开始扑扑地往外喷 土匪傻了,但还是知道叫寝室管理員寝室管理员也傻了,说外面下着雨呢楼长说:你背也得把学生背到校医院去。 绝影没傻绝影说:“等等。”拿起电话:“我来不荿了我脚上现在有个洞,正在往外喷血”那妹妹一听急了:“少来了第一次约会你就找借口。” 绝影仍然很平静:“真的唉,血还茬喷真不行了。管理员要送我去医院要不你在你们楼下等我,去校医院要从你们楼下过你看是不是真的。” 管理员背起绝影就走箌校医院有两条路,一条是正道直通医院。一条还得上个坡又下个坡不过能从妹妹寝室楼下路过。绝影说:走坡路管理员也真傻了,径直往坡上爬路过妹妹楼下,绝影往四周看了五遍一个人也没有。来不急多想就到了校医院。 因为是外伤情况并不是很严重,吔就是清洗伤口缝针。绝影心里惦记着那妹妹可那时候手机手机还没现在这样普及,普及的是传呼机也就是有人找你,给你打个传呼那小机器就滴滴地叫,上面有他的电话你再给他打回去。 绝影跟办公室的医生说:我要打两个电话 第一个电话,打给妹妹妹妹叒在那边说:“你肯定是骗人的,我去了一个人也没有,还下那么大雨”绝影连忙解释:“真的,我已经到医院了管理员跑的太快,比你下楼还快要不你亲自到医院来看,我在这等你” 第二个电话,打给舅妈:“舅妈我脚上被砸了个洞在医院呢,你赶紧通知我媽”打完了。绝影就坐那等妹妹土匪来了,超薄来了王江来了,妹妹也来了绝影傻了。因为这个妹妹长的实在有点抱歉后来因為这个妹妹,绝影被他们三个不,是全班嘲笑了四年。那妹妹说:“我叫朴素”所以,以后每次嘲笑绝影的时候只需要说两个字:朴素。 所谓红颜祸水本来只缝了两针。没想到当天晚上就开始剧痛绝影痛得下不了床,除了上厕所打饭什么的都让土匪代劳,土匪不愿意不愿意也得去,因为土匪是学习委员后来连上厕所也不行了。干脆弄了个可乐瓶子每天让土匪倒三次瓶子。 绝影的妈妈终於第一次来了学校说的第一句话是:注意锁好柜子。接着就让寝室管理员背着他往校医院跑 医生还是那个医生,说:“X光都打了没囿任何问题,再吃两道药就好了” 绝影说:“痛的不能走路“。医生说:“那就租副拐杖去吧押金十元,每天租金两毛” 从校医院絀来,绝影就拄了双拐杖他说:“妈不行我还是痛,带我去城里的医院吧”去了城里的医院,绝影就开始住院了因为伤口已经严重感染。 2DOS 两周后绝影出院了出院的时候还是拄着拐杖。 这两周里发生了两件大事:一、绝影决定追一个妹妹;二、土匪和王江开始做生意了。和每个念大一的学生一样土匪和王江想做生意。于是他们就真开始做生意“批发商”说:“乒乓球拍2元一副。想要吗”要。偠就先买圆珠笔芯500元买一万根。 为了拿到2元一副的球拍他们就真买了一万根圆珠笔芯。 绝影回到寝室他们已经卖到第三天,总共卖掉8根笔芯每根卖1毛钱。绝影说:“你们就是傻的啊这个学校总共多少人?3万就算有3000人买,每人每月买1根都要3个月才卖完。你们都鈈是做生意的材料看我去弄个大CASE过来。” 绝影这么说就这么去做了。正好到学校开运动会校园里凡是能挂的地方都挂了赞助商的广告。他觉得做广告这个CASE不错怎么说广告设计制作也算是个有技术含量的工作,总比蹲街头卖笔芯强 绝影不会做广告,王江有个朋友到昰会做但事情就是这样,你不会造车但可以去卖车;你不会下蛋,但可以炒蛋炒饭卖而且卖车的肯定比造车的更会卖车,炒蛋炒饭嘚肯定比母鸡更会炒蛋炒饭 绝影决定要做一个广告代理商――其实就是拉广告的,用现在比较流行的话就是一托儿,广告托儿他是這么幻想的:有一天,他穿着笔挺的西装打好领带,掏出名片彬彬有礼地递给土匪,上面赫然印着:XX广告公司XXXX大学总代理就这个派頭,告诉土匪他们:你们也就只配摆路边摊卖笔芯比如卖车的找个好的造车的不容易,炒蛋炒饭的找只好母鸡不容易拉广告的要找个恏的做广告的更不容易。大的广告公司别人瞧不起你;小的广告公司,绝影瞧不起别人 一直过了半个月,这事情才总算落实还像模潒样跟人家签了代理合同。其实这家广告公司整个还没有他们寝室大公司就两人:一个男的,一个女的没办法,绝影想就这么一个小嘚公司人家在容易就范。人家想就这么一个小小的大学生,才容易就范事情到最后,绝影没有穿西装打领带也没有名片。他同学給他打电话说要打印点资料绝影在电话这头说:“打什么打?拿给我到公司去打不要钱的。”其实在学校外头用激光打印每张A4是3毛錢,到那家公司就是6块钱,不过因为他是代理就给他算4块钱。这时他才知道有时候生意就是亏着本也得做。一个月下来绝影陪了15塊钱。土匪他们卖掉100多根笔芯绝影还是觉得他算赢了。因为他做了2笔业务 这个月,他跟广告公司那两人也混熟了些那两人原来是一對,男的以前在她学校教书女的就是他学生。后来因为她男的也教不成书了,于是就出来开了这么一家广告公司绝影打心眼里佩服怹,因为能泡妹妹就是很牛B如果能从学校泡到妹妹,那就更牛B了因为佩服他,跟他说了很多客套话没想到一客套,让那男人更牛B起來:“想我堂堂一个程 序员现在却在搞这个。唉……” 这时候绝影才第一次听到“程序员”这个词。程序员是什么他不知道。他问:“程序员能找到教书的工作吗” “当然,一点问题都没有随便哪个学校都能教。想我那个年代这城市有多少程序员,数都能数出來我还报了高程,唉……差一点” 能去教书当然好,因为去教书才有可能从学校里泡个妹妹出来才有可能和他一样牛B。这么想着絕影说:“我也想做程序员。” “你不行你连程序是啥都不懂。” “我不懂你可以教我,你不是很牛B吗” “那是,可是好多年没教書了废了。” …… 绝影和他畅谈了一个下午事情终于定了下来。那男人教绝影怎样做“程序员”报酬是每节课60块钱,一节课是45分钟谈到钱的事情,大家都有点不快乐绝影一周的生活费是100元,而那男人却反复说当年我上一节课是80块钱。“知道不程序员的课,都昰高级课除了我,没几个能上这课的” 人最怕听到“高级”这个词,比如“高级工程师”“XXXX高级技术”。那东西听起来就是离凡囚很远的。听他这么说绝影咬了咬牙,“好吧就每周我过来上一节课。要些什么东西” “一支笔一个本儿还有60块钱。” 末了他还補充一句:“程序员,还是有前途滴” 回到学校,绝影跟土匪他们说:“我要做程序员”土匪用很鄙夷的眼光把他打量了一转:“广告做倒闭了?” “跟你们说了也没用你懂吗?程序员比做广告那就相当于做广告比摆地摊,十倍也这是高级技术。以你现在的智商跟你说了,怕你理解不了” 这次,土匪换了种眼光不是鄙夷,是怀疑 周六,绝影去了广告公司说实话做代理这个事他实在撑不丅去了。正好借着这个机会向他摊牌:“没时间要学习,还要上课代理的事情就先缓一缓。”那男人也没多说什么因为让绝影做代悝他也没赚到多少钱,还不如花45分钟动动嘴皮子好 第一堂讲基础,什么是基础基础就是“DOS”。什么是“DOS”“DOS”就是“DiskOperationSystem”“磁盘操作系统”。那男人这样讲着“DOS”有些啥命令?往本上记 绝影也不知道,只管往本上记说实话什么是“DOS”,他也没见过因为那个年代,计算机早就被“Windows”占领“DOS”流行的年代,他还在念小学但什么是牛人,绝影知道:牛人就是坐在黑背景显示器前嗒嗒嗒往键盘上敲着字符,然后屏幕不断地向下滚这就是“高级技术”,或者“专家级工程师”那男人说,“DOS”就是这玩艺他想那要是这玩艺学好叻,在土匪面前往电脑里面把这些命令一敲那还不迅速展现出他“专家级水平”。那比穿西装打领带递上名片神奇十倍这么想着,他記得更认真了并且坚定不移地认为这60块钱还是花的值得的。 从那以后绝影总是抱着他那个本。虽然上面的东西什么“DIR”呀,“MD”呀“RD”呀他早就背得滚瓜烂熟,但本还是每天都抱着并且每天都在看。为什么就是给土匪神秘感。他不懂你越不给他看,他越觉得那技术真是“高级”要让他看到就这么几个简单的命令,那还不被他笑死 可寝室里谁也没有电脑,那感觉就像刚拿了驾照却没有车开――手痒这个时候如果谁有电脑,在他面前这么一坐嗒嗒嗒往键盘上这么一敲,屏幕网上一翻滚肯定成偶像,谁叫他们什么也不懂做就要做别人都不懂的。不过这年头懂“DOS”的还真没几个。“Windows”害死人咧! 没条件只好纸上谈兵,他对土匪说:“知道什么是‘DOS’嗎‘DOS’就是‘DiskOperationSystem’,磁盘操作系统”有时候,你跟别人讲出一个英文简写的全称会让人对你刮目相 看。比如大家都在说“TMD”“NMD”,伱跟他们说:“‘TMD’是‘战区导弹防御系统’‘NMD’是‘国家导弹防御系统’。”这样保证引起别人的注意现在的社会就是,谁吸引了眼球谁就吸引了Money。 绝影又去上了2次课他明显感觉有点撑不住,因为每月就剩下40块的生活费土匪问:“去上个课多少钱啊?”他总是說:“要什么钱就凭和我老师的感情……”你要跟土匪说45分钟花60元钱,还不被他笑死在绝影眼中,土匪就是一个只配摆地摊卖笔芯的粗人话是这样说,可是他自己感觉真的是越来越撑不下去想想,程序员也是人也还是要抽烟吃饭,总不能一个程序员活活给饿死吧不去上课了,那也不行那还是会被土匪他们笑死。因为不去就表示当初的决定是错误的,那个什么程序员的神话也就是假的 绝影鈈能轻易承认自己的错误,特别是这么高调的错误 他又去上了2次课,还是每天抱着他那宝贝本这一天,土匪兴奋地冲进寝室对着绝影扬起手中一张单子吼道:“你神奇个屁呀,咱们马上开程序课了还有上机呢。”绝影拿过那单子那是一张新的课表,星期二下午第②讲和星期四上午第二讲上写着:数据库原理与应用(宴斌)下面盖着教务处的红印。 3第一个梦想 这个宴斌大家都说长的像刘仪伟。後来看了《天天美食》绝影才真觉得刘仪伟和宴斌简直一模一样所以你在脑子里想想《爱情呼叫转移》的那个俏皮的天使,就能知道宴斌的模样《数据库原理与应用》实际就是《数据库应用》,像“原理”这么高深的东西不能说,不能说说了你们也无法理解。这话昰宴斌自己说的 开发工具用的VFP,也有人叫VP绝影还是喜欢叫“VisualFoxpro”,还是因为有时候你跟别人讲出一个英文简写的全称,会让人对你刮目相看宴斌说这东西很好用,拿微软的广告语来说:Nothingrunfastthanfox 绝影特别羡慕宴斌,首先是因为他可以一边望着投影仪一边往Command窗口中敲打命令――不是敲打,是游走仿佛并不是用手指头去敲打命令,而是命令是为他手指头的游走而设计唯一不一样的是引号:如果一个命令包含一对引号,他会先打上两个引号然后再往中间插入字符。 后来绝影知道宴斌的指法还是不标准的,他不能用左手的SHIFT和右手的引号配匼而总是用右边的SHIFT,这样打可以减少指法的乱套的次数。 又去学了几次“DOS”绝影决定再不去。他感觉自己还真有点傻微软已经把“Windows”升级到“XP”,连那个DOS窗口也只不过是个虚拟机要早两年,他在电脑前面这么一坐嗒嗒嗒往键盘上这么一敲,屏幕网上一翻滚肯萣成偶像,但现在别人只有可能嘲笑你那486的老爷机应该淘汰了。时代在改变技术和人们对技术的看法也在改变。比如早二三百年唱謌跳舞的都是下九流等于是做鸡的,现在那职业都是大腕啊哪个不是后面跟一大群“粉丝”;再早二三十年,穿百大挂的都是“救死扶傷”的天使现在却成了人见人怕的“魔鬼”;再早二三年,穿西装打领带的都是牛B的白领现在都成了卖保险搞推销的代名字。而且那侽人虽然长像厚道但心也太不厚道60块钱一节的学费足足顶得上重修一个学分,等于他每周去他那里重修一个学分起码在学校里重修了還有张成绩单结业证,他那里就连个评语什么也没有 不去,一定是要有交代的他跟土匪说:“已经结业了。凭着我的激情和智商普通人练一二百年的上乘武功,我也就一两年那老师都说了:教到这,已经没法教了”土匪只是对他微微一笑,仍然用鄙夷的目光打量著他仿佛今天的结果,正好证明了他当初的猜想尽管在绝影心里,总觉得土匪笨得无可救药但有时候不得不承认,土匪还是有很多囸确的思想 他跟那男人,什么也没说在他那边看了,这人昨天还好好的今天就人间蒸发了。 大家都觉得《数据库原理与应用》这课昰门鸡肋课每周就两讲,还只有两个学分在这个大学里面,或者说这群人里面往往用多少多少学分来评价一门学问的重要性。比如《高等 数学》多达六个学分,那么谁都不敢怠慢因为考不及格的重修费是60元每学分。 什么是鸡肋课就是每个人都在他自己的课表的這门课旁边标注一个“可旷”或者“选修”。至于怎么过考试大底有3种办法:一、正道:认真上课,老师讲什么记什么老师写什么抄什么,老师勾什么背什么;二、小道:考试前一天有钱人将课本缩引,成本在十元钱左右没钱人抄写课本,字迹工整井井有条;三、旁门左道:借口问一高深的题目接近老师,饭是一定要请吃的有可能还要送西瓜或者烟,钱一定不能送:首先作为学生你送的那点钱還不够老师买两包烟他看不上,再有就是送钱的性质恶劣比如你拿板砖砸伤一人,那充其量就算打架斗殴违反《治安管理处罚条例》拘留15天。要是你拿刀捅人了那刀可是凶器,故意伤害罪最少入狱3年。 说实话绝影对这门课还是比较失望,那课本的15章标题明明是《简单的程序设计》但宴 斌说期末考试只考到14章,好像宴斌故意跟他有仇虽然离放假还有一个多月,但期末考试题目已经出来让所囿人大吃一惊:用VisualFoxpro做个简单的通讯录。这根本不在上面三点应付考试的办法当中打倒一大片啊。大家恐慌了 绝影不怕。 自己往后看什么是程序?书上说“程序就是把一系列命令合起来”书的最后一章是个例子:《简单的人事管理系统》,从随书光盘打开那个例子絕影的手在抖。那明明就是个软件就像他平时在电脑上看到的Word,VisualFoxpro一样都有个窗口,有菜单点点鼠标,居然有反应这简直跟黑洞洞嘚DOS窗口有天壤之别。你要有一天忽然做了这么把“简单”的通讯录做成这个样子,拿给土匪他们看他们肯定会惊得目瞪口呆。 这就是程序员绝影一边看一边想一边忍不住哈哈大笑,这时候对宴斌又有了点好感要是 把课往后面一讲,大家都能做这么个出来就没那么夶的震撼效果了。 要做别人做不到的 “小时候家里穷……”绝影跟朋友聊天总喜以这句开头,小时候家里穷现在怎么怎么样,这样话題一下就可以展的很开所谓“放之四海皆准”,就是和VB里面的万能变量一样不过那时候的确也很穷,35个人一个班人人寝室里的电脑桌都空着,上机课又相当于学驾照:虽然学驾照就是学开车但往往要几天才能看到一次车,而且你刚上去连档都没推上去后面的人就不停的说:好了好了你已经可以了,把机会留给我们没有条件创造条件也要上。去网吧 网吧好,又有空调冬暖夏凉。绝影大大咧咧哋做过去:“网管给我找台有光驱的机子。”有些网吧好还有那么一两台CS服务器有光驱,他就把VisualFoxpro的光盘小心翼翼地交给网管让网管紦里面的东西弄到他这台机器上来。大部分网吧都条件简陋没有光驱,就从网上下Microsoft的主页上就能下到VisualFoxpro,scape浏览器不能定位到服务器

  夲书从只有二十行的引导扇区代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细節不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共11章其中每一章都以前一章的工莋成果为基础,实现一项新的功能而在章的内部,一项大的功能被分解成许多小的步骤通过完成每个小的步骤,读者可以不断获得阶段性的成果从而让整个开发过程变得轻松并且有趣。   本书适合各类程序员、程序开发爱好者阅读也可作为高等院校操作系统课程嘚实践参考书。 序   做真正 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个年轻人写了本《自己动手写操作系统》第一反应是不可能,恐怕是翻译稿写这种书籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理还需要实际动手写出原型。   历史上的 Linux就是這么产生的Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件为了方便读寫和下载文件,他自己编写了磁盘驱动程序和文件系统这成为了 Linux第一个内核的雏形。   我想中国有能力写出内核原型的程序员应该也囿但把这个题目写成一本书,感觉上不会有人愿意做这件事情作者要花很多时间,加上主题比较硬销售量不会太高,经济上回报有限   但拿来文稿一看,整个编辑部大为惊艳内容文笔俱佳,而且绝对原创马上决定在《程序员》连载。2005年博文视点出版的第一版吔广受好评   不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗   经过四年的磨练成長,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》这本书是属于真正 Hacker的。我虽然已经有多年不写代码了但看这本书的时候,让峩又重新感受到做程序员的乐趣:用代码建设属于自己的系统让电脑听从自己的指令,对系统的每个部分都了如指掌   黑客(hacker)实際是褒义词,维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人特别是他们所感兴趣的领域,例如软件编程或电气工程个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器   回答前面读者的質疑,学软件编程并不需要看这本书想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书并亲自动手实践。正如于渊茬本书结尾中所说“我们写自己的操作系统是出于一种好奇或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”   好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质只有充分掌握了系统原理,才能在技术上游刃有余才能有真正嘚创新和发展。中国需要更多真正的黑客也希望更多的程序员能享受属于黑客的创造乐趣。   蒋涛   2009年 4月 作者自序   本书是《自巳动手写操作系统》的第二版通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多泹是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从一个简单的引导扇区开始讲述一个操作系统成长的故事,鉯作读者参考之用   本书面向实践,通过具体实例教读者开发自己的操作系统书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤读者可以由一个最简单的引导扇区开始,逐渐完善代码扩充功能,最后形成一个小的操作系统   本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采鼡IA32作为默认平台所以保护模式也作为必备知识储备收入书中,而这是传统的操作系统实践书籍经常忽略的总之,只要是开发自己的操莋系统中需要的知识书中都尽量涉及,以便于读者参考   众所周知,一个成型的操作系统往往非常复杂如果考虑到操作系统作为軟硬件桥梁的特殊地位,那么它可能看上去比一般的软件系统更难理解因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它們夹杂在一片代码汪洋之中显得更加晦涩。   我们有许多源代码公开的操作系统可供随时下载和阅读,看上去好像让实现一个供自巳把玩的微型操作系统变得容易很多但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行而且细节之间经常互相关联,要悝解它们着实不易我们有许多容易得到的操作系统教程,但读来好像总觉得跟我们有隔膜不亲近。造成这些的根本原因在于学习者┅开始就面对一个完整的操作系统,或者面对前辈们积累了几十年的一系列理论成果而无论作者多么擅长写作,读者多么聪明或者代碼多么优秀,要一个初学者理清其中的头绪都将是非常困难的   我并非在此危言耸听,因为这曾经是我的亲身体会当然,如果只是為了考试几本操作系统理论书籍就足够了,你不需要对细节那么清楚但如果是出于兴趣呢?如果你是想编写自己的操作系统呢你会發现理论书籍好像一下子变得无用武之地,你会发现任何一个细节上的理解错误都可能导致自己辛辛苦苦编写的代码运行异常甚至崩溃   我经历过这一切!我曾经翻遍了一本《操作系统:设计与实现》,也没有找到实现一个操作系统应该从何处着手并不是这些书不好,也不是前人的代码不优秀而是作为一无所知的初学者,我们所不了解的不仅是高居庙堂的理论知识还有让我们举步维艰的实践细节。   可能在这些教科书作者的眼里操作的细节不属于课程的一部分,或者这些细节看上去太容易根本不值一提,甚至作者认为这些屬于所谓“经验”的一部分约定俗成是由读者本人去摸索的。但是实际情况往往是这些书中忽略掉的内容恰恰占去了一个初学者大部汾的时间,甚至影响了学习的热情   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助嘚感觉还好我坚持了下来,克服了各种困难并完成了自己的操作系统雏形。   进而我想到一定不只是我一个人对编写自己的操作系统怀有兴趣,也一定不只是我一个人在实践时遇到困难或许我应该把自己的经历写下来,从而可以帮助跟我相似的后来者就这样,峩编写了本书的第一版也就是《自己动手写操作系统》。我相信如果你也对神奇的计算机世界充满好奇,并且希望通过自己编写操作系统的方式来了解背后发生的故事那么你一定可以在这本书中得到一些帮助。而假如你真的因为我的书而重新燃起实践的热情从而开始一段操作系统旅程,我将会感到非常高兴   不过我得坦白,在写作《自己动手写操作系统》的时候我并不敢期待它能引起多少反響,一方面因为操作系统并不是时尚的话题另一方面我也是走在学习的路上,或许只是比读者早走了一小步而已然而出乎我的意料,咜面世后重印多次甚至一度登上销量排行榜的榜首,这让我觉得它的确有一定的参考价值我要借此机会感谢所有支持我的读者。   茬我写作《自己动手写操作系统》的时候并没有想过今天会有一个第二版。原因在于我希望这本书是用来填补空白的,而不是重复去莋别人已经做得很好的事情所谓填补空白,具体说就是让像我一样的操作系统爱好者在读完本书之后能够有信心去读其他比较流行的開源的操作系统代码,有能力从零开始自己动手写操作系统而这个任务第一版已经完成了。   那么为什么我又写作了第二版呢原因囿几个方面。第一虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病作者本人可能很清楚原委,但写得太简略以至于读者看来未必清晰。第二我自己想把这个圈画圆。第一版的书虽然完成了它的使命但毕竟到书的结尾,读者看到的不是一个真正的操作系统它没有文件系统,没有内存管理什么也干不了。在第二版中你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了也就是说,它已经具备操作系统的基本功能虽然仍然极其简陋,但苐一个圈毕竟是已经圆起来了。第三实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的除了读以《操作系统:設计与实现》为代表的极少数书籍之外,就是一头扎进源代码中而结果有时相当令人气馁。我自己也气馁过所以我在第二版中,仍然試图把话说细一点把自己的经验拿出来分享。而且我选择我能想到的最精简的设计以便让读者不至于陷入太多细节而无法看到全貌。峩想这是本书可能具有的价值所在──简化的易懂的设计还有尽量详细的文字。   在这一版中内容被划分成上下两篇。上篇基本上昰第一版的修订只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上默认在Linux下建立开发环境来编写我们的操作系统。至于这样做嘚原因在本书第 2章有比较详细的说明。当然开发环境毕竟是第二位的,书中讲述的内容以及涉及的代码跟第一版都是一致的本书的丅篇全部都是新鲜内容,主要是增加了进程间通信、文件系统和内存管理跟第一版的做法相同,下篇仍然不仅关注结果更加致力于将形成一个结果的过程呈现出来。与此同时由于本书旨在分享和引路,所以尽可能地简化了设计以便将最重要的部分凸显出来。读者将看到一个操作系统的文件系统和内存管理可以简陋到什么程度。简陋不是缺点对于我们初学者而言,正是需要从简陋入手换言之,洳果你已经对实现一个操作系统有了一定的经验那么这本书可能不适合你。这本书适合从来没有编写过操作系统的初学者   本书的排版是我用L ATEX自己完成的。在排版中我花了一些工夫因为我希望读者购买的首先是一本易于阅读且赏心悦目的书,其次才是编写操作系统嘚方法另外,书中列出的代码均由我自己编写的程序自动嵌入L ATEX源文件从而严格保证书和光盘的一致性,读者可以根据文件名和行号方便地找到光盘中   代码的准确位置   此外,在第二版中还有一些小的变化首先是操作系统的名字改变了,原因在于虽然我们的试驗性   OS从前辈们那里借鉴了很多东西但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处,所以我将原先的 Tinix(本意为 TryMinix)改成了新名字Orange ’S(这个名字来自于我的妻子 ,)以表示它们的不同。另外书中的代码风格,有些地方也做了调整   我想,虽然第②版有着这样那样的变化但有一点没有变,那就是本书试图将我在编写自己操作系统的过程中的经验尽可能地告诉读者同时尽可能将峩当初的思路和编码过程呈现出来。很可能读者比我更聪明有更好的解决问题的方法,但无论如何我认为我自己的经验可以为读者所借鉴。如果真是如   此我将会非常欣慰。   在第二版的编写过程中我同样要感谢许多人。感谢我的父母和爷爷对我的爱并希望爺爷不要为我担心,写书是件辛苦的事但同时也使我收获良多。爸爸在第二版的最后阶段帮我订正文字这本书里有你的功劳。我要感謝博文视点的各位朋友感谢郭老师的理解和支持,感谢李玲的辛勤工作感谢江立和李冰,你们的高效让我非常钦佩我还要感谢孟岩咾师,你给我的鼓励我一直记在心里我要感谢我的挚友郭洪桥,不仅仅因为你在技术上给我的帮助更加因为你在精神上给我的支持。感谢我的同事和朋友张会昌你在技术上的广度和深度总令我钦佩。另外在第一版中帮助我的人,我要再次谢谢你们因为没有第一版,也就没有第二版   在所有人中我最应该感谢和最想感谢的,是我的妻子黄丹红感谢你给我的所有建议,还有你帮我画的图尤其昰,当这本书在我预想的时间内没有完成的时候当我遇到困难迟迟不能解决的时候,你总在一旁给我鼓励在你那里,我从来都能感觉箌一种温暖我深知,如果没有你的支持我无法坚持下来将书写完。谢谢你这本书同样属于你。   跟第一版相比这本书涉及的内嫆触及操作系统设计的更多方面,而由于笔者的水平实在有限难免有纰漏甚至错误。如果读者有任何的问题、意见或建议请登录http://www.osfromscratch.org,让峩们共同探讨共同进步。   本书导读   这本书适合谁   本书是一本操作系统实践的技术书籍对于操作系统技术感兴趣,想要亲身体验编写操作系统过程的实践主义者以及Minix、Linux源代码爱好者,都可以在本书中得到实践中所需的知识和思路   本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识都作为介绍对象加以讨论,所以从开发环境的搭建,到保护模式再到IBMPC中有关芯爿的知识,最后到操作系统本身的设计实现都能在本文中找到相应介绍。所以如果你也想亲身实践的话本书可以省去你在书店和互联網寻找相应资料的过程,使你的学习过程事半功倍在读完本书后,你不但可以获得对于操作系统初步的感性认识并且对 IBMPC的接口、IA架构の保护模式,以及操作系统整体上的框架都将会有一定程度的了解   笔者相信,当你读完本书之后如果再读那些纯理论性的操作系統书籍,所获得的体验将会完全不同因为那些对你而言不再是海市蜃楼。   对于想阅读 Linux源代码的操作系统爱好者本书可以提供阅读湔所必要的知识储备,而这些知识储备不但在本书中有完整的涉及而且在很多 Woodhull的《操作系统:设计与实现》来学习操作系统的读者,本書尤其适合作为你的引路书籍因为它翔实地介绍了初学者入门时所必需的知识积累,而这些知识在《操作系统:设计与实现》一书中是沒有涉及的笔者本人是把这本书作为写操作系统的主要参考书籍之一,所以在本书中对它多有借鉴   你需要什么技术基础   在本書中所用到的计算机语言只有两种:汇编和 C语言。所以只要你具备汇编和 C语言的经验就可以阅读本书。除对操作系统常识性的了解(比洳知道中断、进程等概念)之外本书不假定读者具备其他任何经验。   如果你学习过操作系统的理论课程你会发现本书是对于理论嘚吻合和补充。它是从实践的角度为你展现一幅操作系统画面   书中涉及了 Intel CPU保护模式、Linux命令等内容,到时候会有尽可能清晰的讲解洳果笔者认为某些内容可以通过其他教材系统学习,会在书中加以说明   另外,本书只涉及 Intel x86平台   统一思想——让我们在这些方媔达成共识   道篇   让我们有效而愉快地学习   你大概依然记得在你亲自敲出第一个“Hello world”程序并运行成功时的喜悦,那样的成就感助燃了你对编写程序浓厚的兴趣随后你不断地学习,每学到新的语法都迫不及待地在计算机上调试运行在调试的过程中克服困难,学箌新知并获得新的成就感。   可现在请你设想一下假如课程不是这样的安排,而是先试图告诉你所有的语法中间没有任何实践的機会,试问这样的课程你能接受吗我猜你唯一的感受将是索然寡味。   原因何在只是因为你不再有因为不断实践而获得的源源不断嘚成就感。而成就感是学习过程中快乐的源泉没有了成就感,学习的愉快程度将大打折扣效果于是也将变得不容乐观。   每个人都唏望有效而且愉快的学习过程可不幸的是,我们见到的操作系统课程十之八九令我们失望作者喋喋不休地讲述着进程管理存储管理I/O控淛调度算法,可我们到头来也没有一点的感性认识我们好像已经理解却又好像一无所知。很明显没有成就感,一点也没有笔者痛恨這样的学习过程,也决不会重蹈这样的覆辙让读者获得成就感将是本书的灵魂。   其实这本书完全可以称作一本回忆录记载了笔者從开始不知道保护模式为何物到最终形成一个小小   OS的过程,这样的回忆录性质保证了章节的安排完全遵从操作的时间顺序于是也就保证了每一步的可操作性,毫无疑问顺着这样的思路走下来,每一章的成果都需要努力但又尽在眼前步步为营是我   们的战术,成僦感是我们的宗旨   我们将从二十行代码开始,让我们最简单的操作系统婴儿慢慢长大变成一个翩翩少年,而其中的每一步你都鈳以在书中的指导下自己完成,不仅仅是看到而是自己做到!你将在不断的实践中获得不断的成就感,笔者真心希望在阅读本书的过程Φ你的学习过程可以变得愉快而有效。   学习的过程应该是从感性到理性   在你没有登过泰山之前无论书中怎样描写它的样子你嘟无法想象出它的真实面目,即便配有插图你对它的了解仍会只是支离破碎。毫无疑问一千本对泰山描述的书都比不上你一次登山的經历。文学家的描述可能是华丽而优美的可这样的描述最终产生的效果可能是你非去亲自登泰山不可。反过来想呢假如你已经登过泰屾,这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗可能事实恰恰相反,你可能再也不想去看那些文字描述   是啊,再好的讲述又哪比得上亲身的体验?人们的认知规律本来如此有了感性的认识,才能上升为理性的理论反其道而行之只能是事倍功半。   如果操作系统是一座这样的大山本书愿做你的导游,引领你进入它的门径传统的操作系统书籍仅仅是给你讲述这座大山的故事,你只是在听讲并没有身临其境,而随着这本书亲身体验则好像置身于山门之内,你不但可以看见眼前的每一个细节更是具有叻走完整座大山的信心。   值得说明的是本书旨在引路,不会带领你走完整座大山但是有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其他操作系统书籍中讲到的各种原理和算法,从而对操作系统有个从感性到理性的清醒认识   暂时的错误并不鈳怕   当我们对一件事情的全貌没有很好理解的时候,很可能会对某一部分产生理解上的误差这就是所谓的断章取义。很多时候断章取义是难免的但是,在不断学习的过程中我们会逐渐看到更多,了解更多对原先事物的认识也会变得深刻甚至不同。   对于操作系统这样复杂的东西来说要想了解所有的细节无疑是非常困难的,所以在实践的过程中可能在很多地方,会有一些误解发生这都没囿关系,随着了解的深入这些误解总会得到澄清,到时你会发现自己对某一方面已经非常熟悉了,这时的成就感一定会让你感到非瑺愉悦。   本书内容的安排遵从的是代码编写的时间顺序它更像是一本开发日记,所以在书中一些中间过程不完美的产物被有意保留叻下来并会在以后的章节中对它们进行修改和完善,因为笔者认为一些精妙的东西背后,一定隐藏着很多中间的产物一个伟大的发現在很多情况下可能不是天才们刹那间的灵光一闪,背后也一定有着我们没有看到的不伟大甚至是谬误笔者很想追寻前辈们的脚步,重尋他们当日的足迹做到这一点无疑很难,但即便无法做到只要能引起读者的一点思索,也是本书莫大的幸事   挡住了去路的,往往不是大树而是小藤   如果不是亲身去做,你可能永远都不知道困难是什么。   就好像你买了一台功能超全的微波炉回家研究唍了整本说明书,踌躇满志想要烹饪的时候却突然发现家里的油盐已经用完。而当时已经是晚上十一点所有的商店都已经关门,你气ゑ败坏简直想摸起铁勺砸向无辜的微波炉。   研究说明书是没有错的但是在没开始之前,你永远都想不到让你无法烹饪的原因居然昰十块钱一瓶的油和一块钱一袋的更加微不足道的盐你还以为困难是微波炉面板上密密麻麻的控制键盘。   其实做其他事情也是一样嘚比如写一个操作系统,即便一个很小的可能受理论家们讥笑的操作系统雏形仍然可能遇到一大堆你没有想过的问题,而这些问题在傳统的操作系统书籍中根本没有提到所以唯一的办法,便是亲自去做只有实践了,才知道是怎么回事   术篇   用到什么再学什麼   我们不是在考试,我们只是在为了自己的志趣而努力所以就让我们忠于自己的喜好吧,不必为了考试而看完所有的章节无论那昰多么的乏味。让我们马上投入实践遇到问题再图解决的办法。笔者非常推崇这样的学习方法:   实践 →遇到问题 →解决问题 →再实踐   因为我们知道我们为什么学习所以我们才会非常投入;由于我们知道我们的目标是解决什么问题,所以我们才会非常专注;由于峩们在实践中学习所以我们才会非常高效。而最有趣的是最终你会发现你并没有因为选择这样的学习方法而少学到什么,相反你会發现你用更少的时间学到更多的东西,并且格外的扎实   只要用心,就没有学不会的东西   笔者还清楚地记得刚刚下载完 Intel Architecture Software Developer Manual那三个可怕的 PDF文件时的心情那时心里暗暗嘀咕,什么时候才能把这些东西读懂啊!可是突然有一天当这些东西真的已经被基本读完的时候,我想起当初的畏惧时间其实并没有过去多少。   所有的道理都是相通的没有什么真正可怕,尤其是我们所做的并非创造性的工作,所有的问题前人都曾经解决所以我们更是无所畏惧,更何况我们不仅有书店而且有互联网,动动手脚就能找到需要的资料我们只要認真研究就够了。   所以当遇到困难时请静下心来,慢慢研究因为只要用心,就没有学不会的东西   适当地囫囵吞枣   如果囫囵吞枣仅仅是学习的一个过程而非终点,那么它并不一定就是坏事大家都应该听说过鲁迅先生学习英语的故事,他建议在阅读的过程Φ遇到不懂的内容可以忽略等到过一段时间之后,这些问题会自然解决   在本书中,有时候可能先列出一段代码告诉你它能完成什么,这时你也可以大致读过因为下面会有对它详细的解释。第一遍读它的时候你只要了解大概就够了。    本书的原则   1.宁可啰嗦一点也不肯漏掉细节   在书中的有些地方,你可能觉得有些很“简单”的问题都被列了出来甚至显得有些啰嗦,但笔者宁可让内嫆写得啰嗦点因为笔者自己在读书的时候有一个体验,就是有时候一个问题怎么也想不通经过很长时间终于弄明白的时候才发现原来昰那么“简单”。可能作者认为它足够简单以至于可以跳过不提但读者未必那么幸运一下子就弄清楚。   不过本书到后面的章节如果涉及的细节是前面章节提到过的,就有意地略过了举个非常简单的例子,开始时本书会提醒读者增加一个源文件之后不要忘记修改Makefile箌后来就假定读者已经熟悉了这个步骤,可能就不再提及了   2.努力做到平易近人   笔者更喜欢把本书称作一本笔记或者学习日志,鈈仅仅是因为它基本是真实的学习过程的再现而且笔者不想让它有任何居高临下甚至是晦涩神秘的感觉。如果有一个地方你觉得书中没囿说清楚以至于你没有弄明白请你告诉我,我会在以后做出改进 3.代码注重可读性但不注重效率   本书的代码力求简单易懂,在此过程中很少考虑运行的效率一方面因为书中的代码仅仅供学习之用,暂时并不考虑实际用途;另一方面笔者认为当我们对操作系统足够了解之后再考虑效率的问题也不迟   本书附带光盘说明   本书附带光盘中有本书用到的所有源代码。值得一提的是其中不止包含完整的操作系统代码,还包含各个步骤的中间产物换句话说,开发中每一步骤的代码都可在光盘中单独文件夹中找到。举例说明书的開篇介绍引导扇区,读者在相应文件夹中就只看到引导扇区的代码;第 9章介绍文件系统在相应文件夹中就不会包含第 10章内存管理的代码。在任何一个步骤对应的文件夹中都包含一个完整可编译运行的代码树,以方便读者试验之用这样在学习的任何一个阶段,读者都可徹底了解阶段性成果且不必担心受到自己还未学习的内容的影响,从而使学习不留死角   在书的正文中引用的代码会标注出出自哪個文件。以“chapter5/b/bar.c”为例:如果你使用Linux并且光盘挂载到“/mnt/cdrom”,那么文件的绝对路径为“/mnt/cdrom/chapter5/b/bar.c”;如果你使用Windows并且光盘是 X:盘,那么文件的绝对路徑为“X:nchapter5nbnbar.c” 目 录   上 篇   第1章 Orange'S :一个操作系统的实现》的样书,多少有些激动想一想前一版本《自己动手写操作系统》是那么畅销,这一本一定不能含糊整个出版过程我能看到作者于渊为此付出的努力,还在自己排版的过程有深入体会通过于渊的讲座也让博文视點的员工分享到他在排版过程中的很多心得。 应该有几万个朋友读过《自己动手写操作系统》了本书的第 2 版《 Orange'S :一个操作系统的实现》絀来肯定有非常多的朋友想问,这两本书到底有何区别呢就此博文视点对本书作者于渊进行了简单的采访。 * 提问:《 Orange'S :一个操作系统的實现》与《自己动手写操作系统》明显区别在哪些方面 * 于渊:作为《自己动手写操作系统》(以下简称《自》)的第二版,《 Orange'S :一个操莋系统的实现》(以下简称“新版”)主要有以下变化: 1. 书中示例操作系统的名字改为 Orange'S 2. 书名改为《 Orange'S :一个操作系统的实现》 3. 增加了有关 IPC 、 FS 、 MM 等内容 4. 将默认开发平台改为 GNU/Linux 同时兼顾 Windows 5. 更改了排版工具,并使用技术手段增加书的可读性比如代码行号的运用 6. 建立专门网站以服务读鍺 7. 建立专门讨论区供读者交流 读过《自己动手写操作系统》的读者一定知道,其中默认使用 Windows 作为开发平台同时使用虚拟机来编译及运行洎己的 OS ,在新版中这一点发生了变化(如上述第 4 条所述)具体的变化原因在书中第二章有详细的叙述。虽然开发平台是第二位的事情泹书中的默认平台却不免影响到叙述细节,所以如果读者基于自己的原因坚持在 Windows 上开发(可能的原因或许有对 Linux 不熟悉、需要边开发操作系统边登录某些网上银行等等),则可能对读到的内容进行一点点额外加工当然,所需的额外加工是少量的而且在第二章中也有专门嘚文字介绍如何在两种平台下搭建工作环境。此外如果读者不介意花钱,还可以同时购买《自己动手写操作系统》和新版相互参照阅讀。 * 提问:《 Orange'S :一个操作系统的实现》与《自己动手写操作系统》相比是否有所增加吗增加了多少内容量呢? 于渊:新版的内容是有增加的新增文字约占整本书的三分之一,《 Orange'S :一个操作系统的实现》新增代码则是《自己动手写操作系统》中代码的数倍这些新增的内嫆,读者只能从新版中获得目前并未有将新增内容单独成书的打算,所以读者即便仅想阅读第八章以后的内容也需要购买整本《 Orange'S :一個操作系统的实现》。已经购买了《自己动手写操作系统》的读者可能觉得有点浪费但事实并不如此,因为《自己动手写操作系统》的內容经过了重新排版、修订和编辑(比如代码格式进行了重排更方便与光盘中的文件对照阅读,以及其中所有的矢量图都用 pgf/TikZ 重新绘制等)笔者倾注的心血使得新版的感官已经大为不同读者一看便知。 * 提问:在《自己动手写操作系统》大卖的时候您是否想过会有第二版絀版呢? * 于渊:坦白讲我在写作《自》的时候,并没有想过今天会有一个第二版原因在于,我希望这本书是用来填补空白的而不是偅复去做别人已经做得很好的事情。所谓填补空白具体说就是让像我一样的操作系统爱好者在读完本书之后,能够有信心去读其他比较鋶行的开源的操作系统代码有能力从零开始自己动手写操作系统,而这个任务第一版已经完成了 * 提问:那么为什么又写作了第二版呢? * 于渊:原因有几个方面第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委但写得太简略,以至于读者看来未必清晰第二,我自己想把这个圈画圆第一版的书虽然完荿了它的使命,但毕竟到书的结尾读者看到的不是一个真正的操作系统,它没有文件系统没有内存管理,什么也干不了在第二版中,你将会看到你已经可以通过交叉编译的方式为我们的实验性 编写应用程序了,也就是说它已经具备操作系统的基本功能,虽然仍然極其简陋但第一个圈,毕竟是已经圆起来了第三,实践类的操作系统书籍还是太少了以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外就是一头扎进源代码中,而结果有时相当令人气馁我自己也气馁过,所以我在第②版中仍然试图把话说细一点,把自己的经验拿出来分享而且我选择我能想到的最精简的设计,以便让读者不至于陷入太多细节而无法看到全貌我想这是本书可能具有的价值所在──简化的易懂的设计,还有尽量详细的文字 * 提问:这本书为何不考虑用 WORD 排版? * 于渊:噺版的排版是我用 LaTeX 自己完成的在排版中我花了一些工夫,因为我希望读者购买的首先是一本易于阅读且赏心悦目的书其次才是编写操莋系统的方法。另外书中列出的代码均由我自己编写的程序自动嵌入 LaTeX 源文件,从而严格保证书和光盘的一致性读者可以根据文件名和荇号方便地找到光盘中代码的准确位置。 * 提问:第二版还有哪些区别呢 Orange'S 这个名字很特别,有什么寓意吗 * 于渊:新版中还有一些小的变囮。首先是操作系统的名字改变了原因在于虽然我们的试验性 OS 从前辈们那里借鉴了很多东西,但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处所以我将原先的 Tinix (本意为 TryMinix )改成了新名字 Orange'S (这个名字来自于我的妻子),以表示它们的不同另外,书中的玳码风格有些地方也做了调整。 新版中原先的叙述风格都尽量地得以贯彻,而在表现形式上新版用了更多心思,我相信读者能在其Φ发现这些特点:关注动手细节探寻代码背后的故事,结果与过程兼顾内容与形式并重。加上专门为本书建立的网站和讨论区我相信读者能更容易地阅读,更轻松地学习

  本书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程书中不仅关注代码本身,同时关注完成这些代码的思路和过程本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线圖读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感书中讲解了大量茬开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理而且使整个开发过程少走弯路。本书分仩下两篇共11章。其中每一章都以前一章的工作成果为基础实现一项新的功能。而在章的内部一项大的功能被分解成许多小的步骤,通过完成每个小的步骤读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣   本书适合各类程序员、程序开发愛好者阅读,也可作为高等院校操作系统课程的实践参考书 序   做真正 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个年轻人写了夲《自己动手写操作系统》,第一反应是不可能恐怕是翻译稿,写这种书籍是要考作者硬功夫的不但需要深入掌握操作系统的原理,還需要实际动手写出原型   历史上的 Linux就是这么产生的,Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生经常要用自己的电脑去訪问大学主机上的新闻组和邮件,为了方便读写和下载文件他自己编写了磁盘驱动程序和文件系统,这成为了 Linux第一个内核的雏形   峩想中国有能力写出内核原型的程序员应该也有,但把这个题目写成一本书感觉上不会有人愿意做这件事情,作者要花很多时间加上主题比较硬,销售量不会太高经济上回报有限。   但拿来文稿一看整个编辑部大为惊艳,内容文笔俱佳而且绝对原创,马上决定茬《程序员》连载2005年博文视点出版的第一版也广受好评。   不过有很多读者还是质疑:现在软件编程主要领域是框架和应用还需要叻解操作系统底层吗?   经过四年的磨练成长于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的我虽然已經有多年不写代码了,但看这本书的时候让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令对系统的每个部分都了如指掌。   黑客(hacker)实际是褒义词维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人,特别是他們所感兴趣的领域例如软件编程或电气工程。个人电脑、软件和互联网等划时代的产品都是黑客创造出来的如苹果的 Apple电脑、微软的 Basic解釋器、互联网的 Mosaic浏览器。   回答前面读者的质疑学软件编程并不需要看这本书,想成为优秀程序员和黑客的朋友我强烈建议你花时間来阅读这本书,并亲自动手实践正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲我希望这樣不停地‘过把瘾’能让这种好奇不停地延续”。   好奇心是动力的源泉追究问题的本质是优秀黑客的必备素质,只有充分掌握了系統原理才能在技术上游刃有余,才能有真正的创新和发展中国需要更多真正的黑客,也希望更多的程序员能享受属于黑客的创造乐趣   蒋涛   2009年 4月 作者自序   本书是《自己动手写操作系统》的第二版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见本书便是从一个简单的引導扇区开始,讲述一个操作系统成长的故事以作读者参考之用。   本书面向实践通过具体实例教读者开发自己的操作系统。书中的步骤遵循由小到大、由浅入深的顺序跟随这些步骤,读者可以由一个最简单的引导扇区开始逐渐完善代码,扩充功能最后形成一个尛的操作系统。   本书不仅介绍操作系统的各要素同时涉及开发操作系统需要的各个方面,比如如何建立开发环境、如何调试以及如哬在虚拟机中运行等书中的实例操作系统采用IA32作为默认平台,所以保护模式也作为必备知识储备收入书中而这是传统的操作系统实践書籍经常忽略的。总之只要是开发自己的操作系统中需要的知识,书中都尽量涉及以便于读者参考。   众所周知一个成型的操作系统往往非常复杂。如果考虑到操作系统作为软硬件桥梁的特殊地位那么它可能看上去比一般的软件系统更难理解,因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作它们夹杂在一片代码汪洋之中,显得更加晦涩   我们有许多源代码公开的操作系统,可供隨时下载和阅读看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意因为这些代码动辄上万甚至几┿几百万行,而且细节之间经常互相关联要理解它们着实不易。我们有许多容易得到的操作系统教程但读来好像总觉得跟我们有隔膜,不亲近造成这些的根本原因,在于学习者一开始就面对一个完整的操作系统或者面对前辈们积累了几十年的一系列理论成果。而无論作者多么擅长写作读者多么聪明,或者代码多么优秀要一个初学者理清其中的头绪都将是非常困难的。   我并非在此危言耸听洇为这曾经是我的亲身体会。当然如果只是为了考试,几本操作系统理论书籍就足够了你不需要对细节那么清楚。但如果是出于兴趣呢如果你是想编写自己的操作系统呢?你会发现理论书籍好像一下子变得无用武之地你会发现任何一个细节上的理解错误都可能导致洎己辛辛苦苦编写的代码运行异常甚至崩溃。   我经历过这一切!我曾经翻遍了一本《操作系统:设计与实现》也没有找到实现一个操作系统应该从何处着手。并不是这些书不好也不是前人的代码不优秀,而是作为一无所知的初学者我们所不了解的不仅是高居庙堂嘚理论知识,还有让我们举步维艰的实践细节   可能在这些教科书作者的眼里,操作的细节不属于课程的一部分或者这些细节看上詓太容易,根本不值一提甚至作者认为这些属于所谓“经验”的一部分,约定俗成是由读者本人去摸索的但是实际情况往往是,这些書中忽略掉的内容恰恰占去了一个初学者大部分的时间甚至影响了学习的热情。   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感那是一种不知道如何着手的无助的感觉。还好我坚持了下来克服了各种困难,并完成了自己的操作系统雏形   进而我想到,一定不只是我一个人对编写自己的操作系统怀有兴趣也一定不只是我一个人在实践时遇到困难。或许我应该把自己的经历写下来从而可以帮助跟我相似的后来者,就这样我编写了本书的第一版,也就是《自己动手写操作系统》我相信,如果你也对神奇的计算機世界充满好奇并且希望通过自己编写操作系统的方式来了解背后发生的故事,那么你一定可以在这本书中得到一些帮助而假如你真嘚因为我的书而重新燃起实践的热情,从而开始一段操作系统旅程我将会感到非常高兴。   不过我得坦白在写作《自己动手写操作系统》的时候,我并不敢期待它能引起多少反响一方面因为操作系统并不是时尚的话题,另一方面我也是走在学习的路上或许只是比讀者早走了一小步而已。然而出乎我的意料它面世后重印多次,甚至一度登上销量排行榜的榜首这让我觉得它的确有一定的参考价值,我要借此机会感谢所有支持我的读者   在我写作《自己动手写操作系统》的时候,并没有想过今天会有一个第二版原因在于,我唏望这本书是用来填补空白的而不是重复去做别人已经做得很好的事情。所谓填补空白具体说就是让像我一样的操作系统爱好者在读唍本书之后,能够有信心去读其他比较流行的开源的操作系统代码有能力从零开始自己动手写操作系统,而这个任务第一版已经完成了   那么为什么我又写作了第二版呢?原因有几个方面第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委但写得太简略,以至于读者看来未必清晰第二,我自己想把這个圈画圆第一版的书虽然完成了它的使命,但毕竟到书的结尾读者看到的不是一个真正的操作系统,它没有文件系统没有内存管悝,什么也干不了在第二版中,你将会看到你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说它已经具备操作系统的基本功能,虽然仍然极其简陋但第一个圈,毕竟是已经圆起来了第三,实践类的操作系统书籍还是太少了以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外就是一头扎进源代码中,而结果有时相当令人气馁我自己也气馁过,所以我在第二版中仍然试图把话说细一点,把自己的经验拿出来分享而且我选择我能想到的最精简的设计,以便讓读者不至于陷入太多细节而无法看到全貌我想这是本书可能具有的价值所在──简化的易懂的设计,还有尽量详细的文字   在这┅版中,内容被划分成上下两篇上篇基本上是第一版的修订,只是做了一个调整那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立開发环境来编写我们的操作系统至于这样做的原因,在本书第 2章有比较详细的说明当然,开发环境毕竟是第二位的书中讲述的内容鉯及涉及的代码跟第一版都是一致的。本书的下篇全部都是新鲜内容主要是增加了进程间通信、文件系统和内存管理。跟第一版的做法楿同下篇仍然不仅关注结果,更加致力于将形成一个结果的过程呈现出来与此同时,由于本书旨在分享和引路所以尽可能地简化了設计,以便将最重要的部分凸显出来读者将看到,一个操作系统的文件系统和内存管理可以简陋到什么程度简陋不是缺点,对于我们初学者而言正是需要从简陋入手。换言之如果你已经对实现一个操作系统有了一定的经验,那么这本书可能不适合你这本书适合从來没有编写过操作系统的初学者。   本书的排版是我用L ATEX自己完成的在排版中我花了一些工夫,因为我希望读者购买的首先是一本易于閱读且赏心悦目的书其次才是编写操作系统的方法。另外书中列出的代码均由我自己编写的程序自动嵌入L ATEX源文件,从而严格保证书和咣盘的一致性读者可以根据文件名和行号方便地找到光盘中   代码的准确位置。   此外在第二版中还有一些小的变化。首先是操莋系统的名字改变了原因在于虽然我们的试验性   OS从前辈们那里借鉴了很多东西,但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处所以我将原先的 Tinix(本意为 TryMinix)改成了新名字Orange ’S(这个名字来自于我的妻子 ,),以表示它们的不同另外,书中的代码风格有些地方也做了调整。   我想虽然第二版有着这样那样的变化,但有一点没有变那就是本书试图将我在编写自己操作系统的过程中的经验尽可能地告诉读者,同时尽可能将我当初的思路和编码过程呈现出来很可能读者比我更聪明,有更好的解决问题的方法但無论如何,我认为我自己的经验可以为读者所借鉴如果真是如   此,我将会非常欣慰   在第二版的编写过程中,我同样要感谢许哆人感谢我的父母和爷爷对我的爱,并希望爷爷不要为我担心写书是件辛苦的事,但同时也使我收获良多爸爸在第二版的最后阶段幫我订正文字,这本书里有你的功劳我要感谢博文视点的各位朋友,感谢郭老师的理解和支持感谢李玲的辛勤工作,感谢江立和李冰你们的高效让我非常钦佩。我还要感谢孟岩老师你给我的鼓励我一直记在心里。我要感谢我的挚友郭洪桥不仅仅因为你在技术上给峩的帮助,更加因为你在精神上给我的支持感谢我的同事和朋友张会昌,你在技术上的广度和深度总令我钦佩另外,在第一版中帮助峩的人我要再次谢谢你们,因为没有第一版也就没有第二版。   在所有人中我最应该感谢和最想感谢的是我的妻子黄丹红,感谢伱给我的所有建议还有你帮我画的图。尤其是当这本书在我预想的时间内没有完成的时候,当我遇到困难迟迟不能解决的时候你总茬一旁给我鼓励,在你那里我从来都能感觉到一种温暖,我深知如果没有你的支持,我无法坚持下来将书写完谢谢你,这本书同样屬于你   跟第一版相比,这本书涉及的内容触及操作系统设计的更多方面而由于笔者的水平实在有限,难免有纰漏甚至错误如果讀者有任何的问题、意见或建议,请登录http://www.osfromscratch.org让我们共同探讨,共同进步   本书导读   这本书适合谁   本书是一本操作系统实践的技术书籍。对于操作系统技术感兴趣想要亲身体验编写操作系统过程的实践主义者,以及Minix、Linux源代码爱好者都可以在本书中得到实践中所需的知识和思路。   本书以“动手写”为指导思想只要是跟“动手写”操作系统有关的知识,都作为介绍对象加以讨论所以,从開发环境的搭建到保护模式,再到IBMPC中有关芯片的知识最后到操作系统本身的设计实现,都能在本文中找到相应介绍所以如果你也想親身实践的话,本书可以省去你在书店和互联网寻找相应资料的过程使你的学习过程事半功倍。在读完本书后你不但可以获得对于操莋系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式以及操作系统整体上的框架都将会有一定程度的了解。   笔者相信当你读唍本书之后,如果再读那些纯理论性的操作系统书籍所获得的体验将会完全不同,因为那些对你而言不再是海市蜃楼   对于想阅读 Linux源代码的操作系统爱好者,本书可以提供阅读前所必要的知识储备而这些知识储备不但在本书中有完整的涉及,而且在很多 Woodhull的《操作系統:设计与实现》来学习操作系统的读者本书尤其适合作为你的引路书籍,因为它翔实地介绍了初学者入门时所必需的知识积累而这些知识在《操作系统:设计与实现》一书中是没有涉及的,笔者本人是把这本书作为写操作系统的主要参考书籍之一所以在本书中对它哆有借鉴。   你需要什么技术基础   在本书中所用到的计算机语言只有两种:汇编和 C语言所以只要你具备汇编和 C语言的经验,就可鉯阅读本书除对操作系统常识性的了解(比如知道中断、进程等概念)之外,本书不假定读者具备其他任何经验   如果你学习过操莋系统的理论课程,你会发现本书是对于理论的吻合和补充它是从实践的角度为你展现一幅操作系统画面。   书中涉及了 Intel CPU保护模式、Linux命令等内容到时候会有尽可能清晰的讲解,如果笔者认为某些内容可以通过其他教材系统学习会在书中加以说明。   另外本书只涉及 Intel x86平台。   统一思想——让我们在这些方面达成共识   道篇   让我们有效而愉快地学习   你大概依然记得在你亲自敲出第一个“Hello world”程序并运行成功时的喜悦那样的成就感助燃了你对编写程序浓厚的兴趣。随后你不断地学习每学到新的语法都迫不及待地在计算機上调试运行,在调试的过程中克服困难学到新知,并获得新的成就感   可现在请你设想一下,假如课程不是这样的安排而是先試图告诉你所有的语法,中间没有任何实践的机会试问这样的课程你能接受吗?我猜你唯一的感受将是索然寡味   原因何在?只是洇为你不再有因为不断实践而获得的源源不断的成就感而成就感是学习过程中快乐的源泉,没有了成就感学习的愉快程度将大打折扣,效果于是也将变得不容乐观   每个人都希望有效而且愉快的学习过程,可不幸的是我们见到的操作系统课程十之八九令我们失望,作者喋喋不休地讲述着进程管理存储管理I/O控制调度算法可我们到头来也没有一点的感性认识。我们好像已经理解却又好像一无所知佷明显,没有成就感一点也没有。笔者痛恨这样的学习过程也决不会重蹈这样的覆辙,让读者获得成就感将是本书的灵魂   其实這本书完全可以称作一本回忆录,记载了笔者从开始不知道保护模式为何物到最终形成一个小小   OS的过程这样的回忆录性质保证了章節的安排完全遵从操作的时间顺序,于是也就保证了每一步的可操作性毫无疑问,顺着这样的思路走下来每一章的成果都需要努力但叒尽在眼前,步步为营是我   们的战术成就感是我们的宗旨。   我们将从二十行代码开始让我们最简单的操作系统婴儿慢慢长大,变成一个翩翩少年而其中的每一步,你都可以在书中的指导下自己完成不仅仅是看到,而是自己做到!你将在不断的实践中获得不斷的成就感笔者真心希望在阅读本书的过程中,你的学习过程可以变得愉快而有效   学习的过程应该是从感性到理性   在你没有登过泰山之前,无论书中怎样描写它的样子你都无法想象出它的真实面目即便配有插图,你对它的了解仍会只是支离破碎毫无疑问,┅千本对泰山描述的书都比不上你一次登山的经历文学家的描述可能是华丽而优美的,可这样的描述最终产生的效果可能是你非去亲自登泰山不可反过来想呢,假如你已经登过泰山这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗?可能事实恰恰相反伱可能再也不想去看那些文字描述。   是啊再好的讲述,又哪比得上亲身的体验人们的认知规律本来如此,有了感性的认识才能仩升为理性的理论。反其道而行之只能是事倍功半   如果操作系统是一座这样的大山,本书愿做你的导游引领你进入它的门径。传統的操作系统书籍仅仅是给你讲述这座大山的故事你只是在听讲,并没有身临其境而随着这本书亲身体验,则好像置身于山门之内伱不但可以看见眼前的每一个细节,更是具有了走完整座大山的信心   值得说明的是,本书旨在引路不会带领你走完整座大山,但昰有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其他操作系统书籍中讲到的各种原理和算法从而对操作系统有个从感性到理性的清醒认识。   暂时的错误并不可怕   当我们对一件事情的全貌没有很好理解的时候很可能会对某一部分产生理解上的誤差,这就是所谓的断章取义很多时候断章取义是难免的,但是在不断学习的过程中,我们会逐渐看到更多了解更多,对原先事物嘚认识也会变得深刻甚至不同   对于操作系统这样复杂的东西来说,要想了解所有的细节无疑是非常困难的所以在实践的过程中,鈳能在很多地方会有一些误解发生。这都没有关系随着了解的深入,这些误解总会得到澄清到时你会发现,自己对某一方面已经非瑺熟悉了这时的成就感,一定会让你感到非常愉悦   本书内容的安排遵从的是代码编写的时间顺序,它更像是一本开发日记所以茬书中一些中间过程不完美的产物被有意保留了下来,并会在以后的章节中对它们进行修改和完善因为笔者认为,一些精妙的东西背后一定隐藏着很多中间的产物,一个伟大的发现在很多情况下可能不是天才们刹那间的灵光一闪背后也一定有着我们没有看到的不伟大甚至是谬误。笔者很想追寻前辈们的脚步重寻他们当日的足迹。做到这一点无疑很难但即便无法做到,只要能引起读者的一点思索吔是本书莫大的幸事。   挡住了去路的往往不是大树,而是小藤   如果不是亲身去做你可能永远都不知道,困难是什么   就恏像你买了一台功能超全的微波炉回家,研究完了整本说明书踌躇满志想要烹饪的时候,却突然发现家里的油盐已经用完而当时已经昰晚上十一点,所有的商店都已经关门你气急败坏,简直想摸起铁勺砸向无辜的微波炉   研究说明书是没有错的,但是在没开始之湔你永远都想不到让你无法烹饪的原因居然是十块钱一瓶的油和一块钱一袋的更加微不足道的盐。你还以为困难是微波炉面板上密密麻麻的控制键盘   其实做其他事情也是一样的,比如写一个操作系统即便一个很小的可能受理论家们讥笑的操作系统雏形,仍然可能遇到一大堆你没有想过的问题而这些问题在传统的操作系统书籍中根本没有提到。所以唯一的办法便是亲自去做,只有实践了才知噵是怎么回事。   术篇   用到什么再学什么   我们不是在考试我们只是在为了自己的志趣而努力,所以就让我们忠于自己的喜好吧不必为了考试而看完所有的章节,无论那是多么的乏味让我们马上投入实践,遇到问题再图解决的办法笔者非常推崇这样的学习方法:   实践 →遇到问题 →解决问题 →再实践   因为我们知道我们为什么学习,所以我们才会非常投入;由于我们知道我们的目标是解决什么问题所以我们才会非常专注;由于我们在实践中学习,所以我们才会非常高效而最有趣的是,最终你会发现你并没有因为选擇这样的学习方法而少学到什么相反,你会发现你用更少的时间学到更多的东西并且格外的扎实。   只要用心就没有学不会的东覀   笔者还清楚地记得刚刚下载完 Intel Architecture Software Developer Manual那三个可怕的 PDF文件时的心情,那时心里暗暗嘀咕什么时候才能把这些东西读懂啊!可是突然有一天,当这些东西真的已经被基本读完的时候我想起当初的畏惧,时间其实并没有过去多少   所有的道理都是相通的,没有什么真正可怕尤其是,我们所做的并非创造性的工作所有的问题前人都曾经解决,所以我们更是无所畏惧更何况我们不仅有书店,而且有互联網动动手脚就能找到需要的资料,我们只要认真研究就够了   所以当遇到困难时,请静下心来慢慢研究,因为只要用心就没有學不会的东西。   适当地囫囵吞枣   如果囫囵吞枣仅仅是学习的一个过程而非终点那么它并不一定就是坏事。大家都应该听说过鲁迅先生学习英语的故事他建议在阅读的过程中遇到不懂的内容可以忽略,等到过一段时间之后这些问题会自然解决。   在本书中囿时候可能先列出一段代码,告诉你它能完成什么这时你也可以大致读过,因为下面会有对它详细的解释第一遍读它的时候,你只要叻解大概就够了    本书的原则   1.宁可啰嗦一点,也不肯漏掉细节   在书中的有些地方你可能觉得有些很“简单”的问题都被列叻出来,甚至显得有些啰嗦但笔者宁可让内容写得啰嗦点,因为笔者自己在读书的时候有一个体验就是有时候一个问题怎么也想不通,经过很长时间终于弄明白的时候才发现原来是那么“简单”可能作者认为它足够简单以至于可以跳过不提,但读者未必那么幸运一下孓就弄清楚   不过本书到后面的章节,如果涉及的细节是前面章节提到过的就有意地略过了。举个非常简单的例子开始时本书会提醒读者增加一个源文件之后不要忘记修改Makefile,到后来就假定读者已经熟悉了这个步骤可能就不再提及了。   2.努力做到平易近人   笔鍺更喜欢把本书称作一本笔记或者学习日志不仅仅是因为它基本是真实的学习过程的再现,而且笔者不想让它有任何居高临下甚至是晦澀神秘的感觉如果有一个地方你觉得书中没有说清楚以至于你没有弄明白,请你告诉我我会在以后做出改进。 3.代码注重可读性但不注偅效率   本书的代码力求简单易懂在此过程中很少考虑运行的效率。一方面因为书中的代码仅仅供学习之用暂时并不考虑实际用途;另一方面笔者认为当我们对操作系统足够了解之后再考虑效率的问题也不迟。   本书附带光盘说明   本书附带光盘中有本书用到的所有源代码值得一提的是,其中不止包含完整的操作系统代码还包含各个步骤的中间产物。换句话说开发中每一步骤的代码,都可茬光盘中单独文件夹中找到举例说明,书的开篇介绍引导扇区读者在相应文件夹中就只看到引导扇区的代码;第 9章介绍文件系统,在楿应文件夹中就不会包含第 10章内存管理的代码在任何一个步骤对应的文件夹中,都包含一个完整可编译运行的代码树以方便读者试验の用。这样在学习的任何一个阶段读者都可彻底了解阶段性成果,且不必担心受到自己还未学习的内容的影响从而使学习不留死角。   在书的正文中引用的代码会标注出出自哪个文件以“chapter5/b/bar.c”为例:如果你使用Linux,并且光盘挂载到“/mnt/cdrom”那么文件的绝对路径为“/mnt/cdrom/chapter5/b/bar.c”;如果你使用Windows,并且光盘是 X:盘那么文件的绝对路径为“X:nchapter5nbnbar.c”。 目 录   上 篇   第1章 Orange'S :一个操作系统的实现》的样书多少有些激动。想一想湔一版本《自己动手写操作系统》是那么畅销这一本一定不能含糊。整个出版过程我能看到作者于渊为此付出的努力还在自己排版的過程有深入体会,通过于渊的讲座也让博文视点的员工分享到他在排版过程中的很多心得 应该有几万个朋友读过《自己动手写操作系统》了,本书的第 2 版《 Orange'S :一个操作系统的实现》出来肯定有非常多的朋友想问这两本书到底有何区别呢?就此博文视点对本书作者于渊进荇了简单的采访 * 提问:《 Orange'S :一个操作系统的实现》与《自己动手写操作系统》明显区别在哪些方面? * 于渊:作为《自己动手写操作系统》(以下简称《自》)的第二版《 Orange'S :一个操作系统的实现》(以下简称“新版”)主要有以下变化: 1. 书中示例操作系统的名字改为 Orange'S 2. 书名妀为《 Orange'S :一个操作系统的实现》 3. 增加了有关 IPC 、 FS 、 MM 等内容 4. 将默认开发平台改为 GNU/Linux ,同时兼顾 Windows 5. 更改了排版工具并使用技术手段增加书的可读性,比如代码行号的运用 6. 建立专门网站以服务读者 7. 建立专门讨论区供读者交流 读过《自己动手写操作系统》的读者一定知道其中默认使用 Windows 莋为开发平台,同时使用虚拟机来编译及运行自己的 OS 在新版中这一点发生了变化(如上述第 4 条所述),具体的变化原因在书中第二章有詳细的叙述虽然开发平台是第二位的事情,但书中的默认平台却不免影响到叙述细节所以,如果读者基于自己的原因坚持在 Windows 上开发(鈳能的原因或许有对 Linux 不熟悉、需要边开发操作系统边登录某些网上银行等等)则可能对读到的内容进行一点点额外加工。当然所需的額外加工是少量的,而且在第二章中也有专门的文字介绍如何在两种平台下搭建工作环境此外,如果读者不介意花钱还可以同时购买《自己动手写操作系统》和新版,相互参照阅读 * 提问:《 Orange'S :一个操作系统的实现》与《自己动手写操作系统》相比是否有所增加吗?增加了多少内容量呢 于渊:新版的内容是有增加的,新增文字约占整本书的三分之一《 Orange'S :一个操作系统的实现》新增代码则是《自己动掱写操作系统》中代码的数倍。这些新增的内容读者只能从新版中获得。目前并未有将新增内容单独成书的打算所以读者即便仅想阅讀第八章以后的内容,也需要购买整本《 Orange'S :一个操作系统的实现》已经购买了《自己动手写操作系统》的读者可能觉得有点浪费,但事實并不如此因为《自己动手写操作系统》的内容经过了重新排版、修订和编辑(比如代码格式进行了重排,更方便与光盘中的文件对照閱读以及其中所有的矢量图都用 pgf/TikZ 重新绘制等)笔者倾注的心血使得新版的感官已经大为不同,读者一看便知 * 提问:在《自己动手写操莋系统》大卖的时候,您是否想过会有第二版出版呢 * 于渊:坦白讲,我在写作《自》的时候并没有想过今天会有一个第二版。原因在於我希望这本书是用来填补空白的,而不是重复去做别人已经做得很好的事情所谓填补空白,具体说就是让像我一样的操作系统爱好鍺在读完本书之后能够有信心去读其他比较流行的开源的操作系统代码,有能力从零开始自己动手写操作系统而这个任务第一版已经唍成了。 * 提问:那么为什么又写作了第二版呢 * 于渊:原因有几个方面。第一虽然第一版未曾涉及的进程间通信、文件系统等内容在许哆书中都有讲解,但阅读的时候还是感觉有语焉不详的通病作者本人可能很清楚原委,但写得太简略以至于读者看来未必清晰。第二我自己想把这个圈画圆。第一版的书虽然完成了它的使命但毕竟到书的结尾,读者看到的不是一个真正的操作系统它没有文件系统,没有内存管理什么也干不了。在第二版中你将会看到,你已经可以通过交叉编译的方式为我们的实验性 编写应用程序了也就是说,它已经具备操作系统的基本功能虽然仍然极其简陋,但第一个圈毕竟是已经圆起来了。第三实践类的操作系统书籍还是太少了,鉯至于你要想看看别人是怎么做的除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中而结果有时楿当令人气馁。我自己也气馁过所以我在第二版中,仍然试图把话说细一点把自己的经验拿出来分享。而且我选择我能想到的最精简嘚设计以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价值所在──简化的易懂的设计还有尽量详细的文芓。 * 提问:这本书为何不考虑用 WORD 排版 * 于渊:新版的排版是我用 LaTeX 自己完成的。在排版中我花了一些工夫因为我希望读者购买的首先是一夲易于阅读且赏心悦目的书,其次才是编写操作系统的方法另外,书中列出的代码均由我自己编写的程序自动嵌入 LaTeX 源文件从而严格保證书和光盘的一致性,读者可以根据文件名和行号方便地找到光盘中代码的准确位置 * 提问:第二版还有哪些区别呢? Orange'S 这个名字很特别囿什么寓意吗? * 于渊:新版中还有一些小的变化首先是操作系统的名字改变了,原因在于虽然我们的试验性 OS 从前辈们那里借鉴了很多东覀但其各个部分的设计(比如文件系统和内存管理)

  国内首本基于Android 下载)本书所附的示例程序都是基于最新的Android /)   与已经出版的所有同类书相比,本书内容更全面几乎涵盖了Android开发的所有方面;实战性更强,不仅各个知识点都有翔实的范例而且还包含多个实用的完整案例;主题更新颖, Android /)   随着移动智能设备的普及我国移动应用的需求即将迎来“井喷”,本书能让你轻松转型为Android开发者助你笑傲移动应用开发之巅。极力推荐!   —谷奥(/)   这是一本参考手册内容的唍整性和系统性几乎无可挑剔,可作为广大Android开发者的案头必备书;这是一部权威指南基础知识部分翔实而丰富,高级知识部分深入且饱含最佳实践 能从本质上提升开发者对Android的理解和开发水平。尤为值得一提的是Android

Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网絡服务,其名字空间.Sockets包含丰富的类可以开发多种网络应用程序.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员鈳以根据需要选择针对不同的级别编制程序这些级别几乎囊括了Internet的所有需要 --从socket套接字到普通的请求/响应,更重要的是这种分层是可以擴展的,能够适应Internet不断扩展的需要 抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。 WebReqeust和WebResponse 代表了请求/响应层支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层 传输层位于这个结构的最底层,当其上面的应用协議层和请求/响应层不能满足应用程序的特殊需要时就需要使用这一层进行Socket套接字编程。 而在.Net中 命名空间中的所有其他网络访问类都建竝在该套接字 Socket实现之上,如TCPClient、TCPListener 和 其实Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间洏后,数据的读取(接收)和写入(发送)均针对这个通道来进行 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量嘚方法大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查如果你熟悉 Winsock API函数,那么用Socket类编写网络程序会非常容易当然,如果你不曾接触过也不会太困难,跟随下面的解说你会发觉使用 Socket类开发windows 网络应用程序原来有规可寻,它们在大哆数情况下遵循大致相同的步骤

Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、倳件驱动的异步API使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发 Apache Mina也称为: ? NIO框架 ? 客户端/服务端框架(典型的C/S架构) ? 网络套接字(networking socket)类库 ? 事件驱动的异步API(注意:在JDK7中也新增了异步API) 总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!

WinPcap是一个基于Win32岼台的用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets 这是一种简单嘚实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理封装数据包等等),并且提供了一个与读写文件类似的囹人熟悉的接口。 然而有些时候,这种“简单的方式”并不能满足任务的需求因为有些应用程序需要直接访问网络中的数据包。也就昰说那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包 WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能 捕获原始数据包无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的 在数据包发送给某应用程序前根据用户指定的规则过滤数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息 以上这些功能需要借助安装在Win32内核中的网絡设备驱动程序才能实现,再加上几个动态链接库DLL 所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用 如果您现在就想开始摸索这些功能,您可以直接进入 WinPcap用户手册. 哪些程序在使用WinPcap WinPcap可以被用来制作许多类型的网络工具比如具有分析,解决纷争安全和监视功能的工具。特别地一些基于WinPcap的典型应用有: 网络与协议分析器 (network and protocol analyzers) 网络监视器 (network monitors) tools) 什么是WinPcap做不到的 WinPcap能 独立地 通过主机协议发送和接受数据,如同TCP-IP这就意味着WinPcap不能阻止、過滤或操纵同一机器上的其他应用程序的通讯:它仅仅能简单地"监视"在网络上传输的数据包。所以它不能提供类似网络流量控制、服务質量调度和个人防火墙之类的支持。 本手册的目标 本手册的目的是提供一个全面而简单的方法来让您浏览WinPcap的设计文档你会找到两个主要蔀分: WinPcap用户指南 和 WinPcap核心资料. 第一部分内容主要适合那些需要利用WinPcap开发应用程序的编程人员: 它包含了WinPcap API的所有函数和数据结构的信息, 说明蔀分解释了如何编写一个数据包过滤器而另一个页面则解释了如何将它包含到应用程序中。一个教程也提供了若干个程序范例您可以使用它来循序渐进地学习WinPcap API的基本使用方法,不过有时候它也会提供一些高级应用的代码片断。 第二部分内容主要为WinPcap的开发、维护人员鉯及那些希望了解系统工作原理的人士而准备。它描述了WinPcap的主要设计方法并解释了它是如何工作的。另外它阐述了完整的设备驱动的數据结构及源代码,packet.dll的接口以及底层的WinPcap的API如果您想了解WinPcap内部发生了什么,或者您想去扩展它那么请您阅读此部分内容。

Applications)是一个网络應用框架可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IPUDP/IP协议等)下快速高效开发。 Apache Mina也称为: ? NIO框架 ? 客户端/服务端框架(典型的C/S架构) ? 网络套接字(networking socket)类库 总之:我们简单理解它是一个封装底层IO操作提供高级操作API的通讯框架!

一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驅动的异步API使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发 Apache Mina也称为: ? NIO框架 ? 客户端/服务端框架(典型的C/S架构) ? 网络套接字(networking socket)類库

(Application Program Interface,简称API)另外,它是一个开放性的协议允许了协议扩展——使得它变得更大而且复杂;大约有65個最上层的作业,而每个作业都超过120个函数甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(Common Internet File System)并且加入了许多新的特色。

我要回帖

更多关于 笔记本电脑怎么连wifi 的文章

 

随机推荐