linux kernel(二) 进程描述符

由于自己初入linux内核,文章主要基于LKD(Linux Kernel Development) 和 (Linux Devices Drives)两本书,


分配进程描述符

slab分配器,task_struct结构,以实现对象复用,缓存着色

关于slab分配器可参考以下文章,包括内存的管理,十分详细

http://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#icomments

slab分配器动态生成task_struct,只需在栈顶或栈底创建新的结构struct thread_info

引入该结构不仅使得拥有较少寄存器的x86架构的计算机可以只通过栈的指针来计算其地址,而且使得汇编代码在计算其偏移时变得十分容易。

thread_info结构的定义如下,可以在内核源代码中<asm/thread_info.h>找到其定义,类似如下代码,来源于kernel2.6

struct thread_info{

struct task_struct  *task;
struct exec_domain *exec_domain;
__u32 flags;
__u32 status;
__u32 cpu;
int preempt_count;
mm_segment_t addr_limit;
struct restart_block restart_block;
void *sysenter_return;
int uaccess_err;

};


内核栈在kernel-2.6里面的实现是(kernel-2.6.32):

 Union thread_union {

                   Struct thread_info thread_info;

                   Unsigned long stack[THREAD_SIZE/sizeof(long)];

 };


进程描述符的存放:

内核通过一个唯一的进程标识值(process identification value)或PID来标识每一个进程,PID默认值一般为32768,我用的是opensuse13.1,也是32768,可以在/proc/sys/kernel/pid_max中查看。可以作为超级用户去修改,但是如果不是服务器,对于一般用户来说这个可以不用去管。

由于在内核中访问任务通常要获得指向task_struct的指针,可通过current宏查找,在x86的架构中,由于寄存器数量较少,因此在内核栈栈底创建thread_info结构通过计算偏移量来间接查找task_struct结构。在x86架构中current把栈指针的后13个有效位屏蔽掉,通过current_thread_info()函数实现查找。

汇编代码

movl $-8192, %eax

andl %esp, %eax

8192为内核栈的大小


进程描述符中的 __u32 status;描述进程的状态:
该status域的值为5种进程状态中的一种,
TASK_RUNNING 进程是可执行的,或在执行,或在消息队列中等待执行
TASK_INTERRUPTIBLE 进程在睡眠(阻塞)并随时准备接受信号投入运行

TASK_UNINTERRUPTIBLE 接受到信号也不会被唤醒,与可打断类似,对信号不做响应,例如在linux terminal中使用ps命令看到那些 标识为D的状态又不能被杀死的进程,不过如果用-9参数强行杀死可能会遇到一些意想不到的问题。

__TASK_TRACED 被跟踪,例如调试工具跟踪

__TASK_STOPPED 进程停止执行

在内核中,使用set_task_state(task,state)函数来设置当前进程状态; 可参考<linux/sched.h>


进程创建:

把上述步骤分解到两个单独的函数中去执行,fork(),exec()指exec()一族的函数

fork()先创建一个子进程,exec()函数负责读取可执行文件并将其载入地址空间开始运行,这两者合起来的作用即相当其他操作系统单一进程创建函数一般,至于这样设计的原理,有兴趣自己思考一下。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值