操作系统真象还原

操作系统真象还原
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者:
出版社: 人民邮电出版社
2016-03
版次: 1
ISBN: 9787115414342
定价: 108.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 759页
字数: 1281千字
正文语种: 简体中文
  • 本书共分16章,讲解了开发一个操作系统需要的技术和知识,主要内容有:操作系统基础、部署工作环境、编写MBR主引导记录、完善MBR错误、保护模式入门、保护模式进阶和向内核迈进、中断、内存管理系统、线程、输入输出系统、用户进程、完善内核、编写硬盘驱动程序、文件系统、系统交互等核心技术。本书适合程序员、系统底层开发人员、操作系统爱好者阅读,也可作为大专院校相关专业师生用书和培训学校的教材。 郑钢,毕业于北京大学,前百度运维高级工程师,对操作系统有深入的研究。好运动,喜钻研,热衷于尝试前沿技术,乐于分享学习成果。 第0章一些你可能正感到迷惑的问题 10.1操作系统是什么 10.2你想研究到什么程度 20.3写操作系统,哪些需要我来做 20.4软件是如何访问硬件的 20.5应用程序是什么,和操作系统是如何配合到一起的 30.6为什么称为“陷入”内核 40.7内存访问为什么要分段 40.8代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗 60.9物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别 110.10什么是段重叠 120.11什么是平坦模型 120.12cs、ds这类sreg段寄存器,位宽是多少 120.13什么是工程,什么是协议 130.14为什么Linux系统下的应用程序不能在Windows系统下运行 140.15局部变量和函数参数为什么要放在栈中 140.16为什么说汇编语言比C语言快 150.17先有的语言,还是先有的编译器,第1个编译器是怎么产生的 160.18编译型程序与解释型程序的区别 190.19什么是大端字节序、小端字节序 190.20BIOS中断、DOS中断、Linux中断的区别 210.21Section和Segment的区别 250.22什么是魔数 290.23操作系统是如何识别文件系统的 300.24如何控制CPU的下一条指令 300.25指令集、体系结构、微架构、编程语言 300.26库函数是用户进程与内核的桥梁 330.27转义字符与ASCII码 370.28MBR、EBR、DBR和OBR各是什么 39第1章部署工作环境 421.1工欲善其事,必先利其器 421.2我们需要哪些编译器 421.2.1世界顶级编译器GCC 421.2.2汇编语言编译器新贵NASM 431.3操作系统的宿主环境 431.3.1什么是虚拟机 441.3.2盗梦空间般的开发环境,虚拟机中再装一个虚拟机 451.3.3virtualBox下载,安装 461.3.4Linux发行版下载 461.3.5Bochs下载安装 461.4配置bochs 481.5运行bochs 49第2章编写MBR主引导记录,让我们开始掌权 522.1计算机的启动过程 522.2软件接力第一棒,BIOS 522.2.1实模式下的1MB内存布局 522.2.2BIOS是如何苏醒的 542.2.3为什么是0x7c00 562.3让MBR先飞一会儿 582.3.1神奇好用的$和$$,令人迷惑的section 582.3.2NASM简单用法 602.3.3请下一位选手MBR同学做准备 60第3章完善MBR 653.1地址、section、vstart浅尝辄止 653.1.1什么是地址 653.1.2什么是section 673.1.3什么是vstart 683.2CPU的实模式 703.2.1CPU的工作原理 713.2.2实模式下的寄存器 723.2.3实模式下内存分段由来 763.2.4实模式下CPU内存寻址方式 783.2.5栈到底是什么玩意儿 813.2.6实模式下的ret 843.2.7实模式下的call 853.2.8实模式下的jmp 923.2.9标志寄存器flags 973.2.10有条件转移 993.2.11实模式小结 1013.3让我们直接对显示器说点什么吧 1013.3.1CPU如何与外设通信—IO接口 1013.3.2显卡概述 1053.3.3显存、显卡、显示器 1063.3.4改进MBR,直接操作显卡 1103.4bochs调试方法 1123.4.1bochs一般用法 1133.4.2bochs调试实例 1183.5硬盘介绍 1223.5.1硬盘发展简史 1223.5.2硬盘工作原理 1233.5.3硬盘控制器端口 1263.5.4常用的硬盘操作方法 1283.6让MBR使用硬盘 1293.6.1改造MBR 1303.6.2实现内核加载器 134第4章保护模式入门 1364.1保护模式概述 1364.1.1为什么要有保护模式 1364.1.2实模式不是32位CPU,变成了16位 1374.2初见保护模式 1374.2.1保护模式之寄存器扩展 1374.2.2保护模式之寻址扩展 1404.2.3保护模式之运行模式反转 1414.2.4保护模式之指令扩展 1454.3全局描述符表 1504.3.1段描述符 1504.3.2全局描述符表GDT、局部描述符表LDT及选择子 1554.3.3打开A20地址线 1574.3.4保护模式的开关,CR0寄存器的PE位 1584.3.5让我们进入保护模式 1584.4处理器微架构简介 1654.4.1流水线 1664.4.2乱序执行 1684.4.3缓存 1684.4.4分支预测 1694.5使用远跳转指令清空流水线,更新段描述符缓冲寄存器 1724.6保护模式之内存段的保护 1734.6.1向段寄存器加载选择子时的保护 1734.6.2代码段和数据段的保护 1744.6.3栈段的保护 175第5章保护模式进阶,向内核迈进 1775.1获取物理内存容量 1775.1.1学习Linux获取内存的方法 1775.1.2利用BIOS中断0x15子功能0xe820获取内存 1775.1.3利用BIOS中断0x15子功能0xe801获取内存 1795.1.4利用BIOS中断0x15子功能0x88获取内存 1805.1.5实战内存容量检测 1815.2启用内存分页机制,畅游虚拟空间 1865.2.1内存为什么要分页 1865.2.2一级页表 1885.2.3二级页表 1925.2.4规划页表之操作系统与用户进程的关系 1975.2.5启用分页机制 1985.2.6用虚拟地址访问页表 2045.2.7快表TLB(TranslationLookasideBuffer)简介 2065.3加载内核 2075.3.1用C语言写内核 2075.3.2二进制程序的运行方法 2115.3.3elf格式的二进制文件 2135.3.4elf文件实例分析 2185.3.5将内核载入内存 2225.4特权级深入浅出 2295.4.1特权级那点事 2295.4.2TSS简介 2305.4.3CPL和DPL入门 2325.4.4门、调用门与RPL序 2355.4.5调用门的过程保护 2405.4.6RPL的前世今生 2435.4.7IO特权级 248第6章完善内核 2526.1函数调用约定简介 2526.2汇编语言和C语言混合编程 2566.2.1浅析C库函数与系统调用 2566.2.2汇编语言和C语言共同协作 2596.3实现自己的打印函数 2616.3.1显卡的端口控制 2616.3.2实现单个字符打印 2656.3.3实现字符串打印 2756.3.4实现整数打印 2776.4内联汇编 2816.4.1什么是内联汇编 2816.4.2汇编语言AT&T语法简介 2816.4.3基本内联汇编 2836.4.4扩展内联汇编 2846.4.5扩展内联汇编之机器模式简介 294第7章中断 2987.1中断是什么,为什么要有中断 2987.2操作系统是中断驱动的 2997.3中断分类 2997.3.1外部中断 2997.3.2内部中断 3017.4中断描述符表 3047.4.1中断处理过程及保护 3067.4.2中断发生时的压栈 3087.4.3中断错误码 3107.5可编程中断控制器8259A 3117.5.18259A介绍 3117.5.28259A的编程 3147.6编写中断处理程序 3197.6.1从最简单的中断处理程序开始 3197.6.2改进中断处理程序 3357.6.3调试实战:处理器进入中断时压栈出栈完整过程 3397.7可编程计数器/定时器8253简介 3467.7.1时钟—给设备打拍子 3467.7.28253入门 3487.7.38253控制字 3497.7.48253工作方式 3507.7.58253初始化步骤 3537.8提高时钟中断的频率,让中断来得更猛烈一些 354第8章内存管理系统 3578.1makefile简介 3578.1.1makefile是什么 3578.1.2makefile基本语法 3588.1.3跳到目标处执行 3608.1.4伪目标 3618.1.5make:递归式推导目标 3628.1.6自定义变量与系统变量 3638.1.7隐含规则 3658.1.8自动化变量 3668.1.9模式规则 3678.2实现assert断言 3678.2.1实现开、关中断的函数 3678.2.2实现ASSERT 3708.2.3通过makefile来编译 3728.3实现字符串操作函数 3748.4位图bitmap及其函数的实现 3778.4.1位图简介 3778.4.2位图的定义与实现 3788.5内存管理系统 3818.5.1内存池规划 3818.5.2内存管理系统第一步,分配页内存 388第9章线程 3989.1实现内核线程 3989.1.1执行流 3989.1.2线程到底是什么 3999.1.3进程与线程的关系、区别简述 4029.1.4进程、线程的状态 4059.1.5进程的身份证—PCB 4059.1.6实现线程的两种方式—内核或用户进程 4069.2在内核空间实现线程 4099.2.1简单的PCB及线程栈的实现 4099.2.2线程的实现 4139.3核心数据结构,双向链表 4179.4多线程调度 4219.4.1简单优先级调度的基础 4219.4.2任务调度器和任务切换 425第10章输入输出系统 43910.1同步机制——锁 43910.1.1排查GP异常,理解原子操作 43910.1.2找出代码中的临界区、互斥、竞争条件 44410.1.3信号量 44510.1.4线程的阻塞与唤醒 44710.1.5锁的实现 44910.2用锁实现终端输出 45210.3从键盘获取输入 45610.3.1键盘输入原理简介 45610.3.2键盘扫描码 45710.3.38042简介 46310.3.4测试键盘中断处理程序 46510.4编写键盘驱动 46810.4.1转义字符介绍 46810.4.2处理扫描码 46910.5环形输入缓冲区 47610.5.1生产者与消费者问题简述 47610.5.2环形缓冲区的实现 47810.5.3添加键盘输入缓冲区 48110.5.4生产者与消费者实例测试 482第11章用户进程 48511.1为什么要有任务状态段TSS 48511.1.1多任务的起源,很久很久以前…… 48511.1.2LDT简介 48611.1.3TSS的作用 48811.1.4CPU原生支持的任务切换方式 49211.1.5现代操作系统采用的任务切换方式 49511.2定义并初始化TSS 49711.3实现用户进程 50111.3.1实现用户进程的原理 50111.3.2用户进程的虚拟地址空间 50111.3.3为进程创建页表和3特权级栈 50211.3.4进入特权级3 50511.3.5用户进程创建的流程 50611.3.6实现用户进程—上 50711.3.7bss简介 51311.3.8实现用户进程—下 51511.3.9让进程跑起来—用户进程的调度 51911.3.10测试用户进程 520第12章进一步完善内核 52312.1Linux系统调用浅析 52312.2系统调用的实现 52712.2.1系统调用实现框架 52712.2.2增加0x80号中断描述符 52712.2.3实现系统调用接口 52812.2.4增加0x80号中断处理例程 52812.2.5初始化系统调用和实现sys_getpid 53012.2.6添加系统调用getpid 53112.2.7在用户进程中的系统调用 53212.2.8系统调用之栈传递参数 53412.3让用户进程“说话” 53612.3.1可变参数的原理 53612.3.2实现系统调用write 53812.3.3实现printf 53912.3.4完善printf 54212.4完善堆内存管理 54512.4.1malloc底层原理 54512.4.2底层初始化 54812.4.3实现sys_malloc 55012.4.4内存的释放 55512.4.5实现sys_free 55812.4.6实现系统调用malloc和free 562第13章编写硬盘驱动程序 56613.1硬盘及分区表 56613.1.1创建从盘及获取安装的磁盘数 56613.1.2创建磁盘分区表 56713.1.3磁盘分区表浅析 57113.2编写硬盘驱动程序 57813.2.1硬盘初始化 57813.2.2实现thread_yield和idle线程 58213.2.3实现简单的休眠函数 58413.2.4完善硬盘驱动程序 58513.2.5获取硬盘信息,扫描分区表 590第14章文件系统 59514.1文件系统概念简介 59514.1.1inode、间接块索引表、文件控制块FCB简介 59514.1.2项与简介 59714.1.3超级块与文件系统布局 59914.2创建文件系统 60114.2.1创建超级块、i结点、项 60114.2.2创建文件系统 60314.2.3挂载分区 60914.3文件描述符简介 61214.3.1文件描述符原理 61214.3.2文件描述符的实现 61414.4文件操作相关的基础函数 61514.4.1inode操作有关的函数 61614.4.2文件相关的函数 62014.4.3相关的函数 62314.4.4路径解析相关的函数 62814.4.5实现文件检索功能 63014.5创建文件 63314.5.1实现file_create 63314.5.2实现sys_open 63614.5.3在文件系统上创建第1个文件 63914.6文件的打开与关闭 64014.6.1文件的打开 64014.6.2文件的关闭 64214.7实现文件写入 64314.7.1实现file_write 64314.7.2改进sys_write及write系统调用 64814.7.3把数据写入文件 65014.8读取文件 65114.8.1实现file_read 65114.8.2实现sys_read与功能验证 65314.9实现文件读写指针定位功能 65514.10实现文件删除功能 65714.10.1回收inode 65714.10.2删除项 66014.10.3实现sys_unlink与功能验证 66314.11创建 66514.11.1实现sys_mkdir创建 66614.11.2创建功能验证 66914.12遍历 67114.12.1打开和关闭 67114.12.2读取1个项 67314.12.3实现sys_readdir及sys_rewinddir 67414.13删除 67614.13.1删除与判断空 67614.13.2实现sys_rmdir及功能验证 67714.14任务的工作 67914.14.1显示当前工作的原理及基础代码 67914.14.2实现sys_getcwd 68114.14.3实现sys_chdir改变工作 68314.15获得文件属性 68414.15.1ls命令的幕后功臣 68414.15.2实现sys_stat 685第15章系统交互 68715.1fork的原理与实现 68715.1.1什么是fork 68715.1.2fork的实现 68915.1.3添加fork系统调用与实现init进程 69515.2添加read系统调用,获取键盘输入 69615.3添加putchar、clear系统调用 69715.4实现一个简单的shell 69915.4.1shell雏形 69915.4.2添加Ctrl+u和Ctrl+l快捷键 70115.4.3解析键入的字符 70315.4.4添加系统调用 70515.4.5路径解析转换 70815.4.6实现ls、cd、mkdir、ps、rm等命令 71215.5加载用户进程 71715.5.1实现exec 71715.5.2让shell支持外部命令 72315.5.3加载硬盘上的用户程序执行 72415.5.4使用户进程支持参数 72715.6实现系统调用wait和exit 73115.6.1wait和exit的作用 73115.6.2孤儿进程和僵尸进程 73215.6.3一些基础代码 73315.6.4实现wait和exit 73715.6.5实现cat命令 74115.7管道 74515.7.1管道的原理 74515.7.2管道的设计 74715.7.3管道的实现 74815.7.4利用管道实现进程间通信 75215.7.5在shell中支持管道 754参考文献 760
  • 内容简介:
    本书共分16章,讲解了开发一个操作系统需要的技术和知识,主要内容有:操作系统基础、部署工作环境、编写MBR主引导记录、完善MBR错误、保护模式入门、保护模式进阶和向内核迈进、中断、内存管理系统、线程、输入输出系统、用户进程、完善内核、编写硬盘驱动程序、文件系统、系统交互等核心技术。本书适合程序员、系统底层开发人员、操作系统爱好者阅读,也可作为大专院校相关专业师生用书和培训学校的教材。
  • 作者简介:
    郑钢,毕业于北京大学,前百度运维高级工程师,对操作系统有深入的研究。好运动,喜钻研,热衷于尝试前沿技术,乐于分享学习成果。
  • 目录:
    第0章一些你可能正感到迷惑的问题 10.1操作系统是什么 10.2你想研究到什么程度 20.3写操作系统,哪些需要我来做 20.4软件是如何访问硬件的 20.5应用程序是什么,和操作系统是如何配合到一起的 30.6为什么称为“陷入”内核 40.7内存访问为什么要分段 40.8代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗 60.9物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别 110.10什么是段重叠 120.11什么是平坦模型 120.12cs、ds这类sreg段寄存器,位宽是多少 120.13什么是工程,什么是协议 130.14为什么Linux系统下的应用程序不能在Windows系统下运行 140.15局部变量和函数参数为什么要放在栈中 140.16为什么说汇编语言比C语言快 150.17先有的语言,还是先有的编译器,第1个编译器是怎么产生的 160.18编译型程序与解释型程序的区别 190.19什么是大端字节序、小端字节序 190.20BIOS中断、DOS中断、Linux中断的区别 210.21Section和Segment的区别 250.22什么是魔数 290.23操作系统是如何识别文件系统的 300.24如何控制CPU的下一条指令 300.25指令集、体系结构、微架构、编程语言 300.26库函数是用户进程与内核的桥梁 330.27转义字符与ASCII码 370.28MBR、EBR、DBR和OBR各是什么 39第1章部署工作环境 421.1工欲善其事,必先利其器 421.2我们需要哪些编译器 421.2.1世界顶级编译器GCC 421.2.2汇编语言编译器新贵NASM 431.3操作系统的宿主环境 431.3.1什么是虚拟机 441.3.2盗梦空间般的开发环境,虚拟机中再装一个虚拟机 451.3.3virtualBox下载,安装 461.3.4Linux发行版下载 461.3.5Bochs下载安装 461.4配置bochs 481.5运行bochs 49第2章编写MBR主引导记录,让我们开始掌权 522.1计算机的启动过程 522.2软件接力第一棒,BIOS 522.2.1实模式下的1MB内存布局 522.2.2BIOS是如何苏醒的 542.2.3为什么是0x7c00 562.3让MBR先飞一会儿 582.3.1神奇好用的$和$$,令人迷惑的section 582.3.2NASM简单用法 602.3.3请下一位选手MBR同学做准备 60第3章完善MBR 653.1地址、section、vstart浅尝辄止 653.1.1什么是地址 653.1.2什么是section 673.1.3什么是vstart 683.2CPU的实模式 703.2.1CPU的工作原理 713.2.2实模式下的寄存器 723.2.3实模式下内存分段由来 763.2.4实模式下CPU内存寻址方式 783.2.5栈到底是什么玩意儿 813.2.6实模式下的ret 843.2.7实模式下的call 853.2.8实模式下的jmp 923.2.9标志寄存器flags 973.2.10有条件转移 993.2.11实模式小结 1013.3让我们直接对显示器说点什么吧 1013.3.1CPU如何与外设通信—IO接口 1013.3.2显卡概述 1053.3.3显存、显卡、显示器 1063.3.4改进MBR,直接操作显卡 1103.4bochs调试方法 1123.4.1bochs一般用法 1133.4.2bochs调试实例 1183.5硬盘介绍 1223.5.1硬盘发展简史 1223.5.2硬盘工作原理 1233.5.3硬盘控制器端口 1263.5.4常用的硬盘操作方法 1283.6让MBR使用硬盘 1293.6.1改造MBR 1303.6.2实现内核加载器 134第4章保护模式入门 1364.1保护模式概述 1364.1.1为什么要有保护模式 1364.1.2实模式不是32位CPU,变成了16位 1374.2初见保护模式 1374.2.1保护模式之寄存器扩展 1374.2.2保护模式之寻址扩展 1404.2.3保护模式之运行模式反转 1414.2.4保护模式之指令扩展 1454.3全局描述符表 1504.3.1段描述符 1504.3.2全局描述符表GDT、局部描述符表LDT及选择子 1554.3.3打开A20地址线 1574.3.4保护模式的开关,CR0寄存器的PE位 1584.3.5让我们进入保护模式 1584.4处理器微架构简介 1654.4.1流水线 1664.4.2乱序执行 1684.4.3缓存 1684.4.4分支预测 1694.5使用远跳转指令清空流水线,更新段描述符缓冲寄存器 1724.6保护模式之内存段的保护 1734.6.1向段寄存器加载选择子时的保护 1734.6.2代码段和数据段的保护 1744.6.3栈段的保护 175第5章保护模式进阶,向内核迈进 1775.1获取物理内存容量 1775.1.1学习Linux获取内存的方法 1775.1.2利用BIOS中断0x15子功能0xe820获取内存 1775.1.3利用BIOS中断0x15子功能0xe801获取内存 1795.1.4利用BIOS中断0x15子功能0x88获取内存 1805.1.5实战内存容量检测 1815.2启用内存分页机制,畅游虚拟空间 1865.2.1内存为什么要分页 1865.2.2一级页表 1885.2.3二级页表 1925.2.4规划页表之操作系统与用户进程的关系 1975.2.5启用分页机制 1985.2.6用虚拟地址访问页表 2045.2.7快表TLB(TranslationLookasideBuffer)简介 2065.3加载内核 2075.3.1用C语言写内核 2075.3.2二进制程序的运行方法 2115.3.3elf格式的二进制文件 2135.3.4elf文件实例分析 2185.3.5将内核载入内存 2225.4特权级深入浅出 2295.4.1特权级那点事 2295.4.2TSS简介 2305.4.3CPL和DPL入门 2325.4.4门、调用门与RPL序 2355.4.5调用门的过程保护 2405.4.6RPL的前世今生 2435.4.7IO特权级 248第6章完善内核 2526.1函数调用约定简介 2526.2汇编语言和C语言混合编程 2566.2.1浅析C库函数与系统调用 2566.2.2汇编语言和C语言共同协作 2596.3实现自己的打印函数 2616.3.1显卡的端口控制 2616.3.2实现单个字符打印 2656.3.3实现字符串打印 2756.3.4实现整数打印 2776.4内联汇编 2816.4.1什么是内联汇编 2816.4.2汇编语言AT&T语法简介 2816.4.3基本内联汇编 2836.4.4扩展内联汇编 2846.4.5扩展内联汇编之机器模式简介 294第7章中断 2987.1中断是什么,为什么要有中断 2987.2操作系统是中断驱动的 2997.3中断分类 2997.3.1外部中断 2997.3.2内部中断 3017.4中断描述符表 3047.4.1中断处理过程及保护 3067.4.2中断发生时的压栈 3087.4.3中断错误码 3107.5可编程中断控制器8259A 3117.5.18259A介绍 3117.5.28259A的编程 3147.6编写中断处理程序 3197.6.1从最简单的中断处理程序开始 3197.6.2改进中断处理程序 3357.6.3调试实战:处理器进入中断时压栈出栈完整过程 3397.7可编程计数器/定时器8253简介 3467.7.1时钟—给设备打拍子 3467.7.28253入门 3487.7.38253控制字 3497.7.48253工作方式 3507.7.58253初始化步骤 3537.8提高时钟中断的频率,让中断来得更猛烈一些 354第8章内存管理系统 3578.1makefile简介 3578.1.1makefile是什么 3578.1.2makefile基本语法 3588.1.3跳到目标处执行 3608.1.4伪目标 3618.1.5make:递归式推导目标 3628.1.6自定义变量与系统变量 3638.1.7隐含规则 3658.1.8自动化变量 3668.1.9模式规则 3678.2实现assert断言 3678.2.1实现开、关中断的函数 3678.2.2实现ASSERT 3708.2.3通过makefile来编译 3728.3实现字符串操作函数 3748.4位图bitmap及其函数的实现 3778.4.1位图简介 3778.4.2位图的定义与实现 3788.5内存管理系统 3818.5.1内存池规划 3818.5.2内存管理系统第一步,分配页内存 388第9章线程 3989.1实现内核线程 3989.1.1执行流 3989.1.2线程到底是什么 3999.1.3进程与线程的关系、区别简述 4029.1.4进程、线程的状态 4059.1.5进程的身份证—PCB 4059.1.6实现线程的两种方式—内核或用户进程 4069.2在内核空间实现线程 4099.2.1简单的PCB及线程栈的实现 4099.2.2线程的实现 4139.3核心数据结构,双向链表 4179.4多线程调度 4219.4.1简单优先级调度的基础 4219.4.2任务调度器和任务切换 425第10章输入输出系统 43910.1同步机制——锁 43910.1.1排查GP异常,理解原子操作 43910.1.2找出代码中的临界区、互斥、竞争条件 44410.1.3信号量 44510.1.4线程的阻塞与唤醒 44710.1.5锁的实现 44910.2用锁实现终端输出 45210.3从键盘获取输入 45610.3.1键盘输入原理简介 45610.3.2键盘扫描码 45710.3.38042简介 46310.3.4测试键盘中断处理程序 46510.4编写键盘驱动 46810.4.1转义字符介绍 46810.4.2处理扫描码 46910.5环形输入缓冲区 47610.5.1生产者与消费者问题简述 47610.5.2环形缓冲区的实现 47810.5.3添加键盘输入缓冲区 48110.5.4生产者与消费者实例测试 482第11章用户进程 48511.1为什么要有任务状态段TSS 48511.1.1多任务的起源,很久很久以前…… 48511.1.2LDT简介 48611.1.3TSS的作用 48811.1.4CPU原生支持的任务切换方式 49211.1.5现代操作系统采用的任务切换方式 49511.2定义并初始化TSS 49711.3实现用户进程 50111.3.1实现用户进程的原理 50111.3.2用户进程的虚拟地址空间 50111.3.3为进程创建页表和3特权级栈 50211.3.4进入特权级3 50511.3.5用户进程创建的流程 50611.3.6实现用户进程—上 50711.3.7bss简介 51311.3.8实现用户进程—下 51511.3.9让进程跑起来—用户进程的调度 51911.3.10测试用户进程 520第12章进一步完善内核 52312.1Linux系统调用浅析 52312.2系统调用的实现 52712.2.1系统调用实现框架 52712.2.2增加0x80号中断描述符 52712.2.3实现系统调用接口 52812.2.4增加0x80号中断处理例程 52812.2.5初始化系统调用和实现sys_getpid 53012.2.6添加系统调用getpid 53112.2.7在用户进程中的系统调用 53212.2.8系统调用之栈传递参数 53412.3让用户进程“说话” 53612.3.1可变参数的原理 53612.3.2实现系统调用write 53812.3.3实现printf 53912.3.4完善printf 54212.4完善堆内存管理 54512.4.1malloc底层原理 54512.4.2底层初始化 54812.4.3实现sys_malloc 55012.4.4内存的释放 55512.4.5实现sys_free 55812.4.6实现系统调用malloc和free 562第13章编写硬盘驱动程序 56613.1硬盘及分区表 56613.1.1创建从盘及获取安装的磁盘数 56613.1.2创建磁盘分区表 56713.1.3磁盘分区表浅析 57113.2编写硬盘驱动程序 57813.2.1硬盘初始化 57813.2.2实现thread_yield和idle线程 58213.2.3实现简单的休眠函数 58413.2.4完善硬盘驱动程序 58513.2.5获取硬盘信息,扫描分区表 590第14章文件系统 59514.1文件系统概念简介 59514.1.1inode、间接块索引表、文件控制块FCB简介 59514.1.2项与简介 59714.1.3超级块与文件系统布局 59914.2创建文件系统 60114.2.1创建超级块、i结点、项 60114.2.2创建文件系统 60314.2.3挂载分区 60914.3文件描述符简介 61214.3.1文件描述符原理 61214.3.2文件描述符的实现 61414.4文件操作相关的基础函数 61514.4.1inode操作有关的函数 61614.4.2文件相关的函数 62014.4.3相关的函数 62314.4.4路径解析相关的函数 62814.4.5实现文件检索功能 63014.5创建文件 63314.5.1实现file_create 63314.5.2实现sys_open 63614.5.3在文件系统上创建第1个文件 63914.6文件的打开与关闭 64014.6.1文件的打开 64014.6.2文件的关闭 64214.7实现文件写入 64314.7.1实现file_write 64314.7.2改进sys_write及write系统调用 64814.7.3把数据写入文件 65014.8读取文件 65114.8.1实现file_read 65114.8.2实现sys_read与功能验证 65314.9实现文件读写指针定位功能 65514.10实现文件删除功能 65714.10.1回收inode 65714.10.2删除项 66014.10.3实现sys_unlink与功能验证 66314.11创建 66514.11.1实现sys_mkdir创建 66614.11.2创建功能验证 66914.12遍历 67114.12.1打开和关闭 67114.12.2读取1个项 67314.12.3实现sys_readdir及sys_rewinddir 67414.13删除 67614.13.1删除与判断空 67614.13.2实现sys_rmdir及功能验证 67714.14任务的工作 67914.14.1显示当前工作的原理及基础代码 67914.14.2实现sys_getcwd 68114.14.3实现sys_chdir改变工作 68314.15获得文件属性 68414.15.1ls命令的幕后功臣 68414.15.2实现sys_stat 685第15章系统交互 68715.1fork的原理与实现 68715.1.1什么是fork 68715.1.2fork的实现 68915.1.3添加fork系统调用与实现init进程 69515.2添加read系统调用,获取键盘输入 69615.3添加putchar、clear系统调用 69715.4实现一个简单的shell 69915.4.1shell雏形 69915.4.2添加Ctrl+u和Ctrl+l快捷键 70115.4.3解析键入的字符 70315.4.4添加系统调用 70515.4.5路径解析转换 70815.4.6实现ls、cd、mkdir、ps、rm等命令 71215.5加载用户进程 71715.5.1实现exec 71715.5.2让shell支持外部命令 72315.5.3加载硬盘上的用户程序执行 72415.5.4使用户进程支持参数 72715.6实现系统调用wait和exit 73115.6.1wait和exit的作用 73115.6.2孤儿进程和僵尸进程 73215.6.3一些基础代码 73315.6.4实现wait和exit 73715.6.5实现cat命令 74115.7管道 74515.7.1管道的原理 74515.7.2管道的设计 74715.7.3管道的实现 74815.7.4利用管道实现进程间通信 75215.7.5在shell中支持管道 754参考文献 760
