sti()和cli()

1.2.13協議棧中用到這兩個宏:

#define sti() __asm__ __volatile__ ("sti": : :"memory")
#define cli() __asm__ __volatile__ ("cli": : :"memory")

這個語句需要分爲兩個部分來看:


1、轉自:http://blog.csdn.net/njuitjf/article/details/20448959

1.內存屏障(memory barrier)

  #define set_mb(var, value) do { var = value; mb(); } while (0)
  #define mb() __asm__ __volatile__ ("" : : : "memory")

1)set_mb(),mb(),barrier()函數追蹤到底,就是__asm__ __volatile__("":::"memory"),而這行代碼就是內存屏障。
2)__asm__用於指示編譯器在此插入彙編語句
3)__volatile__用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。即:原原本本按原來的樣子處理這這裏的彙編。
4) memory強制gcc編譯器假設RAM所有內存單元均被彙編指令修改,這樣cpu中的registers和cache中已緩存的內存單元中的數據將作廢。cpu將不得不在需要的時候重新讀取內存中的數據。這就阻止了cpu又將registers,cache中的數據用於去優化指令,而避免去訪問內存。
5)"":::表示這是個空指令。barrier()不用在此插入一條串行化彙編指令。在後文將討論什麼叫串行化指令。

6)__asm__,__volatile__,memory在前面已經解釋


2、sti\cli

STI(Set Interrupt) 中斷標誌置1指令 使 IF = 1
CLI(Clear Interrupt) 中斷標誌置0指令 使 IF = 0

即:STI 打開中斷,CLI關閉中斷


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章