spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
//普通請求鎖
spin_lock(&mr_lock);
//禁止中斷請求鎖
spin_lock_irqsave(&mr_lock);
//確保中斷是激活的狀況可用的方法
spin_lock_irq(&mr_lock)
/**臨界區**/
spin_unlock_irq(&mr_lock)
spin_unlock_irqrestore(&mr_lock);
spin_unlock(&mr_lock)
複製代碼
rwlock_t mr_rwlock = RW_LOCK_UNLOCKED;
read_lock(&mr_rwlock);
/**只讀臨界區**/
read_unlock(&mr_rwlock)
write_lock(&mr_rwlock)
/**讀寫臨界區**/
write_unlock(&mr_rwlock)
複製代碼
//聲明信號量
static DECLARE_SEMAPHORE_GENERIC(name, count);
//聲明互斥量
static DECLARE_MUTET(name);
//以指針方式初始化信號量
sema_init(sem, count);
//以指針方式初始化互斥量
init_MUTET(sem);
//試圖得到信號量
down_interruptible(&name)
//釋放信號量
up(&name)
複製代碼
sturct page{
unsigned long flags; // 頁的狀態,是否髒,是否被鎖定。可表示32種狀態。定義與<linux/page-flags.h>
atomic_t count; // 頁的引用計數,被使用了多少次。爲0時,新的分配就可使用它
struct list_head list;
struct address_space *mapping; //指向與該頁有關的address_space對象
unsigned long index;
struct list_head lru;
union{
struct pte_chain *chain;
pte_addr_t direct;
}pte;
unsigned long private;
void *virtual; //頁虛擬地址,虛擬內存地址
}
複製代碼
// 分配2^order個連續的物理頁,並返回指針
struct page* alloc_pages(unsigned int gfp_mask, unsigned int order) // 將頁轉換爲邏輯地址,頁是連續的,其餘頁緊隨其後 unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order) // 只獲取一頁,高端地址分配須要使用此函數 struct page* alloc_page(unsigned int gfp_mask) unsigned long get_free_page(unsigned int gfp_mask) //獲取填充內容爲0的頁 unsigned long get_zeroed_page(unsigned int gfp_mask) //釋放頁 void __free_pages(struct page *page, unsigned int order) void free_pages(unsigned long addr, unsigned int order) void free_page(unsigned int order) // 與用戶空間的malloc函數相似,最通用的接口。提供用於得到以字節爲單位的一塊內核內存 // 定義與<linux/slab.h>中 void *kmalloc(size_t siez, int flags) // kmalloc相反函數,釋放空間 void kfree(const void *ptr) // 確保分配的頁在物理地址上是連續的 // 定義與<linux/vmalloc.h> void* vmalloc(unsigned long size) //釋放空間 void vfree(void *addr) 複製代碼
//映射一個給定的page結構到內核地址空間:
void kmap(sturct page *page) //解除映射關係 void kunmap(struct page* page) //臨時映射 void *kmap_atomic(sturct page *page, enum km_type type) 複製代碼