linux进程0的内核栈,Linux-0.11内核源码分析系列:进程调度

/*

*Author  : DavidLin

*Date    : 2014-12-10pm

*Email   : linpeng1577@163.com or linpeng1577@gmail.com

*world   : the city of SZ, in China

*Ver     : 000.000.001

*history :     editor      time            do

*          1)LinPeng       2014-12-10      created this file!

*          2)

*/

/* author : linus */

void sleep_on(struct task_struct **p)

{

struct task_struct *tmp;

if(!p)

return;

if(current == &(init_task.task))    //init进程不可睡眠

panic("task[0] trying to sleep");

tmp = *p;   //tmp指向上一个当前进程

*p  = current;    //链表头执行当前进程

current->state = TASK_UNINTERRUPTIBLE;    //睡眠进程不可中断

schedule();    //进程调度,以下代码进程被唤醒之后才会继续执行

if(tmp)  //如果链表next不为空

tmp->state = 0;  //唤醒next进程

}

sleep_on函数可以在sched.c文件中找到,这是一个小函数,不过,

它暗含了如下几个知识点,所以理解起来比schedule()函数更加困难:

1.用户栈与内核栈的区别;

2.内核栈保存在哪里,与用户栈共享?

3.几个进程同时为同一个资源而sleep_on,具体流程?

4.sleep之后如何唤醒?

5.不同进程使用相同的sleep代码,而不同的数据,这个概念的理解。

答:以下基于0.12内核,2.6内核会有所不同,不过基本概念一致

1.用户栈保存在进程数据段,内核栈保存在进程pcb所在的物理页;fork.c中

p->tss.esp0 = PAGE_SIZE + (long)p;    //2.6内核保存在thread_info所在物理页

p->tss.ss0   = 0x10;    //进程内核栈保存在内核数据段

2.不共享,原因如上;

3.tmp相当于单链表next指针, 把等待同一个资源的进程链接在一起,头指针永远指向最新插入的进程;

4.唤醒之后从schedule()函数之后执行,通过内核唤醒;

6.代码段可以相同,在不同内存执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值