wiki:Linux2012

2012年春-Linux操作系统分析

  • 课程目标:
    • 掌握 Linux 操作系统基本概念,进一步加深对操作系统原理的理解
    • 掌握一种典型的操作系统——Linux 的内核构造、系统调用机制、标准库、Shell等,从代码和实践的角度理解操作系统软件架构及相关原理
    • 了解 Linux 内核中的进程管理、中断处理、内存管理、文件系统、设备驱动、网络体系结构等内容
  • 主讲教师:孟宁、李春杰

课程内容及课时安排

根据教学部安排Linux操作系统分析课程安排1-4,6-17周周四上午三节课(8:00-10:30)合计48个课时,18周2个课时安排考试(根据教学部安排时间会有所调整),共计50个课时,此外20个课时实验另行安排.

如果您之前从来没有接触过Linux系统或者不熟悉Linux Shell的基本命令,请您参考Linux GetStarted

实验内容

实验一:熟悉Linux系统,掌握Linux系统的构建和调试方法

  • 实验时间安排:第4周周一(3月5日)晚上18:30-22:00,连5节,地点:明德楼103实验室
  • Linux系统安装及基本Shell命令用法(熟悉的同学可以跳过)
  • 掌握以下GNU Tools的基本用法(参考GNUTools.pdf
    • gcc,as,ar,ld,nm,objdump,readelf,etc.
    • ld与链接描述文件
    • make和Makefile脚本的运行机制
    • gdb
  • How the Computer Works课件最后的作业
  • 按照Build & Run Linux System Based on VMware&Ubuntu10.04熟练掌握Linux系统调试环境
  • 现场检查要点:
    • 命令的基本功能和用法
    • 能以一个小程序为例解释其汇编指令的工作过程
    • 【重点】在模拟器中运行Linux系统,并用gdb工具设置断点查看源代码
      • 晋级点1:能实现系统启动完成后进入磁盘文件系统
      • 晋级点2:能实现系统启动完成后进入磁盘文件系统并系统支持libc,也就是非静态链接编译的程序可以通过调用libc的动态链接库顺利执行。
  • 请在3月1日前完成以上实验

实验二:系统调用的使用验证

  • 实验时间:第7周周三(3月28日)下午2:00-5:30 地点:103实验室
  • 预备知识:How the Computer Works课件最后的作业
  • 学习和了解链接描述符文件格式和ELF文件格式,可以参考linux链接描述符lds的格式GCC编译背后(第二部分:汇编和链接)
  • 实验内容:
    • 1.参考C代码中嵌入汇编代码示例及用汇编代码使用系统调用time示例编写使用C库函数和汇编代码两种方式使用某个系统调用(要求系统调用号后两位与您的学号后两位相同),并静态编译
    • 2.将1生成的可执行文件放入实验一阶段的根文件系统(或磁盘文件系统)中,模拟运行Linux在shell命令行下执行该可执行文件
    • 3.找到1使用的系统调用内核函数,添加printk您的学号姓名,重新编译内核、再次执行2.
  • 检查要点:
    • 1.模拟运行Linux在shell命令行下执行您的C库函数和汇编代码两种方式使用某个系统调用的程序,内核输出您的学号姓名。
    • 2.熟练通过glibc API函数追踪gblic代码和内核代码的调用过程,理解其关键机制,并能现场查找代码回答问题。
  • uselib系统调用的问题

实验三:可执行程序的加载、共享库和动态链接

  • 实验时间:5月15日晚上6:30-9:30,地点:103实验室;
  • 学习和了解ELF文件格式
  • 编译运行共享库和动态链接相关范例代码,该范例代码在自己构造的Linux系统中运行并追踪ld和kernel的行为过程;
  • 详细分析进程的创建与程序的装载运行相关代码实现,应涉及fork/execve系统调用等相关内核代码及Glibc中动态加载器等,完成分析报告
  • 分析报告的要求:
    • 1.分析报告要逻辑缜密,能自圆其说,并要通过实际试验调试运行来证实;
    • 2.分析报告中不得大段引用代码,报告中引用的关键代码要注明文件路径、文件名和代码行号。
    • 3.分析报告中分析的内容能附带说明如何通过实际试验验证更佳。
  • 分析报告应能解释如下几个问题:
    • 1.execve系统调用加载可执行文件后返回用户态的地址信息是哪个位置?
    • 2.execve系统调用加载动态链接的可执行文件时是在内核代码中什么位置加载动态链接器的?是根据ELF文件中的什么信息找到并加载动态连接器的?
    • 3.动态链接器是glibc的一部分,动态连接器本身是静态编译的还是动态链接的?它是如何加载可执行文件依赖的其他动态链接库的?

实验四:进程切换与进程调度时机

  • 实验时间:16周周二(5月29日)晚上6:30-9:30,地点:103实验室;
  • 完成Linux内核进程切换与进程调度时机分析报告
  • 仔细阅读switch_to宏,参见arch/x86/include/asm/system.h 报告应能回答如下问题:
  * 什么时候next进程真正开始执行呢?
  * 当__switch_to正常返回时,发生了什么事情?
  * __switch_to用来处理其他上下文的切换,此时,使用的堆栈是next进程的堆栈,这个堆栈上没有__switch_to需要的参数prev和next,那是怎么传参呢?
  * 每个进程都有4G的进程地址空间,进程切换时需要分辨不同的进程地址空间进行切换吗?为什么?
  • 调研进程的调度时机,并引用内核代码举例说明几种典型的调度时机点
    • 内核态和用户态只是权限不同的代码分类,从运行实体的角度看进程(内核线程是特殊一点的进程)和中断处理程序是运行实体。
  • Linux操作系统是如何工作的?理解进程调度的时机选择和进程切换的关键环节,我想应该可以回答这个问题了。

实验五:几种常见的Linux进程间通讯机制及Linux网络体系架构分析

  • 完成以下内容并撰写实验报告
  • 学习理解几种常见的Linux进程间通讯机制并编程实际验证
    • 信号
    • 管道和FIFO(有名管道)
    • 消息队列
    • 信号量
    • 共享内存区
    • 套接字
    • 相关代码
  • 分析socket API读写数据与网卡收发数据之间数据处理过程,可选择UDP的recvfrom和sendto为例进行分析。

参考资料

Last modified 5 years ago Last modified on 06/11/12 16:54:27

Attachments (23)