如#define SMALL_BUFFER_SIZE ((REPLAY_PAGE_SIZE >> 3) + 64 )
此处移位处括号必须要加!
2、char **inode_large, **inode_small;
二级指针直接使用已经分配的区域代码相当简单,但是需要考虑内存中
实际分配的长度是否一致!
g_large_mem_buf = kmalloc(100);
如inode-large = (char **)g_large_mem_buf;
inode_small = (char **)(g_large_mem_buf + large_mem_len);
然后可直接使用inode_large[i] = ...; inode_small[i] = ...; 让每个指针指向相应的内存区域.
#include <stdio.h>
int func()
{
int a, b;
a = b = 0;
a++;
b++;
return a+b;
}
struct test {
int a;
int b;
int c;
int d;
};
int main()
{
func();
struct test t = {
.a = 1,
.b = 10,
};
struct test p[5] = {
{
.a = 0,
.b = 0,
},
{
.a = 1,
.b = 11,
},
{
.a = 2,
.b = 22,
},
};
struct test **pp = &p; // *pp 和*pp+1偏移量为16,而pp和pp+1的偏移量为一个指针长度,最后p和p+1的偏移量也为16
printf("%p, %p, %p, %p, %p, %p, %p\n", pp, pp+1, *pp, *pp+1, *pp+2, p, p+1);
return 0;
}
结果为:
0x7fffe26653a0, 0x7fffe26653a8, (nil), 0x10, 0x20, 0x7fffe26653a0, 0x7fffe26653b0
3、宏中尽量避免使用可能为空的指针,此问题在kernel中可能导致空指针,若必须使用,请注意
仔细判断!
4、spin_lock_irqsave \ spin_unlock_irqrestore 锁的位置很重要!
首先需要保证锁的时间尽可能要短;其次再考虑锁的位置的合理性!
再者是锁了中断后,注意解锁的时机,如果代码在某处提前返回了,记得解锁,
同时在代码中某处可能下一条睡眠的地方,一定要先unlock,然后在睡眠结束后在lock上!!
以及当时没有返回,那在最后也要解锁,否则将导致死锁!!!!
5、看出错误在哪了么?花了我一个小时才发现的错误!!!
if (readl(_ISR(i2c) == 0x800)) {
// i2c_pxa_reset(i2c);
PRINT(COMMON_DEBUG, "isr is 0x800. Error");
// return I2C_RETRY;
}
6、指针传参不易发觉的错误
static struct phy_device *phy;
struct net_device *get_netdev(struct phy_device *p)
{
p = phy;
if (fastenet)
return fastenet;
else
printk(KERN_ERR "fe dev is NULL\n");
return NULL;
}
调用处p的值是phy么?实际上又错了,应该用二级指针!!!
struct net_device *get_netdev(struct phy_device **p)
{
*p = phy;
if (fastenet)
return fastenet;
else
printk(KERN_ERR "fe dev is NULL\n");
return NULL;
}
struct ic_device *d, *next;
struct net_device *dev;
rtnl_lock();
next = ic_first_dev;
while ((d = next)) { // 当NULL时while会终止!开始我也以为一直循环!
next = d->next;
dev = d->dev;
if (dev != ic_dev) {
DBG(("IP-Config: Downing %s\n", dev->name));
dev_change_flags(dev, d->flags);
}
kfree(d);
}