linux 2.6源代码情景分析笔记之进程2
能被独立调度的每个执行上下文都必须拥有自己的进程描述符。进程和进程描述符之间有严格的对应关系,使用32位进程描述符地址标识,进程描述符指针指向这些地址,内核对进程的大部分引用是通过进程描述符指针进行的。
可以使用pid(进程标识符)来标记进程,存放在字段pid中,PID被顺序编号,新创建的进程PID通常是前一个进程的PID加一。
#define PID_MAX_DEFAULT 0x8000
一个线程租中的所有线程使用和该线程组的领头线程(thread group leader)相同的PID,也就是该组中第一个轻量级进程的PID,被存入进程描述符的tgid字段中。getpid()系统调用返回当前进程的tgid值而不是pid的值,因此一个多线程应用的所有线程共享相同的PID。绝大多数进程都属于一个线程组,包含单一的成员;线程组领头线程其tgid的值与pid的相同,因而getpid()系统调用对这类进程所其的作用和一般进程是一样的。
对每个进程来说,linux把两个不同的数据结构紧凑地存放在一个单独为进程分配的存储区域内:一个内核态的进程堆栈,另一个是紧挨进程描述符的小数据结构thread_info,叫做线程描述符,这块存储区域的大小通常为8192个字节(两个页框)。内核让这8k空间占据连续的两个页框并让第一个页框的起始地址是2^13的倍数。当几乎没有可用的动态内存空间时,就会很难找到这样的两个连续页框,因为空闲空间可能存在大量碎片。内核态的进程访问处于内核数据段的栈,这个栈不同于用户态的进程所用的栈。因为内核控制路径使用很少的栈,因此只需要几千个字节的内核态堆栈。使用task和thread_info字段使thread_info结构与task_struct结构互相关联。
esp寄存器是cpu栈指针,用来存放栈顶单元的地址。栈起始于末端,并朝这个内存区开始的方向增长。从用户态刚切换到内核态之后,进程的内核栈总是空的,因此,esp寄存器指向这个栈的顶端。一旦数据写入堆栈,esp的数值就递减。(thread_info结构是52个字节长)
union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
使用以上联合结构表示一个进程的线程描述符和内核栈。
struct thread_info {
struct task_struct *task; /* main task struct
相关文档:
引导 Linux® 系统的过程包括很多阶段。不管您是引导一个标准的 x86 桌面系统,还是引导一台嵌入式的
PowerPC® 机器,很多流程都惊人地相似。本文将探索 Linux
的引导过程,从最初的引导到启动第一个用户空间应用程序。在本文介绍的过程中,您将学习到各种与引导有关的主题,例如引导加载程序、内核解压、初始
RA ......
转自:http://www.91linux.com/html/article/kernel/20090102/15232.html
select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个, ......
在vMware装上linux鼠标无法使用问题解答
昨天装了Linux+VMware,还用得好好的,今天鼠标就不能用,现在终于把问题解决了!
目前大部分鼠标是usb接口的,特别是笔记本。在vMware装上linux时鼠标类型选择带滑轮的USB后,进入系统时将出现鼠标无法使用的情 ......
Red Hat Linux的分区是不同于其它操作系统分区的,它的分区格式只有Ext2(Ext3)和Swap两种,Ext2(Ext3)用于存放系统文件,Swap则作为Red Hat Linux的交换分区。Red Hat Linux至少需要两个专门的分区(Linux Native和Linux Swap)况且不能将Red Hat Linux安装在Dos/Windows分区。一般来说我们将Red Hat Linux安装一个或多 ......