Re: [問題] 為何要使用asmlinkage?

看板LinuxDev作者 (troylee)時間12年前 (2011/11/02 23:35), 編輯推噓0(0010)
留言10則, 3人參與, 最新討論串4/4 (看更多)
※ 引述《mayasky ( )》之銘言: : 不太一樣..volatile是說不要最佳化 : 例如對一些I/O mapping 的區段 : 你做最佳化就有可能有問題 : ex. : compiler 會reorder 既然您都提到了 Memory Mapped I/O 就應該用這個來舉例摟~ Ex. 程式設定某 Register, 同時 MCU 的 I/O 也會去修改這個 Register 或是某個 Bit 對程式是 Read-only, 寫入 0/1 也不會更變他的值 所以 Compiler 預期你的 Register 在寫入後也不會揮發掉.. int NonVol() { char *RegA = (char *)0x40000000; *RegA = 0x00; if (0x00 != *RegA) { return 1; } else { return 0; } } int Vol() { volatile char *RegA = (char *)0x40000000; *RegA = 0x00; if (0x00 != *RegA) { return 1; } else { return 0; } } /* End of File */ $ gcc -O3 -S novol.c -o novol.s 這時聰明的 Compiler 會怎麼作最佳化呢? NonVol: .LFB13: xorl %eax, %eax movb $0, 1073741824 ret ; 原本 if (*RegA == 0x00) 被最佳化掉, ; 因為 compiler 預期 0x40000000 不會被改變 ; 所以直接回傳 eax == 0 Vol: .LFB14: movb $0, 1073741824 movzbl 1073741824, %eax testb %al, %al setne %al movzbl %al, %eax ret -- It is better to be approximately right than exactly wrong. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.91.238 ※ 編輯: troylee 來自: 122.116.91.238 (11/02 23:38)

11/04 00:59, , 1F
我想他問的是function的declare...這才會對應到他的問題
11/04 00:59, 1F

11/04 01:00, , 2F
他問是否和asmlinkage一樣..這可以加變數前嗎?
11/04 01:00, 2F

11/04 01:01, , 3F
且教學最好的方式就是抽象化.發問人不一定懂x86
11/04 01:01, 3F

11/04 01:21, , 4F
且您似乎沒提到重點?就算是問變數的宣告
11/04 01:21, 4F

11/04 01:30, , 6F
我的重點在最後最佳化後的組合語言, 很明顯看到第一個
11/04 01:30, 6F

11/04 01:30, , 7F
function 最佳化後連判斷都不判斷了, 直接回傳 0
11/04 01:30, 7F
※ 編輯: troylee 來自: 122.116.91.238 (11/04 02:13)

11/07 04:28, , 8F
其實volatile只是直接操作區域是記憶體. 而非用gpr
11/07 04:28, 8F

11/07 04:29, , 9F
當作是temp. asmlinkage 要看asm code. 一般而言也不
11/07 04:29, 9F

11/07 04:29, , 10F
一定要使用.只要你在asm中按照C規則去傳遞parameters
11/07 04:29, 10F
文章代碼(AID): #1EiMCq52 (LinuxDev)
文章代碼(AID): #1EiMCq52 (LinuxDev)