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

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

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 7855 | 回復(fù): 13
打印 上一主題 下一主題

[中斷] arm中斷異常時(shí)cpsr顯示都是svc模式? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-07-11 09:11 |只看該作者 |倒序?yàn)g覽
有個(gè)疑問,
在中斷處理中,打印cpsr發(fā)現(xiàn)mode=0x13 處于svc mode。
data abort處理中,打印cpsr發(fā)現(xiàn)mode=0x13
看來kernel只用了user mode和svc mode。

1. 如果是這樣的,那么怎樣實(shí)現(xiàn)只用兩種mode的呢?
2. 如果是這樣的,那么中斷異常處理中(從usr mode到svc mode), sp是從usr sp自動(dòng)切換到svc sp的,硬件自動(dòng)處理嗎,從文檔上沒有看到相關(guān)部分。


論壇徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16賽季CBA聯(lián)賽之廣東
日期:2018-02-05 11:22:1215-16賽季CBA聯(lián)賽之八一
日期:2016-07-04 12:26:1815-16賽季CBA聯(lián)賽之青島
日期:2016-06-08 11:15:4115-16賽季CBA聯(lián)賽之遼寧
日期:2016-04-05 10:10:1415-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-11 11:11:48酉雞
日期:2014-12-18 14:35:48獅子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16賽季CBA聯(lián)賽之廣夏
日期:2018-03-21 08:51:10
2 [報(bào)告]
發(fā)表于 2013-07-11 10:36 |只看該作者
blake326 發(fā)表于 2013-07-11 09:11
有個(gè)疑問,
在中斷處理中,打印cpsr發(fā)現(xiàn)mode=0x13 處于svc mode。
data abort處理中,打印cpsr發(fā)現(xiàn)mode=0 ...

個(gè)人認(rèn)為,有內(nèi)核態(tài),用戶態(tài)就夠用了。
對(duì)于異常和中斷,應(yīng)該有不同。通常中斷由硬件處理,異常就不一定。異常/系統(tǒng)調(diào)用只是提供從用戶態(tài)到內(nèi)核態(tài)的方法,可以軟件具體實(shí)現(xiàn)。

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [報(bào)告]
發(fā)表于 2013-07-18 21:32 |只看該作者
中斷異常時(shí)是切換到了svc模式下去處理的

在irq模式下,只是將lr r0 spsr入棧,irq模式的棧size只有3個(gè)word,剛好夠放這三個(gè)寄存器
然后將irq模式的;刂诽畹絩0中,然后切換到svc模式
在svc模式下通過r0就可以取出lr r0 spsr,然后將lr和r0和r1-sp都?jí)喝雜vc模式的棧(此時(shí)是借用的被中斷的線程的棧),將spsr寫入svc模式的spsr
然后就進(jìn)行中斷處理
處理完之后,就可以直接從svc模式返回到發(fā)生中斷之前的模式

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術(shù)圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
4 [報(bào)告]
發(fā)表于 2013-07-19 02:50 |只看該作者
回復(fù) 2# daniel_11


    嵌套中斷的要求:

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-07-19 13:03 |只看該作者
回復(fù) 3# arm-linux-gcc

》》》》》》》》》》》
    然后將irq模式的;刂诽畹絩0中,然后切換到svc模式
》》》》》》》》》》

你的意思是發(fā)生中斷后,會(huì)進(jìn)入irq模式,然后保存了r0,lr,spsr之后,kernel就立刻切換到了svc模式?那么這個(gè)切換的動(dòng)作在哪里的,svc_entry? 我看代碼沒有找到這個(gè)動(dòng)作。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-07-19 13:07 |只看該作者
回復(fù) 4# smalloc


    那么你的意思是在中斷處理中,arm處于irq mode嗎?
    但是我打出來的都是arm處于svc mode,不過我的板子用了vlx虛擬機(jī),可能有影響。

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [報(bào)告]
發(fā)表于 2013-07-19 18:29 |只看該作者
本帖最后由 arm-linux-gcc 于 2013-07-19 18:55 編輯

回復(fù) 6# blake326

從irq到svc的切換過程如下:

        .macro        vector_stub, name, mode, correction=0
        .align        5

vector_\name:
        .if \correction
        sub        lr, lr, #\correction
        .endif

        @
        @ Save r0, lr_<exception> (parent PC) and spsr_<exception>
        @ (parent CPSR)
        @
        stmia        sp, {r0, lr}                @ save r0, lr
        mrs        lr, spsr
        str        lr, [sp, #8]                @ save spsr

        @
        @ Prepare for SVC32 mode.  IRQs remain disabled.
        @
        mrs        r0, cpsr
        eor        r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)         
        msr        spsr_cxsf, r0
