Songqian Li's Blog

去历史上留点故事

本文介绍了如何安装 Project-C 维护的带有Alternative CPU Schedulers的 Linux Kernel

下载源代码

下载 kernel 源代码,默认为 5.15-lts 分支

1
git clone https://gitlab.com/songqianli/linux-prjc.git

安装软件包

1
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

内核代码配置

  1. 进入源代码目录
1
cd linux-prjc/
  1. 从当前机器的启动目录拷贝配置信息到源代码目录

    这步操作的目的是将我们编译内核的配置采用用当前环境一致的配置

1
cp -v /boot/config-$(uname -r) .config
  1. 可以通过如下命令启动配置界面
1
make menuconfig

image.png
可以看出里面包含所有的内核组件,包括文件系统,网络,IO 栈,虚拟化和设备驱动等等。如果你不熟悉,可以不做任何修改。

编译

  1. 启动编译

    参数是并发数量,通常是 CPU 的 2 倍

1
make -j 12
  1. 提醒是否配置Alternative CPU Schedulers
1
2
3
4
5
6
7
8
9
10
11
*
* Restart config...
*
*
* Alternative CPU Schedulers
*
Alternative CPU Schedulers (SCHED_ALT) [Y/n/?] (NEW) y
Alternative CPU Scheduler
> 1. BMQ CPU scheduler (SCHED_BMQ) (NEW)
2. PDS CPU scheduler (SCHED_PDS) (NEW)
choice[1-2?]: 1

如果要使用BMQ或者PDS-mq算法,输入Y,否则输入n
输入Y后会提示选择BMQ还是PDS算法。

这里如果不使用 Project-C 的调度算法就输入n后跳过,默认使用CFS算法进行 CPU 调度。

  1. 安装模块
1
sudo make modules_install

成功输出:
image.png

  1. 安装内核
1
sudo make install

成功输出:
image.png

启用内核做引导

  1. 启用内核做引导
1
sudo update-initramfs -c -k 5.15.3+
  1. 更新 grub
1
sudo update-grub

设置默认启动内核

  1. 修改 grub 配置
1
sudo vi /etc/default/grub

GRUB_DEFAULT改为GRUB_DEFAULT="1>0"(含义:第一个菜单的第 2 项,第二个菜单的第 1 项),或者GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.3+"

  1. 更新 grub
1
sudo update-grub

问题排查:

1. CONFIG_X86_X32 enabled but no binutils support

  1. 先尝试:sudo apt install binutils
  2. 如果不是工具的版本问题,再排查在make -j 12时有没有报错,检查报错的问题

2. No rule to make target ‘debian/certs/debian-uefi-certs.pem’

编辑.config将下面两项的配置改为空:

1
2
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""

3. sed: can’t read modules.order: No such file or directory

make出错,检查make -j 12的 log 有没有报错

4. BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

完整错误信息:

1
2
3
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF

解决方案:

1
sudo apt install dwarves

5. *** Missing file: arch/x86/boot/bzImage

错误信息:

1
2
*** Missing file: arch/x86/boot/bzImage
*** you need to run "make before "make install".

解决方案:在sudo make install前编译bzImage

1
make bzImage

6. /bin/sh: 1: zstd: not found

1
sudo apt-get install zstd

附:

  1. 删除旧内核方法
相关文章
评论
分享
  • Ready for Linux Kernel Compiled Testing

    本文章介绍了对project-c 社区 linux-prjc 项目5.15 版本内核编译测试的准备工作。 纯净版内核编译: 123wget https://gitlab.com/alfredchen/projectc/-/raw...

    Ready for Linux Kernel Compiled Testing
  • Clone Linux Kernel Code on Windows

    出现问题的原因 Linux Kernel 代码文件有用系统保留字aux命名的文件,导致 clone 名字中有aux、com1等保留字时就会失败; Linux 文件名区分大小写,但 Win 下不区分大小写,导致当两个文件只是名字大小...

    Clone Linux Kernel Code on Windows
  • 《操作系统真象还原》:第十章 输入输出系统

    上一章中我们遇到的字符混乱和 GP 异常问题,根本原因是由于临界区代码的资源竞争,这需要一些互斥的方法来保证操作的原子性。 10.1 同步机制——锁 10.1.1 排查 GP 异常,理解原子操作 多线程执行刷屏时光标值越界导致...

    《操作系统真象还原》:第十章 输入输出系统
  • 《操作系统真象还原》:第九章 线程

    线程和进程将分两部分实现,本章先讲解线程。 9.1 实现内核线程 9.1.1 执行流 在处理器数量不变的情况下,多任务操作系统采用多道程序设计的方式,使处理器在所有任务之间来回切换,这称为“伪并行”,由操作系统中的任务调度器决定当...

    《操作系统真象还原》:第九章 线程
  • GPU虚拟化

    用户层虚拟化 本地 API 拦截和 API formwarding 在用户态实现一个函数库,假设叫 libwrapper, 它要实现底层库的所有 API; 让 APP 调用这个 libwrapper。如何做? libwrap...

    GPU虚拟化
  • 硬件虚拟化

    硬件虚拟化介绍 硬件虚拟化要做的事情 体系结构支持 体系结构 实现功能 作用 模式切换 Host CPU <-> Guest CPU 切换 CPU 资源隔离 二阶段地址转换 GVA-> GPA...

    硬件虚拟化
  • 《操作系统真象还原》:第八章 内存管理系统

    8.1 makefile 简介 这部分可参考阮一峰的讲解:https://www.ruanyifeng.com/blog/2015/02/make.html 8.1.1 makefile 是什么 makefile 是 Linu...

    《操作系统真象还原》:第八章 内存管理系统
  • 《操作系统真象还原》:第七章 中断

    7.1 中断是什么,为什么要有中断 运用中断能够显著提升并发,从而大幅提升效率。 7.2 操作系统是中断驱动的 略 7.3 中断分类 把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部...

    《操作系统真象还原》:第七章 中断
  • 《操作系统真象还原》:第六章 完善内核

    6.1 函数调用约定简介 咱们实验使用cdecl。这里提一下stdcall,cdecl与stdcall的区别在于由谁来回收栈空间。 stdcall是被调用者清理参数所占的栈空间。 举例来说: 12int subtract(int ...

    《操作系统真象还原》:第六章 完善内核
  • 《操作系统真象还原》:第五章 保护模式进阶——加载内核

    5.3 加载内核 5.3.1 用 C 语言写内核 第一个 C 语言代码: 1234int main(void) { while(1); return 0;} 这个内核文件什么都没做,通过while(1)这个死循...

    《操作系统真象还原》:第五章 保护模式进阶——加载内核