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配置,我查了一下,这里还需要继续研究。

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

时间: 2024-08-11 07:37:23

20169217《Linux内核原理与分析》第二周作业的相关文章

20169217 linux内核原理与分析 第四周作业

本次作业仍然分为两部分,第一部分为实验. 如实验楼的实验过程所述:使用实验楼的虚拟机打开shell,然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c. 代码如下: cd LinuxKernel/linux-3.9.4  qemu -kernel arch/x86/boot/bzImage 实验截图如下: 通过观察我们会发现my_start_kernel和my_timer_handler快速的交替执行. 接下来查看mymain.c和my

20169217 《Linux内核原理与分析》 课程总结

博客链接: 第一周作业 摘要:学习了实验楼linux基础入门课程. 第二周作业 摘要:实验楼实验一:反汇编一个简单的程序.书<linux内核设计与实现>:第1章,第2章,第18章内容. 第三周作业 摘要:自己对于为何要学习linux的感想. 第四周作业 摘要:实验二:分析精简内核源代码mymain.c和myinterrupt.c 书上第2章和第5章内容. 第五周作业 摘要:使用gdb跟踪调试内核从start_kernel到init进程启动 书上第4章和第6章内容. 第六周作业 摘要:使用库函数

《Linux内核原理与分析》教学进程

目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 第十三周 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 采取过程化考核,平时成绩占100分,成绩计算:30+30+15+25=100: 翻转课堂基础考核10次: 3*10 = 30 每次考试20-30道题目,考试成绩规格化成3分(比如总分30分就除以10) 翻转课堂测试

20169217 《Linux内核原理与分析》 第十一周作业

首先更新一下第一次实验关于堆栈的分析,这里我直接手写拍的图片. 这里再补充一点,第5步的call f 实际上等于 pushl %eip,movl f %eip,也就是将f的eip地址压栈,call g原理相同.leave等于movl %ebp,%esp,popl %ebp 也就是将ebp出栈,epb指向自己所存储值的栈,再将ebp的值付给esp,实现栈的释放.   接下来是实验: 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在

2017-2018-1 20179203 《Linux内核原理与分析》第八周作业

攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 一.实验要求: 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节: 3.使用gdb跟踪分析一个

2017-2018-1 20179202《Linux内核原理与分析》第八周作业

一 .可执行程序的装载 1. 预处理.编译.链接 gcc –e –o hello.cpp hello.c //预处理 gcc -x cpp-output -S -o hello.s hello.cpp //编译 gcc -x assembler -c hello.s -o hello.o-m32 //汇编 gcc -o hello hello.o //链接成可执行文件,使用共享库 用gcc -o hello.static hello.o -static静态编译出来的hello.static把C库

2017-2018-1 20179209《Linux内核原理与分析》第八周作业

Linux内核如何装载和启动一个可执行程 一.实验 1.1理解编译链接的过程和ELF可执行文件格式. 1.1.1编译链接过程 能用图说明的问题,就少用文字描述: 1.1.2ELF可执行文件 ELF可执行文件中有三种主要的目标文件: 一个可重定位文件保存着代码和适当的数据,用来和其他的object文件一起创建一个可执行文件或者是一个共享文件.主要是.o文件. 一个可执行文件保存着一个用来执行的程勋:该文件指出了exec如何创建程序进程映像. 一个共享object文件保存着代码和合适地数据,用来被下

2017-2018-1 20179202《Linux内核原理与分析》第九周作业

进程的切换和系统的一般执行过程 1.知识总结 (1)进程调度的时机: 中断处理过程直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(). 内核线程是一个特殊的进程,只有内核态没有用户态,可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度(内核线程可以直接访问内核函数,所以不会发生系统调用).内核线程作为一类的特殊的进程可以主动调度,也可以被动调度. 用户态进程无法实现主动调度,仅能在中断处理过程中进行调度(schedul

2017-2018-1 20179203 《Linux内核原理与分析》第九周作业

攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 一.实验要求: 1.理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确: 2.使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理