Portál AbcLinuxu, 5. května 2025 20:57
The framebuffer device was opened successfully. 1366x768, 32bpp The framebuffer device was mapped to memory successfully. Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])Ale když v funkci nebudu chtít smazat posledních 6 řádků "vinfo.yres-6" tak to funguje OK.
void clear_fb(int r, int g, int b) { int y_pom; int x_pom; for ( y_pom = 0; y_pom < vinfo.yres-6; y_pom++ ) for ( x_pom = 0; x_pom < vinfo.xres; x_pom++ ) { location = (x_pom+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y_pom+vinfo.yoffset) * finfo.line_length; if ( vinfo.bits_per_pixel == 32 ) { *(fbp + location) = b; // Some blue *(fbp + location + 1) = g; // A little green *(fbp + location + 2) = r; // A lot of red *(fbp + location + 3) = 0; // No transparency } else { //assume 16bpp unsigned short int t = r<<11 | g << 5 | b; *((unsigned short int*)(fbp + location)) = t; } } }Někde mám nějakou chybičku neporadíte kde? Celý program v příloze.
Řešení dotazu:
Vypadá to, že zapisuješ do paměti, která ti nepatří
já bych asi hledal kolem finfo.line_length (vypsat si), když mmapuješ, používáš screensize, který počítáš jinak než pak location v clear_fb a to může pak zapisovat do nemmapované paměti.
Tzn. vypsat si celkový screensize a kontrolovat, že location ve funkcích není větší než... a když jo případně vypsat a nezapisovat do té paměti a hledat proč. Rozhodně počítat pokud možno stejným způsobem location a screensize
screensize = finfo.smem_len;Jo třeba projít proměnné a použít správné
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
Ide mimo rozsah, lebo tam bude dany pocet unsigned short int-ov.
fpb + location
sa posunie na lokalitu o location int-ov dalej.
takze by som spravil na zaciatku premennu ( kvoli rychlosti ):
unsigned short int *fbp_us = (unsigned short int*)fbp;
a potom pouzival ju takto:
*(fbp_us + location) = t;
alebo iba jednoducho pretypovat na (unsinged short int*) pred operaciou + location;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.