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) 复制代码