為了編譯android src, 把gcc 版本版本降到4.3 後來學習核心模組 原子操作,寫了乙個測試模組,可以順利make,有個warning:mcount undefined....接著又測試下之前寫好的模組,也出現了相同的錯誤..在網上找了好久,沒有發現此問題的解決辦法,仔細回憶機器環境的變化就是gcc 版本出錯了,改回去,立馬編譯ok
一 gcc 版本切換
1)/usr/bin/gcc 更改軟連線
2)使用工具update-alternatives
增加兩個選項(最後乙個值優先順序,用於自動模式選擇)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40
sudo update-alternatives --config gcc 輸入序號選擇.
二 核心原子操作
原子操作就是在執行過程中不能被中斷的操作,即一般時一系列操作,要麼全做要麼不做.
在併發處理過程中 ,常規看到的操作例如 int i=2; i+=3;這種簡單的賦值語句,看似原子操作,其實質並非原子操作,他們都是又多條彙編**完成..可以使用objdump -d 檢視.
原子操作基本有三種型別: 整型原子操作,64位整型原子操作,位原子操作
整型原子操作定義在
typedef structatomic_t;
整型原子操作主要用於計數.例如檔案開啟次數.
主要使用的巨集和函式
atomic_init(int i);
int atomic_read(atomic_t *v);
void atomic_set(atomic *v,int i);
int atomic_dec_and_test(atomic *v); //減1測試是否為0
int atomic_inc_and_test(atomic *v);
..... //其實操作在標頭檔案檢視
64位整型原子操作
相容64位cpu和os
typedef structatomic64_t;
位原子操作
主要進行位操作,指定位置0或置1
unsigned long value=0;
set_bit(0,&value);
clear_bit(1,&value);
chang_bit(int nr,void *addr) ;//取反
用原子操作阻止裝置檔案被多個程序開啟.
static int atomic_test_open(struct inode *node,struct file *file)
} return 0;
}static int atomic_test_release(struct inode *inode,struct file *file)
return 0;
}
module_param(atom,int,s_irugo|s_iwusr); //引數名稱,型別,許可權
在insmod 時 傳入引數 例如 insmod atomic_test.ko atom=0
原子性,原子操作
舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...
原子變數與原子操作
1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...
c 原子操作 賦值 c 原子操作
這個型別可以在兩個狀態間切換 設定set flag true 和清除clear flag false 必須被atomic flag init初始化此時flag為clear狀態,初始化標準為是清除狀態。當你的標誌物件已初始化,那麼你只能做三件事情 銷毀,清除或設定 查詢之前的值 這些事情對應的函式分別...