以上3句是將spsr中的模式位改為svc,注意這里只是修改了irq的spsr,還未切換狀態(tài)

        @
        @ the branch table must immediately follow this code
        @
        and        lr, lr, #0x0f                    取出spsr中的[M3:M0],這里不用取M4,因?yàn)镸4是表示26位還是32位尋址的,如果只想知道模式的話,取[M3:M0]就夠了
THUMB(        adr        r0, 1f                        )
THUMB(        ldr        lr, [r0, lr, lsl #2]        )
        mov        r0, sp                            將irq模式的;刂诽畹絩0,以后在svc_entry中可以通過r0去讀取irq的棧
ARM(        ldr        lr, [pc, lr, lsl #2]        )         直接將[M3:M0]乘以4再加上pc就可以計(jì)算出入口(因?yàn)橐粋(gè)entry占4個(gè)字節(jié)),結(jié)果為__irq_usr或__irq_svc,具體是usr還是svc要看發(fā)生中斷之前是什么模式
        movs        pc, lr                        @ branch to handler in SVC mode        跳進(jìn)入口(__irq_usr或__irq_svc),同時(shí)做模式切換(mov帶了s,就會(huì)給pc賦值的同時(shí)將用spsr去填cpsr)
ENDPROC(vector_\name)


        vector_stub        irq, IRQ_MODE, 4                        宏vector_\name展開,展開之后的結(jié)果,使得上述 ARM(ldr lr,[pc,lr,lsl #2])處的pc值就是下面的.long        __irq_usr處的地址

        .long        __irq_usr                        @  0  (USR_26 / USR_32)           [M3:M0]為0
        .long        __irq_invalid                        @  1  (FIQ_26 / FIQ_32)
        .long        __irq_invalid                        @  2  (IRQ_26 / IRQ_32)
        .long        __irq_svc                        @  3  (SVC_26 / SVC_32)           [M3:M0]為3
        .long        __irq_invalid                        @  4
        .long        __irq_invalid                        @  5
        .long        __irq_invalid                        @  6
        .long        __irq_invalid                        @  7
        .long        __irq_invalid                        @  8
        .long        __irq_invalid                        @  9
        .long        __irq_invalid                        @  a
        .long        __irq_invalid                        @  b
        .long        __irq_invalid                        @  c
        .long        __irq_invalid                        @  d
        .long        __irq_invalid                        @  e
        .long        __irq_invalid                        @  f
其中一些是占位符,這里剛好16個(gè),對(duì)應(yīng)了[M3:M0]的所有可能取值,所以entry的地址就可以用[M3:M0]很快的算出來,之所以弄16個(gè)entry,是因?yàn)閇M3:M0]在各種模式的取值中并不是連續(xù)的


你在svc_entry是看不到模式切換的,因?yàn)樵谶M(jìn)入svc_entry之前就已經(jīng)做了,你可以去直接看irq的棧,可以查看以下數(shù)據(jù)結(jié)構(gòu)
arch/arm/kernel/setup.c,他們分別是irq abt und模式的棧
struct stack {
        u32 irq[3];
        u32 abt[3];
        u32 und[3];
} ____cacheline_aligned;




寫的挺亂的,不知道說清楚沒,向來不善于寫這類東西


論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
8 [報(bào)告]
發(fā)表于 2013-07-19 18:59 |只看該作者
本帖最后由 arm-linux-gcc 于 2013-07-19 18:59 編輯

另貼一個(gè)CPSR的模式位以便對(duì)比看


M4 M3 M2 M1 M0
0   0   0   0   0     User26 模式
0   0   0   0   1     FIQ26 模式
0   0   0   1   0     IRQ26 模式
0   0   0   1   1     SVC26 模式
1   0   0   0   0     User 模式
1   0   0   0   1     FIQ 模式
1   0   0   1   0     IRQ 模式
1   0   0   1   1     SVC 模式
1   0   1   1   1     ABT 模式
1   1   0   1   1     UND 模式

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2013-07-19 19:47 |只看該作者
回復(fù) 7# arm-linux-gcc

》》》》》》
          movs        pc, lr                        @ branch to handler in SVC mode   


謝謝。這段代碼我也看過幾遍,原來是在這句切到svc mode的。沒有注意到 movs指令。

論壇徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亞洲杯之阿曼
日期:2015-04-14 10:41:50NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03NBA季后賽大富翁
日期:2015-05-04 22:34:11菠菜明燈
日期:2015-05-04 22:35:49新奧爾良黃蜂
日期:2015-05-04 22:49:2315-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-11 15:02:342015年亞洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亞洲杯之阿聯(lián)酋
日期:2015-03-04 11:19:04休斯頓火箭
日期:2015-03-02 16:32:11紐約尼克斯
日期:2015-03-02 16:09:04
10 [報(bào)告]
發(fā)表于 2014-05-30 17:21 |只看該作者
為何irq模式的棧只有3個(gè)word,irq的sp是在哪賦值的?多謝
回復(fù) 3# arm-linux-gcc


   
您需要登錄后才可以回帖 登錄 | 注冊(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)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP