5.2.2 解压
完成内核移动后,下一步就要开始解压内核了,代码如下:
我们看到,在head_32.S中,调用函数decompress_kernel解压内核,见第10行代码。decompress_kernel是用C语言编写的,其函数定义在misc.c中:
我们结合函数decompress_kernel来看看文件head_32.S中的几个关键参数:
1)函数decompress_kernel的最后一个参数output是内核解压的目的地址,这个应该是第一个压栈的参数,见head_32.S代码第1~3行。在前面讨论移动内核时,我们看到,寄存器ebx中保存的是内核移动后的地址,而根据piggy.S,z_extract_offset_negative就是z_extract_offset的负数,所以表达式
相当于
参照图5-7,显然,这就是内核解压的目的地址。
2)函数decompress_kernel的参数input_len表示压缩的内核映像的长度,这个变量对应piggy.S中定义的z_input_len,这是第2个需要压栈的参数,见head_32.S代码片段第4行。
3)函数decompress_kernel的参数input_data表示压缩的内核映像的开头,对应piggy.S中定义的input_data,这是第3个需要压栈的参数,见head_32.S代码片段第5行。
具体解压算法,我们不再分析,读者如果有兴趣,可自行阅读代码。