# embedded-linux-lab **Repository Path**: lynyujiang/embedded-linux-lab ## Basic Information - **Project Name**: embedded-linux-lab - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-21 - **Last Updated**: 2025-08-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Embedded Linux Lab [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) **一个用于探索、学习和实验嵌入式 Linux 系统的开源项目仓库。** 本项目的目标不仅仅是构建一个能运行的 Linux 系统,而是深入理解其每一个组成部分。我们通过多种方式(Initramfs, SD 卡镜像等)构建最小系统,并专注于 **深度剖析 Linux 内核**:分析系统调用、模块机制、内核API,并通过实践例子学习如何使用它们。最具挑战性的是,我们尝试通过**直接删除未使用的内核源代码**来进行"外科手术式"的裁剪,而不仅仅是使用 `make menuconfig` 关闭选项,从而获得一个极度精简且易于理解的内核代码树。 ## 🚀 开始使用 克隆本仓库后,请执行以下命令以确保所有子模块及相关依赖被正确初始化和更新: ```bash git submodule update --init --recursive ``` 此命令会拉取并初始化所有必要的子模块,保证项目的完整性和可构建性。 ## 🔧 实验脚本分类 本仓库提供多种实验脚本,涵盖设备管理、内核功能和启动方式等不同方面: ### 1. 设备节点管理实验 嵌入式 Linux 系统有多种管理设备节点的方式,本仓库提供了五个实验脚本,分别演示不同的设备节点管理方法: #### 1.1 devtmpfs(内核自动管理)- 静态链接版本 - `run-device-devtmpfs.sh` 现代 Linux 内核推荐的设备管理方式。内核自动在 /dev 目录下创建设备节点,并在设备热插拔时动态添加和删除节点。 - **特点**:无需用户空间干预,简单可靠,BusyBox使用静态链接,不依赖外部库 - **适用场景**:现代嵌入式系统,内核版本 >= 2.6.32,需要独立性强、不依赖外部库的环境 - **运行方式**:`./run-device-devtmpfs.sh` #### 1.2 devtmpfs(内核自动管理)- 动态链接版本 - `run-device-devtmpfs-dynamic.sh` 现代 Linux 内核推荐的设备管理方式。内核自动在 /dev 目录下创建设备节点,并在设备热插拔时动态添加和删除节点。 - **特点**:无需用户空间干预,简单可靠,BusyBox使用动态链接,需要外部库支持,体积更小 - **适用场景**:现代嵌入式系统(内核版本 >= 2.6.32),需要动态链接库的环境 - **运行方式**:`./run-device-devtmpfs-dynamic.sh` #### 1.3 devtmpfs(内核自动管理)- 带登录功能版本 - `run-device-devtmpfs-login.sh` 现代 Linux 内核推荐的设备管理方式,增加用户登录认证功能。 - **特点**:内核自动创建设备节点,要求用户登录才能访问系统,增强安全性 - **适用场景**:需要安全认证的现代嵌入式系统 - **运行方式**:`./run-device-devtmpfs-login.sh` #### 1.4 mdev(BusyBox 轻量级方案) - `run-device-mdev.sh` BusyBox 提供的简化版设备管理工具,通过解析 /sys 目录下的信息来动态创建设备节点,支持热插拔。 - **特点**:占用资源少,适合嵌入式系统,支持基本的热插拔操作 - **适用场景**:资源受限的嵌入式设备,需要动态设备管理 - **运行方式**:`./run-device-mdev.sh` #### 1.5 静态设备节点(手动创建) - `run-device-static.sh` 传统的设备节点管理方式,在制作根文件系统时预先创建好所有需要的设备节点。 - **特点**:简单但不够灵活,无法处理热插拔设备 - **适用场景**:设备固定的简单嵌入式系统,或教学演示 - **运行方式**:`./run-device-static.sh` ### 2. 内核功能实验 #### 2.1 最小系统启动模式 - `run-kernel-minimal.sh` 使用最小化的内核和根文件系统启动,仅包含最基本的系统功能。 - **特点**:极小的系统体积,快速启动,适合资源受限的环境和基础功能验证 - **适用场景**:嵌入式设备原型验证,最小系统需求测试,资源受限环境 - **运行方式**:`./run-kernel-minimal.sh` #### 2.2 内核模块演示 - `run-kernel-module-demo.sh` 演示内核模块的加载和卸载,展示内核模块开发流程。 - **特点**:包含完整的模块构建、安装和测试流程 - **适用场景**:学习内核模块开发和调试 - **运行方式**:`./run-kernel-module-demo.sh` #### 2.3 调试文件系统支持 - `run-kernel-debugfs.sh` 启用内核的debugfs并提供strace、lsof等调试工具。 - **特点**:包含完整的调试工具链和debugfs支持 - **适用场景**:内核调试和系统性能分析 - **运行方式**:`./run-kernel-debugfs.sh` #### 2.4 内核崩溃/Oops演示 - `run-kernel-crash-oops.sh` 演示内核模块故障注入和Oops处理机制。 - **特点**:包含故障注入模块,可触发内核Oops和panic - **适用场景**:内核调试和故障恢复机制研究 - **运行方式**:`./run-kernel-crash-oops.sh` ### 3. 启动方式实验 #### 3.1 uImage + Initrd 启动模式 - `run-boot-uimage-initrd.sh` 使用 uImage 内核和 initrd 内存盘启动系统。 - **特点**:内核与根文件系统完全在内存中运行,无需存储设备 - **适用场景**:快速启动和调试场景 - **运行方式**:`./run-boot-uimage-initrd.sh` #### 3.2 uImage + ext4根文件系统启动模式 - `run-boot-uimage-rootfs.sh` 使用 uImage 内核和 ext4 根文件系统启动。 - **特点**:U-Boot格式内核镜像配合ext4根文件系统,模拟真实硬件环境 - **适用场景**:需要U-Boot引导和持久化存储的嵌入式系统开发 - **运行方式**:`./run-boot-uimage-rootfs.sh` #### 3.3 zImage + initramfs 启动模式 - `run-boot-zimage-initrd.sh` 使用 zImage 内核和 initramfs 内存文件系统启动。 - **特点**:内核与根文件系统完全在内存中运行,无需存储设备,启动速度快 - **适用场景**:快速启动和调试场景,无需持久化存储的应用 - **运行方式**:`./run-boot-zimage-initrd.sh` #### 3.4 zImage + ext4根文件系统启动模式 - `run-boot-zimage-rootfs.sh` 使用 zImage 内核和 ext4 根文件系统启动。 - **特点**:根文件系统存储在虚拟SD卡中,模拟真实硬件环境 - **适用场景**:需要持久化存储的嵌入式系统开发 - **运行方式**:`./run-boot-zimage-rootfs.sh` #### 3.5 zImage + ext4根文件系统 + GDB调试模式 - `run-boot-zimage-rootfs-gdb.sh` 使用 zImage 内核和 ext4 根文件系统启动,并启用GDB调试支持。 - **特点**:支持内核调试,包含调试符号,可通过GDB连接进行内核级调试 - **适用场景**:内核开发、驱动调试和系统故障分析 - **运行方式**:`./run-boot-zimage-rootfs-gdb.sh` 每个脚本都会构建一个完整的 Linux 系统并在 QEMU 中运行,您可以通过观察启动日志和系统行为来比较不同机制的特点。 注意:运行前请确保已安装所有依赖(脚本会自动检查并提示安装)。 通过对比这些不同的实验,您可以深入理解 Linux 设备管理、内核功能和启动方式的机制和优缺点。 ## 🔄 更新和贡献子模块 ### 更新子模块到最新远程提交 要更新所有子模块到其远程仓库的最新提交,请执行: ```bash git submodule update --remote ``` ### 修改和提交子模块 1. 进入子模块目录进行修改: ```bash cd path/to/submodule ``` 2. 在子模块中创建新分支并进行更改(推荐): ```bash git checkout -b your-feature-branch # 进行修改... git add . git commit -m "Description of changes in submodule" git push origin your-feature-branch ``` 3. 返回主仓库目录,更新主仓库对子模块的引用: ```bash cd .. git add path/to/submodule git commit -m "Update submodule to new commit: [brief description]" git push ``` ### 批量操作多个子模块 要一次性更新所有子模块并提交主仓库: ```bash git submodule update --remote git commit -am "Update all submodules to latest versions" git push ``` ## 🤝 如何贡献 热烈欢迎任何形式的贡献! ## 📜 许可证 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 ## 🙏 致谢 * 感谢 Linux 内核社区、BusyBox 团队、GNU 工具链和 QEMU 团队提供的强大工具。 * 灵感来源于 [Linux From Scratch](https://www.linuxfromscratch.org/), [Buildroot](https://buildroot.org/) 和 [Linux Kernel Documentation](https://www.kernel.org/doc/html/latest/). --- **Happy Hacking! 开始你的嵌入式 Linux 探索之旅吧!**