- 论坛徽章:
- 0
|
最近在学习Linux内核(Linux2.6.33),看到current宏的时候,就想动手实现current的重定向,这样以实现自己在特定函数的一个特殊功能。通常情况下,current宏是获取当前进程的进程描述符的地址,而我现在需要做的就是使用current宏获取指定进程的进程的描述地址。
在比较早的内核版本中,current宏以前是通过如下汇编指令实现的:movl $-8192,%eax; andl %esp, %eax来实现的,但是Linux2.6.33中current的宏的实现是调用了get_current函数,而get_current函数其实是调用了percpu_read_stable(current_task)宏,其底层是通过如下的汇编指令asm(“movl %%fs:%P1","%0" : "=r" (pfo_ret__) :"p" (&(var))实现的,其实对于这段汇编指令也不是特别的了解,希望可以有大侠可以指点一二。
我自己也尝试着解决这个问题,但是采取了两种方法都没有达到预期的效果。
其一是通过汇编指令修改"%%fs:%P1"部分,但是没有理解上述汇编指令,老师有些问题
其二通过percpu_write(current_task,previous_tsk)宏试图修改,但是也有问题。current_task是自己定义的每cpu变量,DECLARE_PER_CPU(struct task_struct * ,current_task);previous_tsk 是指定的进程的进程描述符指针。
还有一个问题就是,Linux内核这样修改current宏的有什么好处?
希望各位大侠不吝赐教,能指出我实现的过程中的问题,也希望大侠们可以提出关于Linux current宏重定向更多更好的方法!谢谢 |
|