大家来帮忙看一下这个C语言定义 static struct pci_device_id r1000_pci_tbl[] _devinitdata解决方法
大家来帮忙看一下这个C语言定义 static struct pci_device_id r1000_pci_tbl[] __devinitdata
源码如下:
static struct pci_device_id r1000_pci_tbl[] __devinitdata = {
{ 0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8167, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{0,}
};
在看一个C源码时遇到的,
pci_device_id 是在另一个文件中定义的结构体
r1000_pci_tbl[]是这个结构体的一个数组
后面再接一个"__devinitdata "就不知道是什么意思咯
各位大吓帮忙看看,谢谢
------解决方案--------------------
1. __devinitdata是专门给硬件定义的宏,如果你的
系统不支持热插拔的话,改宏没有任何意义,如果你
是支持热插拔的系统,改宏的意义等同于__initdata
__initdata的意义应该很清楚了,就是说在设备加载
启动完成后,凡是带有该标记的变量所占有的内存在
初始化完成后都将被释放,这就是你为什么在linux的
内核启动完成后,经常可以看到多少多少K的memory被
内核free掉的信息
2.这是GNU C中的特性,术语称为labeled elements
一般的C编译器必须要求一个结构在赋初始值的时候
得按照你定义该结构的顺序来赋值。而GNU C的这个
特性允许你不用按照定义改结构的顺序来赋值,只要
用变量名加冒号的形式来赋值即可。这个特性在给
一个union赋值的时候特别有效。注意的是,GNU C++
并不支持该特性。
源码如下:
static struct pci_device_id r1000_pci_tbl[] __devinitdata = {
{ 0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8167, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x10ec, 0x8136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{0,}
};
在看一个C源码时遇到的,
pci_device_id 是在另一个文件中定义的结构体
r1000_pci_tbl[]是这个结构体的一个数组
后面再接一个"__devinitdata "就不知道是什么意思咯
各位大吓帮忙看看,谢谢
------解决方案--------------------
1. __devinitdata是专门给硬件定义的宏,如果你的
系统不支持热插拔的话,改宏没有任何意义,如果你
是支持热插拔的系统,改宏的意义等同于__initdata
__initdata的意义应该很清楚了,就是说在设备加载
启动完成后,凡是带有该标记的变量所占有的内存在
初始化完成后都将被释放,这就是你为什么在linux的
内核启动完成后,经常可以看到多少多少K的memory被
内核free掉的信息
2.这是GNU C中的特性,术语称为labeled elements
一般的C编译器必须要求一个结构在赋初始值的时候
得按照你定义该结构的顺序来赋值。而GNU C的这个
特性允许你不用按照定义改结构的顺序来赋值,只要
用变量名加冒号的形式来赋值即可。这个特性在给
一个union赋值的时候特别有效。注意的是,GNU C++
并不支持该特性。