日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换

發(fā)布時(shí)間:2024/1/23 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載注明出處:http://www.wowotech.net/forum/viewtopic.php?id=54

對(duì)ARM Linux中斷非常簡(jiǎn)潔、精確的描述。

發(fā)生了中斷,最重要的是保存現(xiàn)場(chǎng),在中斷處理完之后,能夠恢復(fù)現(xiàn)場(chǎng)就OK了,硬件現(xiàn)場(chǎng)(hardware context)的保存是由硬件和軟件共同完成的。

對(duì)于ARM,當(dāng)發(fā)生中斷的那一刻,硬件會(huì)進(jìn)行如下的動(dòng)作:

1、將發(fā)生中斷那一刻的CPSR保存在SPSR寄存器中

2、將返回地址保存在lr寄存器中(注意:這個(gè)lr寄存器是IRQ mode的lr寄存器,可以表示為lr_irq)

真正將hardware context保存到內(nèi)核棧上是軟件的行為。當(dāng)然,目標(biāo)是一開始就設(shè)定好了,將發(fā)生中斷那一刻的hardware context保存到current task的內(nèi)核棧上。不同的CPU有不同的設(shè)計(jì),提供不同的軟件和硬件的接口,對(duì)于X86,硬件幫忙做的事情更多,而ARM更希望你自己能夠自力更生(更簡(jiǎn)單的HW logic意味著更少的晶體管,更少的功耗,而這也是ARM在移動(dòng)平臺(tái)上能夠橫掃Intel的根本原因)。怎么辦?hardware context包括了cpu中的各種寄存器,想要將hardware context壓入內(nèi)核棧首先要獲取current thread的內(nèi)核棧指針,任何對(duì)cpu寄存器的使用將破壞硬件上下文,因此,linux kernel采用的方法是借用12個(gè)字節(jié)的中斷棧。方法如下:

1、在中斷棧上保存了發(fā)生中斷那一點(diǎn)的r0值、PC值以及CPSR值。你可能會(huì)覺得:PC和CPSR需要保存嗎?不是硬件已經(jīng)幫忙保存lr_irq(雖然不是PC值,但是和PC值有固定的偏移關(guān)系)和spsr_irq中了嗎?之所以保存spsr_irq和lr_irq的值,那是因?yàn)殡S后在切換到svc mode的時(shí)候需要修改spsr_irq和lr_irq的值。之所以保存r0,是因?yàn)楹罄m(xù)會(huì)修改r0的值,把它做為一個(gè)scratch register。

2、切換到svc mode,具體完成下面兩個(gè)步驟:

(A)將處理器模式切換到svc mode

(B)根據(jù)發(fā)生中斷那一點(diǎn)的處理器模式,將pc設(shè)定為__irq_usr或者_(dá)_irq_svc

在上面的過(guò)程中,lr_irq,spsr_irq和r0被破壞了,但是沒(méi)有關(guān)系,相關(guān)信息已經(jīng)保存在了中斷棧上了(sp_irq)

3、一旦切換到SVC mode,ARM處理器看到的寄存器已經(jīng)發(fā)生變化,這里的sp已經(jīng)變成了sp_svc了。問(wèn)題來(lái)了:sp_svc是什么值?在進(jìn)程切換的時(shí)候就已經(jīng)設(shè)定好了,sp_svc被設(shè)定為current thread的內(nèi)核棧。這時(shí)候,除了被破壞的三個(gè)寄存器保存在中斷棧上,其他的寄存器毫發(fā)無(wú)傷,軟件只要將這些hardware context壓入current thread的內(nèi)核棧上即可。

總結(jié)

以上是生活随笔為你收集整理的linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。