《自己动手写操作系统》读书笔记

本文通过深入解析BIOS与操作系统启动流程,解释了计算机如何在按下电源键后,从BIOS搬运指令至内存,最终由操作系统接管并建立虚拟内存管理机制的过程。从BIOS简介出发,详细阐述了操作系统初始化阶段的关键步骤,包括BIOS如何找到操作系统入口、操作系统指令搬移至内存及后续的事件循环等待机制。本文旨在帮助读者理解系统启动的基本原理,提高编程思维。


《自己动手写操作系统》读书笔记


大学时刚接触计算机时,总时有这样的一个疑问?计算机是怎么启动的,当我们按下电源键时,内部又是怎么工作的了。

通过这本书解开了我的疑惑。

问题:

1.内存是非永久性磁盘?

2.系统程序指令是存储在本地磁盘的?

3.系统指令是怎么样被搬到内存中的?



声明:我们不是系统工程师,不必要完成了解系统是怎么操作的,通过这本书只是想解开系统是如何启动和工作的,从而来提高我们的coding思想。如 果想深入的了解可以去查看相关的书籍。


一.BIOS简介(度娘)

BIOS 是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出 系统 "。 其实,它是一组固化到 计算机 主板 上一个 ROM 芯片 上的 程序 ,它保存着 计算机 最重要的基本输入输出的程序、 系统设置 信息、开机后自检程序和系统自启动程序。  其主要功能是为 计算机 提供最底层的、最直接的 硬件 设置和控制。

刚开始系统指令是不在内存中的,当我们打开计算机的电源键时,运行的就是BIOS,BIOS就是我们的系统搬运工,它时固化到主板上的。它遵循计算机标准,提供基本的输入输出功能,只要它有输入输出功能就足够了。它没有虚拟内存的管理概念,全部都是基于实际内存地址进行工作的。这样我们就找到了系统的搬运工了。


二.按下电源键

当我们按下电源键时,CPU的执行指令是BIOS中的基本输入输出指令。操作系统也是遵循计算机操作系统的标准的,这样BIOS就会去找到操作系统的入口地址,把操作系统的指令搬到内存中,当操作系统的一部分指令能实现基本的输入输出工作之后,BIOS就把CPU的使用权限交给操作系统指令,BIOS就相当于点火器,操作系统之后就运行自己的指令,它就建立虚拟内存的管理机制,建立文件系统进程,通过读取计算机硬件信息建立硬件信息的管理进程,和创建一些系统服务进程,当计算机进入完成之后就进入事件循环等待,等待用户的事件输入,或者网络事件等。这样我们就可以通过操作系统来控制硬件,如监听网络,管理文件,远程操作,运行程序等。



1.按下电源键前:


2.按下电源键之后



3.BIOS运行完之后


小结

操作系统通过BIOS搬到内存,再把CPU运行权限交给操作系统,操作系统进入事件循环等待机制。

读者要想深入了解请查看相关的书籍。


一。

