[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
2
3
4
5
6
minloha@minloha:~$ sudo apt-get install make
minloha@minloha:~$ sudo apt-get install cmake
minloha@minloha:~$ sudo apt-get install gcc
minloha@minloha:~$ sudo apt-get install flex
minloha@minloha:~$ sudo apt-get install bison
minloha@minloha:~$ sudo apt-get install libncurses-dev libssl-dev libelf-dev bc

在没有报错的情况下执行完这些命令即可,这里并没有常见的报错,都是基础环境,如果速度慢或者包不存在,请使用官方镜像源(官方有国区)

初次编译

注意,内核编译会很慢很慢,我的i9仅14核,所以需要根据自己电脑的性能进行编译。

首先我们将源码放在ubuntu系统用户目录下进行解压。

1
2
3
minloha@minloha:~$ ls
linux-6.1.1.tar.xz
minloha@minloha:~$ sudo tar -xvf linux-6.1.1.tar.xz

稍事等待即可……解压完成后移动到文件夹内部。然后我们需要配置一下编译的参数,使用下面的命令:

1
make menuconfig

1

从英文菜单上可以看出自上而下分别为:

  • 编译64位的核心
  • 漏洞缓解措施
  • 虚拟化
  • 启用部分模块加载支持、如块设备或者其他的内存管理选项
  • 网络支持

这里我们关注一下驱动设备,我们按回车可以进入:

2

如果是给嵌入式系统使用的话,可以按Y选中GPIO驱动,这个系统我就是如此打算的,所以我们勾选上,同时为了能弄出更多花样,我也勾选了NVME的驱动程序,当然可以一边翻译一边选择,这里还是非常方便的。

3

配置完成后挪动到Save处,保存并Exit即可

4


这里强调一点,设置完驱动程序后,可以使用下面两条命令配置桌面系统

1
2
3
4
# KDE桌面
make xconfig
# Gnome桌面
make gconfig

如果配置桌面环境时出现了需要安装pkg-config的提示,可以点击我下载,下载后解压,make & make install即可


接下来我们就开始构建了,如果你的CPU不够强劲,可能会需要多一点时间,我的电脑用了1分钟就搞定了,比编译opencv慢了几秒

1
minloha@minloha:~/linux$ make -j 10

如果构建失败或者已经构建过了,需要使用下面的命令清理后重新构建:

1
make mrproper

构建完成后提示的内容是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  HOSTCC  arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/compressed/kaslr.o
CC arch/x86/boot/compressed/ident_map_64.o
CC arch/x86/boot/compressed/idt_64.o
AS arch/x86/boot/compressed/idt_handlers_64.o
AS arch/x86/boot/compressed/mem_encrypt.o
CC arch/x86/boot/compressed/pgtable_64.o
CC arch/x86/boot/compressed/acpi.o
AS arch/x86/boot/compressed/efi_thunk_64.o
CC arch/x86/boot/compressed/efi.o
CC arch/x86/boot/compressed/misc.o
GZIP arch/x86/boot/compressed/vmlinux.bin.gz
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready (#1)
minloha@minloha:~/linux$

然后就可以生成镜像文件了,复制下面的命令即可:

1
minloha@minloha:~/linux$ sudo make install

因为系统不同,生成路径也不同,我到此教一种手工做法,生成的镜像在Linux源码路径/arch/x86/boot/bzImage,生成的map文件在/boot/System.map,这两个文件移动出来就可以去打包img文件了。不过这种办法是换内核的,我就不换了,在之后开发过程中会打包成iso文件,这样可以给虚拟机用了

总结

在接下来的几个内容中,我会持续更新Linux内核开发,当然内容都会很硬核,这也可能是我第一个博客项目,所以再次留个纪念吧!

本期博文读者可以学会使用Linux内核的源码以及创建一个开发环境,读者可以很快的了解到Linux内核的有趣之处,同时读者也需要有非常坚实的C语言功底,了解GNU C的语法规范等,相信阅读完之后,读者的水平会更上一层楼


[1]开发一个Linux系统吧
https://blog.minloha.cn/posts/182214b18bc0992022122222.html
作者
Minloha
发布于
2022年12月22日
更新于
2023年12月21日
许可协议