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