摘要:
1.5 内存资源内存分配管理是实现高性能网络协议栈的关键因素,操作系统中的网络协议栈需要连续高可靠地运行,因此它需要频繁的为接收到的数据包分配缓冲区,同时也需要拼房释放处理完的数据缓冲区。1.5.1 高速缓冲区内核使用函数kmalloc和kfree来分配和释放内存块。这两根函数的使用语法是用户空间C库函数的malloc和free类似。在内核的各种组件中,经常需要为同一类型数据结构分配多个实例,如存放网络数据包的Socket Buffer。当分配内存空间和释放内存的操作发生的非常频繁时,内核组件的初始化函数通常为自己初始化一个特殊的高速缓冲区来为其数据结构分配内存空间,在数据对象使用结束释放内存 阅读全文
摘要:
模块功能的注册和取消应用程序的作用通常是运行后完成一定的功能,模块的主要任务是为当前内核中的其他组件提供服务。某个时候内核以模块的方式增加新功能,运行一段时间后,当不再需要这种功能时,可能将其移走。在系统启动阶段我们无从知道将会有什么功能以模块的形式加入到系统中,所以我们需要为模块提供接口来注册。内核中各个组件都有相应的模块注册的接口(如注册和取消网络驱动程序、文件系统、协议等)这些接口很容易从其函数名识别出来,一般是以register_...和unregister_...开始的函数。 阅读全文
摘要:
自动装载模块除了使用以上命令工具外,内核模块可以在需要的时候自动装载到内核中。使用我们的签名介绍的工具装载模块和卸载模块需要用户的干预,而且处于安全原因只有根用户能使用insmod和rmmod来加载和卸载模块。虽然这样保证了安全,但却带来了不便。例如,当一个用户程序在运行过程中需要使用一个功能,但该功能的模块还没有加载到内核中,这就需要内核有能力自动调度模块到内核地址空间。 通常,在程序运行过程中如果需要的资源或某个设备驱动程序没有注册,内核会报错。你可以事先用内核函数request_模块申请需要的组件模块。为了使用这个函数,在配置内核时需要激活项Kernel Module Loaderre. 阅读全文
摘要:
管理内核模块内核模块由目标代码组成,它在运行时装载到内核地址空间并运行。在系统启动时,内核事先并不知道会有什么功能的模块会装载到系统中,所以模块必须自己通知内核,让相应的组件知道模块加载与否。当模块移走时,它也需要移走所有在内核地址空间对它的引用,释放占用的系统资源。这里有两个方法是用来完成以上任务的。init_模块:向内核注册由模块提供的所有功能cleanup_模块:撤销任何有init_模块所作的功能。这两根方法每个模块都需要实现,在进一步深入理解模块的工作原理之前,我们首先给出一些常规的命令,以便了解如何从内核外来管理模块,用户可以用以下工具来手动插入和卸载模块1.插入模块insmod模块 阅读全文