码迷,mamicode.com
首页 > 系统相关 > 详细

第4天--linux内核学习-上午

时间:2016-08-10 13:59:25      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:

驱动使用方式
1、编译到内核中 * make uImage
进入到系统后
mknod /dev/led c 500 0 创建设备节点

2、编译为模块 M make module
进入到系统后
mknod /dev/led c 500 0 创建设备节点
insmod fs4412_led_drv.ko(驱动可执行程序) 加载驱动

uImage的编译
1、步骤
make uImage -jNUM NUM = 处理器数量*处理器核心数

2、流程
进入顶层目录下的Makefile
找不到uImage 就去找include
504 include $(srctree)/arch/$(SRCARCH)/Makefile ==> arch/arm/Makefile
203 SRCARCH := $(ARCH) =arm

进入arch/arm/Makefile
299 BOOT_TARGETS = zImage Image xipImage bootpImage uImage

304 $(BOOT_TARGETS): vmlinux
305 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ ==> arch/arm/boot/uImage

make -p生成工程目录下的全局变量
62 Q = @ 272 MAKE = make
Makefile中 @make $(build) make -C build的路径 执行指定路径下的Makefile
291 boot := arch/arm/boot

233 MACHINE := arch/arm/mach-$(word 1,$(machine-y))/
155 machine-$(CONFIG_ARCH_EXYNOS) += exynos (在配置文件.config中)
MACHINE=arch/arm/mach-exynos

make -C arch/arm/boot MACHINE=arch/arm/mach-exynos arch/arm/boot/uImage

进入arch/arm/boot/Makefile中

15 include $(srctree)/$(MACHINE)/Makefile.boot ==> arch/arm/mach-exynos/Makefile.boot
1 zreladdr-y += 0x40008000 uImage的启动地址
2 params_phys-y := 0x40000100 传参位置

obj 当前Makefile路径
78 $(obj)/uImage: $(obj)/zImage FORCE ==> 表示强制生成 uImage 生成需要zImage生成

54 $(obj)/zImage: $(obj)/compressed/vmlinux FORCE zImage生成需要arch/arm/boot/compressed/vmlinux

51 $(obj)/compressed/vmlinux: $(obj)/Image FORCE
52 $(Q)$(MAKE) $(build)=$(obj)/compressed $@

make -C arch/arm/boot/compressed/ arch/arm/boot/compressed/vmlinux

进入arch/arm/boot/compressed/Makefile

185 $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
186 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) \
187 $(bswapsdi2) FORCE

vmlinux.lds 依赖于 vmlinux.lds.in 和 上层路径下的Makefile 和kconfig
25 HEAD = head.o (由当前目录下的head.S生成)
86 suffix_$(CONFIG_KERNEL_GZIP) = gzip
piggy.gzip.o 指的就是gzip压缩 压缩代码

195 $(obj)/piggy.$(suffix_y).o: $(obj)/piggy.$(suffix_y) FORCE
192 $(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE piggy.gzip.o 生成是依赖于上层路径下的Image

addprefix 进行拼接路径
OBJS 需要的目标库文件(很多)
lib1funcs 功能相关库文件
148 lib1funcs = $(obj)/lib1funcs.o
154 ashldi3 = $(obj)/ashldi3.o 与工具链相关
160 bswapsdi2 = $(obj)/bswapsdi2.o 与压缩格式相关代码

回到arch/arm/boot/Makefile
47 $(obj)/Image: vmlinux FORCE 表示的是顶层路径下的vmlinux

回到顶层路径下的Makefile
817 vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
809 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
802 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
803 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) 全部包含
804 export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds


530 init-y := init/
531 drivers-y := drivers/ sound/ firmware/
532 net-y := net/
533 libs-y := lib/
534 core-y := usr/

head-y = head.o(arch/arm/kernel/head.S生成的文件) 启动的第一个文件
KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds arch/arm/kernel/vmlinux.lds
就能生成我们所需的uImage

vmlinux.lds .lds链接脚本 生成vmlinux文件的工具
vmlinux 真正的内核程序
Image 经过第一次压缩
zImage 经过第二次压缩
uImage 使用了mkimage 添加头部,为了uboot的识别

vmlinux 60M (没有添加其他驱动,只是默认配置,实际添加过后应为70M左右)
Image 5M左右
zImage 2768232
uImage 2768296 uImage比zImage大64B 是由mkimage添加64B头部 此头部就是为了uboot进行识别来使用的头部(uboot的版本相关)

uboot加载内核后 uImage 读走头部 ——> zImage 进行decopressed Image ——> vmlinux (真正执行在开发板中的程序)

uImage的编译流程是启动流程的逆序

 

linux内核的启动流程
进入的是arch/arm/kernel/head.S

第4天--linux内核学习-上午

标签:

原文地址:http://www.cnblogs.com/renchong/p/5756301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!