• 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

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

        

     

        

  • 相关阅读:
    性能调优之网络速度检测
    通过脚本自动下载Esri会议材料
    移动目标在三维GIS中的实现方法
    java生成CSV文件
    java 提取(解压)zip文件中特定后缀的文件并保存到指定目录
    java 提取(解压)rar文件中特定后缀的文件并保存到指定目录
    spring boot 使用 POI 读取Excel文件
    spring boot jpa 使用<S extends T> List<S> findAll(Example<S> example)查询数据
    一个MySQL中两表联合update的例子(并带有group by分组)
    Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)
  • 原文地址:https://www.cnblogs.com/dkyliuhongyi/p/5919491.html
Copyright © 2020-2023  润新知