走向Linux系统高手之路 内核编译过程解析

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

下载源代码

Linux内核总是不断发展的,最新的内核Kernel2.6.0对USB2.0予以正式的支持,以及内核模块文件后缀最显著的一个变化由*.o到*.ko等等,我们可以从www.kernel.org下载到tarball的源代码包。

前期准备

大家都知道的要先升级“module-init-tools“软件包,否则的话,等你安装内核模块文件的时候,系统会提示你:Warning: you may need to install module-init-tools See http://www.codemonkey.org.uk/post-h...4.21-23.src.rpm

进入下载目录下并安装:

  #rpm -e --nodeps modutils (强行卸载原有的modutilsRPM包)  #rpm -ivh modutils-2.4.21-23.src.rpm (把源代码包安装到了    /usr/src/redhat目录下)  #cd /usr/src/redhat/SPECS (进入规范文件目录下)  #rpmbuild --bb modutils.spec (生成二进制的RPM包)  #cd ../RPMS/i386 (转入刚生成的二进制的RPM包所在位置)  #rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpm    与modutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包,一起安装吧!)
 

因为是在RedHat9.0的平台,RedHat的用户可能还会遇到一些麻烦,我会慢慢说的,除了要以上的升级之外,还有个文件(/etc/rc.d/rc.sysinit)可能有缺陷,因为/proc/ksyms文件在新内核(Kernel2.6.0)中已经没有了,打开文件命令如下:

  #vi /etc/rc.d/rc.sysinit  找到:  if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null    && [ -f /proc/ksyms ]; then  USEMODULES=y  fi  替换成:  if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then  USEMODULES=y  fi
 

