Подскажите пожалуйста, правильно ли выделяется и освобождается память в модуле ядра с целью последующеготображения через 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)
- Форум вызов generic_make_request из обработчика запросов блочного устройства (2019)
- Форум Kernel BUG (2005)
- Форум mmap из ядра в приложение. (2011)
- Форум Всё ли нормально в символьном устройстве? (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)