[1]开发一个Linux系统吧
介绍
主要是补一下GNU C后的坑。
干货
Linux本身是开源的系统内核,内部封装了五个模块,分别为
- 进程管理:负责管理CPU资源,让CPU在不同线程均匀切换
- 内存管理:监控内存情况,系统夹在硬件与用户中间,所以针对不同的内存情况进行对应的管理,如分页管理、SLAB分配器等
- 虚拟文件系统:负责读取存储设备、输入输出设备、显示设备等,Linux将所有外设作为文件进行管理
- 网络系统:管理网络设备,在软件层实现TCP/IP
- IPC:进程通信管理
接下来介绍一下源码结构:
- arch:针对CPU架构的不同,区分包括内存对齐、寄存器内容,同时区分了一些会因架构而改变运行过程函数,比如:memcpy、strnlen、strcmp,为了gcc合理编译,这写函数使用汇编进行了重写
- block:提供外设的控制,主要是块设备
- crypto:包括Hash、ECC、CRC校验等验证函数,包含md4、md5、rsa、shaX等加密算法
- drivers:包含基础的驱动程序
- fs:文件系统的相关算法
- include:提供给用户层使用的头文件,包括媒体对象和网络对象
- init:系统初始化阶段执行的内容(计算机启动过程最中间的一步,是引导后的阶段)
- ipc:进程通信
- kernel:核心功能,维持系统安全稳定的运行,包括信号等内容
- lib:内核使用到的函数,包括crc和btree(二叉树)
- mm:内存管理的各种方法,针对连续内存和非连续内存进行管理
- net:网络驱动相关
- virt:虚拟化技术支持
- usr:主要是生成initramfs,用于讲文件系统的内容移至Swap空间内
Linux源码:https://github.com/torvalds/linux.git
内核源码下载:https://www.kernel.org/
两者并无差别,不过推荐从后者下载,前者可能会缺失文件(git对大小写不敏感)
环境配置
你需要以下内容:GCC,CMake,Make、flex、bison以及扩展包
1 |
|
在没有报错的情况下执行完这些命令即可,这里并没有常见的报错,都是基础环境,如果速度慢或者包不存在,请使用官方镜像源(官方有国区)
初次编译
注意,内核编译会很慢很慢,我的i9仅14核,所以需要根据自己电脑的性能进行编译。
首先我们将源码放在ubuntu系统用户目录下进行解压。
1 |
|
稍事等待即可……解压完成后移动到文件夹内部。然后我们需要配置一下编译的参数,使用下面的命令:
1 |
|
从英文菜单上可以看出自上而下分别为:
- 编译64位的核心
- 漏洞缓解措施
- 虚拟化
- 启用部分模块加载支持、如块设备或者其他的内存管理选项
- 网络支持
这里我们关注一下驱动设备,我们按回车可以进入:
如果是给嵌入式系统使用的话,可以按Y
选中GPIO驱动,这个系统我就是如此打算的,所以我们勾选上,同时为了能弄出更多花样,我也勾选了NVME的驱动程序,当然可以一边翻译一边选择,这里还是非常方便的。
配置完成后挪动到Save处,保存并Exit即可
这里强调一点,设置完驱动程序后,可以使用下面两条命令配置桌面系统
1 |
|
如果配置桌面环境时出现了需要安装pkg-config
的提示,可以点击我下载,下载后解压,make & make install即可
接下来我们就开始构建了,如果你的CPU不够强劲,可能会需要多一点时间,我的电脑用了1分钟就搞定了,比编译opencv慢了几秒
1 |
|
如果构建失败或者已经构建过了,需要使用下面的命令清理后重新构建:
1 |
|
构建完成后提示的内容是这样的:
1 |
|
然后就可以生成镜像文件了,复制下面的命令即可:
1 |
|
因为系统不同,生成路径也不同,我到此教一种手工做法,生成的镜像在Linux源码路径/arch/x86/boot/bzImage
,生成的map文件在/boot/System.map
,这两个文件移动出来就可以去打包img文件了。不过这种办法是换内核的,我就不换了,在之后开发过程中会打包成iso文件,这样可以给虚拟机用了
总结
在接下来的几个内容中,我会持续更新Linux内核开发,当然内容都会很硬核,这也可能是我第一个博客项目,所以再次留个纪念吧!
本期博文读者可以学会使用Linux内核的源码以及创建一个开发环境,读者可以很快的了解到Linux内核的有趣之处,同时读者也需要有非常坚实的C语言功底,了解GNU C的语法规范等,相信阅读完之后,读者的水平会更上一层楼