详细分析contrex-A9的汇编代码__switch_to(进程切换)

本文详细分析了Linux内核中的__switch_to函数,涉及进程切换的过程,包括CC_STACKPROTECT补丁、task_struct结构、线程信息结构thread_info,以及CPU上下文保存和TLS寄存器在多线程环境中的作用。通过示例代码展示了线程切换的场景。
摘要由CSDN通过智能技术生成

//函数原型:版本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));

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值