编译Linux 2.6.34内核

这篇具有很好参考价值的文章主要介绍了编译Linux 2.6.34内核。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《Linux内核设计与实现(第三版)》中所用的内核版本为2.6.34,这个版本太旧了,在高版本系统中编译各种不支持,所以选了Ubuntu 14.04进行编译。

编译准备

编译环境:Ubuntu 14.04

GCC版本:4.8.4

编译的内核版本:Linux 2.6.34

内核源码下载:https://mirrors.edge.kernel.org/pub/linux/kernel/

编译过程

解压源码linux-2.6.34.tar.gz,进入源码目录执行以下命令:

# make mrproper

# make clean

# make config

# make > /dev/null

编译成功后,源码目录所用空间从443M增至4.9G。

上述命令包含三个阶段:

1)清理

make mrproper,该命令用于清除Linux内核源代码树中生成的文件,通常在编译内核时使用,以确保旧的编译产物被完全清除,以开始一个全新的编译过程,该命令会删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件,所以几乎只在第一次执行内核编译前才用这条命令。
make clean,该命令则是用于删除大多数的编译生成文件,但是会保留内核的配置文件.config,还有足够的编译支持来建立扩展模块。所以若只想删除前一次编译过程的残留数据,只需执行make clean命令。
make mrproper删除的范围比make clean大,实际上make mrproper在具体执行时第一步就是调用make clean。

2)配置

make config,该命令会逐一遍历所有配置项,要求用户选择yes、no或module,这是一种基于文本的传统配置方式,它会为内核支持的每一个特性向用户提问,如果用户输入“y”,则把该特性编译进内核,如果输入“m”,则把该特性变成以模块,如果输入为“n”,则表示不编译该特性,用户的配置选择结果会存入.config文件。

make config比较繁琐耗时,可以使用make menuconfig或GTK+图形界面下的make gconfig来进行配置选择。

还有两条与配置相关的命令:

make defconfig,生成默认配置。

make oldconfig,检查已有的.config文件和Kconfig文件的规则是否一致,如果一致就什么都不做,否则提示用户哪些源代码中有的选项在.config文件没有,让用户进行选择。Kconfig文件是源码中提供用来配置内核的文件,是各种配置界面(包括make config这样的文本方式)所需要的源文件,内核配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。当把一个老版本内核源码中已经配置好的.config文件拷贝到一个新版本源码文件夹中继续使用时,应该执行make oldconfig命令,因为新版本内核往往会增加配置项。

3)生成

make,生成内核映像和内核模块。

补充:

make bzImage,只生成内核映像。

make modules,只生成内核模块。

make -jn,开启n个并发编译作业,在多核环境中可以极大加快编译速度。

编译报错

1)报错提示:

gcc: error: elf_x86_64: No such file or directory
gcc: error: unrecognized command line option ‘-m’

解决方法:

这是由于gcc 4.6及以上不再支持linker-style架构,需要将arch/x86/vdso/Makefile中,以VDSO_LDFLAGS_vdso.lds开头所在行的“-m elf_x86_64”替换成“-m64”(注意不是-m 64),将VDSO_LDFLAGS_vdso32.lds开头所在行的“-m elf_i386”替换成“-m32”。

2)报错提示:

drivers/net/igbvf/igbvf.h:129:15: error: duplicate member ‘page’

解决方法:

这是因为高版本GCC对旧定义方式不支持所致,把相关结构体struct igbvf_buffer中最后一个struct page *page注释掉或删掉。

内核安装

# sudo make modules_install

# sudo make install

make modules_install是安装内核模块,安装目录为/lib/modules,这里会生成一个以内核版本号2.6.34命名的子目录,存放各个以.ko为后缀的模块文件。

make install是安装内核映像,安装目录为/boot,本次安装中这里被放入四个文件:vmlinuz-2.6.34,initrd.img-2.6.34,System.map-2.6.34,config-2.6.34

vmlinuz:内核映像文件。

initrd.img:initrd是initial ramdisk的简写,意为初始RAM磁盘,是在系统引导过程中挂载的一个临时根文件系统,initrd绑定到内核,并作为内核引导过程的一部分加载,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载真正的根文件系统,然后再将这个临时根文件系统卸载,继而释放内存。但在很多嵌入式系统中initrd就是最终的根文件系统。

System.map:这是一份用于调试内核的符号对照表,可以将内核符号和它们的起始地址对应起来,将内存地址翻译成容易理解的函数名及变量名。

config:从其内容来看,该文件记录了make config中对内核各个配置项的选择。

可以执行make modules_install install将内核模块和内核映像一并安装。

在执行make install时,如果/boot目录下已经存在相同版本的内核,已存在内核会被重命名为vmlinuz-x.x.xx.old。

有些教程中需要手动运行mkinitramfs命令以在/boot下创建initrd文件,但本次测试中运行make install后自动创建了initrd文件。

更新引导

执行命令:

# sudo update-grub

选择内核

方式一:

在系统启动时,按shift键进入GRUB菜单,选择"Advanced Options for Ubuntu",在新菜单页中选择指定版本的内核启动,如"Ubuntu, with Linux 2.6.34"。

方式二:

