记得大学的时候室友对我的昵称是猪头,其实我还挺瘦的,我想他们是嫉妒我帅。^_^ 现在想想当时真是一段美好的时光,可能是我生命中最美好的一段了吧。而一晃也都是十年多前了。

piggy.o的生成

  1 cmd_arch/x86/boot/compressed/piggy.o := gcc -Wp,-MD,arch/x86/boot/compressed/.piggy.o.d  -nostdinc -isystem /usr/lib/gcc/x86_64-li    nux-gnu/5/include -I./arch/x86/include -Iarch/x86/include/generated/uapi -Iarch/x86/include/generated  -Iinclude -I./arch/x86/incl    ude/uapi -Iarch/x86/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL    __ -m64 -D__KERNEL__ -O2 -fno-strict-aliasing -fPIE -DDISABLE_BRANCH_PROFILING -mcmodel=small -mno-mmx -mno-sse -ffreestanding -fn    o-stack-protector -D__ASSEMBLY__   -c -o arch/x86/boot/compressed/piggy.o arch/x86/boot/compressed/piggy.S 2                                                                                 3 source_arch/x86/boot/compressed/piggy.o := arch/x86/boot/compressed/piggy.S     4                                                                                 5 deps_arch/x86/boot/compressed/piggy.o := \                                      6                                                                                 7 arch/x86/boot/compressed/piggy.o: $(deps_arch/x86/boot/compressed/piggy.o)      8                                                                                 9 $(deps_arch/x86/boot/compressed/piggy.o):                                       

看到这么长哥也是醉了,还好比较简单明了,就是从piggy.S编译到了piggy.o。

揭开piggy.S的面纱

先不管,来看看这个文件长啥样子

.section ".rodata..compressed","a",@progbits
.globl z_input_len
z_input_len = 6957106
.globl z_output_len
z_output_len = 22677744
.globl input_data, input_data_end
input_data:
.incbin "arch/x86/boot/compressed/vmlinux.bin.gz"
input_data_end:

看不太懂,留着以后分析

piggy.S的由来

quiet_cmd_mkpiggy = MKPIGGY $@cmd_mkpiggy = $(obj)/mkpiggy $< > $@ || ( rm -f $@ ; false )$(obj)/piggy.S: $(obj)/vmlinux.bin.$(suffix-y) $(obj)/mkpiggy FORCE$(call if_changed,mkpiggy)

从这个规则看是通过mkpiggy制作的,那展开是什么个样子呢?

cmd_arch/x86/boot/compressed/piggy.S := arch/x86/boot/compressed/mkpiggy arch/x86/boot/compressed/vmlinux.bin.gz > arch/x86/boot/compressed/piggy.S || ( rm -f arch/x86/boot/compressed/piggy.S ; false )

mkpiggy

仔细一看这个代码实在是太简单了。

其实就是读取了压缩文件的大小和被压缩文件的原始大小。
并将这个值填写到了piggy.S中。

vmlinux.bin.gz

$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE$(call if_changed,gzip)

那这个就是压缩成gz的格式咯, 那来看看都是把什么压缩成gz的。

$(obj)/vmlinux.bin: vmlinux FORCE$(call if_changed,objcopy)$(obj)/vmlinux.relocs: vmlinux FORCE$(call if_changed,relocs)vmlinux.bin.all-y := $(obj)/vmlinux.bin
vmlinux.bin.all-$(CONFIG_X86_NEED_RELOCS) += $(obj)/vmlinux.relocs

压缩的源一共可能是两个 vmlinux.bin 和 vmlinux.relocs。

我们把vmlinux.bin的编译命令打开看一下

cmd_arch/x86/boot/compressed/vmlinux.bin := objcopy  -R .comment -S vmlinux arch/x86/boot/compressed/vmlinux.bin

终于找到了你。就是把根目录下的vmlinux中obj复制出来的。

bzImage, 压缩的vmlinux, piggy, 根vmlinux

终于理清楚你们之间的关系了!


