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

看板LinuxDev作者 ( )時間14年前 (2011/11/01 03:04), 編輯推噓9(9036)
留言45則, 2人參與, 最新討論串2/4 (看更多)
不太一樣..volatile是說不要最佳化 例如對一些I/O mapping 的區段 你做最佳化就有可能有問題 ex. compiler 會reorder 今天有一個炸彈,要先設定時間,然後開始倒數 原本你的設計是 start_bomb(){ instruction 1: set the timer instruction 2: countdown! } 接著就快跑人啦XD.. compiler覺得reorder一下比較好..於是生出以下的code start_bomb(){ instruction 1: countdown! instruction 2: set the timer } 假使timer initial value是0 那會怎樣哩?xd http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.4 http://en.wikipedia.org/wiki/Memory_barrier#Out-of-order_execution_versus_compiler_reordering_optimizations 截一段 "In C and C++, the volatile keyword was intended to allow C and C++ programs to directly access memory-mapped I/O. Memory-mapped I/O generally requires that the reads and writes specified in source code happen in the exact order specified with no omissions" ※ 引述《RouterHsieh (醉臥美人膝,醒掌天下權)》之銘言: : 就小弟所知,用asmlinkage當修飾字的話, : 該函數的參數在傳遞時會從stack讀取而非從register。 : 一般而言,似乎只要是system call都會加上這個修飾字。 : 那我想問的是,之所以會有這樣的需求, : 其原因是否跟使用volatile是類似的呢? : 這問題想了一天了而且也有孤狗過,不過沒找到一個確切的理由或者說法就是了囧 : 還請板上的高手們多多指教(拜) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.191.195 ※ 編輯: mayasky 來自: 114.43.191.195 (11/01 03:04) ※ 編輯: mayasky 來自: 114.43.191.195 (11/01 03:05)

11/01 20:41, , 1F
老實說我覺得這例子不好..
11/01 20:41, 1F

11/02 01:56, , 2F
我只是想給的通用有趣的概念罷了..不如樓上給個real case
11/02 01:56, 2F

11/02 01:57, , 3F
記得考量讀者熟哪種arch,你所預計的issue與execute 方式囉
11/02 01:57, 3F

11/02 01:58, , 4F
這樣應該你比說這句話有意義:)
11/02 01:58, 4F

11/02 23:45, , 5F
所以你考量了讀者熟悉的arch, 請問是哪一種arch呢?
11/02 23:45, 5F

11/04 01:05, , 6F
因為不知讀者熟哪種,所以抽象化.不特定arch
11/04 01:05, 6F

11/04 01:06, , 7F
給個pseudo code即可,相信您念書時很多書也如此:)
11/04 01:06, 7F
※ 編輯: mayasky 來自: 1.160.132.131 (11/04 01:26)

11/04 01:28, , 8F
一下說要 real case, 一下又要抽象化...
11/04 01:28, 8F

11/04 01:31, , 9F
一下要考量讀者的熟悉哪種arch, 最後又說不知道他熟哪種
11/04 01:31, 9F

11/04 01:33, , 10F
REAL CASE和實作抽象化是兩回事.演算法都不是real case?
11/04 01:33, 10F

11/04 01:34, , 11F
但很多演算法書只用pseudo code..這樣回答疑問了嗎?
11/04 01:34, 11F

11/04 01:35, , 12F
那請問您的real case中, 如何使用到volatile?
11/04 01:35, 12F

11/04 01:37, , 13F
很多paper為了讓讀者不管慣用哪種language都可以理解
11/04 01:37, 13F

11/04 01:37, , 14F
我所謂的例子舉的不好是說前面說 Memory-mapped I/O 最佳
11/04 01:37, 14F

11/04 01:38, , 15F
化後可能會有問題, 但是後面給的例子卻是 reordering 的
11/04 01:38, 15F

11/04 01:38, , 16F
以及考量簡化就會使用pseudo code..這就是考量讀者
11/04 01:38, 16F

