linux内核网络“每日读书”

主机和网络之间的尾端转换

超过一个字节以上数据结构可以采用两种不同格式存储内存中尾端 little endian 大尾 big endian, 第一种格式最低字节存储最低内存地址第二种格式恰好相反linux这类操作系统所用格式依赖于所用处理器例如Intel处理器遵循小尾端模式Motorola 处理器使用大尾端模式

假设我们linux机器从一台远程主机接收到一个IP封包由于LInux不知道远程主机初始化协议所用格式大端还是小端那么linux无法读取报头出于这个原因, 每个协议族都必须定义所用的尾端例如tcp/ipc采用大端模式

但是这样仍然会给内核开发人员留下一个问题代码必须能在众多支持不同尾端模式处理器工作有些处理器上可能入口封包同一尾端但是如果尾端就必须转换处理器所用尾端模式

因此每次内核需要读取保存/或者比较超过一个字节IP报头字段首先就必须网络尾端转换主机尾端或者相反TCP/IP协议栈其他协议也是如此协议本地主机都是大尾转换函数就是空操作noop, 因为没必要做任何转换但是转换函数还是始终出现代码中代码移植性只有转换函数本身平台相关1-2 列出了用于两个字节资格字节尾端转换主要定义

htons 主机 -网络尾端 short

htonl 主机 - 网络尾端 long

ntohs 网络 -主机尾端 short

htonhl 网络 ->主机尾端 long

这些宏定义在头文件 include/linux/byteorder/generic.h 以下每种体系如何根据尾端裁剪这些定义

就每种体系而言每一体系目录 include/asm-include/linux/byteorder/little-endian.h

little-endian .hbig-endian.h都会包含通用include/linux/byteorder/generic. 文件1-2定义基于其他little-endian.hbig_endian.h定义不同也就是体系尾端影响1-2宏定义方式

对于1-2每个xxxx, 都会有一个姊妹__constant_xxx与之对应输入字段常数美剧列表中一个元素一节就会使用这个姊妹输入常数

本节前面已经谈到了当一个数据字段范围超过一个字节尾端很重要当一个字段所占字节一个或者一个以上而且定义为字段尾端实际上更为重要

捕获bug

有一些函数假定特定条件下调用或者假定特定条件不被调用内核使用BUG_ONBUG_TRAP捕获引起这类条件不满足地方传给BUG_TRAP输入条件内核会打印警告消息warning message, 对于 BUG_ON打印错误消息然后内核panic

数据统计

收集特定条件下发生统计数据功能一种良好习惯缓存查询成功失败次数内存分配成功失败次数等等对于每种收集统计数据网络功能本书列出每个计数器并给出描述

测量时间

内核经常需要测量某一个时刻经过了多长时间例如一个进行CPU密集运算任务通常会特定时间之后释放CPU重新调度执行就会继续工作即使内核支持内核抢占内核代码中这一点也是特别重要网络代码常见例子就是实现垃圾收集函数在本书会看到很多类似函数

内核空间时间流逝采用tick 来计算一个滴答就是两个连续到期定时器中断之间时间长度定时器负责各种不同任务而且每秒都会定期HZHZ是一个变量体系依赖代码进行初始化例如i386机器上初始化每秒1000也就是说linuxi386系统运行定时器每秒终端1000两次连续中断中间就是毫秒

每次定时器到期就会使一个名为jiffies全局变量递增, 也就是说任何时刻

jiffies代表系统引导经过滴答次数通用n * HZ代表就是n时间

如果一个函数所需要工作仅仅测量经过时间就可以jiffies保存在一个局部变量稍后再拿jiffies 当前时间戳做对比得到一段时间间隔得知测量时刻算起经过多长时间

下面例子给出了一个函数函数必须某种工作但又不想让其持有CPU时间超过一个滴答do_something job_done 设置非零表示工作已经完成函数就可以返回

unsigned long start_time = jiffies;

int job_done 0;

do {

do_somehting(&job_done);

if (job_done)

return ;

} while(jiffies - start_time < 1)

内核代码使用jiffies几个实例参见 积压处理process_backlog轮询

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值