也就是把“&& [ -f /proc/ksyms ]”去掉,保存文件(操作之前最好做备份以免删错,这个文件是系统初始脚本,重要的很),这样子内核才能加载模块,当然能启动iptable防火墙了,否则防火墙在新内核中启动时红色的“failed“非常醒目。(请在新内核中核查/proc/sys/kernel/modprobe中的内容是不是: /sbin/modprobe,也可手工注入指令:#echo "/sbin/modprobe" > /proc/sys/kernel/modprobe)。下面开始构造新内核。

一、准备源代码

1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令:

#cp linux-2.6.0.tar.gz /usr/src

2、转到/usr/src目录并解开tarball包。

  #cd /usr/src  #tar xvzf linux-2.6.0.tar.gz
 

3、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1。

二、定制内核

定制内核是门很大的学问,需要大量的硬件知识,特别是2.6.0的内核,如果你从 2.4.N配置文件装载进去的,的确,很多人遇到过麻烦。我是重新配置文件(X窗口服务器进行),配制内核之前请清理源代码树,如果还没有进入 /usr/src/linux-2.6.0目录,请进入此目录,命令如下:

  #make mrproper (刚解开的tarball包不需此步骤)  #make gconfig (需要Gtk开发库的支持)  或make config  或make xconfig(需要Qt开发库的支持)
 

注意:如果你是ext3文件系统,则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核,否则,等你启用新内核时机器就会当掉,出错信息如下:kernel panic : no init found ,try passing init = option to kernel......或者是:kernel panic:VFS:Unable to mount root fs on unknown-block(0,0),我一开始不知道,编译了好几次,系统总给我冷板凳坐,最后把对Ext3、Ext2文件系统的支持直接编译进内核,才解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下无法卸载内核模块(rmmod命令不能用)。

三、编译内核及模块

定制好的内核配置文件(/usr/src/linux- 2.6.0/.config)之后,激动的时刻到来了,编译内核及模块,#make (此命令已完成make bzImage及make modules的工作),bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同,我是Intel的 CPU。

注意:我在RedHat7.2平台时曾出现无法编译的出错信息,出错信息如下:

  /tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin'  make[1]: *** [usr/initramfs_data.o] Error 1  make: *** [usr] Error 2,
 

重新装了个9.0的才解决此问题。说明:make命令在我的1.6GHz,128MB的机器上跑了足足27分钟。

四、安装模块及内核文件

#make modules_install install

以上这个命令可以分解成make modules_install与make install,make modules_install安装内核模块到/lib/modules/2.6.0下。make install完成mkinitrd命令及内核(bzImage)和System.map的拷贝,请查看/boot目录,文件名是有区别的,如是GRUB 引导器,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。

说明:make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒,很快的哦。

五、后记

最后的工作就是重启系统(#shutdown -r now),检验一下你的劳动成果吧。差点忘了还有一点,可能对你很重要,进入新内核之后我发现rpm命令不能用了,原来这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:

  #vi /etc/profile (在文件的末尾加上几句如下)  if [`uname -r`="2.6.0" ];then  export LD_ASSUME_KERNEL=2.2.5 fi
 

也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。

使用新内核可能出现的问题及对策:

1、新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了)。

2、新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module- init-tools软件包(我是modutils-2.4.21- 23.src.rpm包),RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件。

3、RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。
 

linux内核的配置机制及其编译过程 linux内核的配置机制及其编译过程。 一、配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是:    1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核编译规则;     2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;     3、配置工具:包括配置命令解释器(对 阅读详情

相关推荐

深度解析linux内核模块编译makefile

可以看到,这里并没有输入hello.c源文件,熟悉makefile的人应该知道,这得益于makefile的自动推导功能,需要编译生成filename.o文件而没有显示地指定filename.c文件位置时,make查找filename.c是否存在,如果存在就正常编译,如果不存在,则报错。在开发linux内核驱动时,免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆,做一些简单的修改就能用到自己的项目上,但是,对于这些基础的东西,更应该做到知其然并知其所以然。

m0_74282605的博客 2222

[OS] 编译 Linux 内核

这些工具的安装是内核编译的基础,因为内核编译涉及到大量复杂的配置和依赖,少了其中任何一个都会导致编译失败。在进行内核模块的加载和测试时,我们还需要构建内核对象。在重启过程中,你需要在引导菜单中选择新编译内核版本,以确保加载我们新加入的 Kthreads 模块。内核源代码较大,编译过程需要大量的磁盘空间,建议将源代码移动到有足够空间的目录下再继续编译。这个步骤的目的是使用现有内核的配置,确保我们在编译过程中不会遗漏关键的选项。在构建内核对象之后,我们需要将其插入内核进行测试,并在不需要时将其移除。

m0_74331272的博客 1913

Linux内核学习之编译

Linux内核学习之编译Linux内核发展至今,文件数已经超过5万,代码量相当巨大。这一方面是内核功能不断增强补充的原因,另一方面当然是Linux的兼容性考虑,导致整个工程非常浩荡,而且很多文件名都一样,处于不同目录而已,这样一来,读者在学习阅读时就容易困惑,到底那个文件才是我需要的呢?这就涉及到本篇要谈到的问题。当然本文不只是告诉你怎么找文件,更主要是谈谈编译方面。

w35995的专栏 3844

走向Linux系统高手之路 编译内核解析

下载源代码 Linux内核总是不断发展的,最新的内核Kernel2.6.0对USB2.0予以正式的支持,以及内核模块文件后缀最显著的一个变化由*.o到*.ko等等,我们可以从www.kernel.org下载到tarball的源代码包。 前期准备 大家都知道的要先升级“module-init-tools“软件包,否则的话,等你安装内核模块文件的时候,系统会提示你:Warning: you

menuconfig的专栏 911

解决Unable to find the module utility `modprobe`错误

安装NVIDIA显卡驱动时出现以下错误: [INFO]: ERROR: Unable to find the module utility `modprobe`; please make sure you have the package 'module-init-tools' or 'kmod' installed. If you do have 'module-init-tools' or ...

sunmingyang1987的博客 1万+

升级cuda9.0 到cuda10  报错 Unable to find the module utility `modprobe`

在容器里 升级cuda9.0 到cuda10 ,尝试新的训练环境,先卸载9后,安装10的相关驱动 报如下错 [INFO]: ERROR: Unable to find the module utility `modprobe`; please make sure you have the package 'module-init-tools' or 'kmod' installed. If y...

roxxo的博客 5552

linux g++ 编译问题】

项目场景: 在代码移植的时候遇到问题,编译的时候出现gcc 卡死,最后报错的问题,具体报错如下 问题描述 {standard input}:2397706: Error: unknown pseudo-op: `.uleb12 g++: internal compiler error: 已杀死 (program cc1plus) 原因分析: 网上查了很多,有说编译器版本不匹配的,后面看到一个帖子写的内存不足引起的,试着扩内存后编译通过 解决方案: 增加编译机器内存解决 ...

software4y的博客 1295

Error: unknown pseudo-op: `.arch_extension'

你好!这里是风筝的博客, 欢迎和我一起交流。 在编译u-boot时发现一个error: arch/arm/cpu/armv7/nonsec_virt.S: Assembler messages: arch/arm/cpu/armv7/nonsec_virt.S:15: Error: unknown pseudo-op: `.arch_extension' arch/arm/cpu...

风筝 6922

Linux内核开发_1_编译LInux内核

1. 准备工作 1.1 学习环境 本系列教程使用的环境如下: 操作系统版本: Linux ubuntu 18.04 Linux内核版本: cat /proc/version Linux version 4.15.0-20-generic (buildd@lgw01-amd64-039)\ (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 ...

17岁boy的博客 9142

非常好的Linux编译内核详解 - -

转载: http://blog.chinaunix.net/uid-263488-id-2138150.html非常好的Linux编译内核详解 - -一、内核简介   内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。   Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分...

zhenguo26的博客 4万+

linux内核makefile编译生成内核目标文件的过程,Linux内核编译过程

1内核编译过程学习Linux内核除了必备的基础知识、搭建Linux环境、下载内核源码和准备相关资源之外,第一件要做的事情应该就是编译自己的Linux内核,然后运行编译出来的内核内核从配置,到编译,再到安装的命令非常简单,只要按顺序执行下面几个命令就可完成:1.内核配置:make menuconfig2.内核编译:make3.安装模块:make modules_install4.安装内核:mak...

weixin_39809140的博客 2040

Linux 内核编译步骤及配置详解

linux 系统体系结构: linux kernel体系结构: arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RING0级别最高, 这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了 充分的保护 用户空间(用户模式)转到内核空间(系统模式)方法: ·系统调用 ·硬件中断 linux kernel 体系结构: 虚拟文件系统VFS: VFS(虚拟文件系统)隐藏各种文件系统的具体细节,为文件操作提供统一的接口 二.Linux内核

u010783226的专栏 5774

linux 内核 编译过程

作为一个linux的驱动工程师,总想在简历上写上"熟悉uboot/内核启动流程",可惜万一面试官问道,菜鸟我的实力还不足以应付面试。因此需要把内核启动流程仔细研究一下。 uboot的启动过程这里不多说了,根据uboot的bootm执行过程可以知道,uboot在执行了 theKernel (0, machid, bd->bi_boot_params); 就把剩下的任务交给了kernel。ker

linchuanzhi_886的专栏 2225

linux内核编译和移植过程

一、linux内核的特点 1、linux内核是开源的, 作者:linus git : 版本管理工具 源码由C语言和汇编实现 2、linux内核支持多种硬件架构平台 3、linux内核采用模块化方式编写,分层思想 4、linux内核使用C和汇编代码实现, 在内核中最好不要使用C++ 5、linux内核具有很好的移植和裁剪特性 通过图形化界面的配置方式就可以完成裁剪 二、linux内核源码的获取 1、linux官方获取 https://mirrors.edge.kernel.org/pub/linux/kern

q1449660223的博客 1591

配置并交叉编译树莓派linux内核

windows系统linux系统启动过程 windows启动过程: 1.启动电源,BOIS启动windows,windows识别C盘,C盘运行APP. linux启动过程: 1.启动电源,bootloader启动linux内核linux内核识别根文件系统,根文件系统运行APP。 linux源码目录树 ...

qq_55299368的博客 2372

Linux内核启动过程

终于找到一篇文章明白了内核启动过程,记录分享一下,若有侵权则删。 原文链接:http://www.0511zz.com/html/sheji/jc/2018/0815/149280.html 嵌入式linux内核的启动全过程主要分为三个阶段。第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式、使能MMU、设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作,下面是详细介绍。   一、Linux内核自解压过程   在linux内核启动过程中一般能看到图1内核自解压界面,

zd454909951的博客 2952

Beaglebone Black——嵌入式linux系统内核编译

首先是内核源码的来源,首推的当然是

zy812248258的专栏 9444

老司机带你探索内核编译系统--kbuild

Linux内核编译系统kbuild剖析

RichardYSteven的专栏 4756
上一篇: Linux操作系统上进行自动备份的方法步骤
下一篇: 嵌入式系统编程中的代码优化
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值