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

    接着就是编译,编译遇到了比较大的问题,在编译过程中闪退了一次,并且再次编译的时候时间很长,今天并没有编译成功,接下来还需要安装新内核等,博客就先写到这里,后续我还会继续研究学习,并且做实验,有新的进展或者新的问题还会在这里补充。

    

 

 

    

posted @ 2016-09-29 22:51  刘弘毅  阅读(300)  评论(4编辑  收藏  举报