Mctrain's Blog

What I learned in IT, as well as thought about life

知识整理(2015.1)

| Comments

从上大学开始到现在,我们学过多少的知识,尝试过多少的技能?特别是对于程序员来说,每天都可能遇到新的东西,听别人讲解或者自己去查询新的知识,但是这些所谓的知识大部分只能在大脑中贮存那么几天,最多几周,那些我们曾经以为自己看懂了就永远都不会忘记的东西又有多少被那个过于自信的自己所遗忘了呢?当自己想要重新去涉及相关领域的时候甚至都不记得该从那里去找了。有时候,我甚至回想前一天看过什么的时候都已然忘记!

确实,现在有很多很方便的软件,或者相应的方法来记录这些,比如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.


IOCTL

推荐LWN的这篇科普文:The new way of ioctl

  • 原来的IOCTL: 采用内核大锁(big kernel lock: BKL)
  • unlocked_ioctl: 优化,采用自定义的锁(self-defined lock)
  • compat_ioctl: 当32位的进程需要在64位的系统上调用(whenever a 32-bit process calls ioctl() on a 64-bit system),需要做一些类型转换的操作。

MSI-X

MSI-X How To

另外,在Linux内核的文档中(linux-src/Documentation/PCI/MSI-HOWTO.txt)也有最新的详细的描述。

这里是我对这个文档进行的整理


Eventfd

这里是eventfd的man page,讲的还是比较详细的,有一个简单例子。


Namespaces

还是推荐LWN的那几篇介绍吧

这里稍微介绍下,linux的namespace一个最重要的作用是用来支持Linux Container(LXC)的,到目前为止包含6种namespaces(按照出现的时间顺序排列):

  • Mount namespace (Linux 2.4.19):用于隔离不同进程可见的fs mount point,其中一个作用有点像chroot,和chroot不同的是,mount namespace更安全和更灵活。它还有其它用法。
  • UTS namespace (Linux 2.6.19): 隔离两个标示符:nodename和domainname,由uname()返回,由sethostname()和setdomainname()两个syscall进行设置。UTS允许container中有自己的hostname和domain name.
  • IPC namespace (Linux 2.6.19): 隔离IPC资源(System V IPC object和POSIX message queues),现在感觉有了PID的namespace之后好像不怎么用了吧。
  • PID namespace (Linux 2.6.24) 隔离PID number。即不同PID namespace的进程可以有相同的PID。其中一个好处是container可以在host间迁移,同时保持里面进程原有的PID。另外,它可以允许每个container里面都有自己的init(PID 1)进程,在执行初始化和回收子进程的任务)。也就是说,在一个PID namespace中,每个进程会有两个PID,一个是PID namespace里面的PID,一个是外面host看到的PID
  • Network namespace (Linux 2.6.24 - Linux 2.6.29): 提供网络资源的隔离。每个network namespace有自己的网络设备,IP地址,IP路由表,/proc/net 目录,端口号等等。
  • User namespace (Linux 2.6.23 - Linux 3.8): 对user和group ID number进行隔离。也就是说,一个进程的user ID和group ID在user namespace内外可能不一样。从Linux 3.8开始,一个unprivilege的进程可以创建user namespaces,这产生了一些新的可能性,也会产生一些安全性问题。

Qemu Object Model (QOM)

这个slide介绍了Qemu设备模型的发展历史。

WIKI的这篇介绍了QOM和Qdev的区别。

这个文档详细地介绍了QOM。

当然也可以看我写的这篇博客,里面也有一些说明。


Linux Kernel - read/write file

这个点主要是说明如何在内核里面读写文件。

事实上在内核里面是不建议对文件进行读写操作的。

这个mailing list里面简单说明了原因。

而在这个博客中更详细地解释了这件事,不过如果你确实要这么做,它也举了个例子。

这是一个中文博客,同样了举了个例子说明如何在内核中读写文件(如果你真的要这么做的话)

这里是我对这个问题的整理。


Linux Kernel - kmalloc, kzalloc, kcalloc, vmalloc

简单地说,这几个malloc的区别在于:

  • kzalloc zeroes the memory before returning a pointer
  • 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

Inline Assembly

这篇IBM的文档较清楚地介绍了汇编语言和内联汇编的语法。

这个这个是两篇比较简单清楚的科普文档。

这个是X86汇编编程的一个简化版的查询文档

这个事X86汇编的Guide就比较详细的文档。


Segment Register

这个这个是两个问答网站上关于gs、fs等segment register的提问,有一些比较详细的回答。

这个文档介绍了segment寄存器的结构。

这个文档列举了X86的所有寄存器及其简介。


Thread Local Storage (TLS)

这个是一篇中文的关于TLS的介绍,比较长,而且主要是关于Windows的。

这个博客是Linux TLS的介绍,比较清楚。


PCI Device Driver

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。


Xen I/O

这是一个介绍Xen I/O的科普slide

这一篇文章摘自那本《The Definitive Guide to the Xen Hypervisor》书。

其实了解Xen I/O最好的资料是上面提到的这本书,以及去查阅相应的代码。

当然还有一些文档:


BDF Notation

这个Xen的Wiki详细并且清楚地科普了BDF的相关知识


Signal in Linux

这个slide对signal介绍的蛮清楚的。

这个文档对Signal介绍地更为全面。


CPU Privilege Level

这篇中文博客前面的对CPL,DPL,RPL的名词解释部分还不错,但是后面有点看不懂。

这个英文笔记其实对这三种权限级别介绍的更为简单,但是清楚,特别是最后对RPL的介绍所举的那个例子。

这里是我基于上面这篇英文笔记对这几个名词解释的整理。

Comments