存档

‘内核技术’ 分类的存档

Linux Kprobes介绍

2013年3月10日 2 条评论 8,120 次浏览

不得不说printk()函数是一个伟大的调试工具,它几乎能帮助我们在Linux系统的任何位置把我们想要的数据打印出来,但同时这也是一个比较耗时的过程,因为我们得把printk()函数加入到Linux内核源码的对应位置,重新编译模块,如果是内核修改,那么也许还得重启机器。 动态工具Kprobe的出现,使得我们可以在Linux系统的大部分地方都能通过更简便、快速的方法获得更多的内核信息,在前面文章里曾介绍的SystemTap也就是以Kprobe为基石而成的用户命令接口。 Kprobe,简单点说就是允许我们在内核执行到指定的地方时回调一个我们的自定义函数,在这个自定义函数内,我们就可以执行一些内核信息(类似于以前的printk())收集动作,完了之后内核再回去执行它原本的逻辑。 在这里,“内核执行到指定的地方”有一个专门的术语叫做probe(探针),目前有三种类型的probe,分别为: kprobes:内核代码的任何指令处。 jprobes:内核函数的入口处,因此可以很方便的获取到对应内核函数的参数。 kretprobes:内核函数的退出点。 先看个Kprobe实例: /* ... [阅读更多]

如何禁止Linux内核的-O2编译选项

2013年3月10日 2 条评论 11,087 次浏览

已有各种工具可以帮助我们调试内核,比如UML、kgdb、qemu等,但比较麻烦的是gdb经常给我一个“value optimized... [阅读更多]

Socket选项系列之SO_LINGER

2013年2月24日 7 条评论 18,167 次浏览

SO_LINGER是nginx里用到的另外一个重要套接口选项(因为它涉及到的问题很重要),虽然它不是特定于TCP套接口的,但针对的仍然是面向连接的协议,因此就TCP而言,自然也是可以使用它,这里就统一以TCP为例(即下面所提到的套接口仍然都还是TCP套接口)来进行阐述。 当应用程序在调用close()函数关闭TCP连接时,Linux内核的默认行为是将套接口发送队列里的原有数据(比如之前残留的数据)以及新加入的数据(比如函数close()产生的FIN标记,如果发送队列没有残留之前的数据,那么这个FIN标记将单独产生一个新数据包)发送出去并且销毁套接口(并非把相关资源全部释放,比如只是把内核对象sock标记为dead状态等,这样当函数close()返回后,TCP发送队列的数据包仍然可以继续由内核协议栈发送,但是一些相关操作就会受到影响和限制,比如对数据包发送失败后的重传次数)后立即返回。这需要知道两点:第一,当应用程序获得close()函数的返回值时,待发送的数据可能还处在Linux内核的TCP发送队列里,因为当我们调用write()函数成功写出数据时,仅表示这些数据被Linux内核接收放入到发送队列,如果此时立即调用close()函数返回后,那么刚才write()的数据限于TCP本身的拥塞控制机制(比如发送窗口、接收窗口等等),完全有可能还呆在TCP发送队列里而未被发送出去;当然也有可能发送出去一些,毕竟在调用函数close()时,进入到Linux内核后有一次数据包的主动发送机会,即: tcp_close()... [阅读更多]

Socket选项系列之TCP_DEFER_ACCEPT

2013年2月24日 1 条评论 7,395 次浏览

学过计算机网络课程的人,应该都知道TCP协议有个连接状态转换图,也许对其整体详细不甚清楚,但至少对TCP握手协议有些印象。标准的TCP三次握手(本节仅考虑这种情况,对于四次握手等其他情况,可以参考RFC... [阅读更多]

Socket选项系列之TCP_CORK

2013年2月24日 没有评论 5,827 次浏览

从上一节的内容可以看到,选项TCP_NODELAY是禁用Nagle算法,即数据包立即发送出去,而选项TCP_CORK与此相反,可以认为它是Nagle算法的进一步增强,即阻塞数据包发送,具体点说就是:TCP_CORK选项的功能类似于在发送数据管道出口处插入一个“塞子”,使得发送数据全部被阻塞,直到取消TCP_CORK选项(即拔去塞子)或被阻塞数据长度已超过MSS才将其发送出去。举个对比示例,比如收到接收端的ACK确认后,Nagle算法可以让当前待发送数据包发送出去,即便它的当前长度仍然不够一个MSS,但选项TCP_CORK则会要求继续等待,这在前面的tcp_nagle_check()函数分析时已提到这一点,即如果包数据长度小于当前MSS... [阅读更多]

Socket选项系列之TCP_NODELAY

2013年2月24日 没有评论 6,051 次浏览

在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John... [阅读更多]

使用systemtap调试Linux内核

2013年2月24日 1 条评论 7,194 次浏览

最近在公司看Linux内核的nmi死锁检测功能的实现机制,当然,是因为它变了,所以我才看的,简单来说就是在红帽的某牛提交了一个内核patch:new nmi_watchdog using perf... [阅读更多]

编译阶段的assert()

2012年11月13日 没有评论 6,558 次浏览

翻内核代码,看到几个有意思的东东,然后Stackoverflow查了一把BUILD_BUG_ON(不知从何时起,我遇到问题都是先Stackoverflow,找不到再Google,也许是因为在Stackoverflow里,如果能找到答案,那么答案会更明确&详细吧),于是有此文章。 这几个宏从哪个内核版本开始引入不得而知,不过我这里是linux-3.2\include\linux\kernel.h: /*... [阅读更多]

Linux内核与浮点计算

2012年10月24日 1 条评论 9,521 次浏览

在Linux内核里无法直接进行浮点计算,这是从性能上的考虑,因为这样做可以省去在用户态与内核态之间进行切换时保存/恢复浮点寄存器... [阅读更多]

Linux下的套接口选项SO_LINGER

2012年10月7日 没有评论 7,591 次浏览

Linux提供了一个套接口选项SO_LINGER,可以改变在套接口上执行close()函数时的默认行为,对于改变之后的行为如何,网上有大量的资料人云亦云的对其进行了说明,但是事实上却并非如此。 选项SO_LINGER用到的相关参数主要是一个linger结构体: Filename... [阅读更多]