http://soft.buaa.edu.cn/linux/content/analyse.htm
源代码分析 |
|
|
一. 从以下几个Linux内核关键部分源代码中选择2项进行分析和论述。 |
|
1.内核的启动。主要代码位置:Init/main.c。 |
2.内存映射。主要代码位置:mm/mmap.c,mm/mremap.c。 |
3.进程的创建。主要代码位置:kernel/fork.c:包含了get_pid和do_fork;
fs/exec.c:包含了do_execve。 |
4.打开文件。主要代码位置:fs/open.c。 |
5.信号量的实现。主要代码位置:ipc/sem.c |
|
二. 针对所选择的主题,按以下内容写出分析报告。 |
|
1.所选内容的技术背景和应用价值
|
2.所使用的算法和数据结构
|
3.具体实现时函数的调用关系,并对各函数的基本功能进行说明 |
4.从操作系统原理的角度对所选择技术的优缺点及可能存在的改进方法进行分析。 |
|
三. 分析报告的内容、格式及要求 |
|
1.题目:根据自己所选内容自行拟定
2.摘要、关键词
3.技术的背景、特点和应用价值
4.数据结构表及变量说明
5.完成功能的主要函数表
6.重要程序段代码注释
7.代码阅读框图
8.功能说明
9.剖析体会:
① 结合操作系统的理论学习,谈操作系统具体功能如何实现。
② 阅读程序模块后有什么收获。
10.参考文献
分析报告要严格按要求内容撰写。根据论文的项目评分,缺项要减相应的分。
分析文档的篇幅应在8000字以上。 |
|
四. 流程概述 |
|
fork |
|
linux通过clone()系统调用实现fork().这个调用通过一系
列的参数标志来指明父、子进程需要共享的资源.fork()、
vfork()和_clone()库函数都根据各自需要的参数标志去调用clone()。然后由clone()去调用do_fork()。
do_fork()完成了创建中的大部分工作,它的定义在kernel/fork.c文件中。该函
数调用copy_process()函数,然后让进程开始运行。 |
|
mmap |
|
在用户空间可以通过mmap()系统调用获取内核函数do_mmap()的
功能。
mmap()系统调用定义如下:
void*mmap2(){void * start,
size_t length,
int prot,
int flags,
int fd,
off_t pgoff} |
|
启动 |
|
当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接
着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接
下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化
和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用
户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。 |
|
open |
|
函数 int open( const char *
pathname, int flags); 参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗
标.返回值 若所有欲核查的权限都通过了检查则返回0 值,表示成功,只要有一个权限被
禁止则返回-1。 |
|
信号量 |
|
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已经被占用的信号量时,
信号量会将其推进一个等待队列,然后将其睡眠。这时处理器能获自由,从而去执行其
他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,
并获得该信号量。 |
|
|
|
|