1. Linux内核常用函数全景解析
作为Linux系统开发者和内核工程师的"瑞士军刀",内核函数是我们日常工作中最亲密的伙伴。从内存管理到进程调度,从文件操作到网络通信,内核函数构成了整个操作系统的骨架。我整理了这份手册,涵盖15年内核开发中最常用的200+核心函数,每个函数都经过生产环境验证。
这份手册特别适合:刚接触内核开发的工程师、需要快速查阅函数用法的开发者、准备面试的内核岗位候选人。所有示例代码均可直接用于内核模块开发。
2. 内存管理核心函数族
2.1 页分配与释放
c复制struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
void __free_pages(struct page *page, unsigned int order);
这是内核内存分配的基石。gfp_mask参数组合了分配标志:
GFP_KERNEL:标准内核内存分配,可能睡眠GFP_ATOMIC:原子上下文使用,不会触发回收GFP_DMA:用于DMA操作的32位内存
实际项目中,我们常用kmalloc/kfree封装:
c复制void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *objp);
踩坑记录:在中断上下文必须使用GFP_ATOMIC,否则会导致内核oops。我曾在一个网卡驱动中错误使用GFP_KERNEL,导致系统在高负载时崩溃。
2.2 高端内存映射
处理物理地址超过896MB的内存时:
c复制void *kmap(struct page *page);
void kunmap(struct page *page);
这些函数会建立临时映射,典型使用场景:
c复制struct page *high_page = alloc_pages(GFP_HIGHUSER, 0);
void *vaddr = kmap(high_page);
/* 操作映射后的虚拟地址 */
kunmap(high_page);
3. 进程与调度关键API
3.1 进程创建与控制
c复制pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
创建内核线程的经典方法,现代内核更推荐:
c复制struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
const char namefmt[], ...);
进程状态操作:
c复制void set_current_state(int state);
/* 状态标志包括:
TASK_RUNNING
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE */
3.2 等待队列实战
c复制DECLARE_WAIT_QUEUE_HEAD(wq);
wait_event_interruptible(
