momo zone

调核人的blog

关于sleep_on(&buffer_wait)的疑惑

在buffer.c 有这段:
 

static struct task_struct * buffer_wait = NULL;

 
……
 
struct buffer_head * getblk(int dev,int block)
{
…… 
 do {
  if (tmp->b_count)
   continue;
  if (!bh || BADNESS(tmp)<BADNESS(bh)) {
   bh = tmp;
   if (!BADNESS(tmp))
    break;
  }
 } while ((tmp = tmp->b_next_free) != free_list);
 if (!bh) {
  sleep_on(&buffer_wait);
  goto repeat;
 }
……
}
 
这里看到buffer_wait是空指针,即buffer_wait所指示的等待进程(控制块)不存在。那么把一个不存在的进程(控制块)指针的地址给sleep_on是什么意思?
了解到buffer_wait 起初是空的。而这个buffer_wait 是静态指针说明他是常驻内存,且地址永不变化。ok , 既然buffer_wait 是指向task struct ,那么*buffer_wait(原型) 就是指向N个task struct 。又想到buffer_wait 是静态指针,所以没错,*buffer_wait(原型) (或&buffer_wait) 就是指的等待队列喽。 参考sleep_on()的函数:
 

void sleep_on(struct task_struct **p)
{

……

 tmp = *p;
 *p = current;
 current->state = TASK_UNINTERRUPTIBLE;

……}

明白了,sleep_on 形参就是接收的等待队列指针哦。*p就是获得等待队列头的task struct 。而且&buffer_wait就是等待队列的起始地址(NULL的地址,即&NULL。NULL虽是0,但也有被分配地址哦:DS段 0x10(内核数据段))。刚开始我被搞糊涂了,以为起始地址被设置成NULL,正确的理解是等待队列的初始状态时没有任何进程等待。
Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: