从上大学开始到现在,我们学过多少的知识,尝试过多少的技能?特别是对于程序员来说,每天都可能遇到新的东西,听别人讲解或者自己去查询新的知识,但是这些所谓的知识大部分只能在大脑中贮存那么几天,最多几周,那些我们曾经以为自己看懂了就永远都不会忘记的东西又有多少被那个过于自信的自己所遗忘了呢?当自己想要重新去涉及相关领域的时候甚至都不记得该从那里去找了。有时候,我甚至回想前一天看过什么的时候都已然忘记!
确实,现在有很多很方便的软件,或者相应的方法来记录这些,比如evernote,甚至单纯地采用书签。然而单纯的记录和鼠标点击都远远不能达到好的知识学习的效果。在现实生活中,我们想要学习一个知识点,往往都会花上大量的时间和精力在良莠不齐的网页中搜索到那些靠谱的、解释清楚的博客或者文档。再花上时间去阅读和理解。对于我们这种普通人来说,看过的东西大部分会在很短的时间内忘掉,就算当时感觉完全理解了,也会在未来的某一天里不经意地彻底忘记。这种事对我来说发生过太多次了,以至于我经常在某些时候觉得自己掌握了很多知识,充满了自信,而过了一段时间之后又变得颓然无助。
从这个月开始我尝试记录“技术日记”,每天总结一下当天所查询、理解的知识,并且记录下对于我来说比较有用的博客或者的文档出处,以便于日后查询。当记录了一个月之后我依然觉得这样还是不够,我觉得除了每天记录之外,每隔一段时间的回顾和总结也是非常必要的。于是我决定把这个总结作为每个月的常规任务,记录在博客上,或许能够更好地激励和督促我自己,甚至也可能会在不经意间带给别人些许方便呢。
从这次开始,进行2015年1月的知识整理,并不会非常详细,仅仅是当做一个月知识的回顾,并且记录下一些对自己产生启发效果或者科普功能的博客和文档的链接。
这个月的关键字:IOCTL, MSI-X, Eventfd, Namespaces, QOM, Linux Kernel, Inline Assembly, Segement Register, TLS, PCI Device Driver, Xen I/O, BDF Notation, Signal, CPU Privilege Level.
推荐LWN的这篇科普文:The new way of ioctl
另外,在Linux内核的文档中(linux-src/Documentation/PCI/MSI-HOWTO.txt)也有最新的详细的描述。
这里是eventfd的man page,讲的还是比较详细的,有一个简单例子。
还是推荐LWN的那几篇介绍吧
这里稍微介绍下,linux的namespace一个最重要的作用是用来支持Linux Container(LXC)的,到目前为止包含6种namespaces(按照出现的时间顺序排列):
这个slide介绍了Qemu设备模型的发展历史。
WIKI的这篇介绍了QOM和Qdev的区别。
这个文档详细地介绍了QOM。
当然也可以看我写的这篇博客,里面也有一些说明。
这个点主要是说明如何在内核里面读写文件。
事实上在内核里面是不建议对文件进行读写操作的。
这个mailing list里面简单说明了原因。
而在这个博客中更详细地解释了这件事,不过如果你确实要这么做,它也举了个例子。
这是一个中文博客,同样了举了个例子说明如何在内核中读写文件(如果你真的要这么做的话)
这里是我对这个问题的整理。
简单地说,这几个malloc的区别在于:
kcmalloc allocates memory for an array, it is not a replacement for kmalloc :
void *kcalloc(size_t n, size_t size, gfp_t flags)
vmalloc is the same as kmalloc, except that it allocates memory that is only virtually contiguous. The underlying physical memory can be discontiguous.
LWN的这篇文章说明了为什么要引入kcalloc,以及之后的kzalloc:
kcalloc
是用于代替kmalloc()/memset()
的组合的,kzaloc
主要是去掉kcalloc
的第一个参数n,因为在大部分情况下它等于1
。这篇IBM的文档较清楚地介绍了汇编语言和内联汇编的语法。
这个事X86汇编的Guide就比较详细的文档。
这个和这个是两个问答网站上关于gs、fs等segment register的提问,有一些比较详细的回答。
这个文档介绍了segment寄存器的结构。
这个文档列举了X86的所有寄存器及其简介。
这个是一篇中文的关于TLS的介绍,比较长,而且主要是关于Windows的。
这个博客是Linux TLS的介绍,比较清楚。
Writing a PCI Device Driver, A Tutorial with a QEMU Virtual Device 非常详细地介绍了如何写一个Qemu的PCI设备驱动,采用的是Qemu的Inter-VM share memory来做介绍,非常赞!
另外,在Linux内核的文档中(linux-src/Documentation/PCI/pci.txt
)也有最新的详细的描述介绍如何写一个PCI device driver。
而这一篇文章摘自那本《The Definitive Guide to the Xen Hypervisor》书。
其实了解Xen I/O最好的资料是上面提到的这本书,以及去查阅相应的代码。
当然还有一些文档:
Xen Get Started
。这个Xen的Wiki详细并且清楚地科普了BDF的相关知识
这个slide对signal介绍的蛮清楚的。
这个文档对Signal介绍地更为全面。
这篇中文博客前面的对CPL,DPL,RPL的名词解释部分还不错,但是后面有点看不懂。
这个英文笔记其实对这三种权限级别介绍的更为简单,但是清楚,特别是最后对RPL的介绍所举的那个例子。
这里是我基于上面这篇英文笔记对这几个名词解释的整理。