sudo apt install build-essential
sudo apt install qemu # install QEMU
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
此处不再赘述,注意Ubuntu高版本需要安装qemu x86-64
sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
xz -d linux-5.4.34.tar.xz
tar -xvf linux-5.4.34.tar
cd linux-5.4.34
make defconfig # Default configuration is based on ‘x86_64_defconfig’
make menuconfig
make -j$(nproc) # nproc gives the number of CPU cores/threads available
测试一下内核能不能正常加载运行,因为没有文件系统最终会kernel panic
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
电脑加电启动首先由bootloader加载内核,内核紧接着需要挂载内存根文件系统,其中包含必要的设备驱动和工具,bootloader加载根文件系统到内存中,内核会将其挂载到根目录/下,然后运行根文件系统中init脚本执行一些启动任务,最后才挂载真正的磁盘根文件系统。
我们这里为了简化实验环境,仅制作内存根文件系统。这里借助BusyBox 构建极简内存根文件系统,提供基本的用户态可执行程序。
首先从https://www.busybox.net下载 busybox源代码解压,解压完成后,跟内核一样先配置编译,并安装。
axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2
tar -jxvf busybox-1.31.1.tar.bz2
cd busybox-1.31.1
如果是ubuntu20.04建议装1.32.0,不然后面可能报错
make menuconfig
记得要编译成静态链接,不用动态链接库。
Settings —>
[*] Build static binary (no shared libs)
然后编译安装,默认会安装到源码目录下的 _install 目录中。
make -j$(nproc) && make install
出错了看看是不是busybox版本问题
然后制作内存根文件系统镜像,大致过程如下:
mkdir rootfs
cd rootfs
cp …/busybox-1.31.1/_install/* ./ -rf
这一步有问题建议换成绝对路径,或者直接图形界面复制,把_install下所有东西复制到rootfs
mkdir dev proc sys home
sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/
准备init脚本文件放在根文件系统跟目录下(rootfs/init),添加如下内容到init文件。
这一步是自己创建init脚本,直接vim init 然后复制下面内容就行
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo “Wellcome XinLongOS!” #这里改成自己的
echo “--------------------”
cd home
/bin/sh
给init脚本添加可执行权限
chmod +x init
打包成内存根文件系统镜像
find . -print0 | cpio --null -ov --format=newc | gzip -9 > …/rootfs.cpio.gz
测试挂载根文件系统,看内核启动完成后是否执行init脚本
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
这一步根据你自己的路径写,不然可能报找不到文件。假定你现在在linux-5.4.34目录,那么应该是
qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ./busybox-1.32.0/rootfs.cpio.gz
rootfs.cpio.gz放在哪就写哪,busybox改成自己版本
看到自己的设置的文本输出就OK。
略,跟着步骤做。
命令行下打断点跟踪代码还是不够方便,用VSCode边看代码随时打断点单步执行会更方便一些,这需要配置.vscode/tasks.json和.vscode/launch.json。
配置文件参见https://github.com/mengning/linuxkernel/tree/master/src/kerneldebuging
在linux-5.4.34里建.vscode文件夹,打开显示隐藏文件选项,把配置文件全部复制进去。
vscode安装
Visual Studio Code(以下简称 VSCode)近年来获得了爆炸式增长,成为广大开发者工具库中的必备神器。VSCode 是一个轻量且强大的代码编辑器,支持 Windows,macOS X 和 Linux。内置 JavaScript、TypeScript 和 Node.js 支持,而且拥有丰富的插件生态系统,可通过安装插件来支持 C++、C#、Python、PHP 等其他语言。Visual Studio Code 的官方下载地址为: https://code.visualstudio.com/#alt-downloads
下载完 vscode 安装文件在 Windows 和 OS X 下即可图形化安装,在此不做赘述;在 Linux 下以 Ubuntu Linux 为例可以使用类似如下命令安装:
sudo apt install ./.deb
VSCode的基本使用方法可以参考官网使用手册或者二维码,在此不在赘述。
官网下载安装也行
由于 Linux 内核高度定制化,所以没有办法直接通过配置 includePath 等让 Intellisense 正常提示,这里借助一个 Python 脚本来生成 compile_commands.json 文件帮助 Intellisense 正常提示(包括头文件和宏定义等)。在Linux源代码目录下直接运行如下命令就可以生成 compile_commands.json 了。
python ./scripts/gen_compile_commands.py
还要安装VSCode插件C/C++ Intellisense和C/C++ Themes。由于插件C/C++ Intellisense需要GNU Global,还需要使用如下命令安装GNU Global。
sudo apt install global
ubuntu自带python,不用安装python环境。如果python命令没法执行按照提示换成python3 就行
按了GNU global 后C/C++ Intellisense安装不了,换个版本就行
调试过程略,参考别的科憨的文章。
码农要以和为贵,不要搞窝里斗,谢谢朋友们