本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。全书共分7章。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作系统课程的实践参考书。 折叠 作品目录 第1章 马上动手一个最小的"操作系统"1 1.1 准备工作1 1.2 10分钟完成的操作系统1 1.3 Boot Sector3 1.4 代码解释3 1.5 水面下的冰山5 1.6 回顾6 第2章 搭建你的工作环境7 2.1 虚拟计算机(Virtual PC)7 2.1.1 Virtual PC初体验8 2.1.2 创建你的第一个Virtual PC9 2.1.3 虚拟软盘研究12 2.1.4 虚拟软盘实战14 2.2 编译器(NASM & GCC)18 2.3 安装虚拟Linux19 2.4 在虚拟Linux上访问Windows文件夹26 2.5 安装虚拟PCDOS26 2.6 其他要素29 2.7 Bochs29 2.7.1 Bochs vs. Virtual PC vs. VMware30 2.7.2 Bochs的使用方法31 2.7.3 用Bochs进行调试33 2.7.4 在Linux上开发34 2.8 总结与回顾36 第3章 保护模式(Protect Mode)37 3.1 认识保护模式37 3.1.1 GDT(Global Descriptor Table) 42 3.1.2 实模式到保护模式,不一般的jmp45 3.1.3 描述符属性47 3.2 保护模式进阶50 3.2.1 海阔凭鱼跃50 3.2.2 LDT(Local Descriptor Table)58 3.2.3 特权级62 3.3 页式存储82 3.3.1 分页机制概述83 3.3.2 编代码启动分页机制84 3.3.3 PDE和PTE85 3.3.4 cr388 3.3.5 回头看代码88 3.3.6 克勤克俭用内存90 3.3.7 进一步体会分页机制100 3.4 中断和异常107 3.4.1 中断和异常机制109 3.4.2 外部中断111 3.4.3 编程操作8259A113 3.4.4 建立IDT116 3.4.5 实现一个中断117 3.4.6 时钟中断试验119 3.4.7 几点额外说明121 3.5 保护模式下的I/O122 3.5.1 IOPL122 3.5.2 I/O许可位图(I/O Permission Bitmap)123 3.6 保护模式小结123 第4章 让操作系统走进保护模式125 4.1 突破512节的限制125 4.1.1 FAT12126 4.1.2 DOS可以识别的引导盘131 4.1.3 一个最简单的Loader132 4.1.4 加载Loader入内存133 4.1.5 向Loader交出控制权142 4.1.6 整理boot.asm142 4.2 保护模式下的"操作系统"144 第5章 内核雏形146 5.1 用NASM在Linux下Hello World146 5.2 再进一步,汇编和C同步使用148 5.3 ELF(Executable and Linkable Format)150 5.4 从Loader到内核155 5.4.1 用Loader加载ELF155 5.4.2 跳入保护模式161 5.4.3 重新放置内核170 5.4.4 向内核交出控制权175 5.4.5 操作系统的调试方法176 5.5 扩充内核184 5.5.1 切换堆栈和GDT184 5.5.2 整理我们的文件夹191 5.5.3 Makefile191 5.5.4 添加中断处理200 5.5.5 两点说明218 5.6 小结219 第6章 进程221 6.1 迟到的进程221 6.2 概述222 6.2.1 进程介绍222 6.2.2 未雨绸缪--形成进程的必要考虑222 6.2.3 参考的代码224 6.3 最简单的进程224 6.3.1 简单进程的关键技术预测225 6.3.2 第一步--ring0→ring1227 6.3.3 第二步--丰富中断处理程序243 6.3.4 进程体设计技巧254 6.4 多进程256 6.4.1 添加一个进程体256 6.4.2 相关的变量和宏257 6.4.3 进程表初始化代码扩充258 6.4.4 LDT260 6.4.5 修改中断处理程序261 6.4.6 添加一个任务的步骤总结263 6.4.7 号外:Minix的中断处理265 6.4.8 代码回顾与整理269 6.5 系统调用280 6.5.1 实现一个简单的系统调用280 6.5.2 get_ticks的应用286 6.6 进程调度292 6.6.1 避免对称--进程的节奏感292 6.6.2 优先级调度总结300 第7章 输入/输出系统302 7.1 键盘302 7.1.1 从中断开始--键盘初体验302 7.1.2 AT、PS/2键盘304 7.1.3 键盘敲击的过程304 7.1.4 解析扫描码309 7.2 显示器325 7.2.1 初识TTY325 7.2.2 基本概念326 7.2.3 寄存器328 7.3 TTY任务332 7.3.1 TTY任务框架的搭建334 7.3.2 多控制台340 7.3.3 完善键盘处理346 7.3.4 TTY任务总结354 7.4 区分任务和用户进程354 7.5 printf357 7.5.1 为进程指定TTY357 7.5.2 printf()的实现358 7.5.3 系统调用write()361 7.5.4 使用printf()363 后记366
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值