Chinaunix

标题: 读 linux device driver 想起的一个current指针的问题 [打印本页]

作者: picobsd    时间: 2011-07-16 15:51
标题: 读 linux device driver 想起的一个current指针的问题
既然Linux支持多cpu, smp, 那么current为什么不是一个数组或者类似数组的宏呢
我想既然真正支持多cpu , 如果在双核处理器,当前进程应该是current[cpu_index]才对啊
那么这个current到底代表的是当前哪个处理器呢? 他无法描述某一个时刻两个处理器的状态啊?

求高人指点
作者: lengyuex    时间: 2011-07-20 13:01
每个cpu上的current是不影响的
作者: 懂医术的厨师    时间: 2011-07-20 13:43
X86下:  
10 DECLARE_PER_CPU(struct task_struct *, current_task);
  11
  12 static __always_inline struct task_struct *get_current(void)
  13 {
  14         return percpu_read_stable(current_task);
  15 }
  16
  17 #define current get_current()

用了每CPU变量
作者: amarant    时间: 2011-07-20 14:21
回复 1# picobsd


    每个CPU的current指针不是一样的。
作者: picobsd    时间: 2011-07-22 11:20
回复 2# lengyuex


    恕我驽钝, 还是不明白,那么对于一个n核心处理器, current到底引用的是哪个cpu呢? 怎么分别引用不同cpu上面的current呢?
作者: lengyuex    时间: 2011-07-23 15:16
回复  lengyuex


    恕我驽钝, 还是不明白,那么对于一个n核心处理器, current到底引用的是哪个cpu ...
picobsd 发表于 2011-07-22 11:20



current->> get_current->> current_thread_info->> percpu_read_stable->>percpu_from_op

对于smp,每个cpu上都有正在运行的进程的thread_info,current就根据当行栈里thread_info结构获得task_struct的地址,也就是当行进程的地址。

因为task是thread_info的第一个member,offset为0, 所以很容易获得。

而thread_info放在当前内核栈的最小地址处,栈的地址总是从页框开始处开始的,所以根据页框的大小,直接mask掉后N位就能得到thread_info的首地址。

不知道说得明白不?HOHO~~~
作者: picobsd    时间: 2011-07-25 14:15
回复 7# lengyuex


    既然thread_info基于每个cpu的,在多核心cpu中应该也有多个thread_info阿,我总觉得如果‘当前的’总能选出'一个'而不是'n个'的话,那么就还不是真正多线程的。
    谢谢你耐心的解答,等我水平高了也许就明白了, 万分感谢。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2