全面解析Linux 内核 3.10.x - 开始编译

From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构

一切手工技艺,皆由口传心授 - 夏奈尔首席鞋匠

1、你不知道的vmlinux - 链接规则

在上面的总结中,关于链接的部分我写的并不是很详细,就是打算在此处在做详细的总结,内核的链接可以说是理解编译最重要的部分,此处要没有问题,就表示你的基本语法没啥问题了,也就不会出现写驱动的时候出现一些连接错误等问题的时候茫然无措的感觉了!

还是得从vmlinux.lds说起

之前没有只是简单的说vmlinux.lds是由vmlinux.lds.S生成的,但是没有说明到底是如何生成的!
根据顶层Makefile中的规则生成vmlinux是由vmlinux.lds 链接生成!
vmlinux.lds 是由vmliux.S生成的!它的规则文件定义在scripts/Makefile.build中!

# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS     $@
      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
                         -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<

$(obj)/%.lds: $(src)/%.lds.S FORCE
    $(call if_changed_dep,cpp_lds_S)

通过上述target会将vmlinux.lds.S 生成 vmlinux.lds!

vmlinux.lds.S文件分析

#define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir)

#include 

#undef mips
#define mips mips
OUTPUT_ARCH(mips)  ##定义平台
ENTRY(kernel_entry) ##text 入口
PHDRS {
    text PT_LOAD FLAGS(7);  /* RWX */
    note PT_NOTE FLAGS(4);  /* R__ */
}

#ifdef CONFIG_32BIT
    #ifdef CONFIG_CPU_LITTLE_ENDIAN
        jiffies  = jiffies_64;
    #else
        jiffies  = jiffies_64 + 4;
    #endif
#else
    jiffies  = jiffies_64;  ##使用jiffies
#endif

SECTIONS
{
#ifdef CONFIG_BOOT_ELF64  ##此宏一般不开
    /* Read-only sections, merged into text segment: */
    /* . = 0xc000000000000000; */

    /* This is the value for an Origin kernel, taken from an IRIX kernel.  */
    /* . = 0xc00000000001c000; */

    /* Set the vaddr for the text segment to a value
     *   >= 0xa800 0000 0001 9000 if no symmon is going to configured
     *   >= 0xa800 0000 0030 0000 otherwise
     */

    /* . = 0xa800000000300000; */
    . = 0xffffffff80300000;     
#endif
    . = VMLINUX_LOAD_ADDRESS;
    /* read-only */
    _text = .;  /* Text and read-only data */
    .text : {
        TEXT_TEXT
        SCHED_TEXT
        LOCK_TEXT
        KPROBES_TEXT
        IRQENTRY_TEXT
        *(.text.*)
        *(.fixup)
        *(.gnu.warning)
    } :text = 0
    _etext = .; /* End of text section */

    EXCEPTION_TABLE(16)

    /* Exception table for data bus errors */
    __dbe_table : {
        __start___dbe_table = .;
        *(__dbe_table)
        __stop___dbe_table = .;
    }

2、你不知道的vmlinux - 其他镜像文件的生成流程

Mips内核代码没有提供关于bzImage以及Image等镜像格式的文件!
因为我们需要vmlinux就够了,只需要在boot中提供关于vmlinux文件的解析即可!
有的人说那文件很大啊,你可以strip -S vmlinux.

boot引导内核

待续…

3、奔跑吧 - 内核

好了,内核镜像已经生成,是骡子是马拉出去溜溜。。

4、说在启动之前的话

前面说了很多编译细节以及编译方法的问题,可能好多人看到这里都开始纠结,说了这么多,怎么感觉看不懂?在扯淡吗?那么您在看看下面的步骤,然后在对照之前看的内容细细品味,也许会有点不同的味道!

编译内核整体流程!
1、获取内核源码
方法1:直接克隆Linus的仓库
git clone https://github.com/torvalds
方法2:通过 wget 获取
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.92.tar.xz
方法3:通过kernel.org下载源码
2、解压内核源码
tar xvf linux-3.10.92.tar.xz
3、选择config
cp arch/mips/configs/xx_config .config
4、配置config
make ARCH=mips CROSS_COMPILE=mips-xx-linux menuconfig
保存退出
5、编译内核
make -j 8

长夜漫漫,无心睡眠,如果你既想做实干家,也想做理论家,那么赶紧行动吧!去编译属于你的第一份内核吧!

By: Keven - 点滴积累

你可能感兴趣的:(全面解析Linux 内核 3.10.x - 开始编译)