为什么值得花两年时间手写内核

很多人学操作系统,止步于看懂教材里的概念图,或者在 Linux 环境下跑通几个系统调用,但始终对“内核到底是怎么管理内存、调度进程、处理中断”缺乏体感。这门课解决的核心问题,不是教你使用 Linux,而是逼你从汇编和裸机代码开始,逐行写一个能启动、能管理内存、能运行进程的最小 x86 类操作系统。你不再只是“调用 API”,而是亲手实现那个被调用的底层。作者历时两年打磨,采用从零行代码起步的方式,参照 Linux 0.11 的结构但并非完全复现,重点在于让你理解每个设计决策背后的原理。这门课的价值不在于你最后写出的内核有多强大,而在于过程中你必须直面中断向量表、页表映射、上下文切换、文件系统这些平时被黑盒封装的机制。它适合那些已经具备一定基础、想突破“知其然不知其所以然”瓶颈的开发者,而不是零基础的新手。

前置要求与学习路径建议

这门课对基础有硬性门槛,没有以下知识储备会非常痛苦:C 语言(能熟练处理指针、位运算、结构体)、计算机组成原理(理解 CPU、内存、总线的基本工作方式)、微机原理(熟悉 x86 寄存器、汇编基础、保护模式概念)、数据结构(链表、队列、哈希等在进程和内存管理中的应用)、以及操作系统的基本概念(进程、线程、虚拟内存、I/O 等)。如果你对这些概念还停留在“听说过”的程度,建议先花两周补齐基础,再进入课程。 学习路径上,不要试图一口气看完。建议分三个层次推进:第一阶段,跟着课程完成引导加载和内核初始化,重点吃透启动过程、中断设置、内存页表的基本构建;第二阶段,进入进程调度和内存管理的实现,这是最复杂也最核心的部分,反复调试比看视频更重要;第三阶段,对接简单的文件系统和用户态程序,让系统能“跑起来”一点实际功能。每个阶段之间要有至少一周的消化时间,最好配合自己在一个虚拟机或旧电脑上实际编译、运行、调试,把视频里的每一行汇编和 C 代码都敲一遍并注释清楚。

学完能独立做什么,资料如何配合

完成课程并独立复现核心模块后,你将具备以下能力:能独立搭建一个最小可启动的 x86 保护模式操作系统框架;能实现基于页表的虚拟内存管理,并调试常见的段错误和页面错误;能设计并实现一个简单的轮转或优先级进程调度器,理解上下文切换的完整流程;能编写简单的设备驱动(如串口、键盘)并与内核通信;能将用户态程序编译、链接、加载到你的系统中运行。这些能力在嵌入式系统、驱动开发、内核开发、安全研究、高性能计算等领域都是极强的竞争力,因为它证明你真正理解硬件与软件之间的边界,而不是只会调库。 资料包中的视频是主线,但必须配合动手实践。建议将视频中的代码整理成个人仓库,每完成一个模块就写一份简短的设计文档,记录你遇到的坑、调试过程、与 Linux 0.11 的异同。如果条件允许,尝试将你的内核与现有的 Linux 发行版做对比,观察不同设计在处理相同场景时的性能差异,这种对比分析能极大深化理解。不要追求功能完备,而是追求对核心机制的理解深度,一个能跑通 hello world 但你对每行代码都了如指掌的系统,远胜于一个功能丰富但你只能照抄的系统。

课程目录

