学习笔记之Linux内核编译过程
准备工作
- 物理主机:win8(32位)
- 虚拟机工具:VirtualBox_4.3.16_Win32
- 虚拟主机:xubuntu-12.04.4
- 安装virtualBox功能增强包
- 设置好虚拟机与主机的共享文件夹
- 进入内核所在文件夹并解压,由于内核代码一般安装在/usr/src下,因此将内核代码解压到/usr/src下
配置内核
2.1 查看gcc信息
- 在配置内核之前查看系统是否已安装gcc
2.2 使用make gconfig进行配置
2.2.1 错误1
- 然而使用这个配置模式,出现了错误:
- 错误提示,缺少所需的包,需要安装gtk+- 2.0:
sudo apt-get install gnome-devel gnome-devel-docs 一条语句可以完成我们需要的所有的glib,gtk,帮助手册等资源
- 但是,安装之后还是出现之前的错误。在这个配置模式下不停做了修正之后,还是不能配置成功,于是我决定使用默认的配置方式对内核进行配置
2.2.2 删除make gconfig产生文件
- 在这之前,需要删除之前配置产生的垃圾文件
2.3 使用make defconfig配置
- 然后用默认的方式进行配置
编译内核
- 完成默认配置后,就可以使用make命令进行编译
3.1 错误1:PATH_MAX未声明
3.1.1 错误描述
PATH_MAX未声明(在此函数内第一次使用)
3.1.2 解决方法
发现PATH_MAX在limits.h中定义,在/scripts/mod/sumversion.c中添加#include <limits.h>即可[1]
错误2:gcc:错误
3.2.1 错误描述
elf_i386: 没有那个文件或目录
很明显这是一个gcc引起的错误,之前查看过本机中gcc的版本,为4.6.3,而gcc 4.6 不再支持 linker-style 架构
3.2.2 解决方案
将 arch/x86/i386/kernel/Makefile 中,-m elf_i386 改为 –m32
参考[2]
错误3
3.3.1 错误描述
mutex.c undefined reference to '_ _mutex_lock_slowpath
mutex.c undefined reference to '—mutex_unlock_slowpath
3.3.2 解决方案1
很明显,提示是有两个变量的定义找不到,先进入muex.c中进行查看
从代码中看出这两个变量是定义了的,但编译提示找不到,可能是有一些宏定义没有打开导致的。
查看代码,CONFIG_DEGUG_MUTEXES控制了_ _mutex_lock_slowpath
和_ _mutex_unlock_slowpath的定义
从CONFIG_DEBUG_MUTEXES这个名字可以猜测,该宏定义是跟配置相关的,由于在配置的时候,选择的是默认的配置方式,因此配置方式可能造成了这个问题的产生。
接下来在config文件中查看CONFIG_DEBUG_MUTEXES
可以看到没有CONFIG_DEBUG_MUTEXS的定义
在.config文件中添加CONFIG_DEBUG_MUTEXS的定义
如果直接编译,还是会出现之前的错误,原因是配置文件虽然更改了,但没有进行更新,应该使用make oldconfig 进行重新配置
3.3.3 解决方案2
然而这样还是没有解决这个问题,在网上搜索,有一种说法是:
可能原因是编译器版本与内核版本匹配度的问题。
安装gcc4.4
安装成功后系统中有两个版本的gcc
设置gcc4.4为系统默认版本
设置完成后,重新进入内核所在文件,使用make进行编译
编译后结果如下:
3.4 说明
由于在配置的时候使用的是默认的配置,因此在解决了上述问题之后,编译内核的时间并不是很长,只有约5min
安装内核
4.1 安装内核模块
使用命令:make modules_install安装内核模块
4.2 安装内核
然后使用make install安装内核
此时,内核已经编译完毕。
修改启动程序配置,运行新的内核
先将生成的bzImage文件和System.map文件拷贝到/boot/目录下,命令如下:
cp /usr/src/linux-2.6.18/arch/x86/boot/bzImage /boot/
cp /usr/src/linux-2.6.18/System.map /boot/
然而输入该命令后,出现了以下错误。即在/usr/src/linux-2.6.18/arch/x86/boot/这个目录下没有bzImage文件
通过查找,在i386/boot下找到了bzImage文件
重新拷贝bzImage
拷贝System.map
5.1 建立镜像文件
在终端输入命令:
mkinitramfs 3.12.6 -o /boot/initrd/img-3.12.6
来建立镜像文件
这里有错误,改正后如下
5.2 更新修改系统引导配置
然后输入命令:
update-initramfs -c -k 2.6.18
再输入命令:
update-grub2
更新修改系统引导配置。
查看grub.cfg中的配置信息
如查看到以下信息,则我们编译的内核已经添加到启动项中了
5.3 重启验证
命令:/sbin/reboot
由于我用的linux是安装在虚拟机中的,因此重启后会直接进入登陆界面,而跳过了grub界面。
解决方法是在虚拟机开机时,一直按住shift键, 参考[5]
可以看到,Previous Linux version下面包含了我们的2.6.·8版本,选择该菜单后,得到下面的界面
说明linux-2.6.18已经成功安装并可以启动
5.4 说明
可以看到,内核已经成功编译并安装到了系统中,但是在grub界面选择从2.6.18版本启动时,系统没有跑起来。在配置内核时,使用make defconfig的方式实际上,按照默认的配置文件arch/i386/defconfig对内核进行配置,生成.config可以用作初始化配置,然后再使用make menuconfig进行定制化配置。也就是说,默认配置只是做了一些初始化的配置,硬件所配置的选项很多都是没有启动的,因此系统不能成功。
由于使用make menuconfig配置的操作步骤与defconfig类似,此次报告中就不再对更改过后的配置过程进行赘述了。
参考资料
[1] 编译错误提示PATH_MAX未声明
http://blog.csdn.net/armeasy/article/details/6217522
[2] 编译linux内核并安装
http://blog.sina.com.cn/s/blog_7e49bf5e0100y4sr.html
[3] 编译linux内核问题
[4] 编译linux-2.6.18内核出错
[5] linux 在虚拟机中开机启动时如何进入grub界面?
[6] 各种配置详解
http://www.51testing.com/html/38/225738-237838.html
学习笔记之Linux内核编译过程的更多相关文章
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...
- Linux内核学习笔记2——Linux内核源码结构
一 内核组成部分 内核是一个操作系统的核心,主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络结构,进程间通信. 1.进程调度(SCHED) 控制进程对CPU的访问.当需要选择下一个进程运行时 ...
- Linux内核编译与安装
2013-04-16 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...
- Linux 内核 编译模块
背景: 由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中. 所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载. 概览: Linux内核模块的编译方法有两种: 1. ...
- Linux内核编译完整过程
Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...
- 嵌入式入门学习笔记3:[转]编译linux
摘自:https://blog.csdn.net/baidu_24256693/article/details/80115354 编译Linux是什么意思? Linux内核是Linux操作系统的核心, ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...
- Linux内核启动过程概述
版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...
随机推荐
- 套题T3
秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 量化生产力Quantifying Productivity
I'm always on a lookout for interesting datasets to collect, analyze and interpret. And what better ...
- OpenGL图形管线和坐标变换[转]
1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比 ...
- asp.net TreeView与XML配合使用v1.1
刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...
- NuGet学习笔记
NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 NuGet学习笔记(3)——搭建属于自己的NuGet服务器
- OEM status|start|stop
OEM一旦建立以后,LINUX的主机名(hosts)就不要去改变. [oracle@redhat4 ~]$ emctl start dbconsoleOC4J Configuration issue. ...
- [Codeforces137B]Permutation(贪心?思路?,水题)
题目链接:http://codeforces.com/contest/137/problem/B 给n个数字,要求修改成1~n的全排列数中的一个,修改的次数尽可能少,问最少需要修改几个数. 记下数组里 ...
- Web内容管理系统 Magnolia 介绍-挖掘优良的架构(1)
Magnolia简介: Magnolia CMS是一家瑞士公司自2003年起发布的一个基于Java的开源内容管理系统.它适合且已被使用在以下领域:电子商务(例如:COOP.Migros.Rossman ...
- poj 2777 Count Color(线段树 区间更新)
题目:http://poj.org/problem?id=2777 区间更新,比点更新多一点内容, 详见注释, 参考了一下别人的博客.... 参考博客:http://www.2cto.com/kf/ ...
- bzoj2584
这是bzoj上AC的第700题,一定要是一道神题!!! 当初分组赛的时候讲过拖到现在才写…… 我们考虑把垂直方向移动和水平方向移动分开来考虑,不合法的轮数取二者最小 假设考虑的是垂直方向移动,障碍其实 ...