查看详情
12
好书推荐 / 更多
操作系统真象还原
洛城花落(周大新新作)
周大新
操作系统真象还原
名望与光荣(全三册)(波兰现代史诗、战后小说创作高成就作品)
[波兰]雅·伊瓦什凯维奇;易丽君 裴远颖
操作系统真象还原
金色俄罗斯丛书(27):堕落者的天堂波利亚科夫小说选
[俄]波利亚科夫 著
操作系统真象还原
果麦经典:黑塞童话
文泽尔 译者;果麦文化 出品;[德]赫尔曼·黑塞
操作系统真象还原
童年往事
[爱尔兰]罗迪·道伊尔 著;郭国良 彭真丹 译
操作系统真象还原
来日非善:艺术、批评、紧急事件
李翔宇 译者;作者:哈尔·福斯特
操作系统真象还原
汉代物质文化资料图说(修定本·精装)
孙机 著
操作系统真象还原
柏林法则:欧洲与德国之道
保罗·莱弗(英)
操作系统真象还原
俄罗斯千年文化:从古罗斯至今
[俄]德米特里·利哈乔夫 著;焦东建、董茉莉 译
操作系统真象还原
理想国译丛046:风雨横渡:英国、奴隶和美国革命
[英]西蒙·沙玛
操作系统真象还原
美国不平等的起源
[美]伊莎贝尔·威尔克森 著;姚向辉 顾冰珂 译
操作系统真象还原
甲骨文丛书·亚当夏娃浮沉录
[美]斯蒂芬·格林布拉特((Stephen Greenblatt)) 作者;罗颖男 译