Chinaunix
標(biāo)題: arm中mov r0, r0的作用是? [打印本頁]
作者: jwwzhh 時間: 2011-07-14 23:20
標(biāo)題: arm中mov r0, r0的作用是?
在內(nèi)核中,我看到過好幾處使用了mov r0, r0的指令。我知道它是一條空語句,就是讓cpu多運行一條指令,相當(dāng)于有些單片機的nop指令。但是不理解為什么要是用這條指令,比如:
arch/arm/kernel/entry-common.S:在執(zhí)行用戶程序時,發(fā)生中斷,當(dāng)中斷處理完后,下面這段程序就是返回的一些操作。- /*
- * "slow" syscall return path. "why" tells us if this was a real syscall.
- */
- ENTRY(ret_to_user)
- ret_slow_syscall:
- disable_irq @ disable interrupts
- ldr r1, [tsk, #TI_FLAGS]
- tst r1, #_TIF_WORK_MASK
- bne work_pending
- no_work_pending:
- /* perform architecture specific actions before user return */
- arch_ret_to_user r1, lr
- @ slow_restore_user_regs
- ldr r1, [sp, #S_PSR] @ get calling cpsr
- ldr lr, [sp, #S_PC]! @ get pc
- msr spsr_cxsf, r1 @ save in spsr_svc
- ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
- mov r0, r0
- add sp, sp, #S_FRAME_SIZE - S_PC
- movs pc, lr @ return & move spsr_svc into cpsr
- ENDPROC(ret_to_user)
復(fù)制代碼 就是不明白上面這里指令mov r0, r0的用意。誰能給我個答案,這個問題已經(jīng)困擾我半年之久了。
作者: jwwzhh 時間: 2011-07-15 09:37
自己頂一下。這條語句是比較常見的,怎么沒人幫一下?期待中啊。。。。。。
作者: platinum 時間: 2011-07-15 09:55
譯碼時有的會譯成 mov r0, r0
但實際就是 nop
作者: jwwzhh 時間: 2011-07-15 11:24
對啊,它就是nop指令,我的意思就是,為什么這里需要nop指令。
作者: amarant 時間: 2011-07-15 11:43
貌似跟流水線什么的有關(guān) 以前在哪看過,記不清了 

作者: jwwzhh 時間: 2011-07-15 13:33
是的,我原來也是這么想的,但是感覺不踏實,總覺得可能還有什么其它的。
不知道這樣解釋對不對:
ldmdb sp, {r0 - lr}^ 雖然該指令執(zhí)行完了,但是可能數(shù)據(jù)還沒有真正完全傳遞完。
mov r0, r0
add sp, sp, #S_FRAME_SIZE - S_PC
movs pc, lr pc=lr,cpsr=spsr,引起模式切換。因此在ldmdb和本條指令之間需要有兩條指令進行間隔。
我上面的解釋是沒有什么依據(jù)的,只是一點想法。希望各位大佬能夠解釋清楚,讓我可以安心,謝謝!
作者: platinum 時間: 2011-07-15 14:06
剛才做了一個實驗
ARM 指令(非 thumb),32bit
- mov r15, r15
- mov r14, r14
- mov r13, r13
- mov r12, r12
- mov r11, r11
- mov r10, r10
- mov r9, r9
- mov r8, r8
- mov r7, r7
- mov r6, r6
- mov r5, r5
- mov r4, r4
- mov r3, r3
- mov r2, r2
- mov r1, r1
- mov r0, r0
- nop
復(fù)制代碼 編譯、譯碼后的結(jié)果如下
- 0: e1a0f00f mov pc, pc
- 4: e1a0e00e mov lr, lr
- 8: e1a0d00d mov sp, sp
- c: e1a0c00c mov ip, ip
- 10: e1a0b00b mov fp, fp
- 14: e1a0a00a mov sl, sl
- 18: e1a09009 mov r9, r9
- 1c: e1a08008 mov r8, r8
- 20: e1a07007 mov r7, r7
- 24: e1a06006 mov r6, r6
- 28: e1a05005 mov r5, r5
- 2c: e1a04004 mov r4, r4
- 30: e1a03003 mov r3, r3
- 34: e1a02002 mov r2, r2
- 38: e1a01001 mov r1, r1
- 3c: e1a00000 nop ; (mov r0, r0)
- 40: e1a00000 nop ; (mov r0, r0)
復(fù)制代碼
作者: jwwzhh 時間: 2011-07-15 14:54
在arm中nop是偽指令,它實際翻譯成mov r0, r0。
我的問題提的不是很好?我想說的是,為什么需要添加mov r0,r0,或者說nop偽指令。
作者: platinum 時間: 2011-07-15 15:01
你是想問為什么要設(shè)計一個 nop 指令,是這個意思嗎?
作者: jwwzhh 時間: 2011-07-15 15:06
不是,你看一下我的主帖。我指的是在這里代碼中為什么要用nop指令。
作者: jwwzhh 時間: 2011-07-15 16:12
等高手啊。
作者: xzko 時間: 2011-07-15 16:40
這可能是一個臨界問題,如果不加nop,從arm5級流水線來看在"movs pc, lr"執(zhí)行階段正好是ldmdb回寫寄存器階段,這條ldmdb指令是恢復(fù)user模式下的r0-lr寄存器,movs指令一旦執(zhí)行就會切回user模式并丟棄之后預(yù)取指令,如果ldmdb回寫操作和cpu模式切換寄存器恢復(fù)操作同時發(fā)生就可能在切回user模式后寄存器的值是錯誤的,如果加了一句nop就能錯開這兩個操作了。
作者: fei1700 時間: 2011-07-15 18:17
我也是記得跟ARM三級流水線有關(guān),比如MMU enable前的2條語句就是廢語句,無法執(zhí)行到的,所以就用類似nop來填充。但是中斷返回時總是說起lr -4,這里的mov r0 r0后面也還有一條,所以我都不明白了,我認為要么最后2句都廢了,不然一條nop也沒用
作者: jwwzhh 時間: 2011-07-15 21:55
非常感謝12樓,我剛才認真研究了一下,arm的5級流水線結(jié)構(gòu),確實是這樣。這就是為什么加nop指令的真正原因了。謝謝!
作者: 吾愛夏日長 時間: 2011-07-16 14:59
為了達到指令流水線平衡,CPU的執(zhí)行順序是預(yù)取,譯碼,執(zhí)行三步,插入一條空指令可以使流水線更加流暢,更加高效
作者: fei1700 時間: 2011-07-18 22:44
本帖最后由 fei1700 于 2011-07-18 22:56 編輯
回復(fù) 12# xzko
完了,我還是不明白,把印象的三級替換成五級,我看的某五級資料寫的是回寫和執(zhí)行會錯開,那么也就不應(yīng)該有所描述的問題了?
由于采用馮-諾依曼體系結(jié)構(gòu),不能夠同時訪問數(shù)據(jù)存儲器和指令存儲器
ldmdb 取指 譯碼 算地址 訪存 回寫
add 取指 譯碼 執(zhí)行
movs 取指 譯碼 執(zhí)行
T1 T2 T3 T4 T5
T5可能沖突,但流水線應(yīng)該是下面這種吧
ldmdb 取指 譯碼 算地址 訪存 回寫
add 取指 譯碼 執(zhí)行
movs 取指 譯碼 執(zhí)行
T1 T2 T3 T4 T5 T6 T7
多了2個周期,沒沖突
[attach]496383[/attach]
圖片要怎么顯示出來啊
作者: ckanhw 時間: 2011-07-19 18:32
有沒有可能是為了設(shè)置標(biāo)記位
作者: fei1700 時間: 2011-07-25 22:25
我還是頂一下,后來我問的,因為處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期,那么為什么還要認為只有mov r0,r0來避免處理器缺陷呢?
不是這個T5時段的沖突
ldmdb 取指 譯碼 算地址 訪存 回寫
add 取指 譯碼 執(zhí)行
movs 取指 譯碼 執(zhí)行
T1 T2 T3 T4 T5
而是下面這個,早就錯開了
ldmdb 取指 譯碼 算地址 訪存 回寫
add 取指 譯碼 執(zhí)行
movs 取指 譯碼 執(zhí)行
T1 T2 T3 T4 T5 T6 T7
作者: azzurris 時間: 2011-07-26 10:39
我還是頂一下,后來我問的,因為處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期,那么為什么還要 ...
fei1700 發(fā)表于 2011-07-25 22:25 
請問關(guān)于這句話“處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期”,有哪本書或者資料上提到過嗎。
另外,你前文里說是馮諾依曼結(jié)構(gòu),arm處理器不是哈佛結(jié)構(gòu)嗎?
作者: fei1700 時間: 2011-07-26 13:33
回復(fù) 19# azzurris
http://wenku.baidu.com/view/b261f0d376a20029bd642de7.html
ARM流水線關(guān)鍵技術(shù)分析與代碼優(yōu)化
時間: 2009-03-30 10:15:21 來源:單片機與嵌入式系統(tǒng) 作者:大連理工大學(xué) 邱鐵 西方 遲宗正
2.1 帶有存儲器訪問指令的流水線
作者: azzurris 時間: 2011-07-26 14:37
回復(fù) azzurris
ARM流水線關(guān)鍵技術(shù)分析與代碼優(yōu)化
時間: 2009-03-30 10:15:21 來源:單片機與嵌 ...
fei1700 發(fā)表于 2011-07-26 13:33 
非常感謝,我先看看
作者: azzurris 時間: 2011-07-26 15:53
好像你理解有誤吧,采用五級流水的就是哈佛結(jié)構(gòu),比如arm9。包括你提供的資料里面寫的也是:arm9系列則采用了五級流水的哈佛結(jié)構(gòu)。不是馮諾依曼結(jié)構(gòu)。
你說的2.1節(jié),應(yīng)該描述的是3級流水的arm7.
關(guān)于arm9的五級流水線哈佛結(jié)構(gòu),這里有個簡單介紹http://infocenter.arm.com/help/t ... i0022a/DVI0022A.pdf
作者: fei1700 時間: 2011-07-26 22:27
好像你理解有誤吧,采用五級流水的就是哈佛結(jié)構(gòu),比如arm9。包括你提供的資料里面寫的也是:arm9系列則采用 ...
azzurris 發(fā)表于 2011-07-26 15:53 
謝謝你,是理解錯了
我有看到一個專門寫pipeline harzards 第15-31頁有專門說到幾種harzards及LDR interlock。
[PDF] ARM Processor Architecture
http://www.google.com.hk/url?sa=t&source=web&cd=4&ved=0CDUQFjAD&url=http%3A%2F%2Ftwins.ee.nctu.edu.tw%2Fcourses%2Fsoclab_04%2Fhandout_pdf%2F03_ARM_Processor_Architecture.pdf&rct=j&q=arm%205-stage%20pipeline%20hazards&ei=8ckuTovWK63ymAWWmfhF&usg=AFQjCNETBVkQ9BZW-L6iVTJ1r2xXNvPi4A&cad=rja
---------------------------
Pipeline Hazards
There are situations, called hazards, that prevent the next
instruction in the instruction stream from being executing
during its designated clock cycle. Hazards reduce the
performance from the ideal speedup gained by pipelining.
There are three classes of hazards:
– Structural Hazards
• They arise from resource conflicts when the hardware cannot support all
possible combinations of instructions in simultaneous overlapped
execution.
– Data Hazards
• They arise when an instruction depends on the result of a previous
instruction in a way that is exposed by the overlapping of instructions in
the pipeline.
– Control Hazards
• They arise from the pipelining of branches and other instructions that
change the PC
后來又看到那個文后面的3.1節(jié)描述了,也貼一下
http://www.21ic.com/app/embed/200903/34441_2.htm
3.1 五級流水線互鎖分析
五級流水線只存在一種互鎖,即寄存器沖突。讀寄存器是在譯碼階段,寫寄存器是在回寫階段。如果當(dāng)前指令(A)的目的操作數(shù)寄存器和下一條指令(B)的源操作數(shù)寄存器一致,B指令就需要等A回寫之后才能譯碼。這就是五級流水線中的寄存器沖突。如圖6所示,LDR指令寫R9是在回寫階段,而MOV中需要用到的R9正是LDR在回寫階段將會重新寫入的寄存器值,MOV譯碼需要等待,直到LDR指令的寄存器回寫操作完成。(注:現(xiàn)在處理器設(shè)計中,可以通過寄存器旁路技術(shù)對流水線進行優(yōu)化,解決流水線的寄存器沖突問題。)
雖然流水線互鎖會增加代碼執(zhí)行時間,但是為初期的設(shè)計者提供了巨大的方便,可以不必考慮使用的寄存器會不會造成沖突;而且編譯器以及匯編程序員可以通過重新設(shè)計代碼的順序或者其他方法來減少互鎖的數(shù)量。另外分支指令和中斷的發(fā)生仍然會阻斷五級流水線。
作者: azzurris 時間: 2011-07-28 09:41
謝謝你,是理解錯了
我有看到一個專門寫pipeline harzards 第15-31頁有專門說到幾種harzards及LDR i ...
fei1700 發(fā)表于 2011-07-26 22:27 
你找資料的能力真強啊,我就沒找到。還能介紹一些有關(guān)arm結(jié)構(gòu)的不錯的資料嗎。
作者: Cloudprogram 時間: 2024-04-20 21:12
本帖最后由 Cloudprogram 于 2024-04-20 21:20 編輯
回復(fù) 12# xzko
ARM7TDMI-SData Sheet
ARM7DI Data Sheet
R15 not in list and S bit set (User bank transfer)
For both LDM and STM instructions, the User bank registers aretransferred rather than theregister bank corresponding to the current mode. This is useful for saving theuser state on process switches.Base write-back should not be used when this mechanism is employed.
When the instruction is LDM, care must be taken not to read from abanked register during thefollowing cycle (inserting a dummy instruction such as MOV R0, R0 after the LDM will ensure safety).
官方手冊 說明ldm 操作用戶模式寄存器的時候后面要注意不要訪問寄存器,一般加nop語句。
arm體系結(jié)構(gòu)與編程
P99頁
LDM(2)用戶模式的批量內(nèi)存字數(shù)據(jù)讀取指令
指令的使用
在本指令的后面不能緊跟訪問備份寄存器(bankedregisters)的指令,最好跟一條NOP指令。
在用戶模式和系統(tǒng)模式下使用本指令會產(chǎn)生不可預(yù)知的結(jié)果。
-
未命名圖片.jpg
(409.05 KB, 下載次數(shù): 15)
下載附件
2024-04-20 21:12 上傳
arm體系結(jié)構(gòu)與編程
歡迎光臨 Chinaunix (http://www.72891.cn/) |
Powered by Discuz! X3.2 |