//函数原型:版本linux-3.0.8
struct task_struct *__switch_to(structtask_struct *, struct thread_info *, struct thread_info *);
#define switch_to(prev,next,last) \
do { \
last =__switch_to(prev,task_thread_info(prev), task_thread_info(next)); \
} while (0)
//首先我们看一下下面的宏:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)
//下面其实就是指向对应的struct成员
/*
CC_STACKPROTECT补丁是Tejun Heo在年给主线kernel提交的一个用来防止内核堆栈溢出的补丁。
默认的config是将这个选项关闭的,可以在编译内核的时候,修改.config文件为CONFIG_CC_STACKPROTECTOR=y
来启用。未来飞天内核可以将这个选项开启来防止利用内核stack溢出的day攻击。这个补丁的防
溢出原理是:在进程启动的时候,在每个buffer的后面放置一个预先设置好的stack canary,你
可以把它理解成一个哨兵,当buffer发生缓冲区溢出的时候,肯定会破坏stack canary的值,当
stack canary的值被破坏的时候,内核就会直接当机。那么是怎么判断stack canary被覆盖了呢?
其实这个事情是gcc来做的,内核在编译的时候给gcc加了个-fstack-protector参数.
*/
DEFINE(TSK_STACK_CANARY, offsetof(struct task_struct,stack_canary));