11/04 01:38, , 17F
那如果您要避免這種reordering最佳化, 請問 volatile 是要
11/04 01:38, 17F

11/04 01:39, , 18F
如何在您的例子上避免呢?
11/04 01:39, 18F

11/04 01:40, , 19F
reorder在非I/O應該不會有事...在I/O可能會有事
11/04 01:40, 19F

11/04 01:41, , 20F
你確定嗎?
11/04 01:41, 20F

11/04 01:42, , 21F
要避免compiler對這個例子作最佳化, 所以把volatile放在
11/04 01:42, 21F

11/04 01:42, , 22F
幾乎確定~可以參考ARM的strongly ordered與device 之設計
11/04 01:42, 22F

11/04 01:42, , 23F
start_bomb() 前面摟?
11/04 01:42, 23F

11/04 01:44, , 24F
基本上這關鍵字就是叫compiler不要幫你最佳化
11/04 01:44, 24F

11/04 01:44, , 25F
所以理論上放這前面是ok的..只要他compiler有做
11/04 01:44, 25F

11/04 01:45, , 26F
但或許不是每個compiler都有做..甚至有的compiler不接受
11/04 01:45, 26F

11/04 01:46, , 27F
如果你想要個真的code..或許哪天我看到我貼一下
11/04 01:46, 27F

11/04 01:47, , 28F
compiler啥時想reorder我不知道..一時生不出來
11/04 01:47, 28F
※ 編輯: mayasky 來自: 1.160.132.131 (11/04 01:50)

11/04 01:51, , 29F
欲知更詳細..上面wiki似乎有帶到一些.請參閱
11/04 01:51, 29F
※ 編輯: mayasky 來自: 1.160.132.131 (11/04 01:55)

11/04 01:57, , 30F
謝謝 所以你的例子應該是把 volatile 放在 timer 的regist
11/04 01:57, 30F

11/04 01:57, , 31F
er 上, 而不是 function 上
11/04 01:57, 31F

11/04 01:58, , 32F
且應詳述 set timer 與 count down 這兩個的關係
11/04 01:58, 32F

11/04 02:00, , 33F
NO~是function上
11/04 02:00, 33F

11/04 02:01, , 34F
炸彈的定時和開始倒數.ㄜ.這需要說嗎?好吧..
11/04 02:01, 34F

11/04 02:01, , 35F
當我覺得大家都看過電視中的定時炸彈..我的錯
11/04 02:01, 35F

11/04 02:02, , 36F
放在變數上基本上是叫compiler要把這值寫進對應address
11/04 02:02, 36F

11/04 02:02, , 37F
不過我還真的沒看過 volatile 放在 c 的 function 上 @@
11/04 02:02, 37F

11/04 02:03, , 38F
不然compiler有可能只放在register中.這樣對應的device是
11/04 02:03, 38F

11/04 02:03, , 39F
可能我真的看得不夠多 抱歉
11/04 02:03, 39F

11/04 02:03, , 40F
不會收到你寫進去的訊號的..還是留在reg中
11/04 02:03, 40F

11/04 02:05, , 41F
這種關鍵字本來就不常見..與硬體直接相關的code比較常見
11/04 02:05, 41F

11/04 02:07, , 42F
我只看過他用在 pointer 上.
11/04 02:07, 42F

11/04 02:08, , 43F
asm volatile(..)應該常見點.這也是叫compiler不要最佳化
11/04 02:08, 43F

11/04 02:12, , 44F
另外不是每個compiler都可以放在function前的樣子
11/04 02:12, 44F

11/04 02:13, , 45F
似乎是gcc另外延伸的..發問者應該是用gcc
11/04 02:13, 45F
文章代碼(AID): #1Ehl4kC6 (LinuxDev)
討論串 (同標題文章)
文章代碼(AID): #1Ehl4kC6 (LinuxDev)