switch linux性能,arm linux的switch_to

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

文来自本人的旧博客: blog.163.com/awaken_ing/blog/static/12061319720158310574442/

<< Professional Linux Kernel Architecture >> page105标题为 Intricacies of switchto (intricacies:错综复杂的) , 絮絮叨叨着switchto.

下面看下arm linux的情况.context_switch(struct rq *rq, struct task_struct *prev,

struct task_struct *next)

{

...

switch_to(prev, next, prev);

barrier();

/*

假定进程A被调出去, 进程B运行, 即switch_to(A, B, A)

那么, 这里是刚才被调度走的进程A 恢复运行后, 会执行这个地方,

要验证的话, 可以看看进程A让出CPU前, 最后一条修改lr的指令.

*/

finish_task_switch(this_rq(), prev);

}

进程A让出CPU前, 最后一条修改lr的指令:(gdb) disass schedule

...

0xc02b997c : bl 0xc02bb514 <__switch_to>

0xc02b9980 : bl 0xc0043524

...

(gdb) disass __switch_to

...

0xc02bb51c : stmia r12!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, lr}

...

最后一条修改lr的指令为bl, 之后_switchto()中的stmia指令将lr保存到struct threadinfo的成员struct cpucontextsave cpucontext中.#define switch_to(prev,next,last)

do {

last = __switch_to(prev,task_thread_info(prev), task_thread_info(next));

} while (0)

141a94dcdc73a75934d8307b67912533.png

书中有上图, 进程A被调度出去后, 之后又准备投入运行, 也就是准备执行contextswitch()中的switchto(), 这时, 为何不是 next==B, prev==A, 而是prev==C.

(switchto()的返回值? 从汇编来看, 没有用到这个返回值.)

进程A恢复运行(进程C调用switchto( , 进程A ,))后, prev这个进程栈内的变量变了, 是因为switch_to中

linux-2.6.35.7/arch/arm/kernel/entry-armv.SENTRY(__switch_to)

...

ARM( stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stack

ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously

可以看到并没有保存r0或r1.

switchto()的r0, 在 进程切换前后 进行传递, 用来告诉 切换后的进程 前面的struct taskstruct 信息.

附 进程的栈等信息是存储在哪?

不好意思, 内核换到linux-3.10.86了.

linux-3.10.86/arch/arm/kernel/entry-armv.SENTRY(__switch_to)

add ip, r1, #TI_CPU_SAVE

...

ARM( stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stack

所以, 要看看r1和TICPUSAVE都是啥?

注释中有r0 = previous taskstruct, r1 = previous threadinfo, r2 = next thread_info

linux-3.10.86/arch/arm/kernel/asm-offsets.cDEFINE(TI_CPU_SAVE, offsetof(struct thread_info, cpu_context));

所以, 是存储在 thread->cpu_context

linux-3.10.86/arch/arm/include/asm/thread_info.hstruct thread_info {

struct cpu_context_save cpu_context; /* cpu context */

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值