编辑文件/etc/default/grub,添加配置
GRUB_TIMEOUT_STYLE=menu
再执行update-grub命令更新GRUB配置,系统重启后会自动进入GRUB菜单,再选择指定版本的内核启动。
方式三
直接指定开机启动项,编辑文件/etc/default/grub,将配置GRUB_DEFAULT=0修改如下:
GRUB_DEFAULT="1>4"
其中,1表示在第一个菜单页中选择第2项,也即"Advanced Options for Ubuntu",4表示在第二个菜单页中选择第5项,也即"Ubuntu, with Linux 2.6.34"
再执行updage-grub命令更新GRUB配置,系统重启后会自动按照"1>4"依次选择相应的菜单项。

验证成功

选择2.6.34版本内核重启系统后,执行命令:

# uname -r

可以查看系统当前所用内核的版本。

 
 
 

 文章来源地址https://www.toymoban.com/news/detail-695061.html

 

 

 

 

到了这里,关于编译Linux 2.6.34内核的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译tiny4412 Linux 内核

    工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码,进入目录 将官方配置完好的defconfig文件作为配置文件 由于内核版本较低,需要下载低版本的gcc,选择下载gcc-9与g+±9 将gcc g++版本都切换为9 切换后可以通过 gcc -v 查看是否切换成功 进入Linux目录,执行make编译 出现错误 C

    2024年02月11日
    浏览(46)
  • Linux内核的编译、安装、调试

    Linux内核下载The Linux Kernel Archives 打开 .config 更改 CONFIG_SYSTEM_TRUSTED_KEYS 和 CONFIG_SYSTEM_REVOCATION_KEYS 更改 CONFIG_DEBUG_INFO_BTF 注释掉CONFIG_X86_X32 首先安装模块 这里加上 INSTALL_MOD_STRIP=1 是为了避免内核启动时卡在 loading initial ramdisk 安装内核 更改引导 更改 grub 修改文件 更新 重启 在

    2024年02月11日
    浏览(47)
  • ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核

    编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程:在线视频与配套资料》里面可以下载到),还有参考 菜

    2024年02月04日
    浏览(54)
  • ARM Linux 内核的配置和编译原理

    1、源码从哪里来 (1) 之前讲过,我们使用 2.6.35.7 版本的内核。 这个版本的内核有三种: 第一种,是 kernel.org 上的官方版本; 第二种,是三星移植过的; 第三种,是九鼎 X210 的移植版本。 我们讲课时使用第三种内核来讲解,后面的移植实验使用第二种内核来移植。 (2) 源码

    2024年02月09日
    浏览(51)
  • 【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)

    编译驱动一般采用的是将驱动编译成模块(.ko 文件),然后加载到内核,这其中就用到了 make modules 命令。 目录 一、单模块编译 1、一个 c 文件编译成一个 ko 文件 2、多个文件编译成一个 ko 文件 二、多模块编译(多文件多模块) 下面是最简易的单文件单模块编译,假设我们

    2024年02月10日
    浏览(65)
  • Linux 编译内核模块出现--Unknown symbol mcount

    Linux suse: 在编译SUSE Linux Enterprise Server 12 SP时,使用低版本的docker镜像编译内核模块时,加载内核模块时出现: 加载内核模块时: (1) 指示系统可能受到 Spectre V2 漏洞的影响,并且正在加载的模块没有使用 retpoline 编译器进行编译。 Spectre V2(CVE-2017-5715)是 Spectre 漏洞家族

    2024年02月11日
    浏览(60)
  • 【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

    1.ubuntu18.04镜像下载 打开ubuntu18.04镜像传送门,进入到主页 往下滑,找到相应镜像并下载 等待镜像下载完毕即可 2.VMware软件安装 VMware是一款 运行在windows系统上的虚拟机软件 ,可以虚拟出一台计算机硬件,方便安装各类操作系统 进入VMware官网传送门,来到主页,往下滑,选

    2024年04月29日
    浏览(57)
  • Linux驱动实践:带你一步一步编译内核驱动程序

    记得以前我在开始学习驱动开发的时候,找来很多文章、资料来学习,但是总是觉得缺少了点全局视角。 就好像:我想看清一座山的全貌,但总是被困在一个、又一个山谷中一样。 主要的困惑有 3 点: 每一篇文章的介绍都是正确的,但是如果把很多文章放在一起看,就会

    2023年04月24日
    浏览(52)
  • 【Xilinx】开发环境(五)- 基于Petalinux配置,单独编译uboot,Linux内核

    此系列博客,仅对Xilinx平台PS端(ARM部分)开发做介绍,不对PL(FPGA)做过多介绍。 目录 一. 单独编译UBoot 2.1.拷贝源码 2.拷贝配置文件 3.编译 二. 单独编译内核源码 2.1 复制内核源码 2.2 复制配置文件( 根据芯片,32位复制到arch/arm/configs, 64位到arch/arm64/configs) 2.3 复制.its文件,用

    2024年02月10日
    浏览(56)
  • 【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    在Makefile中,变量的赋值可以使用以下几种方式: = :最基本的赋值符号,表示简单的延迟展开(lazy expansion)方式。变量的值将会在使用变量的时候进行展开。 := :立即展开(immediate expansion)的赋值方式。变量的值在赋值的时候立即展开,并且在后续的使用中不再改变。

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包