本书巧妙地结合了Linux内核源代码分析、操作系统设计原理和操作系统设计实践三个方面的内容,在对Linux 0.01内核源代码进行深入分析的基础上,讲解了操作系统设计的基本原理和方法技巧。同时,还向读者提供了大量的操作系统实践方面的实例。通过对本书的学习,读者可以对操作系统的内核有深入的了解,掌握基本的硬件操作和控制能力,具有对操作系统的理解和实践能力。\r\n 本书中的所有例子,都可以使用GNU编译器来编译,所有的工具软件也都可以应用到GNU的自由软件中。本书内窜丰富、通俗易懂、可操作性强,既可作为大学高年级本科和研究生学习操作系统设计的辅导教材,也可作为计算机爱好者学习和分析Linux内核的教材。同时,也是软件工程师进行各类操作系统设计的最佳参考用书。 \r\n \r\n
第1章 GNU和Linux简介\r\n 1.1 自由的天地:GNU和Linux\r\n 1.1.1 热爱和享受自由\r\n 1.1.2 神奇的Linux\r\n 1.2 在乐趣中获得成功\r\n 1.2.1 11岁开始编程序\r\n 1.2.2 一种操作系统的诞生\r\n 1.3 GNU的开发工具\r\n 1.3.1 编译器家族GCC\r\n 1.3.2 和操作系统开发有关的工具\r\n 1.4 本章小结\r\n第2章 操作系统设计入门\r\n 2.1 操作系统介绍\r\n 2.1.1 早期的操作系统\r\n 2.1.2 DOS操作系统\r\n 2.1.3 Unix和Windows操作系统两大阵营\r\n 2.1.4 自由时代的宠儿Linux\r\n 2.2 操作系统的基本功能\r\n 2.3 编写操作系统的建议\r\n 2.3.1 编程语言选择\r\n 2.3.2 编译器和链接器\r\n 2.3.3 运行时函数库\r\n 2.3.4 使用汇编语言完成底层操作\r\n 2.3.5 关于C++的使用\r\n 2.4 x86虚拟机Bochs使用简介\r\n 2.4.1 Bochs简介\r\n 2.4.2 下载Bochs软件\r\n 2.4.3 如何安装Bochs\r\n 2.5 使用Bochs运行一个操作系统\r\n 2.5.1 制作一个软盘镜像文件\r\n 2.5.2 使用Bochs运行操作系统\r\n 2.6 操作系统设计的基本准则\r\n 2.6.1 简单就是优美\r\n 2.6.2 利用已有的基础\r\n 2.6.3 良好的设计\r\n 2.6.4 单内核操作系统和微内核操作系统\r\n 2.7 本章小结\r\n第3章 操作系统设计基础\r\n 3.1 使用DJGPP\r\n 3.1.1 DJGPP和RHIDE的安装与使用\r\n 3.1.2 make的使用\r\n 3.1.3 ld的使用\r\n 3.1.4 nasm的使用\r\n 3.2 保护模式汇编语言\r\n 3.2.1 一个简单的实模式的汇编语言的例子\r\n 3.2.2 Linux汇编程序设计\r\n 3.3 实例:一些简单的例子程序\r\n 3.3.1 识别CPU类型\r\n 3.3.2 直接向视频缓冲区输出\r\n 3.3.3 检测显示器类型\r\n 3.3.4 移动光标\r\n 3.4 本章小结\r\n第4章 Linux 0.01内核简介\r\n 4.1 Linux 0.01内核简介\r\n 4.1.1 Linux 0.01内核背景\r\n 4.1.2 Linux 0.01内核的技术特色\r\n 4.1.3 存储管理\r\n 4.1.4 文件系统\r\n 4.1.5 硬件平台移植和应用程序\r\n 4.2 Linux 0.01核心代码目录\r\n 4.3 核心源代码的目录分布\r\n 4.3.1 boot目录\r\n 4.3.2 fs目录\r\n 4.3.3 include目录\r\n 4.3.4 init目录\r\n 4.3.5 kernel目录\r\n 4.3.6 lib目录\r\n 4.3.7 mm目录\r\n 4.3.8 tools目录\r\n 4.4 Linux 0.01的main.c分析\r\n 4.5 编译和运行Linux 0.01系统\r\n 4.6 本章小结\r\n第5章 操作系统引导\r\n 5.1 操作系统引导的基本知识\r\n 5.1.1 系统引导设备\r\n 5.1.2 启动过程简介\r\n 5.1.3 硬盘主引导扇区简介\r\n 5.1.4 软盘主引导扇区\r\n 5.1.5 Linux 0.01引导代码分析\r\n 5.2 引导扇区和引导代码实例分析\r\n 5.2.1 引导扇区的内容\r\n 5.2.2 使用debug建立自己的第一张启动盘\r\n 5.2.3 使用BIOS增强“操作系统”功能\r\n 5.3 使用nasm生成引导代码\r\n 5.3.1 引导代码基础\r\n 5.3.2 最简单的引导程序\r\n 5.3.3 如何设置段寄存器\r\n 5.3.4 在引导程序中装入程序(基于扇区)\r\n 5.4 本章小结\r\n第6章 存储管理分析\r\n 6.1 操作系统内存管理策略简述\r\n 6.1.1 连续分配存储管理方式\r\n 6.1.2 虚存组织\r\n 6.1.3 非连续存储管理机制\r\n 6.2 物理存储管理\r\n 6.2.1 技术细节\r\n 6.2.2 物理存储管理器的组织\r\n 6.2.3 物理存储管理器的初始化\r\n 6.2.4 页面分配\r\n 6.2.5 页面回收\r\n 6.2.6 映射\r\n 6.2.7 内存映射\r\n 6.3 虚拟存储管理\r\n 6.3.1 技术细节\r\n 6.3.2 malloc()和free()\r\n 6.3.3 缺页处理\r\n 6.3.4 虚拟存储管理的页面分配\r\n 6.3.5 可执行程序\r\n 6.3.6 交换\r\n 6.3.7 处理流程\r\n 6.4 存储管理系统代码实例\r\n 6.4.1 实例1:探测计算机的物理内存容量\r\n 6.4.2 实例2:malloc()和free()的实现\r\n 6.5 Linux 0.01存储管理代码分析\r\n 6.5.1 memory.c分析\r\n 6.5.2 page.s分析\r\n 6.6 本章小结\r\n第7章 进程管理和调度\r\n 7.1 进程介绍\r\n 7.1.1 进程的基本功能\r\n 7.1.2 进程的调度(schedule()函数)\r\n 7.1.3 线程\r\n 7.2 多任务实现基础\r\n 7.3 进程调度的性能分析\r\n 7.4 Linux进程调度源代码分析\r\n 7.5 实例:实现协作式多任务\r\n 7.6 本章小结\r\n第8章 设备管理和调度\r\n 8.1 Linux设备管理概述\r\n 8.1.1 设备管理的基本要求\r\n 8.1.2 驱动程序(Drivers)\r\n 8.1.3 接口(Interfaces)\r\n 8.1.4 异步I/O(Asynchronous I/O)\r\n 8.2 Linux 0.01中断处理\r\n 8.2.1 中断处理的基本过程\r\n 8.2.2 traps.c文件分析\r\n 8.2.3 /kernel/asm.s文件分析\r\n 8.3 如何编写中断服务程序ISR\r\n 8.4 设备驱动程序实例\r\n 8.4.1 利用BIOS的探测系统设备\r\n 8.4.2 块设备驱动\r\n 8.4.3 键盘驱动\r\n 8.4.4 访问8042芯片各端口\r\n 8.4.5 发给8042的命令\r\n 8.4.6 发给8048的命令\r\n 8.4.7 8048到8042的数据\r\n 8.4.8 键盘源代码\r\n 8.4.9 探测软盘驱动器\r\n 8.5 Linux 0.01设备驱动程序源代码分析\r\n 8.5.1 终端控制代码:console.c\r\n 8.5.2 rs323驱动代码:serial.c和rs_io.s\r\n 8.6 本章小结\r\n第9章 磁盘文件系统\r\n 9.1 硬盘驱动器结构简介\r\n 9.1.1 硬盘参数解释\r\n 9.1.2 基本INT 13h调用简介\r\n 9.1.3 现代硬盘结构简介\r\n 9.1.4 扩展INT 13h简介\r\n 9.2 Unix文件系统\r\n 9.2.1 磁盘的基础特性\r\n 9.2.2 现代磁盘的寻道延迟特性\r\n 9.2.3 Unix文件系统分析\r\n 9.3 Virtual File System(VFS)简介\r\n 9.3.1 VFS的体系结构\r\n 9.3.2 文件的表示\r\n 9.3.3 磁盘布局(Disk layout)\r\n 9.4 文件系统设计步骤\r\n 9.4.1 磁盘函数库(Disk library)\r\n 9.4.2 文件系统(File system)\r\n 9.4.3 容错性(Robustness)\r\n 9.5 自己编写的简单文件系统\r\n 9.6 Linux 0.01文件系统源代码分析\r\n 9.7 本章小结\r\n第10章 shell编程技术和实例\r\n 10.1 shell的基本概念\r\n 10.2 实例:最简单的shell程序\r\n 10.3 管道和I/O重定向\r\n 10.3.1 使用dup()重定向I/O\r\n 10.3.2 使用pipe()和dup()\r\n 10.3.3 使用dup2()的例子\r\n 10.4 t—shell实现代码分析\r\n 10.4.1 shell总体结构(不支持管道)\r\n 10.4.2 shell总体结构(支持管道)\r\n 10.4.3 main()函数\r\n 10.4.4 initialization()函数\r\n 10.4.5 getline()函数\r\n 10.4.6 parse()函数\r\n 10.4.7 command()函数\r\n 10.4.8 execute()函数\r\n 10.4.9 forkexec()函数\r\n 10.4.10 check()函数\r\n 10.4.11 getname()函数\r\n 10.4.12 t—shell的运行效果\r\n 10.5 本章小结\r\n第11章 系统调用和C语言库的实现\r\n 11.1 Linux系统调用概述\r\n 11.1.1 系统调用\r\n 11.1.2 系统调用的实现\r\n 11.1.3 系统调用到INT 0x80h中断请求的转换\r\n 11.2 Linux 0.01系统调用实现分析\r\n 11.2.1 system_call.s\r\n 11.2.2 sys.c\r\n 11.3 试验:在Linux中添加新的系统调用\r\n 11.3.1 实现系统调用的代码\r\n 11.3.2 链接新的系统调用\r\n 11.3.3 重新编译Linux 0.01的内核\r\n 11.4 C语言标准库函数的实现\r\n 11.4.1 字符串和内存操作函数\r\n 11.4.2 I/O函数库\r\n 11.4.3 工具函数:随机数\r\n 11.5 本章小结\r\n第12章 Linux网络实现分析\r\n 12.1 TCP/IP概述\r\n 12.1.1 协定分层原则\r\n 12.1.2 网络访问层\r\n 12.1.3 网络层\r\n 12.1.4 传输层\r\n 12.1.5 应用层\r\n 12.2 环形缓冲区\r\n 12.2.1 环形缓冲区的实现原理\r\n 12.2.2 实例:环形缓冲区的实现\r\n 12.3 通信协议中的定时器编程\r\n 12.3.1 基本定时编程\r\n 12.3.2 高精度定时中断编程\r\n 12.4 简单停等协议\r\n 12.4.1 停等协议简介\r\n 12.4.2 有限状态机\r\n 12.4.3 差错控制\r\n 12.5 实例:串口数据通信\r\n 12.6 实例:停等协议的实现\r\n 12.7 本章小结\r\n参考文献\r\n
操作系统是一个非常复杂的软件, 设计和实现一个操作系统需要具有精深的理论知识和高超的实践能力. 传统的操作系统设计课程, 过于偏重理论的学习, 缺乏对实践的指导. 如果希望深入地学习操作系统的设计, 最好的方法就是找一个操作系统来自己实践, 在实践中学习, 可以创造出奇迹.
Linux的诞生, 为我们接触到世界上最优秀的操作系统内核提供了机会. L1nux具有膏多优点, 因此越来越多的计算机爱好者投入到学习Lnux的行列中来. 对于软件工程师而言, Linux作为一个功能强大, 源码开放的操作系统, 是学习操作系统设计的最好教材.
现在有许多书籍介绍Linux的内核, 然而这些书籍大多侧重于最新的内核, 例如2. x. x的内核. Linux核心源代码的文件数量和代码的行数随着版本的增长而飞速地增加. 对于Linux0. 01而言, 文件数量是76个, 所有源代码只有8413行. 而Linux2. 4. 22核心有文件1万个, 源代码行数有468万行之多. 目前, Linux内核的最新版本是2. 6. 0, tiaux2. 6. 0的内核是一个完善的操作系统内核, 具有丰富的功能. 但是Linux2. 6. 0内核的源代码数量也是惊人的, 有数百万行代码. 即便是Linuxl. 0的源代码, 也有高达16万行的代码量. 作者认为普通的读者去学习几十万行和几百万行代码的Linux核心是很固难的. 因为, Linux核心的功能已经扩展得非常复杂, 许多经典的理论和实现都被大量的细节所掩盖, 使读者难以掌握操作系统设计的精髓.
而Linux0. 01虽然是Linux的第一个发行版本, 但是却基本具备了操作系统中最重要的组成部分, 同时Linux0. 01只有8500行左右的代码, 对于初学者而言, 学习起来就非常简单和轻松了. 因此, 本书以Linux0. 01核心为背景, 来介绍操作系统的设计.
操作系统是运行在计算机硬件上的第一层软件, 因此开发一个操作系统与开发一个普通的应用程序有很大的不同. 本书以Linux0. 01为基础, 带领读者在学习操作系统基本的设计理论和实践技巧的基础上, 使用Linux 0. 01的源代码, 去修改. 编译. 试验自己感兴趣的东西.
本书提供的Linux0. 01源代码, 都可以在RedHat Linux 7. x/8. x上编译. 同时, 本韦还提供了大量可以使用GNU编译器编译的例子程序, 这些例子程序都可以轻松地移植到Linux0. 01的代码中, 为Linux0. 01拓展功能.
学习完本书, 相信读者会对操作系统的内核有深入的了解, 掌握基本的硬件操作和控制能力, 具有对操作系统的理解和实践能力. 本书中的所有例子, 都可以使用GNU编译器来编译, 所有的工具软件也都可以使用到GNU的自由软件中.
本书巧妙地结合了Linux内核源代码分析. 操作系统设计原理和操作系统设计实践三个方面的内容, 在基于对Linux0. 01内核源代码进行深入分析的基础上, 讲解了操作系统设计的基本原理, 同时还向读者提供了大量的操作系统实践方面的实例.
通过本书的学习, 读者可以掌握操作系统设计的基本原理和技术, 可以学习到经典的Linux0. 01内核的源代码. 同时, 本书给读者安排了大量的基于Linux0. 01内核的操作系统设计实例. 这些实例都是精心设计的, 它们大多数都可以直接使用在操作系统的设计实现中, 从而帮助读者快速地掌握操作系统设计的基本技能.
本书的背景是Linux0. 01内核, 这是一个经典. 简单. 易懂的内核, 是读者学习操作系统设计的最佳切入点. 本书对操作系统设计中设计的一些较为复杂的软件和硬件知识都力图通过具体的实例来进行演示和分析, 强调边学习, 边实践.
本书自带的光盘, 包含了可以编译运行的Linux0. 01核心源代码和本书中所有实例的源代码, 这些源代码都可以在读者的计算机上自由通畅地运行. 光盘中还包括了进行操作系统设计所需要的所有的GNU开发工具, 通过这些工具, 读者可以迅速地进行各类操作系统的设计.
在本书配套光盘中包含了如下内容:
/386intel目录 //包含了80386的详细技术手册
/doc目录 //包含了可引导光盘技术手册
/example //本书各章中的例程源代码
/kernel目录 //包含了Linux0. 01版本的核心源代码
/Linux. tar. gz //gz压缩格式源代码
/linux0. 01(rxnrnent. zip//Linux0. 01核心源代码的注释
/Linux0. 01. zip //ZIP压缩格式源代码
/tools //编译. 测试Linux0. 01和本书中例子需要使用到的工具软件
/as86andld86 //as86汇编器和ld86链接器
/bmhs //开放源代码的虚拟机软件
/disk //磁盘映像文件生成工具集
/DjgPP //DOS下的GNU编译器
/masm //masm汇编器
/mtools //生成bochs使用的磁盘文件的工具
/nasm //nasm汇编器
注意, 本书的Linux0. 01源代码推荐在RedHat 7. x/8. x中编译.
本配套光盘中的所有文件都可以直接复制到本地磁盘中加以使用.
本书由卢军担任主要编写工作. 同时, 参与本书编排的人员还有:王安贵. 陈郭宜. 程小英. 谭小丽. 卢丽娟. 刘育志. 吴淬砺. 赵明星. 贺洪俊. 李小平. 史利. 张燕秋. 周林英. 黄茂英. 李力. 李小琼. 李修华. 田茂敏. 苏萍. 巫文斌. 邹勤. 粟德容. 童芳. 李中全. 蒋敏. 刘华菊. 袁媛. 李建康等, 在此一并感谢.
由于编写时间仓促, 书中疏漏之处在所难免, 欢迎广大读者和同行批评指正.
延伸服务:如果读者愿意参加"Linux0. 01内核分析与操作系统设计--创造你自己的操作系统"的学习培训, 或是在学习过程中发现问题, 或有更好的建议, 欢迎致函. 同时, 我们也非常愿意随时同操作系统爱好者保持经常的联系, 我们的E-mail:bojia@bo-jia. net, 网址:http://www. bojia.net, 我们将认真. 负责地对待每位读者的来信.
作 者
2004年7月