├── 1-课前准备/@更多it资源www. │ ├── [ 36M] 1.1-课程简介.mp4
 │ ├── [795K] 1.2-资料下载链接.pdf
 │ ├── [ 27M] 1.3-资料下载说明.mp4
 │ └── [4.1M] 1.4-常见问题.pdf
 ├── 2-开发环境准备/ │ ├── [ 12M] 2.1-开发工具总览.mp4
 │ ├── [1.2M] 2.2-注意事项(必看!!!).pdf
 │ ├── [129M] 2.3-Windows平台.mp4
 │ ├── [ 74M] 2.4-Linux平台(ubuntu).mp4
 │ └── [ 49M] 2.5-Mac平台.mp4
 ├── 3-前置课(选学,介绍x86保护模式下的编程)/ │ ├── [951K] 3.1-课程说明.pdf
 │ ├── [ 35M] 3.2-课程简介.mp4
 │ ├── [ 47M] 3.3-开发环境安装(与前面部分内容有重复).mp4
 │ ├── [ 21M] 3.4-工程组织结构.mp4
 │ ├── [ 33M] 3.5-让计算机跑我们的操作系统.mp4
 │ ├── [ 41M] 3.6-x86处理器编程模型(1).mp4
 │ ├── [ 21M] 3.7-x86处理器编程模型(2).mp4
 │ ├── [ 15M] 3.8-加载自己的剩余部分(1).mp4
 │ ├── [ 29M] 3.9-加载自己的剩余部分(2).mp4
 │ ├── [ 54M] 3.10-进入保护模式(1).mp4
 │ ├── [ 67M] 3.11-进入保护模式(2).mp4
 │ ├── [ 47M] 3.12-进入保护模式(3).mp4
 │ ├── [ 52M] 3.13-打开分页机制(1).mp4
 │ ├── [ 53M] 3.14-打开分页机制(2).mp4
 │ ├── [ 73M] 3.15-打开分页机制(3).mp4
 │ ├── [ 49M] 3.16-开启定时中断(1).mp4
 │ ├── [ 51M] 3.17-开启定时中断(2).mp4
 │ ├── [ 69M] 3.18-开启定时中断(3).mp4
 │ ├── [ 30M] 3.19-切换至低特权级(1).mp4
 │ ├── [ 69M] 3.20-切换至低特权级(2).mp4
 │ ├── [ 40M] 3.21-切换至低特权级(3).mp4
 │ ├── [ 30M] 3.22-两个任务的切换(1).mp4
 │ ├── [104M] 3.23-两个任务的切换(2).mp4
 │ ├── [ 58M] 3.24-两个任务的切换(3).mp4
 │ ├── [ 26M] 3.25-增加系统调用(1)..mp4
 │ ├── [ 65M] 3.26-增加系统调用(2)..mp4
 │ ├── [ 97M] 3.27-增加系统调用(3)..mp4
 │ ├── [ 57M] 3.28-使用LDT(1).mp4
 │ ├── [ 84M] 3.29-使用LDT(2).mp4
 │ ├── [ 17M] 3.30-使用LDT(3).mp4
 │ └── [ 57M] 3.31-课程总结.mp4
 ├── 4-引导程序:接管控制权/ │ ├── [ 33M] 4.1-计算机启动流程简介.mp4
 │ ├── [ 31M] 4.2-接管运行控制权.mp4
 │ ├── [ 53M] 4.3-创建可引导的启动程序.mp4
 │ ├── [ 20M] 4.4-初始化引导程序(1).mp4
 │ ├── [ 14M] 4.5-初始化引导程序(2).mp4
 │ ├── [ 16M] 4.6-使用BIOS中断显示字符.mp4
 │ ├── [ 39M] 4.7-使用BIOS中断读取磁盘.mp4
 │ ├── [ 23M] 4.8-进入C语言环境并跳到loader(1).mp4
 │ └── [ 31M] 4.9-进入C语言环境并跳到loader(2).mp4
 ├── 5-加载器loader的实现/ │ ├── [ 53M] 5.1-利用内联汇编显示字符串.mp4
 │ ├── [ 29M] 5.2-检测内存容量(1).mp4
 │ ├── [ 44M] 5.3-检测内存容量(2).mp4
 │ ├── [ 23M] 5.4-切换进保护模式(1)-1.mp4
 │ ├── [ 25M] 5.5-切换进保护模式(1)-2.mp4
 │ ├── [ 22M] 5.6-切换进保护模式(1)-3.mp4
 │ ├── [ 23M] 5.7-切换进保护模式(2)-1.mp4
 │ ├── [ 31M] 5.8-切换进保护模式(2)-2.mp4
 │ ├── [ 52M] 5.9-使用LBA模式读取磁盘.mp4
 │ ├── [ 58M] 5.10-创建内核工程.mp4
 │ ├── [ 35M] 5.11-向内核传递启动信息(1).mp4
 │ ├── [ 39M] 5.12-向内核传递启动信息(2).mp4
 │ ├── [ 44M] 5.13-代码段数据段与链接脚本(1).mp4
 │ ├── [ 27M] 5.14-代码段数据段与链接脚本(2).mp4
 │ ├── [ 40M] 5.15-加载内核映像文件(1).mp4
 │ └── [ 84M] 5.16-加载内核映像文件(2).mp4
 ├── 6-中断与异常处理/ │ ├── [ 37M] 6.1-创建GDT表及其表项(1).mp4
 │ ├── [ 51M] 6.2-创建GDT表及其表项(2).mp4
 │ ├── [ 42M] 6.3-保护模式下的内存管理简介.mp4
 │ ├── [ 78M] 6.4-重新加载GDT(1).mp4
 │ ├── [ 45M] 6.5-重新加载GDT(2).mp4
 │ ├── [ 21M] 6.6-触发异常与异常简介.mp4
 │ ├── [ 36M] 6.7-添加中断门描述符.mp4
 │ ├── [ 30M] 6.8-初始化IDT表.mp4
 │ ├── [ 42M] 6.9-捕获除0异常(1).mp4
 │ ├── [ 36M] 6.10-捕获除0异常(2).mp4
 │ ├── [ 25M] 6.11-解析异常栈信息(1).mp4
 │ ├── [ 40M] 6.12-解析异常栈信息(2).mp4
 │ ├── [ 39M] 6.13-利用宏重用异常处理代码(1).mp4
 │ ├── [ 44M] 6.14-利用宏重用异常处理代码(2).mp4
 │ ├── [ 35M] 6.15-处理其它类型的异常(1).mp4
 │ ├── [ 68M] 6.16-处理其它类型的异常(2).mp4
 │ ├── [ 32M] 6.17-初始化中断控制器(1).mp4
 │ ├── [ 49M] 6.18-初始化中断控制器(2).mp4
 │ ├── [ 23M] 6.19-中断的打开与关闭.mp4
 │ ├── [ 19M] 6.20-启动定时器并开中断(1).mp4
 │ ├── [ 46M] 6.21-启动定时器并开中断(2).mp4
 │ └── [ 39M] 6.22-启动定时器并开中断(3).mp4
 ├── 7-日志与printf格式化输出/ │ ├── [ 39M] 7.1-创建日志输出接口.mp4
 │ ├── [ 51M] 7.2-实现基本的信息输出.mp4
 │ ├── [ 13M] 7.3-实现基本的信息输出(1).mp4
 │ ├── [ 38M] 7.4-实现基本的信息输出(2).mp4
 │ ├── [ 47M] 7.5-若干字符串和内存操作函数实现.mp4
 │ ├── [ 49M] 7.6-实现字符串的格式化输出(1).mp4
 │ ├── [ 22M] 7.7-实现字符串的格式化输出(2).mp4
 │ ├── [ 39M] 7.8-支持整数的格式化(1).mp4
 │ ├── [ 40M] 7.9-支持整数的格式化(2).mp4
 │ ├── [ 43M] 7.10-在异常处理程序中打印信息..mp4
 │ └── [ 51M] 7.11-利用assert辅助调试.mp4
 ├── 8-实现简单的进程切换/ │ ├── [ 25M] 8.1-创建两个小任务.mp4
 │ ├── [ 34M] 8.2-添加任务状态段(1).mp4
 │ ├── [ 28M] 8.3-添加任务状态段(2).mp4
 │ ├── [ 29M] 8.4-任务的简单初始化(1).mp4
 │ ├── [ 26M] 8.5-任务的简单初始化(2)-1.mp4
 │ ├── [ 46M] 8.6-任务的简单初始化(2)-2.mp4
 │ ├── [ 19M] 8.7-简单双任务相互切换(1).mp4
 │ ├── [ 47M] 8.8-简单双任务相互切换(2).mp4
 │ ├── [ 30M] 8.9-简单双任务相互切换(3).mp4
 │ ├── [ 35M] 8.10-另一种任务切换方法(1).mp4
 │ └── [ 45M] 8.11-另一种任务切换方法(2).mp4
 ├── 9-实现链表数据结构/ │ ├── [ 47M] 9.1-定义结点和链表.mp4
 │ ├── [ 14M] 9.2-实现链表的查询函数.mp4
 │ ├── [ 37M] 9.3-链表的两种插入.mp4
 │ ├── [ 45M] 9.4-链表的两种删除.mp4
 │ ├── [ 10M] 9.5-获取结点所在的结构(1).mp4
 │ └── [ 41M] 9.6-获取结点所在的结构(2).mp4
 ├── 10-进程的管理与延时/ │ ├── [ 48M] 10.1-添加任务管理器.mp4
 │ ├── [ 38M] 10.2-将任务加入就绪队列.mp4
 │ ├── [ 45M] 10.3-进程主动放弃CPU.mp4
 │ ├── [8.5M] 10.4-让进程按时间片运行(1).mp4
 │ ├── [ 44M] 10.5-让进程按时间片运行(2).mp4
 │ ├── [ 20M] 10.6-临界资源及简单的保护(1).mp4
 │ ├── [ 32M] 10.7-临界资源及简单的保护(2).mp4
 │ ├── [ 24M] 10.8-临界资源及简单的保护(3).mp4
 │ ├── [ 69M] 10.9-让进程能够延时运行.mp4
 │ └── [ 46M] 10.10-让所有进程都能延时.mp4
 ├── 11-进程间的同步与互斥/ │ ├── [ 32M] 11.1-计数信号量及其初始化.mp4
 │ ├── [ 33M] 11.2-发送和等待信号.mp4
 │ ├── [ 40M] 11.3-使用计数信号量.mp4
 │ ├── [ 17M] 11.4-互斥锁及其初始化.mp4
 │ ├── [ 29M] 11.5-互斥锁的加解锁.mp4
 │ └── [ 31M] 11.6-应用互斥锁.mp4
 ├── 12-虚拟内存管理和保护模式/ │ ├── [ 37M] 12.1-内存管理问题.mp4
 │ ├── [ 29M] 12.2-位图数据结构与初始化.mp4
 │ ├── [6.0M] 12.3-位图位的分配(1).mp4
 │ ├── [ 39M] 12.4-位图位的分配(2).mp4
 │ ├── [ 25M] 12.5-创建地址分配结构(1).mp4
 │ ├── [ 34M] 12.6-创建地址分配结构(2).mp4
 │ ├── [8.2M] 12.7-规划内存空间的分配(1).mp4
 │ ├── [ 34M] 12.8-规划内存空间的分配(2).mp4
 │ ├── [ 34M] 12.9-规划内存空间的分配(3).mp4
 │ ├── [ 25M] 12.10-内存分页机制介绍.mp4
 │ ├── [ 27M] 12.11-开启内存分页机制(1).mp4
 │ ├── [ 15M] 12.12-开启内存分页机制(2)-1.mp4
 │ ├── [ 42M] 12.13-开启内存分页机制(2)-2.mp4
 │ ├── [ 21M] 12.14-开启内存分页机制(2)-3.mp4
 │ ├── [ 17M] 12.15-创建内核页表(1)-建立映射表.mp4
 │ ├── [ 47M] 12.16-创建内核页表(1)-建立映射表.mp4
 │ ├── [ 51M] 12.17-创建内核页表(2)-页目录和页表结构.mp4
 │ ├── [ 22M] 12.18-创建内核页表(3)-建立映射表(1).mp4
 │ ├── [ 50M] 12.19-创建内核页表(3)-建立映射表(2).mp4
 │ ├── [ 50M] 12.20-创建内核页表(3)-建立映射表(3).mp4
 │ ├── [ 38M] 12.21-创建内核页表(4)-添加权限处理.mp4
 │ ├── [ 26M] 12.22-为进程创建页表(1).mp4
 │ └── [ 77M] 12.23-为进程创建页表(2).mp4
 ├── 13-隔离操作系统与进程/ │ ├── [ 75M] 13.1-隔离操作系统与进程(1)-代码分离.mp4
 │ ├── [ 71M] 13.2-隔离操作系统与进程(2)-地址分离.mp4
 │ ├── [ 71M] 13.3-隔离操作系统与进程(3)-搬运代码.mp4
 │ ├── [ 37M] 13.4-调整应用的特权级(1).mp4
 │ ├── [ 45M] 13.5-调整应用的特权级(2).mp4
 │ ├── [ 37M] 13.6-调整异常处理函数(1).mp4
 │ ├── [ 78M] 13.7-调整异常处理函数(2).mp4
 │ ├── [ 29M] 13.8-修改空闲任务的特权级.mp4
 │ ├── [ 55M] 13.9-切换至应用进程的特权级为最低.mp4
 │ └── [ 86M] 13.10-为进程添加特权级0的栈空间.mp4
 ├── 14-建立系统调用/ │ ├── [ 60M] 14.1-创建调用门(1).mp4
 │ ├── [ 60M] 14.1-创建调用门.mp4
 │ ├── [ 56M] 14.2-实现系统调用的调用和返回(1).mp4
 │ ├── [ 27M] 14.3-实现系统调用的调用和返回(2).mp4
 │ ├── [ 54M] 14.4-实现msleep系统调用(1).mp4
 │ ├── [ 19M] 14.5-实现msleep系统调用(2).mp4
 │ ├── [ 64M] 14.6-实现getid系统调用.mp4
 │ ├── [ 23M] 14.7-实现pint_msg调用.mp4
 │ └── [ 63M] 14.8-使用int$0x80实现系统调用.mp4
 ├── 15-新进程的加载与创建/ │ ├── [ 38M] 15.1-实现fork系统调用(1)-添加调用接口.mp4
 │ ├── [ 33M] 15.2-实现fork系统调用(2)-分配任务块.mp4
 │ ├── [121M] 15.3-实现fork系统调用(3)-初始化任务块.mp4
 │ ├── [108M] 15.4-实现fork系统调用(4)-复制进程地址空间.mp4
 │ ├── [ 70M] 15.5-实现exec系统调用(1)-创建一个空应用.mp4
 │ ├── [ 25M] 15.6-实现exec系统调用(2)-增加空的exec调用.mp4
 │ ├── [ 79M] 15.7-实现exec系统调用(3)-添加虚似文件访问接口.mp4
 │ ├── [144M] 15.8-实现exec系统调用(4)-解析并加载elf文件.mp4
 │ ├── [ 62M] 15.9-实现exec系统调用(5)-分配栈并进入进程执行.mp4
 │ ├── [ 20M] 15.10-实现exec系统调用(6)-为进程传递参数(1).mp4
 │ ├── [111M] 15.11-实现exec系统调用(6)-为进程传递参数(2).mp4
 │ └── [ 55M] 15.12-添加sys_yield()系统调用.mp4
 … 其余 

92 项略,目录共 292 项