linux系统升级后,手动编译的kernel无法启动问题
linux系统升级后,手动编译的kernel无法启动问题
做开发相关,需要编译3.18的kernel,x86_64的,但是我的deepin升级v20之后,编译的kernel就无法启动了,引导不了,直接重启。
解决办法在最后
启动打印如下,然后重启
early console in decompress_kernel
Decompressing Linux... Parsing ELF...
因为重启很快,打印很快闪过,添加启动参数,需要将earlyprintk打印到串口记录下来。
APPEND root=/dev/sda1 rw earlyprintk=ttyS0,115200
grep kernel代码,加了一点打印,发现内核解压完之后,在将程序段复制到内存时失败,memcpy阶段重启了。
还看了下编译过程,但也就限于了解下是如何编译的。
使用readelf分析了下各个文件的信息,和之前可以启动的相比,arch/x86/boot/comprssed/vmlinux.bin程序段个数不一样多。
能力有限,就只能分析到这里了。
因为系统升级前可以,所以问题肯定出在一些软件包,库等更新了,导致编译的东西有问题,但是无法定位哪个软件包有问题。
怀疑对象:ld,objcopy,nm等
编译了master上最新的kernel,启动正常,所以怀疑是kernel是后面修复了这个问题的。
主要怀疑的代码为:arch/x86/boot目录里面的代码
几经曲折,终于发现一个可疑点:
启动失败就是在这个函数,标识位置为最新kernel上有的。
合并到我的kernel里面后,系统果然卡在这个位置里面,可见是对齐问题。
然后查看kernel开发日志,找出patch
查找修改这个文件的日志,可以很快找到那次日志
提交日志
从提交记录可以知道,当binutils软件包升级到2.31后,为了减少x86-64可执行文件和共享对象的大小,最大页面大小从2MB减少到4KB。但是x86-64内核必须对齐到2MB,所以出了问题。
修改办法为,添加编译参数,强制2M。
在arch/x86/Makefile中添加如下补丁
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 498c1b8123006..1c4d012550ec5 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -223,6 +223,15 @@ KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr)
LDFLAGS := -m elf_$(UTS_MACHINE)
+ifdef CONFIG_X86_64
+LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
+endif
+
# Speed up the build
KBUILD_CFLAGS += -pipe
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
在arch/x86/boot/compressed/misc.cz中添加检查
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -309,6 +309,10 @@ static void parse_elf(void *output)
switch (phdr->p_type) {
case PT_LOAD:
+#ifdef CONFIG_X86_64
+if ((phdr->p_align % 0x200000) != 0)
+error("Alignment of LOAD segment isn't multiple of 2MB");
+#endif
#ifdef CONFIG_RELOCATABLE
dest = output;
dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR);
binutils包里有什么?
ld,as,strip,ojbcopy,readelf等
GNU_Binutils
linux系统升级后,手动编译的kernel无法启动问题相关教程
Linux邮件服务器搭建实验
Linux邮件服务器搭建实验 Linux邮件服务器搭建实验 本文重点在于后面的搭建过程,前面会简单介绍邮件服务原理与工作流程,如果有什么错误或遗漏的地方,欢迎大家指正批评,谢谢。 电子邮件服务器是处理邮件交换的软硬件设施的总称,包括电子邮件程序、电子邮
Linux的crontab任务调度
Linux的crontab任务调度 目录 任务调度概述 crontab任务调度的流程图 crontab命令的基本语法 实战 任务调度概述 任务调度,是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫等。2.个别用户工
(一)自己动手写操作系统——环境搭建
(一)自己动手写操作系统——环境搭建 (一)自己动手写操作系统——环境搭建 环境:Mac OS 10.15.4 一、安装NASM brew install nasm NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序 注:需要先安装brew,使用的版本为:2.1
Linux下安装 SkyWalking 分布式追踪系统--完全无代码入侵【落地
Linux下安装 SkyWalking 分布式追踪系统--完全无代码入侵【落地】 Linux下安装 SkyWalking 分布式追踪系统--完全无代码入侵【落地】 背景: 由于现系统拆分为了分布式系统,对于线上查看错误日志有点费劲 方案: 部署搭建 SkyWalking的分布式追踪系统 一、Sky
ROS启动小海龟
ROS启动小海龟 ROS启动小海龟是检验自己的ROS系统以及UBANTU系统是否安装完全的一个小进程,也是新手入门的试手工具。首先打开终端1(ctrl+alt+t)启动ROS Master 即输入:roscore 第二步打开终端2 启动小海龟仿真器即输入:rosrun turtlesim turtlesim_node
linux下安装tomcat
linux下安装tomcat linux下安装tomcat 1、解压缩安装 前提先把JDK安装好! 上传解压包到tomcat,可以使用下列方式 方式一:使用SecureCRT的上传功能 方式二:不会的可以看这里文件传输软件 WinSCP及xftp的使用 上传后解压:用tar -zxvf 命令解压缩安装tomcat
JAVA简单图书管理系统
JAVA简单图书管理系统 //建议采用不同的类来保存众多方法 import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; import javax.swing.JOptionPane; public class Main { static Scanner input = new Scanner(System.in);static
Linux下mysql安装
Linux下mysql安装 Linux下mysql安装 下载 压缩包解压 配置my.cnf, 解压、安装mysql 启动mysql 配置root账号自定义密码 设置root账号远程可连接 防火墙开放端口 版本说明 环境:windows10 hyper Linux:centos 8.2 mysql:8.0.20 ps:由于博主只是想在本地的