《给操作系统捋条线》分为了五个大的部分:启动,中断,文件系统,进程,控制台,其他部分比如说内存管理,锁等等都是分散在那五大部分里面。每个部分我都尽量细致到各个方面,并且附有详细的文字描述或者流程图。
《给操作系统捋条线》主要讲述了下面这些问题,看看你是否清楚:
计算机启动: 的计算机启动过程与常见的一些启动过程稍稍不同,主要是 MBR 和 Bootloader 揉在一起了,其他的没什么,比较常规,可能就是多处理器的情况可能大家不太熟悉,这一块大概有这么一些问题:
- BIOS -> MBR -> Bootloader -> OSinit -> MultiProcessor 启动的大概过程?
- 实模式如何到保护模式?
- 如何开启分页机制?
- 逻辑地址,虚拟地址,线性地址,物理地址如何转化的?
- 如何读取磁盘加载内核?
- 多处理器的话又是如何启动的?
中断与系统调用:两者的过程差不太多,只不过一个中断源来源于外部,一个来源内部,在内核部分,两者的处理过程基本一样,这一块儿大概有这些问题:
-
中断与异常的关系?
-
什么是软件中断? 软件中断和软中断是一个东西吗?
-
中断控制器 PIC、APIC 的基本认识?
-
多个处理器多种中断,哪个处理器处理哪个中断呢?
-
中断的处理过程
-
向量号,IDT,中断服务程序(如何定位中断服务程序)?
-
现场的保存与恢复到底什么意思?
-
发生中断期间栈是如何变化的?
-
-
系统调用大致过程?
-
系统调用时用户程序的参数如何传递给内核?
文件系统: 将文件系统分为了 7 层,磁盘 -> 缓存 -> 日志 -> 目录 -> 路径 -> 文件描述符,大概有这些问题:
- 磁盘驱动程序(磁盘如何读写)?
- 一个简单的日志系统如何设计?
- 为什么日志系统能够保证数据的一致性?
- inode,文件,目录,目录项,文件描述符,文件结构体它们之间到底什么关系?
- 一切皆文件怎么理解,为什么 write,read 这两个系统调用就可以读写任意类型的文件?
- 目录项,硬链接,软链接到底什么意思,有什么关系?
- 常见的文件系统调用比如 dup 如何实现的?
进程
- 如何创建一个进程(fork 实现)?
- 第一个进程如何创建的?
- 程序是如何从磁盘加载到内存的(exec 实现)?
- 一个进程如何被调度上 CPU?
- 常见的调度算法及其利弊?
- 进程如何切换(页表,TSS,栈,上下文等是如何变化的)?
- 进程的休眠唤醒如何实现?
- 进程的等待退出如何实现?
- 孤儿进程,僵尸进程什么意思?
- 程序从 main 开始执行(简单了解了解运行库)?
- 堆到底是个什么玩意儿?如何实现?如何组织管理?
内存管理:
- xv6 的物理内存是如何管理的,虚拟内存又是如何管理的?
- 虚拟地址空间应该如何理解?
- 地址 0 真的就不能访问?
- 所谓的分配内存做了些什么事
锁:
- 自旋锁如何设计?
- 休眠锁如何设计?
- 常见死锁判断
控制台:
- 键盘的简单认识
- 显卡的简单认识
- 串口的简单认识
- 按下一个键到输出到屏幕这之间的详细过程?
- printf 函数如何实现的
- 为什么文件描述符 0、1、2 就表示标准输入输出错误呢?
- shell 如何实现的
- 重定向什么意思,如何实现?
- 管道什么意思,如何实现?
- 一些常用命令如 echo、grep 等等如何实现的?
大概就这些吧,有什么问题还请批评指正,也欢迎大家来同我交流。
微信:icanbehero,更多精彩内容硬核文章尽在公众号:Rand_cs