内核里的猪头 -- piggy.o
记得大学的时候室友对我的昵称是猪头,其实我还挺瘦的,我想他们是嫉妒我帅。^_^ 现在想想当时真是一段美好的时光,可能是我生命中最美好的一段了吧。而一晃也都是十年多前了。
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相关推荐
- linux内核 猪头 作用,漫谈Linux内核哈希表(1)
关于哈希表,在内核里设计两个很重要的数据结构:哈希链表节点: 点击(此处)折叠或打开 /*Kernel Version:3.4.x[include/linux/types.h]*/ struct hl ...
- 用c语言编写猪头图案,可爱的猪头简笔画教程步骤图片
古代经常用猪代表财富和生育.商代的猪被人认为是贵重.吉祥的礼物.随着种植业的发展.居住地的稳定和猪的驯化,很多和猪有关的字产生出来,比如"家"(房子底下有猪.豕,意思就是猪).那么 ...
- 叫男朋友猪头的四大理由
猪的天性是好吃懒做 男朋友的懒主要体现在一些生活细节上.通常来说,与女朋友约会的时候穿得衣冠楚楚.但是他的单身公寓里很可能就跟某些动物的窝极为类似.墙角里面的报纸.烟头.拖鞋参杂在一起.球衣与球鞋为伍 ...
- Linux内核中段伪例,利用Linux内核里的Use-After-Free(UAF)漏洞提权
*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. * 作者:nickchang 上个月爆出的CVE-2016-0728 (http: ...
- [转]毕业了,失恋了——写给我曾经的猪头
曾经,我也在这个大学里和我所爱的人留下点点滴滴.不过我是不可能写出这样的文章,虽然我有着大概类似的成长.但我不想去回忆,想让它保留在记忆的深处!因为一点一点去回忆出来去写,那是很痛苦的事情! [合集] ...
- linux内核 semaphore,2.4内核里semaphore源码的一个疑问
博主你好, 请教一个问题. __down()里面有一段代码, 我觉得不那么保险.我先把__down的源码贴出来: ========================================== ...
- Linux 内核里的“智能指针”【转】
转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...
- Linux 内核里的“智能指针”
Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...
- Win64 驱动内核编程-8.内核里的其他常用
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...
最新文章
- 一起学Hadoop——实现两张表之间的连接操作
- android 静音
- 全球与中国聚硫聚合物市场运行规模分析及前景趋势预测报2021年版
- html5中加亮文本,html实现高亮关键字
- idea 版本控制忽略文件、文件夹设置
- 喜欢去知乎炸鱼?用python吧
- 【Elasticsearch】es 报错 index has not yet rolled over with that alias
- linux cp -w,对Linux的cp命令的思考
- vue2.x-cnode(vue全家桶)
- 简单数字电压表的c语言程序,简易数字直流电压表电路及程序
- 分析下这个LC振荡电路图
- 如何使用Linux匿名上网-四大法宝
- vue使用插件jsbarcode 生成条码下载
- 详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别
- 私域流量运营和微商有什么区别?
- ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问 解决方案
- Excel:把数据生成曲线图
- MongoDB 后台创建索引、查看创建进度等
- 搞定签到码,一切皆可码!!!微信小程序篇
- Hbase的Hmaster高可用分布式报错probably a clock skew
热门文章
- 2014校园招聘总结(转载)
- 结构化学习(Structured Learning)
- WIFI基本知识及802.11协议整理
- [ Android ] Eclipse调试Android程序的问题——模拟器与真机同时存在时出现的
- 新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版
- 20多年的岁月里一路走来满是辜负与遗憾,从双非到阿里SP,收到offer的那天我哭惨了
- 【深度学习入门】——亲手实现图像卷积操作
- 阿里云服务器托管-云服务器托管介绍
- 《云南虫谷》不还原?到底好不好看?鬼吹灯观影顺序是啥?
- Unity 托管代码剥离