zoukankan      html  css  js  c++  java
  • 编译Linux内核

    下面的实验以 debian7.5 64bit 为例.

    获取源码

    获取 debian7.5 本身的源码非常简单:

    sudo apt-get install linux-source
    

    https://www.kernel.org/ 的git上提供的源码分支非常多, 刚开始学习源码主要关注下面几个分支:

    1. linus分支: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
      linux创始人的分支, 不用说肯定最重要, 它是所有分支的根源. 处于 "mainline" 的地位.
      这个分支还有个好听的名字 – "vanilla(香草)" 内核.
    2. linux-next树: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/
      这个一个为发布将来的版本而积累新代码并进行测试的源码树.
      由 Stephen Rothwell 等人进行管理和维护
    3. stable树: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/
      这是一个主要针对过去发布的内核版本进行bug修改, 使其更加稳定的树.
      由 Greg Kroah-Hartman, Chris Wright 进行管理和维护.
      针对某个Linus树的稳定版维护一般持续6个月左右, 也有更持久的.

    上面的列出的git树中都可以获取想要的源码.

    编译内核

    其实编译内核和编译普通软件也没多大区别, 只是内核编译的参数非常之多.
    下面就来先看看如何设置内核编译参数

    内核编译选项

    1. 编译选项个数
      内核的编译选项的个数非常多, v2.6.38的内核中就有 12 000 个左右的设置选项(这是包含所有arch的配置选项).
      内核编译选项不仅多, 有些编译选项之间还存在依赖关系, 所以手动设置编译选项几乎是不可能的.
      值得庆幸的是, 只要知道自己需要设置的那些选项, 就可以使用 make ***config 来进行设置, 它还会自动处理依赖关系.

    2. 配置编译选项:
      设置内核编译选项是通过 kconfig 这个工具来完成的.
      kconfig 的源码就是内核代码中 script/kconfig 目录下

      各个编译选项的选择有3种方式:

      1. =y :: 直接编译到内核中
      2. =m :: 以模块方式编译到内核中
      3. 不设置 :: 不编译

      编译方法:

      1. make menuconfig :: 源码根目录下生成 .config (没有会自动生成), .config中就是各个内核编译选项的选择状况.
      2. make defconfig :: 根据当前系统的架构默认 .config 生成内核源码目录下的 .config (每个架构的配置文件: ex. arch/x86/configs/x86_64_defconfig)
      3. make oldconfig :: 将已有的 .config 放到源码根目录下后执行, 目的是为了复用之前的内核编译选项的配置.
      4. make xconfig :: 图形化配置, 需要qt3, 个人觉得没有必要, 有 make menuconfig 就足够了.
      5. make localmodconfig :: 生成以正在使用的内核模块为对象的 .config

    编译

    编译很简单, 内核编译选项设置好之后, 只需简单的命令 make, 就可以编译了.
    由于内核代码的庞大, 所以和一般应用程序相比, 编译时间会很长. 可以尝试以下方法来加快编译速度:

    1. 不用的驱动程序都不要设置, 这样就不会编译

    2. 利用make的 -j 选项来并发编译, ex. make -j N (N是并发数). 如果你的机器有2个CPU, 可以用 make -j 2 来提高编译速度

    3. 使用 make localmodconfig 来生成仅以正在使用的内核模块为对象的 .config (一般这样生成的.config中包含的内核模块最少, 所以编译速度快)

    4. 编译时间比较: 测试环境 - debian v7.5虚拟机(cpu: 单核, 内存: 512MB)

    .config生成 make时间 生成的modules 备注
    make menuconfig 1小时13分41秒 3052个.ko, 共1.2GB 默认配置, 什么也不选择
    make localmodconfig 19分36秒 337 个.ko, 共176MB  

    modules 是通过 make modules_install 之后, 在 /lib/modules 中根据编译内核版本号来查看的
    查看有多少个 .ko 文件的方法:

    cd /lib/modules/3.2.60
    find . -name '*.ko' | wc -l
    

    分开编译

    模块和内核不在一起的编译, 就是在现有的内核中追加一些内核模块时, 不需要将内核也重新编译.
    模块分开编译的方法很简单, 参考之前的博客: 《Linux内核设计与实现》读书笔记(六)- 内核数据结构 这篇博客中的例子就是和内核分开编译的模块.

    交叉编译

    交叉编译就是在当前平台上编译其他平台上的内核二进制映像, 比如在 x86_64 平台上编译 arm 的内核映像.
    交叉编译需要目标平台的交叉编译器. 编译时主要是 ARCH 和 CROSS_COMPILE 2个变量的设置.

    下面举个交叉编译 ARM 的例子: 公司用的制作 Cubieboard 板子上的image中的一段编译内核的代码

    make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfig
    make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 INSTALL_MOD_PATH=${CB_TARGET_DIR} uImage modules
    

    上述 第一行 是编译内核源码. 第二行 是创建 uImage 格式的内核映像以及创建内核模块
    最终在 INSTALL_MOD_PATH 生成的内核模块可以直接拷贝到 arm机器上使用.

    生成内核包

    debian 系 linux下生成 内核源码包的方法

    make deb-pkg
    

    安装内核

    make modules_install (安装内核模块到 /lib/modules 下)
    make install (安装内核二进制映像, 生成并安装boot初始化文件系统映像文件)

    卸载内核

    1. 删除/lib/modules/目录下不需要的内核库文件
    2. 删除/usr/src/kernel/目录下不需要的内核源码
    3. 删除/boot目录下启动的核心档案禾内核映像
    4. 更改grub的配置,删除不需要的内核启动列表

    内核 Makefile 中一些有用的 target

    1. make help : 内核Makefile中的各种 target
    2. make cscope : 生成 cscope 文件
    3. make tags/TAGS : tags可用于vim, TAGS可用于emacs
  • 相关阅读:
    There is no Action mapped for namespace [/pages/action/student] and action name [findStudent]
    站点设计至尊 (展示文)
    【翻译自mos文章】DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果的解释
    Effective C++ 条款45
    NYOJ109 数列转换 【守恒法】
    Windows 上安装 pip
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0
    解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
    neuroph Perceptron Sample
    Visio 画图去掉页边距(图形四周的空白区域)的解决办法
  • 原文地址:https://www.cnblogs.com/wang_yb/p/3899439.html
Copyright © 2011-2022 走看看