bzImage|                                                             +-- arch/x86/boot/setup.bin                                   |     |                                                       |     | objcopy from :                                        |     +-arch/x86/boot/setup.elf                               |                                                             |                                                             +-- arch/x86/boot/vmlinux.bin                                 |                                                       | objcopy from :                                        +-arch/x86/boot/compressed/vmlinux                      |                                                   | linked from :                                     +-arch/x86/boot/compressed/head_$(BITS).o           |                                                   +-arch/x86/boot/compressed/misc.o                   |                                                   +-arch/x86/boot/compressed/string.o                 |                                                   +-arch/x86/boot/compressed/cmdline.o                |                                                   +-arch/x86/boot/compressed/error.o                  |                                                   +-arch/x86/boot/compressed/cpuflags.o               |                                                   +-arch/x86/boot/compressed/piggy.o                  |                                               | linked with :                                 +-arch/x86/boot/compressed/vmlinux.bin.gz       |                                           |  compressed from :                        +- vmlinux

内核里的猪头 -- piggy.o相关推荐

  1. linux内核 猪头 作用,漫谈Linux内核哈希表(1)

    关于哈希表,在内核里设计两个很重要的数据结构:哈希链表节点: 点击(此处)折叠或打开 /*Kernel Version:3.4.x[include/linux/types.h]*/ struct hl ...

  2. 用c语言编写猪头图案,可爱的猪头简笔画教程步骤图片

    古代经常用猪代表财富和生育.商代的猪被人认为是贵重.吉祥的礼物.随着种植业的发展.居住地的稳定和猪的驯化,很多和猪有关的字产生出来,比如"家"(房子底下有猪.豕,意思就是猪).那么 ...

  3. 叫男朋友猪头的四大理由

    猪的天性是好吃懒做 男朋友的懒主要体现在一些生活细节上.通常来说,与女朋友约会的时候穿得衣冠楚楚.但是他的单身公寓里很可能就跟某些动物的窝极为类似.墙角里面的报纸.烟头.拖鞋参杂在一起.球衣与球鞋为伍 ...

  4. Linux内核中段伪例,利用Linux内核里的Use-After-Free(UAF)漏洞提权

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. * 作者:nickchang 上个月爆出的CVE-2016-0728 (http: ...

  5. [转]毕业了,失恋了——写给我曾经的猪头

    曾经,我也在这个大学里和我所爱的人留下点点滴滴.不过我是不可能写出这样的文章,虽然我有着大概类似的成长.但我不想去回忆,想让它保留在记忆的深处!因为一点一点去回忆出来去写,那是很痛苦的事情! [合集] ...

  6. linux内核 semaphore,2.4内核里semaphore源码的一个疑问

    博主你好, 请教一个问题. __down()里面有一段代码,  我觉得不那么保险.我先把__down的源码贴出来: ========================================== ...

  7. Linux 内核里的“智能指针”【转】

    转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...

  8. Linux 内核里的“智能指针”

    Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...

  9. Win64 驱动内核编程-8.内核里的其他常用

    内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...

最新文章

  1. 一起学Hadoop——实现两张表之间的连接操作
  2. android 静音
  3. 全球与中国聚硫聚合物市场运行规模分析及前景趋势预测报2021年版
  4. html5中加亮文本,html实现高亮关键字
  5. idea 版本控制忽略文件、文件夹设置
  6. 喜欢去知乎炸鱼?用python吧
  7. 【Elasticsearch】es 报错 index has not yet rolled over with that alias
  8. linux cp -w,对Linux的cp命令的思考
  9. vue2.x-cnode(vue全家桶)
  10. 简单数字电压表的c语言程序,简易数字直流电压表电路及程序
  11. 分析下这个LC振荡电路图
  12. 如何使用Linux匿名上网-四大法宝
  13. vue使用插件jsbarcode 生成条码下载
  14. 详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别
  15. 私域流量运营和微商有什么区别?
  16. ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问 解决方案
  17. Excel:把数据生成曲线图
  18. MongoDB 后台创建索引、查看创建进度等
  19. 搞定签到码,一切皆可码!!!微信小程序篇
  20. Hbase的Hmaster高可用分布式报错probably a clock skew

热门文章

  1. 2014校园招聘总结(转载)
  2. 结构化学习(Structured Learning)
  3. WIFI基本知识及802.11协议整理
  4. [ Android ] Eclipse调试Android程序的问题——模拟器与真机同时存在时出现的
  5. 新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版
  6. 20多年的岁月里一路走来满是辜负与遗憾,从双非到阿里SP,收到offer的那天我哭惨了
  7. 【深度学习入门】——亲手实现图像卷积操作
  8. 阿里云服务器托管-云服务器托管介绍
  9. 《云南虫谷》不还原?到底好不好看?鬼吹灯观影顺序是啥?
  10. Unity 托管代码剥离