linux_network_stack_hack.ppt
Linux内核网络协议栈Hack快速入门 Samuelchen QQ空间产品中心 培训目标 熟悉基本的Linux内核编程方法 掌握常见的内核协议栈修改和优化原理 掌握常见的调试优化方法和工具 从内核层次理解和调优网络应用 Linux内核网络协议栈Hack 基本知识 协议栈架构 优化实例 参考文件 基本知识点-内核程序架构 #include #include #include #include static int war2089_background( void ) { printk("<0>\nIn 2089,one way happens between human and robots.\n") } static int __init war2089_init( void ) { printk("<0>\nMy is demo programme,starting...\n"); } /*模块注销入口*/ static void __exit war2089_exit( void ) { printk("<0>\nMy is demo programme,exit...\n"); } #ifdef __KERNEL_MODULE__ module_init(war2089_init) module_exit(war2089_exit) #endif 基本知识点-内核编译 1、配置内核 1)cd /usr/src/linux/ make menuconfig; 修改内核配置,并保存 2)make -j 10 bzImage 编译内核,采用10个线程编译 3)make -j 10 modules; 编译模块 4)make install 安装内核 5)make modules_install 安装模块 基本知识点-定时器 static void war2089_apple_producer_timer_handle( unsigned long data) { war2089_apple_producer_timer.expires = jiffies+5*HZ; if ( time_to_exit ) return ; spin_lock(&attack_lock); robots[robot_count]='R'; robots[robot_chairman_pos]='R'; robot_chairman_pos = random_num()%robot_count; robots[robot_chairman_pos]='H'; spin_unlock(&attack_lock); robot_count++; if (robot_count >= MAX_ROBOT_COUNT) robot_count=0; add_timer(&robot_producer_timer); } 基本知识点-时钟与时间 内核的全局变量jiffies,应用中只能读。 jiffies的值是当每次timer中断产生后,就会加1. 而HZ预示了你1秒发生多少次timer中断,所以 一秒jiffies增加的数值肯定就等于HZ的值 2.4是100次 2.6中的HZ默认为1000次 可以直接通过HZ来计时 基本知识点-内存使用 32vs64: 32位:稳定支持4GB,超过4GB容易down.3GB以下是用户空间,3GB以上是内核空间.4KB/Page 64位:>128G, 8KB/Page 地址分类: 逻辑地址:请求控制器的地址 线性地址:从0开始寻址的内存.Intel使用段式寻址 物理地址:物理总线地址 基本知识点-内存使用 内核栈内静态分配 32位:8K,64位:16K 逻辑地址到物理地址转化 phyaddr = __pa(_mapd)>>PAGE_SHIFT; 如何在内核分配较大的静态内存 启动时候指定参数.. 基本知识点-中断与延后处理 驱动buffer穿越网络芯片、网卡驱动、IP协议栈的力量 中断驱动机制 分为硬中断和软中断机制. 硬件中断完成链路帧到达通知,并告诉CPU可以去处理收到链路帧等。 通常是在设备驱动中注册硬件中断处理函数来实现该机制。 软件中断是驱动整个TCP/IP协议栈的核心力量。对应网络协议栈有 专有的软中断标识,如NET_TX_SOFTIRQ,NET_RX_SOFTIRQ。也可以增加自定义的入口。 如: open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); --注册 r