Linux操作系统分析
陈香兰
Fall 2014
考试时间:2014年12月11日周四下午2:30~4:30,203教室
主讲老师信息
陈香兰(
xlanchen@ustc.edu.cn
): 科大西区电三421
助教信息
人数(1人)
权彦清
Email:
csqyq@mail.ustc.edu.cn
主页:
http://home.ustc.edu.cn/~csqyq
办公室:
科大西区电三421
参考书
Understanding the Linux Kernel (O'reilly)
各种网站
课时和上课时间
课时:5课时/周*10周-十一放假周五2课时+考试=50课时
9.26日交第一次作业、10.24日交第二次作业、11月14日交第三次作业
注:
考试相关参考资料
幻灯片
2014-9-9,
课程介绍
2014-9-9,
绪论
x86 Assembly Programming,有关于AT&T汇编的说明
80x86指令说明,这里面用的是Intel汇编格式
1_2,
GNU Tools
2,
基于x86的Linux的启动
2_2,
制作简单的Linux系统
3,
内存寻址
4.1,
进程管理1
4.2,
进程管理2
4.3,
进程管理3
5,
中断和异常
6,
系统调用
,2014-10-24
7,
时钟和定时
,2014-10-28
8,
内存管理
,2014-10-31
9.1,
地址空间
,2014-11-4
9.2,
程序的执行
,2014-11-4
10,
文件系统
11,
信号机制
12,
IO管理
13,
进程的同步和通信
,
几个例子
实验课时间安排(
参见助教主页
)
实验报告和上机:
不分组
1,实验报告:准备源代码分析和实验环境
请根据课堂内容准备源代码分析和实验环境
要求(1):准备好Linux主机环境,安装好开发工具链(说明低版本gcc的安装过程)
要求(2):下载并缺省编译
Linux-2.6.26
,成功
要求(3):安装源代码阅读工具,推荐SourceInsight,并基于编译过的Linux-2.6.26源代码,建立Linux-2.6.26的源代码工程
若使用SourceInsight,建立利用SourceInsight的文件管理功能,去除arch目录和include目录下非x86的其他体系结构的源代码
使用其他源码阅读工具,可是可以的
要能看到若干Makefile文件
要能看到若干*.lds文件
注:可以直接在Linux中使用Wine来运行SourceInsight,也可以使用Windows系统中安装的SourceInsight
要求(4):使用主机环境中的工具重新编译test.c并反汇编,观察函数调用框架的形成、参数的传递、返回值的传递和局部变量的定义方法,比较与课堂上讲解的有什么区别
要求(5):对gcc的优化编译进行尝试,对采用不同优化编译选项得到的可执行文件,使用time命令来获得它们各自的运行时间并进行简单比较
目标(1):熟悉安装并使用Linux主机环境
目标(2):熟悉Linux编译步骤
目标(3):熟悉安装并使用常用GCC相关工具软件
目标(4):熟悉安装并使用源代码阅读工具
目标(5):初步掌握Linux-2.6.26的内核源代码框架
检查方法
除实验报告,每个同学还需提交一份
自查报告
,由助教汇总
助教根据自查报告随机抽查若干进行人工检查(
凡人工检查不合格者,须重新准备环境,且得分最高不超过6分
)
2,实验报告:基于x86体系结构分析linux-2.6.26的启动过程
仅考虑32位体系结构
不考虑多核多处理器
要求1:分析流程按照开机-->BIOS-->grub-->Linux的顺序进行,到start_kernel结束
要求2:结合几个关键的Makefile文件和缺省编译linux的输出信息,给出Linux映像的make过程分析,说明编译链接的结果有哪些?
要求3:结合GRUB和几个链接描述文件,说明GRUB是如何加载bzImage的,GRUB将跳转到内存的哪个地址上开始运行Linux,该地址的代码对应于哪个Linux源文件中的哪处?
要求4:给出Linux中的启动相关的几个关键源文件的执行顺序,分析setup和内核解压缩前后这三个阶段的主要流程(直到start_kernel)。
3,进程调度和切换分析与实验
对Linux2.6.26的进程调度和切换过程进行分析,提交分析报告
要求(1):分析从schedule()开始,说明几种不同类型的进程之间的调度选择;在相同类型的进程之间的调度选择算法
要求(2):在选择好next进程之后,以ppt动画的方式或其他动画方式,画出prev进程切换到next进程时,相关堆栈内容、CPU的堆栈指针以及相关数据结构内容变化的情况
要求(3):从CPU的IP值的变化上,说明在switch_to宏执行后,执行了哪个函数?执行了这个函数之后,又到哪里执行了?
要求(4):说明哪一行代码切换了堆栈,在切换堆栈前后,求current_thread_info有什么变化
要求(5):说明哪一行代码切换了地址空间,在切换堆栈前还是后?为什么地址空间的切换不会影响后续切换代码的执行?
要求(6):说明哪一行代码的执行,使得current宏所代表的进程发生了变化
要求(7):说明哪一行代码的执行,使得任务状态段中关于内核堆栈的信息发生了变化
编写一个程序调整进程的调度策略和优先级
要求(8):先作为一个非实时进程调整其优先级,然后作为一个实时进程调整其调度策略和优先级
4,进程的创建,提交实验和分析报告
从用户态体验进程的创建
使用C语言编写一个程序,调用fork创建一个子进程,然后让子进程和父进程分别输出fork的返回值和各自的pid。
编写另外一个程序,连续3次调用fork, 然后让子进程和父进程分别输出fork的返回值和各自的pid,说明一共创建了几个进程?画出进程之间的创建关系(进程使用pid来标识)
对Linux中进程的创建进行分析
5,中断/异常/系统调用
分析中断、异常和系统调用的代码(任选其一),提交分析报告
要求(对于中断):
说明x86的中断机制,说明它在Linux中是如何实现的
说明Linux体系结构无关层是如何组织中断处理程序的
请结合一个具体的中断进行分析,例如某个设备驱动中的中断处理程序
分析该中断处理程序是如何注册的?
当该中断被触发,CPU是如何响应的,从什么代码开始执行,如何执行到这个设备驱动所注册的中断处理程序上的?
说明Linux中的软中断、tasklet和工作队列机制,在Linux中分别找到一个例子来说明设备是如何使用这三种机制的
请采用某种方法截获一个中断,例如键盘中断
要求(对于异常):
说明x86的异常机制,说明它在Linux内核中是如何实现的
以某个异常为例,从这个异常被触发开始,说明这个异常在Linux中是如何处理的
采用某种方法制造缺页异常
要求(对于系统调用):
Linux的系统调用利用了x86的哪种硬件机制?
说明Linux是如何组织系统调用的?
说明一个用户态的程序是如何进入系统调用中执行的?
以某个系统调用为例,从用户激活系统调用开始,分析系统调用在Linux中是如何一步一步执行的
自己编写一个系统调用,并编写用户态程序,从这个用户态程序中调用这个系统调用
任选其一,其中异常的难度最低,起评分最低
实验与分析报告和源代码
6,定时器
在用户态编写一个程序,该程序设定一个定时器,在时间到期的时候做出某种可观察的响应(方法不限)
分析你的程序的实际执行借助了内核的哪些机制
提交实验与分析报告
7,虚拟字符驱动
模拟一个字符设备,提供字符设备驱动
在Linux 2.6环境中,动态加载虚拟字符驱动模块
编写一个应用程序,对虚拟字符设备驱动进行读写
课堂举例的参考
Edited by
xlanchen@ustc.edu.cn
HeFei, Anhui, China.
Fall, 2014.