01
课程导论与实验环境准备
什么是QEMU?为什么在QEMU上运行自定义内核?Linux、GCC交叉编译器、QEMU安装
环境搭建入门
02
计算机体系结构基础回顾
CPU、内存、I/O;x86与ARM启动流程;实模式与保护模式
体系结构基础
03
汇编语言速通与AT&T语法
内核开发为什么需要汇编?常用指令(mov, jmp, call, ret, int);GNU as使用
汇编AT&T
04
链接脚本(Linker Script)深入理解
什么是链接脚本?为什么内核需要它?编写一个最简单的lds文件
链接脚本lds
05
制作最小的“裸机”内核(x86)
从零开始,用汇编编写在QEMU上打印字符的16位实模式内核
裸机实模式
06
进入32位保护模式
GDT、段描述符;从实模式切换到保护模式
保护模式GDT
07
保护模式下的屏幕打印
直接操作VGA文本缓冲区(0xB8000);用C语言编写内核入口
VGAC语言
08
搭建C语言运行时环境
设置栈指针(ESP);调用约定cdecl;编写_start入口并链接C代码
运行时cdecl
09
内核编译与Makefile构建系统
编写专业Makefile;自动化编译、链接、清理;生成ELF与裸机二进制
Makefile构建
10
QEMU调试技巧
使用 -s -S 选项;GDB远程调试内核;单步跟踪启动流程
调试GDB
11
中断与异常处理入门
IDT结构;编写简单的键盘中断处理程序
中断IDT
12
可编程中断控制器(8259A)
8259A初始化与编程;中断屏蔽与优先级管理
8259APIC
13
时钟中断与定时器
使用PIT(8253/8254)产生精确时钟中断;实现系统Tick
时钟PIT
14
内存管理基础——分页机制
CR0、CR3寄存器;页目录与页表;开启分页模式
分页MMU
15
物理内存管理——位图分配器
设计简单物理内存页帧分配器;实现分配与释放函数
位图物理内存
16
虚拟内存与地址映射
建立内核虚拟地址空间;线性地址到物理地址映射
虚拟内存页表
17
内核堆内存管理——简易malloc
基于链表或桶的堆分配器;处理内存碎片
堆分配malloc
18
进程与任务的概念
进程控制块(PCB)设计;任务状态段(TSS)的作用
PCBTSS
19
任务切换与上下文切换
实现软件任务切换;保存与恢复寄存器上下文
上下文切换
20
实现一个简单的多任务调度器
基于时间片轮转(Round-Robin)调度;添加与删除任务
调度器RR
21
系统调用实现
用户态与内核态切换;使用软中断(int 0x80)实现系统调用
系统调用int 0x80
22
内核态与用户态的分离
CPL、DPL、RPL理解;实现用户态代码加载与执行
特权级用户态
23
文件系统概念与VFS抽象
虚拟文件系统(VFS)设计思想;实现内存文件系统(ramfs)
VFSramfs
24
块设备驱动框架
以QEMU virtio-blk为例;实现块设备读写请求
块设备virtio
25
从磁盘加载ELF可执行文件
解析ELF文件格式;加载用户程序到内存并跳转执行
ELF加载器
26
内核同步原语——自旋锁与互斥锁
为什么需要同步?单核与多核环境下的实现
同步自旋锁
27
内核日志系统(printk)的实现
带缓冲区的格式化输出函数;支持不同日志级别
printk日志
28
键盘驱动与终端输入
解析键盘扫描码;实现行缓冲终端
键盘终端
29
将内核移植到ARM架构(树莓派模拟)
使用QEMU raspi2/3机器模型;编写ARM启动代码
ARM树莓派
30
课程总结与未来展望
回顾内核开发流程;推荐进阶路径(Linux内核、xv6、RT-Thread)
总结进阶