如#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); }