全面解析Linux 内核 3.10.x - 开始编译<二>
2015-11-17 22:00
639 查看
From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构
根据顶层Makefile中的规则生成vmlinux是由vmlinux.lds 链接生成!
vmlinux.lds 是由vmliux.S生成的!它的规则文件定义在scripts/Makefile.build中!
通过上述target会将vmlinux.lds.S 生成 vmlinux.lds!
因为我们需要vmlinux就够了,只需要在boot中提供关于vmlinux文件的解析即可!
有的人说那文件很大啊,你可以strip -S vmlinux.
编译内核整体流程!
1、获取内核源码
方法1:直接克隆Linus的仓库
一切手工技艺,皆由口传心授 - 夏奈尔首席鞋匠
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 <asm-generic/vmlinux.lds.h> #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[/code]
方法2:通过 wget 获取wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.92.tar.xz[/code]
方法3:通过kernel.org下载源码
2、解压内核源码tar xvf linux-3.10.92.tar.xz
3、选择configcp arch/mips/configs/xx_config .config
4、配置configmake ARCH=mips CROSS_COMPILE=mips-xx-linux menuconfig
保存退出
5、编译内核make -j 8
长夜漫漫,无心睡眠,如果你既想做实干家,也想做理论家,那么赶紧行动吧!去编译属于你的第一份内核吧!
By: Keven - 点滴积累
相关文章推荐
- Centos 7 下安装hadoop 2.6.x
- centos7配置samba
- linux - ubuntu 配置 ssh
- linux export环境变量
- linux 更新gcc 4.9.3
- Linux 磁盘分区、格式化、挂载、查看操作
- quickLinux
- Linux spi驱动分析(四)----SPI设备驱动(W25Q32BV)
- Linux spi驱动分析(三)----spiddev分析
- centos 7安装后初始化配置
- Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)
- linux挂盘
- [知其然不知其所以然-9] linux e820/efi memory map是如何初始化的
- linux 挂载硬盘笔记
- Linux C 学习 单向链表
- centos国内的源
- linux下c++读文件夹下的文件及文件夹笔记
- Linux<十四> 软件安装管理
- linux APT 命令
- linux source filename