【李述铜】从0手写,用6000+行代码开发x86 Linux操作系统

欢迎来到从0手写操作系统课程!
课程设计来源
这门课程所涉及的操作系统是我大学时就开始折腾的东西。当时水平有限,资料也不多,所以折腾了挺久,最终还是不了了之,什么都没做出来。
不过,后面工作了一些年后,对这个事情仍然放不下,所以又花了一些时间去写。慢慢地,就形成了一个雏形,并且修修改改,做成一门课程。
设计目标
这个课程的目标构造一个类似Linux 0.11的操作系统。
有文件系统、支持多进程、支持虚拟内存,还带有Shell
整个系统并不是复刻Linux 0.11,而是做一个功能类似的系统。原始的Linux 0.11系统功能及其实现对于初学者来说,我认为是过于复杂了。
其复杂性表现在汇编代码过多,有些代码结构设计过于复杂。此外0.11本身支持的功能也较多;所以,对于初学者来说是不友好的。
因此,我在做这个课程时,尽可能从学习者的角度对整体系统结构做了简化,尽可能地砍掉了大部分汇编代码,每一小节尽可能只讲一个小的功能。
对于学习者来说,复杂且功能多的操作系统,反而是非常不利于学习。
├──01.c00.00 课程介绍.mp4 19.69M
├──02.c00.01 资料下载.mp4 15.03M
├──04.c02.01 开发工具介绍.mp4 6.17M
├──05.c02.02 Windows开发环境配置.mp4 67.26M
├──06.c02.03 ubuntu安装与配置开发工具.mp4 36.71M
├──07.c02.04 Mac下安装与配置开发工具.mp4 24.20M
├──08.第1节 介绍视频.mp4 3.29M
├──09.第2节 课程简介.mp4 21.55M
├──10.第3节 windows平台环境配置(可跳过).mp4 31.73M
├──11.第4节 mac平台环境配置(可跳过).mp4 25.64M
├──12.第5节 工程组织结构.mp4 13.04M
├──13.第6节 让计算机跑我们的操作系统.mp4 22.19M
├──14.第7节 x86处理器编程模型(1).mp4 26.52M
├──15.第8节 x86处理器编程模型(2).mp4 14.00M
├──16.第9节 加载自己的剩余部分(1).mp4 10.56M
├──17.第10节 加载自己的剩余部分(2).mp4 19.78M
├──18.第11节 进入保护模式(1).mp4 32.49M
├──19.第12节 进入保护模式(2).mp4 43.86M
├──20.第13节 进入保护模式(3).mp4 31.00M
├──21.第14节 打开分页机制(1).mp4 32.78M
├──22.第15节 打开分页机制(2).mp4 34.90M
├──23.第16节 打开分页机制(3).mp4 49.27M
├──24.第17节 开启定时中断(1).mp4 31.76M
├──25.第18节 开启定时中断(2).mp4 33.11M
├──26.第19节 开启定时中断(3).mp4 45.62M
├──27.第20节 切换至低特权级(1).mp4 19.47M
├──28.第21节 切换至低特权级(2).mp4 46.03M
├──29.第22节 切换至低特权级(3).mp4 26.49M
├──30.第23节 两个任务的切换(1).mp4 20.53M
├──31.第24节 两个任务的切换(2).mp4 69.51M
├──32.第25节 两个任务的切换(3).mp4 37.32M
├──33.第26节 增加系统调用(1).mp4 16.43M
├──34.第27节 增加系统调用(2).mp4 43.24M
├──35.第28节 增加系统调用(3).mp4 61.75M
├──36.第29节 使用LDT(1).mp4 37.01M
├──37.第30节 使用LDT(2).mp4 54.97M
├──38.第31节 使用LDT(3).mp4 11.12M
├──39.第32节 课程总结.mp4 33.91M
├──40.c03.01 计算机启动流程简介.mp4 16.15M
├──41.c03.02 接管计算机运行权.mp4 16.68M
├──42.c03.03 创建可引导的启动程序.mp4 28.44M
├──43.c03.04 初始化引导程序–seg1.mp4 12.68M
├──44.c03.04 初始化引导程序–seg2.mp4 7.91M
├──45.c03.05 使用BIOS中断显示字符.mp4 9.31M
├──46.c03.06 使用BIOS中断读取磁盘–seg1.mp4 8.73M
├──47.c03.06 使用BIOS中断读取磁盘–seg2.mp4 13.68M
├──48.c03.07 进入C语言环境并跳到loader–seg1.mp4 13.06M
├──49.c03.07 进入C语言环境并跳到loader–seg2.mp4 17.48M
├──50.c04.01 利用内联汇编显示字符串.mp4 26.66M
├──51.c04.02 检测内存容量(1).mp4 15.43M
├──52.c04.02 检测内存容量(2).mp4 23.43M
├──53.c04.03 切换进保护模式(1)–seg1.mp4 14.15M
├──54.c04.03 切换进保护模式(1)–seg2.mp4 13.98M
├──55.c04.03 切换进保护模式(1)–seg3.mp4 12.42M
├──56.c04.04 切换进保护模式(2)–seg1.mp4 13.36M
├──57.c04.04 切换进保护模式(2)–seg2.mp4 17.48M
├──58.c04.05 使用LBA读取磁盘.mp4 29.28M
├──59.c04.06 创建内核工程本.mp4 32.21M
├──60.c04.07 向内核传递启动信息–seg1.mp4 20.48M
├──61.c04.07 向内核传递启动信息–seg2.mp4 21.58M
├──62.c04.08 代码段数据段与链接脚本–seg1.mp4 25.95M
├──63.c04.08 代码段数据段与链接脚本–seg2.mp4 15.07M
├──64.c04.09 加载内核映像文件(1).mp4 22.81M
├──65.c04.10 加载内核映像文件(2).mp4 45.43M
├──66.c05.01 创建GDT表及其表项–seg1.mp4 18.86M
├──67.c05.01 创建GDT表及其表项–seg2.mp4 28.48M
├──68.c05.02 保护模式下的内存管理简介.mp4 24.41M
├──69.c05.03 重新加载GDT–seg1.mp4 42.83M
├──70.c05.03 重新加载GDT–seg2.mp4 24.36M
├──71.c05.04 触发异常与异常简介.mp4 12.21M
├──72.c05.05 添加中断门描述符.mp4 20.88M
├──73.c05.06 初始化IDT表.mp4 16.70M
├──74.c05.07 捕获除0异常–seg1.mp4 23.72M
├──75.c05.07 捕获除0异常–seg2.mp4 20.29M
├──76.c05.08 解析异常栈信息–seg1.mp4 14.19M
├──77.c05.08 解析异常栈信息–seg2.mp4 21.53M
├──78.c05.09 利用宏重用异常处理代码–seg1.mp4 21.81M
├──79.c05.09 利用宏重用异常处理代码–seg2.mp4 23.99M
├──80.c05.10 处理其它类型的异常–seg1.mp4 19.55M
├──81.c05.10 处理其它类型的异常–seg2.mp4 36.49M
├──82.c05.11 初始化中断控制器–seg1.mp4 17.12M
├──83.c05.11 初始化中断控制器–seg2.mp4 27.19M
├──84.c05.12 中断的打开与关闭.mp4 12.81M
├──85.c05.13 启动定时器并开中断–seg1.mp4 10.62M
├──86.c05.13 启动定时器并开中断–seg2.mp4 26.79M
├──87.c05.13 启动定时器并开中断–seg3.mp4 21.45M
├──88.c06.01 创建日志打印接口.mp4 18.17M
├──89.c06.02 实现基本的信息输出–seg1.mp4 7.02M
├──90.c06.02 实现基本的信息输出–seg2.mp4 20.86M
├──91.c06.03 字符串和内存工具函数实现.mp4 25.89M
├──92.c06.04 实现字符串的格式化输出–seg1.mp4 27.27M
├──93.c06.04 实现字符串的格式化输出–seg2.mp4 11.93M
├──94.c06.05 支持整数的格式化–seg1.mp4 21.25M
├──95.c06.05 支持整数的格式化–seg2.mp4 22.21M
├──96.c06.06 在异常处理程序中打印信息.mp4 23.76M
├──97.c06.07 利用assert辅助调试.mp4 27.89M
├──98.c07.01 创建两个小任务.mp4 13.86M
└──99.c07.02 添加任务状态段–seg1.mp4 20.53M
├──100.c07.02 添加任务状态段–seg2.mp4 17.14M
├──101.c07.03 初始化任务(1).mp4 17.35M
├──102.c07.03 初始化任务(2)–seg1.mp4 14.15M
├──103.c07.03 初始化任务(2)–seg2.mp4 24.83M
├──104.c07.04 简单双任务相互切换–seg1.mp4 10.73M
├──105.c07.04 简单双任务相互切换–seg2.mp4 25.74M
├──106.c07.04 简单双任务相互切换–seg3.mp4 16.02M
├──107.c07.05 另一种任务切换方法–seg1.mp4 21.12M
├──108.c07.05 另一种任务切换方法–seg2.mp4 26.95M
├──109.c08.01 定义结点和链表.mp4 22.63M
├──110.c08.02 链表的查询函数.mp4 7.54M
├──111.c08.03 链表的两种插入.mp4 21.07M
├──112.c08.04 链表的两种删除.mp4 25.24M
├──113.c08.05 获取结点所在的结构–seg1.mp4 6.30M
├──114.c08.05 获取结点所在的结构–seg2.mp4 22.53M
├──115.c09.01 添加任务管理器.mp4 21.81M
├──116.c09.02 将任务加入就绪队列.mp4 21.75M
├──117.c09.03 任务主动放弃CPU.mp4 25.89M
├──118.c09.04 让进程按时间片运行–seg1.mp4 5.26M
├──119.c09.04 让进程按时间片运行–seg2.mp4 24.39M
├──120.c09.05 临界资源及简单的保护–seg1.mp4 12.74M
├──121.c09.05 临界资源及简单的保护–seg2.mp4 18.93M
├──122.c09.05 临界资源及简单的保护–seg3.mp4 13.38M
├──123.c09.06 让进程能够延时运行–seg1.mp4 11.47M
├──124.c09.06 让进程能够延时运行–seg2.mp4 28.99M
├──125.c09.07 让所有进程都能延时.mp4 26.55M
├──126.c10.01 信号量及其初始化.mp4 15.80M
├──127.c10.02 使用信号量进行进程同步~1.mp4 19.64M
├──128.c10.03 使用计数信号量~1.mp4 22.18M
├──129.c10.04 互斥锁及其初始化.mp4 9.45M
├──130.c10.05 互斥锁的加解锁.mp4 16.76M
├──131.c10.06 应用互斥锁.mp4 17.44M
├──132.c11.01 内存管理问题~1.mp4 19.65M
├──133.c11.02 位图数据结构与初始化~1.mp4 16.71M
├──134.c11.03 位图位的分配–seg1~1.mp4 3.71M
├──135.c11.03 位图位的分配–seg2~1.mp4 21.92M
├──136.c11.04 创建地址分配结构–seg1.mp4 14.06M
├──137.c11.04 创建地址分配结构–seg2.mp4 18.73M
├──138.c11.05 规划内存空间的分配–seg1.mp4 5.01M
├──139.c11.05 规划内存空间的分配–seg2.mp4 18.85M
├──140.c11.05 规划内存空间的分配–seg3.mp4 19.06M
├──141.c11.06 内存分页机制介绍.mp4 14.93M
├──142.c11.07 开启内存分页机制(1).mp4 16.55M
├──143.c11.08 开启内存分页机制(2)–seg1.mp4 8.45M
├──144.c11.08 开启内存分页机制(2)–seg2.mp4 23.93M
├──145.c11.08 开启内存分页机制(2)–seg3.mp4 11.44M
├──146.c11.09 创建内核页表(1)-建立映射表–seg1.mp4 9.49M
├──147.c11.09 创建内核页表(1)-建立映射表–seg2.mp4 26.76M
├──148.c11.10 创建内核页表(2)-页目录和页表结构.mp4 29.13M
├──149.c11.11 创建内核页表(3)-建立映射表–seg1.mp4 11.99M
├──150.c11.11 创建内核页表(3)-建立映射表–seg2.mp4 29.68M
├──151.c11.11 创建内核页表(3)-建立映射表–seg3.mp4 27.85M
├──152.c11.12 创建内核页表(4)-设置权限.mp4 21.47M
├──153.c11.13 为进程创建页表–seg1.mp4 15.42M
├──154.c11.13 为进程创建页表–seg2.mp4 42.20M
├──155.c12.01 隔离操作系统与进程(1)-代码分离.mp4 38.35M
├──156.c12.02 隔离操作系统与进程(2)-地址分离.mp4 40.02M
├──157.c12.03 隔离操作系统与进程(3)-搬运代码.mp4 39.50M
├──158.c12.04 调整应用的特权级–seg1.mp4 21.49M
├──159.c12.04 调整应用的特权级–seg2.mp4 25.77M
├──160.c12.05 调整异常处理函数–seg1.mp4 20.96M
├──161.c12.05 调整异常处理函数–seg2.mp4 44.84M
├──162.c12.06 修改空闲任务的特权级.mp4 15.84M
├──163.c12.07 切换至用户特权级为最低.mp4 31.06M
├──164.c12.08 为进程添加特权级0的栈空间.mp4 46.39M
├──165.c13.01 创建调用门.mp4 32.77M
├──166.c13.02 实现系统调用的调用和返回–seg1.mp4 31.12M
├──167.c13.02 实现系统调用的调用和返回–seg2.mp4 15.77M
├──168.c13.03 实现msleep系统调用–seg1.mp4 30.32M
├──169.c13.03 实现msleep系统调用–seg2.mp4 10.90M
├──170.c13.04 实现getid系统调用.mp4 35.59M
├──171.c13.05 实现pint_msg调用.mp4 12.75M
├──172.c13.06 使用int $0x80实现系统调用.mp4 35.00M
├──173.c14.01 实现fork系统调用(1)- 添加调用接口.mp4 19.95M
├──174.c14.02 实现fork系统调用(2)- 分配任务块.mp4 17.87M
├──175.c14.03 实现fork系统调用(3)- 初始化任务块.mp4 66.47M
├──176.c14.04 实现fork系统调用(4) – 复制进程地址空间.mp4 59.99M
├──177.c14.05 实现exec系统调用(1) – 创建一个空应用.mp4 38.41M
├──178.c14.06 实现exec系统调用(2) – 增加空的exec调用.mp4 13.99M
├──179.c14.07 实现exec系统调用(3) – 添加虚似文件访问接口.mp4 43.63M
├──180.c14.08 实现exec系统调用(4) – 解析并加载elf文件.mp4 77.80M
├──181.c14.09 实现exec系统调用(5) – 分配栈并进入进程执行.mp4 35.08M
├──182.c14.10 实现exec系统调用(6) – 为进程传递参数–seg1.mp4 11.08M
├──183.c14.10 实现exec系统调用(6) – 为进程传递参数–seg2.mp4 61.44M
├──184.c14.11 添加sys_sched_yield()系统调用.mp4 28.91M
├──185.c15.01 增加文件系统调用–seg1.mp4 34.08M
├──186.c15.01 增加文件系统调用–seg2.mp4 17.73M
├──187.c15.02 导入newlib c并调用printf.mp4 38.85M
├──188.c15.03 为malloc实现sys_brk调用–seg1.mp4 5.24M
├──189.c15.03 为malloc实现sys_brk调用–seg2.mp4 61.50M
├──190.c15.04 简单的printf调用实现.mp4 18.95M
├──191.c16.01 控制台简介与初始化–seg1.mp4 13.81M
├──192.c16.01 控制台简介与初始化–seg2.mp4 23.70M
├──193.c16.02 在控制台上显示字符串.mp4 43.52M
├──194.c16.03 处理换行和清屏-.mp4 50.41M
├──195.c16.04 设置光标并重定向日志输出到显示器.mp4 25.43M
├──196.c16.05 有趣的转义字符串以及删除字符.mp4 25.14M
├──197.c16.06 保存并恢复光标位置.mp4 48.86M
├──198.c16.07 更新显示字体的颜色.mp4 48.63M
├──199.c16.08 移动光标位置及清屏.mp4 34.12M
├──200.c16.09 键盘初始化.mp4 24.54M
├──201.c16.10 借助按键映射表进行键值转换–seg1.mp4 16.39M
├──202.c16.10 借助按键映射表进行键值转换–seg2.mp4 42.54M
├──203.c16.11 处理caplock和numlock键.mp4 23.31M
├──204.c16.12 处理其它特殊功能键.mp4 30.67M
├──205.c17.01 设备管理框架简介.mp4 19.73M
├──206.c17.02 增加tty设备.mp4 15.09M
├──207.c17.03 实现dev层接口操作.mp4 30.45M
├──208.c17.04 为tty设备添加结构描述.mp4 20.55M
├──209.c17.05 实现tty设备的打开.mp4 32.14M
├──210.c17.06 通过tty设备写显示数据–seg1.mp4 10.71M
├──211.c17.06 通过tty设备写显示数据–seg2.mp4 55.37M
├──212.c17.07 文件系统简介及初始化.mp4 24.02M
├──213.c17.08 为进程添加文件打开表.mp4 17.08M
├──214.c17.09 打开tty设备并向其写入数据.mp4 46.48M
├──215.c17.10 从tty读取键值字符串并显示~1.mp4 51.98M
├──216.c17.11 打开标准输出及错误输出文件~1.mp4 35.59M
├──217.c17.12 允许切换tty窗口–seg1.mp4 5.30M
├──218.c17.12 允许切换tty窗口–seg2~1.mp4 45.16M
├──219.c17.13 为每个tty窗口创建进程并保护~1.mp4 35.48M
├──220.c18.01 初始化命令行解释器~1.mp4 35.09M
├──221.c18.02 实现help命令的解析~1.mp4 43.74M
├──222.c18.03 执行echo命令并给输出加点颜色–seg1~2.mp4 29.64M
├──223.c18.03 执行echo命令并给输出加点颜色–seg2.mp4 31.73M
├──224.c18.04 为进程增加exit接口.mp4 37.50M
├──225.c18.05 为进程增加wait接口–seg1.mp4 21.03M
├──226.c18.05 为进程增加wait接口–seg2.mp4 41.19M
├──227.c18.05 为进程增加wait接口–seg3.mp4 12.13M
├──228.c18.06 让子进程继承父进程已打开的文件.mp4 28.07M
├──229.c19.01 描述一个文件系统.mp4 32.00M
├──250.c20.07 挂载FAT16文件系统–seg3.mp4 20.76M
├──251.c20.08 遍历目录命令ls的实现(1)- 添加系统调用接口.mp4 34.74M
├──252.c20.09 遍历目录命令ls的实现(2)- 列出虚假的目录内容.mp4 32.71M
├──253.c20.10 遍历目录命令ls的实现(3)- 列出真实的目录内容–seg1.mp4 22.24M
├──254.c20.10 遍历目录命令ls的实现(3)- 列出真实的目录内容–seg2.mp4 24.74M
├──255.c20.10 遍历目录命令ls的实现(3)- 列出真实的目录内容–seg3.mp4 43.92M
├──256.c20.11 文件查看命令less的实现(1)- 打开文件.mp4 50.09M
├──257.c20.12 文件查看命令less的实现(2)- 显示部分文件内容.mp4 45.42M
├──258.c20.13 文件查看命令less的实现(3)- 显示全部文件内容.mp4 37.00M
├──259.c20.14 文件查看命令less的实现(4)- 逐行显示文件内容.mp4 47.25M
├──230.c19.02 挂载设备文件系统–seg1.mp4 7.34M
├──231.c19.02 挂载设备文件系统–seg2.mp4 23.67M
├──232.c19.02 挂载设备文件系统–seg3.mp4 40.67M
├──233.c19.03 打开dev_tty0文件(1).mp4 58.80M
├──234.c19.04 打开dev_tty0文件(2).mp4 40.07M
├──235.c19.05 往dev_tty0读写数据.mp4 41.58M
├──236.c20.01 磁盘基本特性简介.mp4 25.72M
├──237.c20.02 识别系统中已有的磁盘–seg1.mp4 10.26M
├──238.c20.02 识别系统中已有的磁盘–seg2.mp4 16.18M
├──239.c20.02 识别系统中已有的磁盘–seg3.mp4 23.96M
├──240.c20.02 识别系统中已有的磁盘–seg4.mp4 31.39M
├──241.c20.03 解析磁盘分区表–seg1.mp4 7.94M
├──242.c20.03 解析磁盘分区表–seg2.mp4 43.14M
├──243.c20.04 增加磁盘设备管理.mp4 36.39M
├──244.c20.05 实现磁盘的读取和写入–seg1.mp4 36.50M
├──245.c20.05 实现磁盘的读取和写入–seg2.mp4 22.49M
├──246.c20.06 FAT16文件系统简介–seg1.mp4 23.60M
├──247.c20.06 FAT16文件系统简介–seg2.mp4 21.62M
├──248.c20.07 挂载FAT16文件系统–seg1.mp4 32.33M
├──249.c20.07 挂载FAT16文件系统–seg2.mp4 32.29M
├──260.c20.15 通过文件系统加载shell.mp4 44.66M
├──261.c20.16 让shell加载应用程序运行.mp4 33.10M
├──262.c20.17 应用运行异常时强制中断运行.mp4 25.82M
├──263.c20.18 文件复制命令cp的实现(1)- 创建新文件.mp4 45.86M
├──264.c20.19 文件复制命令cp的实现(2)- 删除文件.mp4 36.65M
├──265.c20.20 文件复制命令cp的实现(3)- 文件写入(1).mp4 37.73M
├──266.c20.21 文件复制命令cp的实现(4)- 文件写入(2).mp4 58.80M
├──267.c21.01 最后的调整与总结.mp4 21.42M
├──268.c21.02 课程总结.mp4 21.67M