Подскажите пожалуйста, правильно ли выделяется и освобождается память в модуле ядра с целью
последующеготображения через mmap?
После нескольких циклов выделения/освобождения свободная память в системе заканчивается и
не выделяется необходимое количество блоков.
Ядро 2.4.18. Спасибо. Привожу псевдокод выделения/освобождения памяти.
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//Allcoate m_blkNum blcok of memory m_blkSize
for( ii=0; ii<m_blkNum; ii++ )
{
m_arrBlock[ii].sysAdr = pci_alloc_consistent( m_pci,
m_blkSize,
&m_arrBlock[ii].phyAdr );
if( pcbuf->m_arrBlock[ii].sysAdr == NULL )
{
printk("<0> Allocc(()) failed allocate memory for block=%d,\
ptr=0x%X\n", ii, (int)pBlk[ii] );
return -ENOMEM;
}
//try to lock all physical pages in the current block
lock_pages( m_arrBlock[ii].sysAdr, m_blkSize );
}
//free allocated memory blocks
for( ii=0; ii<m_blkNum; ii++ )
{
if(m_arrBlock[ii].sysAdr != NULL)
{
//unlock all physical pages in the current block
unlock_pages( m_arrBlock[ii].sysAdr, m_blkSize );
pci_free_consistent( m_pci, m_blkSize,
m_arrBlock[ii].sysAdr,
virt_to_bus(m_arrBlock[ii].sysAdr));
}
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------
static int lock_pages( void *va, u32 size )
{
int j=0;
struct page *start_page_addr = virt_to_page( va );
spin_lock(&init_mm.page_table_lock);
for (j=0; j < (size >> PAGE_CACHE_SHIFT); j++) {
SetPageReserved((start_page_addr+j));
//printk("<0> start_page_addr[%i] = 0x%X\n", j, (int)(start_page_addr+j) );
}
spin_unlock(&init_mm.page_table_lock);
//set lock status;
return 0;
}
//--------------------------------------------------------------------
static int unlock_pages( void *va, u32 size )
{
int j=0;
struct page *start_page_addr = virt_to_page( va );
spin_lock(&init_mm.page_table_lock);
for (j=0; j < (size >> PAGE_CACHE_SHIFT); j++) {
ClearPageReserved((start_page_addr+j));
//printk("<0> start_page_addr[%i] = 0x%X\n", j, (int)(start_page_addr+j) );
}
spin_unlock(&init_mm.page_table_lock);
//clear lock status
return 0;
}
//--------------------------------------------------------------------
Ответ на:
комментарий
от idle
Ответ на:
комментарий
от karak
Ответ на:
комментарий
от karak
Ответ на:
комментарий
от idle
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум проблема с обработкой прерывания (2006)
- Форум mmap из ядра в приложение. (2011)
- Форум вызов generic_make_request из обработчика запросов блочного устройства (2019)
- Форум Kernel BUG (2005)
- Форум Всё ли нормально в символьном устройстве? (2017)
- Форум Производительность AF_PACKET RAW и AF_INET SOCK_STREAM сокетов в ядре. (2010)
- Форум падает книжный пример (2013)
- Форум Косяк с NFS в 2.6.19-rc* (fs/nfs/dir.c) (2006)
- Форум Максимальное колличество MPLS POP меток на оборудовании (2017)
- Форум pci driver (2008)