# xv6 **Repository Path**: codeyangjunwh/xv6 ## Basic Information - **Project Name**: xv6 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 32 - **Created**: 2023-09-18 - **Last Updated**: 2023-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 《给操作系统捋条线》分为了五个大的部分:启动,中断,文件系统,进程,控制台,其他部分比如说内存管理,锁等等都是分散在那五大部分里面。每个部分我都尽量细致到各个方面,并且附有详细的文字描述或者流程图。 《给操作系统捋条线》主要讲述了下面这些问题,看看你是否清楚: 计算机启动: 的计算机启动过程与常见的一些启动过程稍稍不同,主要是 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