- 論壇徽章:
- 0
|
10可用積分
我的目標(biāo)平臺(tái)為 s3c2410-linux2.4.18
宿主機(jī)為readhat9.0
做對(duì)UART2以DMA方式進(jìn)行數(shù)據(jù)讀取的驅(qū)動(dòng)
在設(shè)置緩沖區(qū)的函數(shù)里,
當(dāng)為DMA內(nèi)核緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)(uart_buf_t)分配內(nèi)存時(shí),
(構(gòu)建s->nbfrags個(gè)這樣的緩沖區(qū),所以乘以 s->nbfrags)
(s->nbfrags根據(jù)需要設(shè)定,在我看的音頻驅(qū)動(dòng)中,設(shè)定為最大8個(gè))
kmalloc(sizeof(uart_buf_t) * s->nbfrags, GFP_KERNEL);
// 其中 sizeof(uart_buf_t) = 36
// s->nbfrags = 2
當(dāng)s->nbfrags為2或者3時(shí),能正常分配。當(dāng)s->nbfrags為1, 4, 8 ... 出現(xiàn)如下錯(cuò)誤:
kernel BUG at slab.c:1099!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c3b2c000
*pgd = 33c11001, *pmd = 33c11001, *pte = 00000000, *ppte = 00000000
Internal error: Oops: ffffffff
CPU: 0
pc : [<c001e858>] lr : [<c0025d74>] Tainted: P
sp : c3b35e60 ip : c3b35e18 fp : c3b35e70
r10: c3b34000 r9 : 00149898 r8 : 00000000
r7 : 00000000 r6 : c02073b0 r5 : 00000007 r4 : 00000000
r3 : 00000000 r2 : 00000001 r1 : 00000001 r0 : 00000001
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment user
Control: C000317F Table: 33B2C000 DAC: 00000015
Process insmod (pid: 53, stackpage=c3b35000)
Stack: (0xc3b35e50 to 0xc3b36000)
......
......
----------------------------------------------------------------------------
請(qǐng)問:
我看了kmalloc的用法,原型是 void *kmalloc(unsigned int len, int priority);
priority,也應(yīng)該傳入?yún)?shù)GFP_KERNEL。
只是分配的內(nèi)存長(zhǎng)度不一樣怎么會(huì)出錯(cuò)呢? 而且我分配的內(nèi)存空間并不大。
請(qǐng)高手指點(diǎn),感謝!
----------------------------------------------------------------------------
kmaolloc的相關(guān)代碼如下:
void * kmalloc (size_t size, int flags)
{
cache_sizes_t *csizep = cache_sizes;
for (; csizep->cs_size; csizep++) {
if (size > csizep->cs_size)
continue;
return __kmem_cache_alloc(flags & GFP_DMA ?
csizep->cs_dmacachep : csizep->cs_cachep, flags);
}
return NULL;
}
static cache_sizes_t cache_sizes[] = {
#if PAGE_SIZE == 4096
{ 32, NULL, NULL},
#endif
{ 64, NULL, NULL},
{ 128, NULL, NULL},
{ 256, NULL, NULL},
{ 512, NULL, NULL},
{ 1024, NULL, NULL},
{ 2048, NULL, NULL},
{ 4096, NULL, NULL},
{ 8192, NULL, NULL},
{ 16384, NULL, NULL},
{ 32768, NULL, NULL},
{ 65536, NULL, NULL},
{131072, NULL, NULL},
{ 0, NULL, NULL}
}; |
|