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和myinterrupt.c代码。

首先我们分析mymain.c,包含两个函数两个函数, my_start_kernel和my_process。

首先是my_start_kernel:

初始化0号进程,将esp指向task[0]的堆栈stack顶端。 将task[0].thread.sp即堆栈顶端地址压栈,为以后的%ebp的复位使用。 将task[0].thread.ip即程序入my_process压栈。通过ret指令,将task[0].thread.ip即程序入口my_process放到eip。之后的pop %ebp是下一个被调度到的process第一个执行的代码。

my_process函数:

my_process中每10000000个循环输出信息,并且调用my_schedule函数。

接下来我们分析myinterrupt.c文件:

myinterrupt.c同样包含my_timer_handler和my_schedule两个函数。

my_timer_handler每隔1000次将my_need_sched置1,调用进程的调度函数。 my_schedule保存恢复进程上下文。

总结:

通过本次实验,更加深刻了解了操作系统时间片轮转的基本原理,即先初始化若干进程,并执行第一个进程,当CPU分配给进程的时间片用完时,便需要进行进程切换:先保存进程的上下文,即进程栈的栈顶esp和ebp,并通过将eip压栈和弹栈的方式进行切换。

那么linux是如何进行进程管理的,接下来就是本次作业的第二部分内容,看书第三章和第五章进行深入学习。

通过学习,我将linux执行进程的过程总结如下:

1.通过task_struct进程描述符来描述进程,也就是表示进程。

2.通过fork()创建进程,这也是上课老师主要强调的为何演示代码执行以后好像返回了两次,实际上fork()会重新创建一个进程。

3.通过exec()将执行映像装入地址空间。

4.进程的消亡,调用exit()。

接着我们来看看什么叫系统调用,系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。

时间: 2024-10-14 07:44:06

20169217 linux内核原理与分析 第四周作业的相关文章

《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内核原理与分析》 课程总结

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

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,该漏洞可用于许多系统,并且既可以远程也可以在

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文件 将刚刚修

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

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

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 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系统进程调度与进程切换过程的理