存档

2013年3月 的存档

中断栈溢出后的结果

2013年3月24日 没有评论 6,108 次浏览

说一下上文中最开始提到的“某个问题”:如果一台主机网卡比较多,然后每个网卡分队列又比较多,总之结果就是系统里的网卡设备的中断号比较多(关于超过256个中断数的情况,请见参考1,2,3),一旦所有这些中断都绑定到同一个CPU,那么如果网卡收到数据包进而触发中断,而众多硬中断一嵌套就非常容易出现中断栈溢出。一旦中断栈溢出,那么将会导致怎样的结果,这曾在之前的文章里隐含的提到过,这里再重新整理一遍。 在继续下面的描述之前,先看两个知识点: 1,Linux... [阅读更多]

Linux文件系统的日志功能

2013年3月17日 没有评论 7,032 次浏览

所谓原子操作,即要么全部成功,要么全部失败。磁盘硬件可以保证对一个扇区的操作是原子的,也就是说对一个磁盘扇区进行写操作,那么结果只有两种:1,整个扇区被完全修改为新数据;2,整个扇区没有被做任何修改;而不会出现扇区半新半旧的混乱状态(比如前256字节为新数据,后256字节还为旧数据,这里假定一个扇区为512字节)。 如果需要对超过一个扇区的操作进行原子控制,那么就需要更高一级别的软件控制机制。这是必须的,否则将导致磁盘文件系统数据的不一致错误,在Linux上对应的软件控制机制为JBD(Journaling... [阅读更多]

分类: *nix技术, 文件系统 标签: , , ,

对Linux x86-64架构上硬中断的重新认识

2013年3月16日 1 条评论 3,957 次浏览

对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草内核版本,并且以x86-64架构为基准)。 以前的认识:Linux对硬中断(本文如无特殊说明,都是指普通意义上的可屏蔽硬件中断)的处理有优先级概念,高优先级硬中断可以打断低优先级硬中断。 重新认识: 1,对于x86硬件而言,在文档325462.pdf卷3章节6.9... [阅读更多]

如何对仅在指定调用路径下的函数断下断点

2013年3月16日 没有评论 2,767 次浏览

举个例子,有示例代码如下: # cat t.c #include <stdio.h> void foo() { printf("foo\n"); } void bar() { foo(); } void baz() { foo(); } int main() { bar(); baz(); bar(); ... [阅读更多]

Linux Kprobes介绍

2013年3月10日 1 条评论 4,238 次浏览

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

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

2013年3月10日 2 条评论 5,977 次浏览

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