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:由于博主只是想在本地的

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

  1. 龙芯linux内核,龙芯的linux kernel,内核开发与编译

    在很久很久以前,linux被视为geek极客的玩具.自行升级Linux内核,对普通用户来说,简直是天方夜谭.曾经的曾经,升级内核需要很多纷繁复杂的步骤,也需要花费很多的时间.但是,现在不一样了.内核的 ...

  2. 解决ubuntu更改Linux内核(或更新系统)后扩展屏(第二显示器)无法正常显示问题)

    解决ubuntu更改Linux内核(或更新系统)后扩展屏(第二显示器)无法正常显示问题 我的解决方案 一定先看这个(很重要) 直接看这个就可以 前几天更新了一下ubuntu系统,一切正常,但是当我把系 ...

  3. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  4. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

  5. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  6. linux内核编译选项ccl,嵌入式Linux学习笔记(一)

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  7. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  8. 搭建《深入Linux内核架构》的Linux环境

    搭建<深入Linux内核架构>的Linux环境 阅读目录(Content) 作者 软件 概述 正文 一.安装GCC 二.编译Linux内核 三.制作跟文件系统 四.运行qemu 五.启动l ...

  9. 在win10查看本机linux的文件,Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件...

    原标题:Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件 来源:创事记 终于!在Windows里可以访问Linux文件了. 这表明,微软插入开源界的触角,越来越深入 ...

  10. linux内核 lts长期演进,Linux Kernel 4.19 将成为下一个LTS(长期支持)系列

    最近Linux内核开发人员和维护人员Greg Kroah-Hartman透露,Linux Kernel 4.19将下一个长期支持的Linux内核系列. 现在Linux Kernel 4.17已经达到使 ...

最新文章

  1. oracle spool用法
  2. SAP WM 针对采购订单收货时候不能自动获取物料主数据里的Special Movement Indicator?
  3. [Swift]LeetCode218. 天际线问题 | The Skyline Problem
  4. java正则 链接_Java正则表达式获取网址和链接文字解析
  5. php+字符串去掉反斜杠,PHP如何去掉反斜杠?
  6. django filter查询多选_Django:使用filter的pk进行多值查询操作
  7. android开启前台服务_如何在PC端一次性开启Tasker的所有权限和服务
  8. PostgreSQL Huge Page 使用建议 - 大内存主机、实例注意
  9. struts2遍历select
  10. docker server 容器连接sql_docker 容器连接 host的sql server失败
  11. 网易有道上市首日股价跌26% 市值达14亿美元
  12. 爬虫爬取文件(图片,视频)
  13. matlab画平面风羽图(彩色)
  14. mysqli mysql assoc,mysqli中的mysql_fetch_assoc?
  15. Win10右下角小图标怎么叠起来?
  16. 手游冷知识丨为什么绝大多数手游不开放自由交易系统?
  17. latex中lstlisting使用
  18. 2020春季《形势与政策》各章节测试答案
  19. 重磅!图灵奖,公布!
  20. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之①搭建场景

热门文章

  1. andpods授权码订单号分享_微信OAuth2授权登录
  2. python双素数_python双素数_用Python打印100以下的所有双素数对
  3. C++ 判断元音/辅音
  4. 熵权法 —— python
  5. 山东大学 2020级数据库系统 实验四
  6. 我的世界服务器虚拟菜单插件,《我的世界》服务器快捷菜单插件怎么用?
  7. 印刷 计算机控制系统,陶瓷印刷计算机直接制版控制系统设计与实现
  8. java 代码锁_Java中的Lock锁
  9. python java web前端 net 移动开发_JavaScript超越了Java,c,python等等成为Stack Overflow上最热门的...
  10. opencv Mat push_back