当前位置:  技术问答>linux和unix

DEFINE_WAIT(__wait)这宏把__wait变量定义在了进程的内核堆栈中,则另一进程使用wake_up时,是如何访问到__wait变量的呢?

    来源: 互联网  发布时间:2016-12-30

    本文导语:  #define__wait_event_interruptible(wq, condition, ret)  do{  DEFINE_WAIT(__wait);/×新建一个”等待“,把current加入其中。×/  for (;;){  /×把__wait加入wq(WaitQueue)×/ prepare_to_wait(&wq,&__wait, TASK_INTERRUPTIBLE);  if(condition) //条件成立...

#define__wait_event_interruptible(wq, condition, ret) 

do{ 

DEFINE_WAIT(__wait);/×新建一个”等待“,把current加入其中。×/ 



for (;;){ 

/×把__wait加入wq(WaitQueue)×/

prepare_to_wait(&wq,&__wait, TASK_INTERRUPTIBLE); 

if(condition) //条件成立,则跳出循环。 

break; 

if(!signal_pending(current)) { //当前进程有信号,则也跳出,这是interruptible的特有的处理。

schedule();/休眠,主动让出CPU,/ 

continue; 



ret =-ERESTARTSYS; 

break; 



finish_wait(&wq,&__wait);//离开这个等待队列 

} while(0)

#define DEFINE_WAIT_FUNC(name, function)
wait_queue_t name = {
.private = current,
.func = function,
.task_list = LIST_HEAD_INIT((name).task_list),
}

#define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, autoremove_wake_function)

以上宏都是在函数中使用,当宏被展开时,DEFINE(__wait); 这个__wait是作为一个局部变量只在函数内部有效吗?
schedule之后,另外一个进程使用的wake_up中,一定得用到这个变量。但是它是如何变成全局变量的呢?

以下是我的推测,但没证实。
那这与内核的内存操作有关,当schedule之后,其实这个进程就暂停在了schedule之前的环境中,它的内核堆栈也保持不变。当调度之后,其实它的内核堆栈的内核不变。只是esp和ebp的内容变成了新进程的内核堆栈了。此时,当新的进程要使用wake_up时,要访问wait_queue中的每一个wait项,此时如果使用物理地址,或是内核的虚拟地址,也是可以找到旧进程的堆栈中的一个数据的。这样解释对吗?

|
把__wait加入wq(WaitQueue)

通过这个等待队列得到.

|
只要能拿到地址就好了,kernel都是公用一个页表
参见__wake_up的实现

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3