linux 内核编译不能打字,linux系统升级后,手动编译的kernel无法启动问题
linux系統(tǒng)升級后,手動編譯的kernel無法啟動問題
linux系統(tǒng)升級后,手動編譯的kernel無法啟動問題
做開發(fā)相關,需要編譯3.18的kernel,x86_64的,但是我的deepin升級v20之后,編譯的kernel就無法啟動了,引導不了,直接重啟。
解決辦法在最后
啟動打印如下,然后重啟
early console in decompress_kernel
Decompressing Linux... Parsing ELF...
因為重啟很快,打印很快閃過,添加啟動參數(shù),需要將earlyprintk打印到串口記錄下來。
APPEND root=/dev/sda1 rw earlyprintk=ttyS0,115200
grep kernel代碼,加了一點打印,發(fā)現(xiàn)內核解壓完之后,在將程序段復制到內存時失敗,memcpy階段重啟了。
還看了下編譯過程,但也就限于了解下是如何編譯的。
使用readelf分析了下各個文件的信息,和之前可以啟動的相比,arch/x86/boot/comprssed/vmlinux.bin程序段個數(shù)不一樣多。
能力有限,就只能分析到這里了。
因為系統(tǒng)升級前可以,所以問題肯定出在一些軟件包,庫等更新了,導致編譯的東西有問題,但是無法定位哪個軟件包有問題。
懷疑對象:ld,objcopy,nm等
編譯了master上最新的kernel,啟動正常,所以懷疑是kernel是后面修復了這個問題的。
主要懷疑的代碼為:arch/x86/boot目錄里面的代碼
幾經(jīng)曲折,終于發(fā)現(xiàn)一個可疑點:
啟動失敗就是在這個函數(shù),標識位置為最新kernel上有的。
合并到我的kernel里面后,系統(tǒng)果然卡在這個位置里面,可見是對齊問題。
然后查看kernel開發(fā)日志,找出patch
查找修改這個文件的日志,可以很快找到那次日志
提交日志
從提交記錄可以知道,當binutils軟件包升級到2.31后,為了減少x86-64可執(zhí)行文件和共享對象的大小,最大頁面大小從2MB減少到4KB。但是x86-64內核必須對齊到2MB,所以出了問題。
修改辦法為,添加編譯參數(shù),強制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系統(tǒng)升級后,手動編譯的kernel無法啟動問題相關教程
Linux郵件服務器搭建實驗
Linux郵件服務器搭建實驗 Linux郵件服務器搭建實驗 本文重點在于后面的搭建過程,前面會簡單介紹郵件服務原理與工作流程,如果有什么錯誤或遺漏的地方,歡迎大家指正批評,謝謝。 電子郵件服務器是處理郵件交換的軟硬件設施的總稱,包括電子郵件程序、電子郵
Linux的crontab任務調度
Linux的crontab任務調度 目錄 任務調度概述 crontab任務調度的流程圖 crontab命令的基本語法 實戰(zhàn) 任務調度概述 任務調度,是指系統(tǒng)在某個時間執(zhí)行的特定的命令或程序。任務調度分類:1.系統(tǒng)工作:有些重要的工作必須周而復始地執(zhí)行。如病毒掃等。2.個別用戶工
(一)自己動手寫操作系統(tǒng)——環(huán)境搭建
(一)自己動手寫操作系統(tǒng)——環(huán)境搭建 (一)自己動手寫操作系統(tǒng)——環(huán)境搭建 環(huán)境:Mac OS 10.15.4 一、安裝NASM brew install nasm NASM全稱The Netwide Assembler,是一款基于80x86和x86-64平臺的匯編語言編譯程序 注:需要先安裝brew,使用的版本為:2.1
Linux下安裝 SkyWalking 分布式追蹤系統(tǒng)--完全無代碼入侵【落地
Linux下安裝 SkyWalking 分布式追蹤系統(tǒng)--完全無代碼入侵【落地】 Linux下安裝 SkyWalking 分布式追蹤系統(tǒng)--完全無代碼入侵【落地】 背景: 由于現(xiàn)系統(tǒng)拆分為了分布式系統(tǒng),對于線上查看錯誤日志有點費勁 方案: 部署搭建 SkyWalking的分布式追蹤系統(tǒng) 一、Sky
ROS啟動小海龜
ROS啟動小海龜 ROS啟動小海龜是檢驗自己的ROS系統(tǒng)以及UBANTU系統(tǒng)是否安裝完全的一個小進程,也是新手入門的試手工具。首先打開終端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簡單圖書管理系統(tǒng)
JAVA簡單圖書管理系統(tǒng) //建議采用不同的類來保存眾多方法 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賬號遠程可連接 防火墻開放端口 版本說明 環(huán)境:windows10 hyper Linux:centos 8.2 mysql:8.0.20 ps:由于博主只是想在本地的
總結
以上是生活随笔為你收集整理的linux 内核编译不能打字,linux系统升级后,手动编译的kernel无法启动问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net怎么实现按条件查询_【33
- 下一篇: vue 同级页面调用方法_【Vue】一个