20169217《Linux内核原理与分析》第二周作业
通过第二周的学习,我想把我的博客分为两部分,第一部分是实验楼linux内核分析实验一的实验报告,第二部分是看书第1,2,18章的内容和时间情况。
现在先说实验一
实验内容:将一段c语言程序反汇编成汇编程序。
c语言程序代码:应实验要求我把其中部分数值进行了修改。
int g(int x)
{
return x+6;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(9)+3;
}
实验过程:
首先创建一个main.c文件
将刚刚修改过数值的c语言程序写入
接着使用gcc -S -o main.s main.c -m32将此程序反汇编成汇编程序,-S表示执行反汇编,-m32表示转换成32位汇编程序。注意实验楼的实验环境是64位,所以这里要加-m32。
使用gedit main.s 查看汇编程序。
我们会发现短短几句程序却变成了如此复杂的汇编程序,通过同步学习孟宁老师mooc我得知此段程序中只要是以“.”开头的语句,例如“.globl g”,都是用于链接辅助信息,实际并不会执行,所以可以直接忽略。那么此段程序简化后就变成如下形式:
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $6, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $9, (%esp)
call f
addl $3, %eax
leave
ret
我们发现和c怨言程序一样,此段汇编程序分为三部分,f函数,g函数,还有main主函数。接下来我们就简要分析一下这段汇编程序。
对于汇编程序如果我们不是很熟悉的话我们可以借助原C语言程序进行分析,首先执行的是main函数, pushl %ebp movl %esp, %ebp 两句的意思是保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针。subl $4, %esp movl $9, (%esp) 这两条指令的意思是栈顶指针下以4个单位,分配了一个单元,第二条指令将数值9存储到刚刚分配的个单元中。所以这两条指令的作用是将数值9压入堆栈。接下来是call f 即调用f函数,这时我们来看f函数。 前三句和main函数的前三句相同,第四句movl 8(%ebp), %eax 它的含义是将栈基指针的内容加上8对应的存储单元的内容传送给累加寄存器EAX。下一条指令再把EAX内容拷贝给栈顶指针所指的位置。call g调用g函数。 popl %ebp 这条指令相当于:movl (%esp),%ebp add $4,%esp。实现将之前压入栈的栈基指针EBP的内容出栈到EBP中。leave是撤销函数堆栈,ret相当于c语言中的return返回程序运行值。
实验一基本就是这样,通过查看汇编指令我们可以清楚地知道linux是如何进行取指运行程序的。
接下来是第二部分,linux内核的编译,通过学习教材我大概可以进行linux内核的编译和安装,过程如下:
进入终端,使用命令 sudo passwd root 启动root账号,
安装编译内核所需软件包
# apt-get update
# apt-get install build-essential kernel-package libncurses5-dev fakeroot 选择Y
下载4.7.5源码包并解压
# wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.7.5.tar.xz
# tar -Jxvf linux-4.7.5.tar.xz
貌似下载起来比较慢,这里我下载的是最新版本4.7.5
接下来就是配置内核:
#cd linux-4.7.5
#make menuconfig
然后出现图形配置界面,这时问题来了,这里的配置我并不太知道是啥意思,我猜想可能类似于windows下的BIOS配置,我查了一下,这里还需要继续研究。
这里补充一点,关于配置内核的问题,引用别人的博客,这里有详解http://blog.csdn.net/gaoyuanlinkconcept/article/details/8810468。
接着就是编译,编译遇到了比较大的问题,在编译过程中闪退了一次,并且再次编译的时候时间很长,今天并没有编译成功,接下来还需要安装新内核等,博客就先写到这里,后续我还会继续研究学习,并且做实验,有新的进展或者新的问题还会在这里补充。