内存缓存
内核使用kmalloc和kfree分配和释放内存块。对于常用的数据结构比如struct skb_buff等内核通常分配一块内存缓冲区用于常用数据结构的申请和释放。
处理内存缓存相关的函数
- kmem_cache_create
- kmem_cache_destroy
- kmem_cache_alloc
- kmem_cache_free
引用计数
为了避免访问已经释放的数据结构,同时让垃圾回收机制更加容易和有效率,很多数据结构会设置引用计数(reference count)。对于数据结构的存储和释放,内核组件会分别递增和递减引用计数。一般内核组件提供两个函数用于维护引用计数。xxx_get、xxx_put或者xxx_hold、xxx_release等。
垃圾回收
内核垃圾回收方式主要有两种:
-
异步
定时器定义调用函数,扫描数据结构然后把那些适合删除的数据结构释放掉。 -
同步方式
内存不足时立即出发垃圾收集动作,不用等定时器超时出发异步操作。
函数指针和虚拟函数表(VFT)
借助函数指针可以使C语言实现面向对象语言的某些优点。在定义数据结构的时候将函数指针作为结构的成员。
函数指针的优点是可以根据不同逻辑规则为对象设置不同的操作函数。
执行函数指针时需要检查其值是否为NULL,避免发生段错误。
函数指针缺点是增加阅读代码的困难程度,需要搞清楚函数指针的初始化位置。
goto语句
Linux内核中使用goto语句作为异常处理的常用方