# linux_study **Repository Path**: yangjam_tm/linux_study ## Basic Information - **Project Name**: linux_study - **Description**: 用ai构建一个用于学习的最小linux系统 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-11 - **Last Updated**: 2026-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux Study — 精简类 Linux 内核 从零构建一个能在 QEMU 中运行的 x86_64 精简内核,以"剥/学 Linux 子系统"的方 式系统性学习 Linux 操作系统。 ## 快速开始 ```bash # 安装依赖 sudo apt-get install -y gcc make binutils xorriso grub-pc-bin qemu-system-x86 # 编译并运行 make -C src/kernel qemu-nox ``` 预期输出: ``` [INFO] ======================================== [INFO] Linux Study Kernel - P3: Memory Mgmt [INFO] ======================================== [INFO] IDT initialized [INFO] PIC remapped (IRQ1 enabled) [INFO] Keyboard buffer initialized [INFO] Interrupts enabled [INFO] Memory management initialized [INFO] Zone 0: start_pfn=0 managed=3822 pages (14 MB) [INFO] Zone 1: start_pfn=4096 managed=28640 pages (111 MB) [INFO] --- Memory Test --- [INFO] get_free_page() = 0x7fc0000 [INFO] free_page() ok [INFO] kmalloc(64) = 0x7fc0008 [INFO] kfree(64) ok [INFO] kmalloc(256) x5 + kfree ok [INFO] krealloc(32->128) ok [INFO] --- Memory Test Done --- [INFO] Keyboard ready. Type to echo: ``` ## 分阶段路线 | 阶段 | 内容 | 状态 | |------|------|------| | P1 | 启动引导: Multiboot2 → 长模式 → 串口输出 | ✅ | | P2 | 中断/异常处理 (IDT, 键盘中断, 除零异常) | ✅ | | P3 | 物理内存管理 (bootmem → buddy → SLOB, kmalloc) | ✅ | | P4 | 虚拟内存 + 分页 (页表, mmap, 缺页异常) | 待开始 | | P5 | 进程管理 + 调度 (task_struct, CFS) | 待开始 | | P6 | 系统调用 + 用户态切换 (ring3) | 待开始 | | P7 | VFS + 文件系统 (ramfs) | 待开始 | | P8 | 块设备驱动 + ramdisk | 待开始 | | P9 | 运行 BusyBox (init → /bin/sh) | 待开始 | | P10 | 网络栈 (TCP/IP, socket) | 扩展目标 | ## 技术选型 - 架构: x86_64 (AMD64) - 启动协议: Multiboot2 + GRUB - 内存模型: 恒等映射 (P1-P3) → 高半核 -2GB (P4 计划) - 内存分配: bootmem (早期) → buddy (页) → SLOB (小对象) - 用户空间: BusyBox (静态链接) - 参考: Linux 6.1 LTS, Linux 0.11 - 构建: GCC + GNU Make + ld ## 目录 ``` src/kernel/ # 内核源码 ├── arch/x86_64/ # 架构相关 (boot.S, interrupt.S, idt.c, irq.c, pic.c, tss.c, linker.ld) ├── include/ # 头文件 │ ├── kernel.h # 核心类型 + list_head + PAGE 宏 + 对齐工具 │ ├── idt.h # 门描述符 + pt_regs + 门类型常量 │ ├── pic.h # 8259A 端口/命令常量 │ ├── io.h # inb/outb 内联封装 │ ├── serial.h # 串口驱动接口 (COM1, 0x3F8) │ ├── keyboard.h # 键盘驱动接口 │ ├── printk.h # 内核 print 接口 │ ├── log.h # 日志 4 级过滤 + pr_* 宏 + 环形缓冲区 │ ├── mm.h # 内存管理公共 API (PFN/page 转换, buddy, SLOB) │ ├── mm_types.h # struct page, free_area, zone (3 zones, MAX_ORDER=11) │ └── gfp.h # GFP 标志位 (__GFP_DMA/WAIT/IO/FS/ZERO, GFP_KERNEL/ATOMIC) ├── drivers/ # 设备驱动 (serial.c, keyboard.c) ├── lib/ # 内核库 (printk.c, log.c) ├── mm/ # 物理内存管理 │ ├── bootmem.c # 早期启动分配器 (Multiboot2 mmap 解析, first-fit) │ ├── page_alloc.c # buddy 伙伴系统 (alloc_pages / __free_pages) │ ├── slob.c # SLOB 分配器 (kmalloc / kfree / krealloc) │ └── mm_init.c # 内存初始化入口 (bootmem → zone → buddy → SLOB) ├── kernel.c # 内核主入口 (kmain) └── Makefile # 构建系统 scripts/ # 工具脚本 (sync-wiki.sh) docs/notes/ # 学习笔记 (按阶段 p1/p2/p3 分目录) docs/superpowers/ # 设计文档与实现计划 ``` ## 编码风格 Linux kernel style,8 字符硬制表符,Doxygen 中文注释。