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

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

下载源代码

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

相关推荐

Linux内核学习之编译

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

w35995的专栏 3844

[OS] 编译 Linux 内核

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

m0_74331272的博客 1913

[kernel]linux内核基础: 版本、源码、编译与调试

linux kernel 安全基础

Breeze的博客 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

解决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万+

linux g++ 编译问题】

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

software4y的博客 1296

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

ubuntu上docker中使用cuda

1. 默认主机上已经安装好cuda cuda安装 2. 安装docker docker安装 上面都可自行百度 3. 设置 repository 和 GPG key $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - $ curl -s -L https://nvidia.githu

DYF的博客 2566

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

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

听说读写 686

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的博客 9143

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

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

zhenguo26的博客 4万+

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

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

u010783226的专栏 5774

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

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

zy812248258的专栏 9444

Linux内核编译总结

不写成<name>-m语义分层m是 “模块编译开关”(obj-m),objs是 “模块组成文件列表”,二者职责不同,不能混用;可读性objs(目标文件)比m(模块)更能体现 “组成定义” 的本质;解析逻辑:Kbuild 固定解析作为组成定义,不识别<name>-m;无歧义性:避免m既表示 “开关” 又表示 “组成”,符合 Kbuild 的设计惯例。

weixin_57340941的博客 1083

Linux内核编译出来的Image文件解析

一、介绍Linux内核提供了一个用户界面,使我们能够与操作系统进行交互,处理进程管理、内存管理、设备驱动程序和系统安全等任务。在某些情况下,我们需要生成和构造自定义内核镜像,当我们编译自定义内核时,可以将其生成为以下内核镜像之一:vmlinux,.bin,和。内核镜像是包含内核代码和其他组件的二进制表示形式的文件。内核镜像格式因压缩、体系结构和特定用例而异。二、创建image镜像文件在Linux中,通常使用工具如dd或cpio来创建镜像文件。

sinat_31608641的博客 1461

解锁Linux内核编译:打造专属系统的密钥

Kconfig 是 Linux 内核配置系统的核心机制,它就像是一本详细的配置指南,在配置内核功能时发挥着举足轻重的作用。分布在各目录下的 Kconfig 共同构成了一个分布式的内核配置数据库,每个 Kconfig 都详细描述了所属目录源文件相关的内核配置菜单。当我们执行make menuconfig(或其他配置命令)时,系统会从 Kconfig 中读取配置菜单信息,然后将这些信息展示给用户,用户根据自己的需求进行配置后,配置结果会保存到顶层目录下的.config文件中。

大雨淅淅的博客 717

Linux 内核编译,打包

分别是:.config,bzImage,System.map 和系统/lib/modules/linux-3.12.5目录。查看自己安装过的内核版本,在里面我们可以找到对应的headers与image。(可以参考arch/arm64/boot/install.sh安装脚本)配置内核,如果没什么需求就直接save,然后exit。执行完成之后,在源码目录的上层会生成3个文件。使用当前系统的.config文件作为模板。中间可以加入自己需要的源码补丁。设置环境变量,加入工具链存放的路径。判断工具链加入是否正常。

chi's blog 1035

Linux系统镜像构建(2):linux内核编译与烧录

芬兰人Linus最早开发,是类Unix系统,但不是Unix,实现了Unix的API(具体实现和Unix可能不同)而Linux使用GPLv2开源协议。

lishing6的博客 1525
上一篇: Linux下的硬件驱动——USB设备(下)
下一篇: 如何成为一个Linux系统内核开发者
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值