做开发相关,需要编译3.18的kernel,x86_64的,但是我的deepin升级v20之后,编译的kernel就无法启动了,引导不了,直接重启。

解决办法在最后

重启位置

启动打印如下,然后重启

early console in decompress_kernelDecompressing 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 buildKBUILD_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_RELOCATABLEdest = output;dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR);

binutils包里有什么?
ld,as,strip,ojbcopy,readelf等
GNU_Binutils

linux系统升级后,手动编译的kernel无法启动问题相关推荐

  1. linux 内核编译不能打字,linux系统升级后,手动编译的kernel无法启动问题

    linux系统升级后,手动编译的kernel无法启动问题 linux系统升级后,手动编译的kernel无法启动问题 做开发相关,需要编译3.18的kernel,x86_64的,但是我的deepin升级 ...

  2. Linux系统移植:原厂 Kernel 移植到开发板

    文章目录 Linux系统移植:原厂 Kernel 移植到开发板 一.获取原厂内核并编译 二.内核启动测试 三.添加自己板子文件 3.1 板子配置文件 3.2 板子设备树 3.3 编译 四.重要配置修改 ...

  3. ubuntu中手动编译源码安装Xorg-server过程中依赖关系的解决

    ubuntu中手动编译源码安装Xorg-server过程中依赖关系的解决 在linux系统中手动编译源码安装软件包的过程是非常痛苦的,然而这一个多星期以来我是强忍住脾气体验了一把,虽然面对慢的令人发指 ...

  4. linux内核centos6.9,CentOS6.9手动编译并更新Kernel内核版本

    Kernel是Linux操作系统的核心部分.它由操作系统中用于管理存储器.文件.外设和系统资源的那些部分组成.Kernel是操作系统的核心,掌控着所有硬件设备的控制权. 内核就是系统上面的一个文件,这 ...

  5. 手动编译kernel和supplicant使树莓派支持wpa3

    目前支持wpa3的client毕竟还少,因此决定用树莓派作为wpa3 client,同时为了方便分析wpa3有关的supplicant和 kernel的代码流程,决定手动编译. 编译之前需要下载树莓派 ...

  6. Linux下手动编译shogun

    手动编译shogun,如果按照直接按照官网上的步骤进行,会踩非常多的坑,下面分享一下在下的编译过程,希望能为阁下提供些许借鉴. 1. git clone https://github.com/shog ...

  7. linux环境手动编译安装Nginx实践过程 附异常解决

    linux环境手动编译安装Nginx实践过程 附异常解决 参考文章: (1)linux环境手动编译安装Nginx实践过程 附异常解决 (2)https://www.cnblogs.com/david9 ...

  8. Linux上手动编译apache

    手动编译httpd(非yum安装),需要先安装apr和apr-util > **第一步:安装apr** 典型安装三部曲: ./configure make make install 安装apr的 ...

  9. Ubuntu linux 手动编译安装 Realtek 8852 无线网卡驱动 非常简单 添加Manjaro教程

    由于8852是刚出的支持wifi6的无线网卡,因此只有Windows驱动,而Linux 用只能自己编译驱动,好在不麻烦. 本驱动置只支持5.4及以上内核,请确认. 安装必要工具: sudo apt-g ...

最新文章

  1. 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )
  2. 天平称重【递归解法】
  3. hp-ux_UX中的格式塔-或-为什么设计师如此讨厌间距
  4. ad中电容用什么封装_二极管在电路中到底做什么用的
  5. WCF发布到IIS的配置步骤
  6. Azure Synapse Analytics简介第3部分:数据科学和商业智能
  7. java+2e10_CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)
  8. HNU实验五 小希与火车 基于神经网络的垃圾分类
  9. mysql 恢复root权限_Linux MySQL root权限恢复[图文]
  10. C/C++编程语言中操作目录及目录中文件的方法
  11. 【数字基带信号】基于matlab数字双相码仿真【含Matlab源码 989期】
  12. 数学建模【三款超实用建模小软件!】
  13. 三大开源bi工具_不用无限手套,人人都能开发 BI 系统------开源BI软件,可集成的BI工具...
  14. 海思3516dv300之bmi160/LSM6DS3驱动总结
  15. 程序员如何在工作之外获得收入
  16. 转:读“DataBase Sharding at Netlog”,看DataBase Scale Out
  17. likeshop单商户SAAS商城系统无限多开
  18. android usb 读写权限,Android默认给予USB读写权限,去掉受权对话框
  19. 软件项目管理中的需求管理要以用户为中心
  20. 还在为阅读量苦恼么?文章提升10倍曝光的写作技巧

热门文章

  1. Tomcat9版本不支持jsp处理PUT,DELETE之外的请求的解决方案(405方法不允许)
  2. python使用redis做缓存_python实现类redis缓存
  3. vm 虚拟机 删除 权限_虚拟机win7一键傻瓜式安装
  4. python线程暂停_python3线程启动与停止
  5. VTK图形模型主要对象
  6. [CF1107E]Vasya and Binary String【区间DP】
  7. java step1:基础知识1
  8. VC----SDK下对窗口非客户区的操作
  9. XML Schema 配置文件自动生成c#类设计案例子
  10. freebasic 编译linux,FreeBasic库文件入门 [SJ ZERO原创,沧海冷心翻译]