写在前面

之前做项目的时候,有前辈告诉自己,要去学一下Linux内核,对很多方面都有帮助,现在闲下来,来花时间学一下这一部分的知识点,也算是一个学习笔记
目前跟着B站UP主——简说linux 的教程《Linux内核开发100讲》学习,链接如下:
简说linux个人空间
还有简书的一个教程
使用 qemu 搭建内核开发环境

整体环境

为了学习代码,我们需要一个一套Linux环境,因为为了方便自己记笔记和学习,没有用双系统,直接在windows10下面用VMware建了一个虚拟机进行试验。
UP主用的是在这里插入图片描述
但我图方便,之前装过18的虚拟机,不想装别的了,我直接用18.04跑的linux-4.9.229
由于虚拟机的配置的时候,遇到了许多问题,把这些博客都记录下来,超链接如下:便于以后自己解决问题(注:我的虚拟机安装的Ubuntu18.04的最省略的版本,即基本上没有任何函数包和其他文本、视频软件)

Ubuntu18.04虚拟机连接不上网络
使用VMware+Ubuntu,无法切换大小写的异常处理

由于自己的Ubuntu基本上没有装库,所以还需要装几个后续在编译Linux内核中需要使用的库

sudo apt-get install libncurses5-dev #内核编译进行配置的一个文本窗口界面
sudo apt-get install build-essential #编译需要的重要函数库

学习笔记

内核源码文件夹介绍

由于Linux的内核代码非常庞大,比如4.9.229的内核大小就有797M,所以需要知道不同的目录有啥意义
进入Linux内核源码之后,会有很多文件夹,下面是目录对应的功能的大概了解
在这里插入图片描述
-arch 可以支持的CPU体系的相关的代码,内核移植基本上这个文件夹有关
|–x86 支持x86体系相关的代码
|—kernel 对应体系下的通用代码
|—boot 启动相关的 所有平台相关的启动代码
|—mach-xxx 代表了不同的公司针对不同的硬件平台的代码,其目录下的不同.c基本上和硬件平台启动相关的代码
|—net 网络相关的
-Documentation 开发中参考的第一手的资料文件
-firmware 固件相关代码
-init 内核启动及其初始化相关代码。整个内核首先以一段汇编代码开始,然后跳入C语言的start_kernel函数
-tools 内核的相关工具
-usr 测试相关的代码
-block 与块(存储)设备相关的代码
-drivers (代码中最多的部分,重要)内核对外设的支持包括鼠标、键盘、GPU、视频设备等等,与驱动相关的代码
|–i2C… 对不同类型外设的驱动
-ipc 进程通信相关代码
-security 安全相关的代码
-net 协议相关的代码
-sound 声音相关代码
-fs 文件系统相关的代码
|–sysfs… 虚拟文件系统等
-kernel 内核核心相关代码,与内核进程 调用相关的代码
-crypto 加密解密相关代码
-include 头文件相关代码
-lib 通用库
-mm(重要) 内存管理相关的代码
-scripts 内核编译相关的脚本

内核编译

了解完了基本的知识点之后,我们就开始编译一下我们自己的环境吧。
学习内核的第一步,我们先了解一下这个Linux内核,我们先从一个直观的了解方式——编译一个内核来了解它。
从源码编译linux-4.9内核并运行一个最小的busybox文件系统(最新整理版)
这里面还包含了一个busybox文件系统,这个文件系统里面有很多很实用的库,便于我们后续去使用

编译过程中遇到的问题

因为是初学Linux内核,有一些地方还是要手把手的教,在学习这个教程的过程当中,发现了教程中有一些缺漏的地方,将其补上

①缺少进入菜单进行调整的指令

在这里插入图片描述
第三步中缺少了进入菜单进行微调的指令
应该加上一句 make menuconfig

②制作镜像文件那部分过于模糊

up主的那片文章中对qemu的介绍实在太过于模糊,像我这样的新手很容易不知其所云,又找到了一篇讲的很清楚的,链接如下:这个链接很重要! 虽然有些地方还是有些模糊,但是很多知识已经解释的比up主的那一篇清楚很多了
https://www.jianshu.com/p/e1a4b5b808e0

③挂载硬盘镜像需要检查

在这里插入图片描述
在这一步中,分一块内存为硬盘,并挂载镜像文件这一步特别的重要,他是内核的文件系统的位置
挂载完了之后(我的路径有稍微一点点区别,我放在桌面了),在Linux内核的文件中,能发现img右下角有一个硬盘的标志
在这里插入图片描述
安装完busybox和内核模块中,在挂载的硬盘中应该有这些文件
在这里插入图片描述

etc其实就是格式化硬盘的时候产生的,我在编译的过程当中,一直在纠结这个里面的/etc是什么文件,后来发现就是mount硬盘之后产生的etc文件
在这里插入图片描述

最后终于跑起来啦 呜呜 学习Linux内核第一步完成
在这里插入图片描述