治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu
发布时间:2013-01-09 14:26:07
这几个函数都是内核的延时函数: 1. udelay(); mdelay(); ndelay();实现的原理本质上都是忙等待,ndelay和mdelay都是通过udelay衍生出来的,我们使用这些函数的实现往往会碰到编译器的警告implicit declaration of function 'udelay',这往往是由于头文件的使用不当造成的。在include/asm-???/delay.h中定义了udelay(),而在include/linux/delay.h中定义了mdelay和ndelay. udelay一般适用于一个比较小的delay,如果你填的数大于2000......【阅读全文】
发布时间:2013-01-06 16:34:36
python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。不可变类型:string,integer,tuple>>>......【阅读全文】
发布时间:2013-01-05 22:22:36
先看一个经典的面试题:#include <stdio.h>#define f(a,b) a##b#define g(a) #a#define h(a) g(a) int main(){ printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2))); return 0;}输出是:12f(1,2)原因就是宏替换的原则问题:当一个宏参数被放进宏体时,通常(注意,有例外)这个宏参数会首先被全部展开。当展开后的宏参数被放进宏体时,预处理器对新展开的宏体进行第二次扫描,并继续展开。例如:#define P......【阅读全文】
发布时间:2013-01-04 16:36:22
驱动工程师最关心就是如何编写PCI设备驱动了. 经过前面的处理,所有设备及其信息都已经遍历出来了.在深入分析PCI驱动架构之前,我们来回顾一下前面遍历PCI设备时,对pci_dev->dev的一些重要成员的赋值.以及各结构在sysfs中的视图 8.1:pci架构在sysfs中视图 1:对于pci_dev pci_dev->dev的所属bus,parent和name的赋值: 在pci_scan_child_bus() --> pci_scan_slot()--> pci_scan_single_device()-->pci_sc......【阅读全文】
发布时间:2013-01-04 16:25:53
这里讨论系统上电时的情况, 热插拔的情况应该差不多.首先是从根总线开始, 然后就是扫描这个根总线上的每一条子BUS, 如下:unsigned int pci_scan_child_bus(struct pci_bus *bus){ unsigned int devfn, pass, max = bus->secondary; struct pci_dev *dev; pr_debug("PCI: Scanning bus %04x:%02x\n", pci_domain_nr(bu......【阅读全文】