亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 2364 | 回復(fù): 5
打印 上一主題 下一主題

[內(nèi)核模塊] 關(guān)于arm的cpsr寄存器 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-11-09 14:57 |只看該作者 |倒序?yàn)g覽
本帖最后由 xiaojsj 于 2013-11-09 14:57 編輯

各位大牛幫忙來(lái)解析下:
在進(jìn)入中斷時(shí),arm的cpsr寄存器會(huì)保存到相應(yīng)異常模式的cpsr私有備份寄存器中,

而在進(jìn)程切換的時(shí)候,cpsr寄存器卻不需要保存,這是原因呢?

保存cpsr寄存器的標(biāo)準(zhǔn)是什么呢?


叩謝!·

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-11-09 15:23 |只看該作者
因當(dāng)中斷發(fā)生的時(shí)候我們先保存當(dāng)前狀態(tài),等中斷結(jié)束之后,就可以返回到當(dāng)前狀態(tài),CPSR,SPSR就是起這個(gè)作用。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-11-09 15:34 |只看該作者
當(dāng)我的理解是,當(dāng)進(jìn)程切換時(shí),也是需要保存cpsr寄存器的啊?
那位什么最新我看的linux3.4.5版本的內(nèi)核就沒(méi)有對(duì)cpsr寄存器進(jìn)行保存呢?

貼源碼如下:
/*
* Register switch for ARMv3 and ARMv4 processors
* r0 = previous task_struct, r1 = previous thread_info, r2 = next thread_info
* previous and next are guaranteed not to be the same.
*/
ENTRY(__switch_to)
UNWIND(.fnstart        )
UNWIND(.cantunwind        )
        add        ip, r1, #TI_CPU_SAVE
        ldr        r3, [r2, #TI_TP_VALUE]
ARM(        stmia        ip!, {r4 - sl, fp, sp, lr} )        @ Store most regs on stack
THUMB(        stmia        ip!, {r4 - sl, fp}           )        @ Store most regs on stack
THUMB(        str        sp, [ip], #4                   )
THUMB(        str        lr, [ip], #4                   )
#ifdef CONFIG_CPU_USE_DOMAINS
        ldr        r6, [r2, #TI_CPU_DOMAIN]
#endif
        set_tls        r3, r4, r5
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
        ldr        r7, [r2, #TI_TASK]
        ldr        r8, =__stack_chk_guard
        ldr        r7, [r7, #TSK_STACK_CANARY]
#endif
#ifdef CONFIG_CPU_USE_DOMAINS
        mcr        p15, 0, r6, c3, c0, 0                @ Set domain register
#endif
        mov        r5, r0
        add        r4, r2, #TI_CPU_SAVE
        ldr        r0, =thread_notify_head
        mov        r1, #THREAD_NOTIFY_SWITCH
        bl        atomic_notifier_call_chain
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
        str        r7, [r8]
#endif
THUMB(        mov        ip, r4                           )
        mov        r0, r5
ARM(        ldmia        r4, {r4 - sl, fp, sp, pc}  )        @ Load all regs saved previously
THUMB(        ldmia        ip!, {r4 - sl, fp}           )        @ Load all regs saved previously
THUMB(        ldr        sp, [ip], #4                   )
THUMB(        ldr        pc, [ip]                   )
UNWIND(.fnend                )
ENDPROC(__switch_to)

回復(fù) 2# zhangshuang2013


   

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-11-09 15:37 |只看該作者
盼各位大牛過(guò)來(lái)不膩賜教啊:wink:

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-11-09 15:47 |只看該作者
進(jìn)程間的切換有讓lr入棧操作,然后出棧就可以返回繼續(xù)運(yùn)行了,CPSR保存與否是看有沒(méi)有狀態(tài)的改變,需不需要返回當(dāng)前狀態(tài),具體可看CPSR中每位表示的情況。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-11-09 16:12 |只看該作者
抽了根煙后,終于理解了為什么中斷時(shí)需要保存cpsr,而上下文切換時(shí)不需要保存cpsr寄存器了。
因?yàn)橹袛喟l(fā)生是隨機(jī)不確定的,他可能在任何指令的后面產(chǎn)生中斷,而cpsr只會(huì)影響到中斷指令的下面的
指令的執(zhí)行,如果被中斷時(shí)的指令的下一條指令的執(zhí)行是依賴(lài)于cpsr的,如果中斷處理程序修改了cpsr值,而又
沒(méi)保存,會(huì)導(dǎo)致中斷返回時(shí),在執(zhí)行下條指令時(shí),會(huì)出現(xiàn)錯(cuò)誤。

而上下文切換的返回地址和要執(zhí)行的指令是確定的,只要上下文切換回來(lái)的指令不受cpsr值得影響,則就可以
不保存cpsr寄存器的值。


回復(fù) 5# zhangshuang2013


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP