linux kernel的问与答
文章目錄
- 一、內存
- 1、kmalloc、valloc、kzalloc、devm_kmalloc的區別
- 二、同步機制
- 1、spinlock
- 2、信號量semaphore
一、內存
1、kmalloc、valloc、kzalloc、devm_kmalloc的區別
- kmalloc和valloc的區別:
kmalloc是在線性映射區分配內存,它的物理地址是連續的; vmalloc是在高端內存區(非線性區/valloc區)分配內存,它的虛擬地址是連續的、物理地址非連續;
kmalloc在分配內存的時候,通過傳入GFP_ATOMIC可以進行原子操作;
- kmalloc kzalloc的區別
kzalloc申請內存后,并將這段內存清0
- kmalloc devm_kmalloc的區別
kmalloc申請的內存,在不使用時需要主動free釋放
devm_kmalloc申請的內存,在不使用時無需主動free釋放.
二、同步機制
1、spinlock
(1)、請問自旋鎖spinlock中都干了哪些事?
在spin_lock中,先關閉搶占preempt_disable、再加入排隊序列(有ower和next兩個變量,排隊就是next++)、再進入低功耗模式等到wfe
在spin_unlock中,先讓cpu退出低功耗模式(armv7使用sev指令,armv8使用staddlh指令),更新排隊序列(onwer++),在打開搶占preempt_enable
(2)、spin_lock中,為何要關閉搶占preempt_disable ?
如果不關閉搶占,單核的情況下, 進程A獲取spinlock后,在臨界區干活,發生了搶占,進程B嘗試獲取spinlock,進程B拿不到,就會自旋等待那里.
等到B的時間片耗完,再次調度到進程A,且A釋放了該鎖,然后再調用B,B才能拿到該鎖.
在B自旋的時候,造成cpu資源很大的浪費; 因為那個時候:A拿著鎖,A并沒有在執行,CPU在B上自旋等待
(3)、cpu0調用的A進程,剛獲取lock->next值后,正準備給該變量+1計數、此時cpu1調用的B進程,也獲取了lock->next值; 這樣A和B進程都能拿到該鎖? 請問linux是怎樣解決這個問題的?
在ARMV8上使用了exclusive機制,是一種獨占訪問的狀態,在A進程操作lock->next值時,在讀取時,使用了ldaxr指令,將global monitor狀態從open切換成exclusive狀態, 然后寫入數據到變量時使用stxr指令,將global monitor狀態從exclusive切換成open狀態。
在global monitor狀態未exclusive時,B是再去使用ldaxr指令讀取數據時,會返回錯誤,然后B會再繼續讀取該數據。
而在ARMv7上,雖然沒有exclusive機制,但是提供了類似的指令,ldrex和strex;
2、信號量semaphore
(1)、在信號量semaphore的down()中,都干了哪些事情?
檢查count值,大于0則獲得該鎖,進入臨界區;
否則的話,未獲得該鎖,先將task加入到wait_list,再調用schedule_timeout進入睡眠
(2)、信號量的實現為何要依賴spinlock ?
在信號量的實現中,要對count值進行加加或減減操作,使用spinlock防止該變量產生競爭;
總結
以上是生活随笔為你收集整理的linux kernel的问与答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ARM异常]-图解armv7/armv
- 下一篇: [ARM-assembly]-ARM64