linux源代码分析与研究.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《linux源代码分析与研究.pdf》由会员分享,可在线阅读,更多相关《linux源代码分析与研究.pdf(135页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 1 章 引言 Linux 是一种能运行于多种平台、源代码公开、免费、功能强大、遵守 POSIX标准、与 UNIX 兼容的操作系统。Linux 最初版本是由 Linus Benedict Torvalds 编写的,为了能够使 Linux 更加完善,Torvalds在网络上公开了Linux的源码,邀请全世界的志愿者来参与Linux的开发。在这些无私的人们的帮助下,Linux 得到不断的完善,并在短时期内迅速崛起。现在,Linux 内核已经发展到了 2.5.X 版,并还在以相当快的速度不断地发展着。据报道,它是一个很有发展前途的操作系统,也是为数不多可以与 Microsoft旗下操作系统相竞争的
2、操作系统。我国的 IT 产业起步较晚,技术落后于西方经济发达国家。在我国,由于受知识产权的限制,无论是使用 PC 平台上的 Windows,还是使用应用于大中型机的UNIX,都无法窥视到其内部结构。这些系统很可能存在不为我们所知的漏洞,如果这些漏洞为别有用心者所利用,将会严重危及我国的经济安全和国家安全。操作系统不同于其它软件产品,它是其它应用程序得以运行的平台,应用软件的开发必须基于对相应平台(操作系统)的技术的理解和掌握。由于我们的软件企业无法获知这些系统的细节,根本无法与拥有这些关键技术的国外先进企业相抗衡,长此以往,将会对我国软件产业产生深远的负面影响。为了打破这种受制于人的局面,我国
3、迫切的需要开发一个具有自主知识产权的操作系统。由于 Linux 性能优越,属于自由软件,公开源代码且完全免费,所以拿来作发展自主知识产权的操作系统的底版是非常合适的选择。只有完全了解当前Linux 的实现细节,才能在它的基础上作进一步的开发和完善。因此,分析 Linux源代码对于在Linux现有的基础上开发我们自己的Linux就具有非常现实和重要的意义。本论文主要在源码水平上讨论 Linux 内核进程调度与控制的实现,其目的是通过对源码的分析与研究,找出Linux在本论文研究方向上的优缺点,作为今后Linux系统开发的参考。1 第 2 章 Linux 内核的整体结构 Linux 内核由 5 个
4、主要的子系统组成。这 5 个子系统分别是进程调度(SCHED)、内存管理(MM)、虚拟文件系统(Virtual File System,VFS)、网络接口(NET)和进程间通信(IPC)。进程调度控制着进程对 CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。内存管理允许多个进程安全地共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操
5、作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。虚拟文件系统隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,虚拟文件系统还支持多达数十种不同的文件系统,这也是 Linux 较有特色的部分。虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux所支持的文件系统,如 ext2、fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。网络接口提供
6、了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。进程间通信支持进程间各种通信机制。下图显示了上述五个子系统之间的关系:2 虚拟文件系统虚拟文件系统逻辑文件系统硬件驱动程序内存管理内存管理硬件无关硬件相关网络网络网络协议硬件驱动程序进程调度进程调度进程间通信进程间通信 各个子系统之间的依赖关系如下:1 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将
7、程序和数据装入内存。2 进程间通信与内存管理之间的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有内存,还可存取共同的内存区域。3 虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持 RAMDISK 设备。4 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前当前正在运行的进程。在这些子系统中,进程调度子系统是其他子系统得以顺利工作
8、的关键。无论是文件系统的系统进程还是网络子系统的服务进程都需要通过进程调度来获得相应的 CPU 时间以正常运行。3第 3 章 Linux 进程调度 3.1 相关概念简述 3.1.1Linux 进程的四个要素 一般来说 Linux 系统的进程都具备下列诸要素:(1)有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。(2)有进程专用的内核空间堆栈。(3)在内核中有一个 task_struct 数据结构,即通常所说的“进程控制块”。有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。同时,这个结构还记录着进程所占用的各项资源。(4)有独立的存储空间,这意味着拥有
9、专有的用户空间;进一步,还意味着除前述的内核空间堆栈外还有其专用的用户空间堆栈。有一点必须指出,内核空间是不能独立的,任何进程都不可能直接(不通过系统调用)改变内核空间的内容(除其本身的内核空间堆栈以外)。这四条都是必要条件,缺了任何一条都不能成为“进程”。如果只具备了前三条而缺第四条,就称为“线程”。如果完全没有用户空间,就称为“内核线程”(kernel thread);而如果共享用户空间则称为“用户线程”。二者往往都简称“线程”。事实上,在 Linux 系统中,进程和线程的区分并不十分严格,许多进程在“诞生”之初都与其父进程共用同一个存储空间,所以严格说来还是线程;但是子进程可以建立其自己
10、的存储空间,并与父进程分离,成为真正意义上的进程。3.1.2 task_struct 结构描述 task_struct结构是向系统表明进程存在的唯一凭证,它包含了进程的全部信息。同时,也是进程为实现操作而取得必要资源的唯一途径。下面列出了 task_struct结构的全部源码,在源码后面有对 task_struct 结构(参见 includelinuxsched.h)各数据项的分类解释:struct task_struct /*these are hardcoded-dont touch*/volatile long state;/*-1 unrunnable,0 runnable,0 sto
11、pped*/unsigned long flags;/*per process flags,defined below*/int sigpending;mm_segment_t addr_limit;/*thread address space:0-0 xBFFFFFFF for user-thead 0-0 xFFFFFFFF for kernel-thread */struct exec_domain*exec_domain;long need_resched;4/*various fields*/long counter;long priority;cycles_t avg_slice;
12、/*SMP and runqueue state*/int has_cpu;int processor;int last_processor;int lock_depth;/*Lock depth.We can context switch in and out of holding a syscall kernel lock.*/struct task_struct*next_task,*prev_task;struct list_head run_list;/*task state*/struct linux_binfmt*binfmt;int exit_code,exit_signal;
13、int pdeath_signal;/*The signal sent when the parent dies */*?*/unsigned long personality;int dumpable:1;int did_exec:1;pid_t pid;pid_t pgrp;pid_t tty_old_pgrp;pid_t session;/*boolean value for session group leader*/int leader;/*pointers to(original)parent process,youngest child,younger sibling,*olde
14、r sibling,respectively.(p-father can be replaced with *p-p_pptr-pid)*/struct task_struct*p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;/*PID hash table linkage.*/struct task_struct*pidhash_next;struct task_struct*pidhash_pprev;wait_queue_head_t wait_chldexit;/*for wait4()*/struct semaphore*vfork_sem;/*f
15、or vfork()*/unsigned long policy,rt_priority;unsigned long it_real_value,it_prof_value,it_virt_value;unsigned long it_real_incr,it_prof_incr,it_virt_incr;5 struct timer_list real_timer;struct tms times;unsigned long start_time;long per_cpu_utimeNR_CPUS,per_cpu_stimeNR_CPUS;/*mm fault and swap info:t
16、his can arguably be seen as either mm-specific or thread-specific*/unsigned long min_flt,maj_flt,nswap,cmin_flt,cmaj_flt,cnswap;int swappable:1;/*process credentials*/uid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;int ngroups;gid_t groupsNGROUPS;kernel_cap_t cap_effective,cap_inheritable,cap_pe
17、rmitted;struct user_struct*user;/*limits*/struct rlimit rlimRLIM_NLIMITS;unsigned short used_math;char comm16;/*file system info*/int link_count;struct tty_struct*tty;/*NULL if no tty*/*ipc stuff*/struct sem_undo*semundo;struct sem_queue*semsleeping;/*CPU-specific state of this task*/struct thread_s
18、truct thread;/*filesystem information*/struct fs_struct*fs;/*open file information*/struct files_struct*files;/*memory management info*/struct mm_struct*mm,*active_mm;/*signal handlers*/spinlock_t sigmask_lock;/*Protects signal and blocked*/struct signal_struct*sig;sigset_t signal,blocked;struct sig
19、nal_queue*sigqueue,*sigqueue_tail;unsigned long sas_ss_sp;size_t sas_ss_size;1.调度数据成员 6(1)(1)volatile long states;volatile long states;表示进程的当前状态:TASK_RUNNING:正在运行或在就绪队列 run-queue 中准备运行的进程,实际参与进程调度。TASK_INTERRUPTIBLE:处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号(signal)或定时中断唤醒后进入就绪队列 run-queue。TASK_UNINTERRUPTIBLE
20、:处于等待队列中的进程,待资源有效时唤醒,不可由其它进程通过信号(signal)或定时中断唤醒。TASK_ZOMBIE:表示进程结束但尚未消亡的一种状态(僵死状态)。此时,进程已经结束运行且释放大部分资源,但尚未释放进程控制块。TASK_STOPPED:进程被暂停,通过其它进程的信号才能唤醒。导致这种状态的原因有二,或者是对收到 SIGSTOP、SIGSTP、SIGTTIN 或 SIGTTOU信号的反应,或者是受其它进程的 ptrace 系统调用的控制而暂时将 CPU 交给控制进程。TASK_SWAPPING:进程页面被交换出内存的进程。(2)(2)unsigned long flags;un
21、signed long flags;进程标志:PF_ALIGNWARN 打印“对齐”警告信息。PF_PTRACED 被 ptrace 系统调用监控。PF_TRACESYS 正在跟踪。PF_FORKNOEXEC 进程刚创建,但还没执行。PF_SUPERPRIV 超级用户特权。PF_DUMPCORE dumped core。PF_SIGNALED 进程被信号(signal)杀出。PF_STARTING 进程正被创建。PF_EXITING 进程开始关闭。PF_USEDFPU 该进程使用 FPU(SMP only)。PF_DTRACE delayed trace(used on m68k)。(3)(3
22、)long priority;long priority;进程优先级。Priority 的值给出进程每次获取 CPU 后可使用的时间(按jiffies 计)。优先级可通过系统调用 sys_setpriorty 改变(在 kernel/sys.c 中)。(4)(4)unsigned long rt_priority;unsigned long rt_priority;rt_priority给出实时进程的优先级,rt_priority+1000给出进程每次获取CPU后可使用的时间(同样按 jiffies 计)。实时进程的优先级可通过系统调用sys_sched_setscheduler()改变(见
23、kernel/sched.c)。(5)(5)long counter;long counter;在轮转法调度时表示进程当前还可运行多久。在进程开始运行是被赋为priority 的值,以后每隔一个 tick(时钟中断)递减 1,减到 0 时引起新一轮调度。重新调度将从 run_queue 队列选出 counter 值最大的就绪进程并给予 CPU 使用权,因此 counter 起到了进程的动态优先级的作用(priority 则是静态优先级)。(6)(6)unsigned long policy;unsigned long policy;该进程的进程调度策略,可以通过系统调用 sys_sched_s
24、etscheduler()更改(见 kernel/sched.c)。调度策略有:SCHED_OTHER 0 非实时进程,基于优先权的轮转法(round robin)。7SCHED_FIFO 1 实时进程,用先进先出算法。SCHED_RR 2 实时进程,用基于优先权的轮转法。2.信号处理(1)(1)unsigned long signal;unsigned long signal;进程接收到的信号。每位表示一种信号,共 32 种。置位有效。(2)(2)unsigned long blocked;unsigned long blocked;进程所能接受信号的位掩码。置位表示屏蔽,复位表示不屏蔽。(
25、3)(3)struct signal_struct*sig;struct signal_struct*sig;因为 signal 和 blocked 都是 32 位的变量,Linux 最多只能接受 32 种信号。对每种信号,各进程可以由 PCB 的 sig 属性选择使用自定义的处理函数,或是系 统 的 缺 省 处 理 函 数。指 派 各 种 信 息 处 理 函 数 的 结 构 定 义 在include/linux/sched.h 中。对信号的检查安排在系统调用结束后,以及“慢速型”中断服务程序结束后(IRQ#_interrupt(),参见 9。5 节“启动内核”)。3.进程队列指针(1)(1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 源代码 分析 研究
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内