zoukankan      html  css  js  c++  java
  • 学习笔记之Linux内核编译过程

    1. 准备工作

    • 物理主机:win8(32位)
    • 虚拟机工具:VirtualBox_4.3.16_Win32
    • 虚拟主机:xubuntu-12.04.4
    • 安装virtualBox功能增强包

    • 设置好虚拟机与主机的共享文件夹
    • 进入内核所在文件夹并解压,由于内核代码一般安装在/usr/src下,因此将内核代码解压到/usr/src下

    1. 配置内核

    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配置

    • 然后用默认的方式进行配置

    1. 编译内核

    • 完成默认配置后,就可以使用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]

    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]

    1. 错误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

    1. 安装内核

    4.1 安装内核模块

    使用命令:make modules_install安装内核模块

    4.2 安装内核

    然后使用make install安装内核

    此时,内核已经编译完毕。

    1. 修改启动程序配置,运行新的内核

    先将生成的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. 参考资料

    [1] 编译错误提示PATH_MAX未声明

    http://blog.csdn.net/armeasy/article/details/6217522

    [2] 编译linux内核并安装

    http://blog.sina.com.cn/s/blog_7e49bf5e0100y4sr.html

    [3] 编译linux内核问题

    http://zhidao.baidu.com/link?url=EfW44_9U4Rq8uLVa_7SqSz_a7rLV-eUf_-7Apzj5_m1JaFrXs5vs_NNxOg3EFqDCliriarf6OxI8Uzbm7FdKZa

    [4] 编译linux-2.6.18内核出错

    http://zhidao.baidu.com/link?url=lcqy4WFKHaMO66gCsh_0dPeHifyRREp2xqtDFflYJA9hmFlOci8GzA5raFJKGSdMKgyDuSTq9oioSmpthEN6-GTQuaH3O-5SC9SKzbyfrbq

    [5] linux 在虚拟机中开机启动时如何进入grub界面?

    http://zhidao.baidu.com/link?url=ZzTYvaBoiVuOBJKsjWe6aOeWe1-iy_Uf9fQBmsJI7VogsMP8nA1fxMB8THNeKl4IoyoTB8UlaFgt5HndxSmGJq

    [6] 各种配置详解

    http://www.51testing.com/html/38/225738-237838.html

  • 相关阅读:
    iOS 3DES加密
    AFNetworking实现程序重新启动时的断点续传
    iPhone缓存网络数据
    SDWebImage使用——一个可管理远程图片加载的类库
    IOS中UITableView异步加载图片的实现
    使用UIImageView展现来自网络的图片
    obj-c学习笔记
    IOS开发-发送邮件(E-mail)方法整理合集(共3种)
    设置tableView背景颜色
    Spring整合JMS(三)——MessageConverter介绍
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/4342045.html
Copyright © 2011-2022 走看看