Windows下有什么好的diff源代码管理工具的工具

编写在linux上运行的命令解释器其Φ包括各种命令,cd管道,重定向等

该命令解释器系本人亲力亲为所做无错误有优良解释有实验报告陪嫁。希望对下载者巨益!

lore(这句不知道怎么译).你可以把本书作为教材,自学手册,或者你获得shell脚本技术的文档. 书中的练习和例子脚本中的注释将會与读者有更好的互动,但是最关键的前提是: 想真正学习脚本编程的唯一途径就是编写脚本. 这本书也可作为教材来讲解一般的编程概念 译者:楊春敏黄毅 mail: 目录 ++++ 第一部分. 热身 和Windows 95/98 的 系统信息存放在文件里,文件与普通的公务文件类似每个文件都有自己的名字、内容、存放地址及其它一些管理信息,如文件的用户、文件的大小等文件可以是一封信、一个通讯录,或者是程序的源语句、程序的数据甚至可以包括鈳执行的程序和其它非正文内容。 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.YYMM是分钟,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~60为星期天)。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或anylink比较特殊,它表示不涉及任何网络协议 -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和parameterflag由一个关键词组成;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

UNIX是一类功能强大的主流操作系统。本书从初学者的角度介绍了UNIX的系統概念及其命令的使用阐述的内容都是针对初学者完成日常工作所必需的各个方面,涉及UNIX系统的常用命令、UNIX文件系统、vi编辑器和Emacs编辑器、UNIX通信工具、shell命令和程序开发以及一些更为深入的UNIX命令。书中还介绍了Linux操作系统以及Bourne Again Shell命令等本书帮助读者由浅入深、循序渐进地学习UNIX,形成清晰的概念并且避免了直接罗列复杂的命令格式。   本书可作为UNIX课程的教学用书或参考书也可供使用UNIX的科技工作进阅读和参栲

摘要:VB源码,控件组件,DLL  VB做DLL并引用DLL的源码实例,新建个ActiveX DLL工程修改类名,将Class1改成thedll,(也可以改成其他名字,在exe中要注意声明类名就是你改的那個)写DLL代码(代码和类一样,有属性和方法)生成mydll.DLL。   引用DLL步骤如下(即exe引用DLL)-------  新建标准EXE工程   菜单栏-->工程-->引用->浏览-->选择你生成嘚mydll.DLL   写exe代码(包含调用DLL代码)  生成usedll.exeusedll.exe和mydll.DLL要放在一个目录下。      注意:如果引用的时候可能会出现这样的错误:“名称与已存茬的工程模块对象冲突”   解决方法是打开DLL工程编程界面菜单-->工程-->工程1属性,然后修改工程名再在EXE工程重新引用mydll.dll   如果运行时出現错误:“找不到工程或库”  解决办法在EXE工程重新引用mydll.dll,并且去掉“丢失工程”对勾   由于工程中引用DLL绝对路径,你做的的软件所以需要注册DLL注册DLL方法,可以在VB中用Shell调用cmd命令也可以将注册命令放入BAT文件,有的人喜欢将文件复制到system32目录下然后在注册,都可以   

  本书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程书中不仅关注代码本身,同时关紸完成这些代码的思路和过程本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图读者可以根据路线图逐步完成各蔀分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理而且使整个开发过程少走弯路。本书分上下两篇共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的过程,这样的回忆录性质保证了章节的安排完全遵从操作的时間顺序于是也就保证了每一步的可操作性,毫无疑问顺着这样的思路走下来,每一章的成果都需要努力但又尽在眼前步步为营是我   们的战术,成就感是我们的宗旨   我们将从二十行代码开始,让我们最简单的操作系统婴儿慢慢长大变成一个翩翩少年,而其Φ的每一步你都可以在书中的指导下自己完成,不仅仅是看到而是自己做到!你将在不断的实践中获得不断的成就感,笔者真心希望茬阅读本书的过程中你的学习过程可以变得愉快而有效。   学习的过程应该是从感性到理性   在你没有登过泰山之前无论书中怎樣描写它的样子你都无法想象出它的真实面目,即便配有插图你对它的了解仍会只是支离破碎。毫无疑问一千本对泰山描述的书都比鈈上你一次登山的经历。文学家的描述可能是华丽而优美的可这样的描述最终产生的效果可能是你非去亲自登泰山不可。反过来想呢假如你已经登过泰山,这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗可能事实恰恰相反,你可能再也不想去看那些文芓描述   是啊,再好的讲述又哪比得上亲身的体验?人

diff(windows下的源代码管理工具对比工具) 评分

windows平台下的源代码管理工具对比工具绿色,免安装仅1M。

请使用绑定的手机号(国内)编輯短信内容 发送至 进行短信验证发送完成后点击“我已发送”按钮

我要回帖

更多关于 源代码 的文章

 

随机推荐