zoukankan      html  css  js  c++  java
  • linux内核编译相关

    一. 内核编译

    1) linux 2.4
    make clean/make mrproper
    make dep
    make zImage
    make modules //编译模块
    2) linux 2.6
    make clean/make mrproper
    make // 编译内核同时编译了模块
    3) 模块安装
    上述步骤完成后,模块分布在各个内核目录下,通过下面命令安装到具体目录下:
    make modules_install INSTALL_MOD_PATH=./mod_dir
    其中./mod_dir为模块安装目录,禁止为“/”(安装到本机host上)。

    注:可通过make help查看make选项。
    clean Remove most generated files but keep the config and enough build support to build external modules
    mrproper Remove all generated files + config + various backup files
    distclean mrproper + remove editor backup and patch files

    二. 镜像文件介绍
    一般情况下,先编译链接生成顶层目录的vmlinux,再把vmlinux精简压缩成piggy.gz,然后加上自引导程序链接生成arch/$(ARCH)/boot/zImage,这样就得到一个具备自启动能力的linux内核映像。
    >>vmlinux 内核在虚拟空间运行时代码真实反应。
    不具备引导能力,需要借助其他Bootloader引导启动。
    位于顶层目录。
    注:linux内核运行在虚拟地址空间
    >>Image vmlinux去除调试信息后的镜像
    >>vmlinuz 即zImage
    可引导的压缩的内核映像。
    大多数包含两部分:压缩的vmlinux和自引导程序。
    vmlinuz通过自引导程序初始化系统,并且解压启动vmlinux。
    vmlinuz采用gzip压缩格式,包含gzip解压缩函数。
    >>uImage uboot格式的内核镜像,zImage前增加64字节
    >>System.map 一个特定内核的内核符号表,包含内核全局变量和函数的地址信息。
    $nm vmlinux >System.map
    可提供给klogd/loof/ps等使用。
    /proc/ksyms使用
    CONFIG_ALLSYMS => 内核映像将包含符号表。

    三. 内核补丁
    上一个版本的linux内核源码,通过打补丁可以得到下一个版本。
    linux-2.6.14 –> linux-2.6.15 =>patch-2.6.14.15
    打补丁
    bzcat ../patch-2.6.14.15.bz2 | patch –p1
    四. 编译内核模块2.6内核
    linux2.6内核的模块采用新的加载器,它使用内核编译机制,生成一个*.ko(内核目标文件,kernel object)模块文件,而不是一个*.o模块目标文件。
    内核编译系统首先编译这些模块,然后链接上vermagic.o。这样就在目标模块创建了一个特殊区域,用来记录编译器版本号、内核版本号、是否使用内核抢占等信息。
    新的内核编译系统如何来编译并加载一个简单的模块呢?举例说明。

    #drivers/char/hello/hello.c
    void init_module(void)
    {
    printk( “Hello module!
    ”);
    }
    
    void cleanup_module(void)
    {
    printk( “Bye module!
    ”);
    }

    相应的makefile文件如下:

    KERNEL_SRC = ~/linux-2.6.14
    SUBDIR = $(KERNEL_SRC)/drivers/char/hello/
    all: modules
    obj-m := hello_mod.o
    hello-objs := hello.o
    EXTRA_FLAGS += -DDEBUG=1
    modules:
    $(MAKE) –C $(KERNEL_SRC) SUBDIR=$(SUBDIR) modules

    makefile文件使用内核编译机制来编译模块。
    新模块要用新的模块工具加载或卸载。原来2.4内核的工具不能再用来加载或卸载2.6内核模块。

    五.  X86平台编译安装内核

    1. 下载内核源文件。

    2. 安装开发包组下载。

    根据需要安装开发工具,包括gcc、g++等,centos下可通过如下命令安装:yum groupinstall "development tools"。

    3. 更新.config文件。

    最好拷贝当前系统的配置文件/boot/config-xxx当作默认配置文件,当然不同版本间配置选项可能不同。

    若是标准X86版本可拷贝对应版本的配置文件,理论上X86配置文件应该是通用的(如Ubuntu16.04各版本应该相同,Centos7.5各版本应该相同)。

    4. make menuconfig。

    根据需要更改配置选项。

    5. make

    根据需要安装缺少的编译工具。

    6. make modules_install

    默认安装目录为/lib/modules,完成后增加一个新编译系统版本号目录。

    7. make install:安装内核相关文件

    自动生成三个文件并修改grub相关配置,相关内容均在目录/boot下。

    文件包含:initramfs,vmlinuz,System,且相关的系统文件链接到最新文件。

     

    grub文件配置在:/boot/grub2/grub.cfg,新添加了最新内核的配置menuentry。

    8. reboot重启后uname查看内核更新。

    参考:

    1. http://www.arm.linux.org.uk/docs/kerncomp.php

    2. centos7编译安装内核最新版

    3. CentOS 6/7 上编译安装Linux内核

    4. https://wiki.centos.org/Sources

    5. http://vault.centos.org/centos/7/os/Source/SPackages/

  • 相关阅读:
    OCP-1Z0-053-V13.02-702题
    OCP-1Z0-053-V13.02-688题
    OCP-1Z0-053-V13.02-691题
    OCP-1Z0-053-V13.02-698题
    OCP-1Z0-053-V13.02-703题
    OCP-1Z0-053-V13.02-701题
    OCP-1Z0-053-V13.02-685题
    memcached 按键查找和批量查找
    catch(CException *e)捕获异常
    char数组最大长度
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6012595.html
Copyright © 2011-2022 走看看