首 页文章中心

Linux学习网

您的位置Linux学习网 > Linux综合 > 文章内容

Linux源代码的注释

作者:佚名  来源:不详  发布时间:2007-12-21 16:50:00
接触Linux内核已有一段时间了,算是对操作系统有了那吗一点点的认识,今天突然心血来潮,想把自己学的一点东西写出来.于是便来到了论坛,小可学艺未精,不当之处还请包涵.cwaLinux联盟
下面先说一下操作系统存在的基础或理由:cwaLinux联盟
计算机中最重要和最智能化的硬件部件是中央处理器(CPU),为什么这么说呢?原因是CPU提供了一套最基本的指令集,这个东西(指令集)是计算机能够进行数据处理的基础.举个例子,当你进行c语言编程时有一条最简单的赋值语句x=3,它是怎么被计算机执行的呢? 在计算机的CPU内部他是把3这个数送入x所在的内存单元,其中最重要的”送”这个命令是谁发出的呢?就是CPU的电子脉冲,CPU里面定义了很多这样的电子脉冲,比如'加'指令的电子脉冲,”跳转”指令(实现循环)的电子脉冲等.而这些电子脉冲合起来就是所谓的CPU指令集.它定义了计算机内部最基本的运算方式,计算机的所有的算法最后都被分解成这些最基本的运算方式,就像是数学上不管怎么难的算式最后都分解成加法,减法,乘法,除法等最基本的算式一样. cwaLinux联盟
利用这些指令集定义的最基本的算法构建的更为复杂的算式就是所谓的计算机软件, cwaLinux联盟
操作系统以是一种软件,以是一大堆最基本的指令集的组合.只不过它是管理其它软件的软件,如果把操作系统看比做物理上的公式的话,那么一般的应用软件就好像是套用这公式的数据一样.现在应该知道操作系统存在的基础和理由了吧!cwaLinux联盟
下面就开始说操作系统的部分了:cwaLinux联盟
操作系统是由一大堆基本指令组成的更为复杂的程序,一般操作系统都是用c语言的编写的,c语言编写的操作系统在安装是被编译器编译成二进制代码存放在计算机的硬盘当中,cwaLinux联盟
计算机打开电源的时候被读入内存,然后就由操作系统利用自己的程序控制整个计算机的软件和硬件.cwaLinux联盟
操作系统是怎么控制整个计算机的软硬件的呢,当然是通过它自己的程序来控制计算机的,现在讨论的问题是操作系统通过什么样的程序来控制计算机的.cwaLinux联盟
总的来说操作系统分为五大部分:cwaLinux联盟
进程管理,内存管理,文件管理,网络管理,设备管理.cwaLinux联盟
下面就以这五部分为总纲,我有一一道来:    style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">进程管理:cwaLinux联盟
什么是进程,cwaLinux联盟
大家都用过计算机,知道什么是计算机程序.我们说写在纸上或者存储在计算机的硬盘上的一段代码就是程序.那什么是进程呢?我们说在计算机上运行的程序就是进程.cwaLinux联盟
那进程和程序和什么区别呢?程序是写在纸上或者是存储在计算机硬盘上一段”死”的代码,当这段代码进入计算机内存被计算机执行的时候就变成了进程,进程是”活”的东西.因为进程是在计算机中被执行的程序,所以它比程序要多考虑的东西就是计算机内部的运行环境.cwaLinux联盟
在操作系统中进程和任务是同一个概念.我们用的操作系统基本上都是多任务操作系统(window/Linux在同一时间有多个进程运行),那么这么多进程是怎么同时在CPU上运行的哪?cwaLinux联盟
这就是进程管理要解决的问题.cwaLinux联盟
在计算机中要执行一个程序,首先将程序的代码从硬盘读入到内存,然后CPU根据程序代码指令一条一条的执行,而这时候的程序就叫进程,计算机中同时存在多个进程在等待被执行,比如你在用window/Linux上网的时候,你一边用QQ和朋友聊天,一边在用MP3播放器听音乐,一边在浏览网页.那么这时候在计算机中就有三个进程在同时运行,一是QQ进程,二是MP3播放器进程,三是浏览器进程.但是计算机中只有一个CPU,在一个时间点上,它只能运行一个进程的指令,比如在2005/11/29/日 08/23/42/秒时计算机的CPU执行的是QQ进程的一条加法(mov)指令.那么计算机是怎样让三个进程同时运行起来的呢(至少我们看来是这样).cwaLinux联盟
在计算机内部所有的正在运行的进程都在等待被CPU执行,操作系统按一定的规律让所有的进程都得到CPU的执行.方法是一会儿让QQ进程执行,过了一定时间后又让MP3播放器进程得到CPU的执行,再过一定时间后让浏览器进程得到CPU的执行.相对于人的反应,CPU的执行速度太快,所以人根本感觉不到这些进程的切换过程,也不会对人的操作产生影响 style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word"> style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">现在的问题是操作系统是按照什么样的规律给个各进程分配CPU资源的.操作系统是按照个各进程的属性来分配CPU资源的.那进程的属性在什么呢?当操作系统创建一个进程时都就为这个进程分配了一定的内存空间来存放它的属性.在Linux操作系统中,操作系统定义了一个数据结构task_struct来描述各个进程的进程属性,task_struct结构叫进程控制块(PCB), 它是操作系统中重要的数据结构之一.具体定义在/include/linux/sched.h中,注意在Linux操作系统中所有的操作系统源代码都在/usr/src目录下.cwaLinux联盟
task_struct结构的代码如下所示:cwaLinux联盟
(这里以2.40内核为准,可能不同版本的内核代码会有一点点的不同)cwaLinux联盟
(为了保持简洁,从宏关上把握,不拘泥于具体,这里只说一部分,其它的以后会讲到,这里只说功能)cwaLinux联盟
cwaLinux联盟
____________________________________________________/include/linux/sched.h cwaLinux联盟
cwaLinux联盟
struct task_struct {cwaLinux联盟
cwaLinux联盟
volatile long state; /* 进程的状态,在代码后面有说明*/cwaLinux联盟
unsigned long flags; /* 进程标志 */cwaLinux联盟
int sigpending;cwaLinux联盟
mm_segment_t addr_limit; /* 线性地址空间:cwaLinux联盟
0-0xBFFFFFFF 为用户线性空间地址;cwaLinux联盟
0-0xFFFFFFFF 为内核线性空间地址 */cwaLinux联盟
cwaLinux联盟
struct exec_domain *exec_domain;cwaLinux联盟
volatile long need_resched; cwaLinux联盟
unsigned long ptrace; cwaLinux联盟
cwaLinux联盟
int lock_depth; cwaLinux联盟
cwaLinux联盟
long counter; /* 进程的动态优先级,在代码后面有说明 */cwaLinux联盟
long nice; /* 进程的静态优先级,在代码后面有说明 */cwaLinux联盟
unsigned long policy; /* 进程采用的调度策略,在代码后面有说明 */cwaLinux联盟
struct mm_struct *mm; /* 进程属性中指向内存管理的数据结构mm_structd的 cwaLinux联盟
指针,在代码后面有说明 */cwaLinux联盟
int has_cpu, processor;cwaLinux联盟
unsigned long cpus_allowed;cwaLinux联盟
cwaLinux联盟
struct list_head run_list;cwaLinux联盟
unsigned long sleep_time;cwaLinux联盟
cwaLinux联盟
struct task_struct *next_task , *prev_task; /* 所以进程通过这两个指针组成cwaLinux联盟
一个双向链表*/cwaLinux联盟
struct mm_struct *active_mm; /* 指向活动地址空间,在后面的代码有说明 */ cwaLinux联盟
/* task state */cwaLinux联盟
struct linux_binfmt *binfmt;cwaLinux联盟
int exit_code, exit_signal; style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word"> style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">int pdeath_signal; cwaLinux联盟
unsigned long personality;cwaLinux联盟
int did_exec:1;cwaLinux联盟
int dumpable:1;cwaLinux联盟
pid_t pid; /* 进程标志符,,在代码后面有说明 */cwaLinux联盟
pid_t pgrp; /* 进程组标号,,在代码后面有说明 */cwaLinux联盟
pid_t tty_old_pgrp;cwaLinux联盟
pid_t session;cwaLinux联盟
pid_t tgid;cwaLinux联盟
cwaLinux联盟
int leader;cwaLinux联盟
cwaLinux联盟
struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;cwaLinux联盟
/* 这五个标志表示一个进程的在计算机中的亲属关系,cwaLinux联盟
分别标志祖先进程,父进程,子进程,弟进程和兄进程,cwaLinux联盟
为了在两个进程之间共享方便而设立 */cwaLinux联盟
struct list_head thread_group;cwaLinux联盟
cwaLinux联盟
struct task_struct *pidhist_next;cwaLinux联盟
struct task_struct *pidhist_pprev; /* 上面两个指针是为了在计算机中快速查 cwaLinux联盟
一个进程而设立,具体方式以后讲*/cwaLinux联盟
wait_queue_head_t wait_chldexit; cwaLinux联盟
struct completion *vfork_sem; cwaLinux联盟
unsigned long rt_priority; /* 实时进程的优先级标志*/ cwaLinux联盟
unsigned long it_real_value, it_prof_value, it_virt_value;cwaLinux联盟
unsigned long it_real_incr, it_prof_incr, it_virt_incr;cwaLinux联盟
struct timer_list real_timer;cwaLinux联盟
struct tms times;cwaLinux联盟
struct tms group_times;cwaLinux联盟
unsigned long start_time;cwaLinux联盟
long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];cwaLinux联盟
cwaLinux联盟
unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;cwaLinux联盟
int swappable:1;cwaLinux联盟
cwaLinux联盟
uid_t uid,euid,suid,fsuid;cwaLinux联盟
gid_t gid,egid,sgid,fsgid;cwaLinux联盟
int ngroups;cwaLinux联盟
gid_t groups[NGROUPS];cwaLinux联盟
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;cwaLinux联盟
int keep_capabilities:1;cwaLinux联盟
struct user_struct *user;cwaLinux联盟
cwaLinux联盟
struct rlimit rlim[RLIM_NLIMITS];cwaLinux联盟
unsigned short used_math;cwaLinux联盟
char comm[16];cwaLinux联盟
cwaLinux联盟
int link_count;cwaLinux联盟
struct tty_struct *tty; /* NULL if no tty */cwaLinux联盟
unsigned int locks; /* How many file locks are being held */ style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word"> style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">struct sem_undo *semundo;cwaLinux联盟
struct sem_queue *semsleeping;cwaLinux联盟
cwaLinux联盟
struct thread_struct thread;cwaLinux联盟
cwaLinux联盟
struct fs_struct *fs; /* 进程属性中指向和文件管理有关的数据结构*/ cwaLinux联盟
cwaLinux联盟
struct files_struct *files;cwaLinux联盟
cwaLinux联盟
spinlock_t sigmask_lock;cwaLinux联盟
struct signal_struct *sig;cwaLinux联盟
cwaLinux联盟
sigset_t blocked;cwaLinux联盟
struct sigpending pending;cwaLinux联盟
cwaLinux联盟
unsigned long sas_ss_sp;cwaLinux联盟
size_t sas_ss_size;cwaLinux联盟
int (*notifier)(void *priv);cwaLinux联盟
void *notifier_data;cwaLinux联盟
sigset_t *notifier_mask;cwaLinux联盟
cwaLinux联盟
cwaLinux联盟
u32 parent_exec_id;cwaLinux联盟
u32 self_exec_id;cwaLinux联盟
cwaLinux联盟
spinlock_t alloc_lock;cwaLinux联盟
cwaLinux联盟
spinlock_t switch_lock;cwaLinux联盟
};cwaLinux联盟
cwaLinux联盟
____________________________________________________/include/linux/sched.h cwaLinux联盟
cwaLinux联盟
程序说明如下:cwaLinux联盟
cwaLinux联盟
volatile long state 定义了进程的状态,进程总共有6种状态标志,分别是:cwaLinux联盟
一. TASK_RUNING. (正在运行状态或者是可运行状态)cwaLinux联盟
二. TASK_INTERRUPTIBLE,(可打断睡眠状态)cwaLinux联盟
三. TASK_UNINTERRUPTIBLE,(不可打断睡眠状态)cwaLinux联盟
四. TASK_ZOMBLE. (僵死状态)cwaLinux联盟
五. TAKS_STOPPED.(暂停状态)cwaLinux联盟
六. 交换状态.cwaLinux联盟
这六种属性标志了此进程现在的状态,各种不同的状态决定了进程什么时候获得CPU而被执行.cwaLinux联盟
正在运行状态是当前正在运行进程的状态.也就是说他的volatile long state被标志成TASK_RUANING.cwaLinux联盟
可运行状态是那些正在等待CPU资源的进程的状态,这些进程在就绪队列run-queqe中.这些进程只要得到CPU在个资源就马上可以被运行.其也被标志也为TASK_RUANING.cwaLinux联盟
可打断睡眠状态是哪些在等待队列中等待除CPU之外的其它资源的进程,只要它们所等待的资源到达就马上可以从等待队列进入就绪队列,其状态标志也 style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word"> style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">从TASK_INTERRUPTIBLE状态变成TASK_RUANING可运行状态.cwaLinux联盟
不可打断睡眠状态和可睡眠状态类似,区别在于前者可以用信号唤醒,而后者不可以.cwaLinux联盟
僵死状态是标志那些已经运行完毕释放了大部分资源并退出但还没有释放进程控制快task_struct的进程.cwaLinux联盟
暂停状态是那些遇到突发情况或者收到暂停信号而暂时停止运行的进程的状态.cwaLinux联盟
cwaLinux联盟
counter是进程的动态优先级,它定义了一个在就绪队列的进程当它得到CPU后可运行的时间,用静态优先级初始化,当然计算机是以时钟中断做为时间的计数器,每发送一个时钟中断,动态优先级上的时间片就减少一个时钟中断的时间,时间片减到0的时候就退出该进程而调度另一个进程获得CPU.cwaLinux联盟
cwaLinux联盟
nice是进程的静态优先级,当一个在就绪队列中的进程获得CPU之后,它被赋予此进程可占有CPU的时间.这个时间被称为时间片. cwaLinux联盟
cwaLinux联盟
policy是进程的调度策略标志.有三种调度标志:cwaLinux联盟
SCHED_OTHER 普通进程的调度策略,基于优先权的轮转法.cwaLinux联盟
SCHED_FIFO 实时进程的调度策略,基于先进先出的算法.cwaLinux联盟
SCHED_RR 实时进程的调度策略,基于优先权的轮转法.
收藏本页到: 365Key | del.icio.us | | 添加到雅虎收藏+
  • 网站帮助 - 广告合作 - 网站地图