Bonjour,
Comme je le dit dans le titre du sujet, j'ai un problème pour désallouer la mémoire RAM que j'ai réservée pour un module. Le système est une Debian Lenny 5.03 32 bits avec l'option Hight Mem activée (PAE) pour que le système puisse utiliser les 8Go de RAM entre les différents programmes. La version de GCC utilisée est la 4.2.4.
Le problème : il s'agit d'une réservation de 24Mo mémoire démarrant à 7.5Go. La réservation est faite avec ioremap et la libération avec iounmap. La libération de la mémoire s'effctue sans problème dans le cas où l'on ecrit rien dans la mémoire allouée mais si on essaye de libérer la mémoire après avoir écrit dedans, on a un kernel panic.
La valeur affichée en héxadécimale de MEM_SHARE vaut 3.5Go mais il semblerait que ioremap tienne compte du depassement de 4Go.
voici la sortie du fichier /var/log/messages
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <linux/version.h> #include <linux/kernel.h> #include <linux/module.h> #include <asm/io.h> #define MEM_SHARE 7680 * 0x100000 // revervation a partir de 7.5Go #define MEM_SIZE 24 * 0x100000 // Reservation de 24Mo char * mem; int init_module(void) { char * mes; char * string={"* Simple - REALLY simple memory mapping test."}; printk("\n\n"); mem = (char *) ioremap((unsigned long) MEM_SHARE,(unsigned long) MEM_SIZE); memcpy((char *)mem,string,strlen(string)); memcpy(mes, (char *)mem, strlen(string)); printk(mes); printk("\n\n\n"); printk("Ring buffer size at phys @ %x, at @ %x\n",MEM_SIZE, MEM_SHARE); printk("Ring buffer size at log @ %x, at @ %x\n",MEM_SIZE, mem ); return (0); } void cleanup_module(void) { printk("Ring buffer size at phys @ %x, at @ %x\n",MEM_SIZE, MEM_SHARE); printk("Ring buffer size at log @ %x, at @ %x\n",MEM_SIZE, mem ); iounmap((void *) mem); printk("Module has been removed\n"); }
Sep 17 10:14:00 Xport-NT kernel: [ 924.658719]
Sep 17 10:14:00 Xport-NT kernel: [ 924.658720]
Sep 17 10:14:00 Xport-NT kernel: [ 924.658748] * Simple - REALLY simple memory mapping test.
Sep 17 10:14:00 Xport-NT kernel: [ 924.658750]
Sep 17 10:14:00 Xport-NT kernel: [ 924.658750]
Sep 17 10:14:00 Xport-NT kernel: [ 924.658752] Ring buffer size at phys @ 1400000, at @ e0000000
Sep 17 10:14:00 Xport-NT kernel: [ 924.658755] Ring buffer size at log @ 1400000, at @ f8bc0000
Sep 17 10:14:22 Xport-NT kernel: [ 947.368431] Ring buffer size at phys @ 1400000, at @ e0000000
Sep 17 10:14:22 Xport-NT kernel: [ 947.368435] Ring buffer size at log @ 1400000, at @ f8bc0000
Sep 17 10:14:22 Xport-NT kernel: [ 947.368449] Module has been removed
Sep 17 10:14:22 Xport-NT kernel: [ 947.368536] c01acf51
Sep 17 10:14:22 Xport-NT kernel: [ 947.368545] Modules linked in: nvidia(P) binfmt_misc ppdev lp ipv6 acpi_cpufreq cpufreq_conservative cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table cpufreq_userspace dm_crypt dm_mod loop snd_hda_intel snd_pcm snd_seq snd_timer snd_seq_device snd i2c_i801 i2c_core parport_pc parport soundcore intel_agp agpgart snd_page_alloc button evdev ext3 jbd mbcache raid1 md_mod sg sr_mod sd_mod cdrom generic usbhid hid ff_memless jmicron ide_core ata_piix ata_generic ahci libata ehci_hcd r8169 scsi_mod floppy uhci_hcd usbcore thermal processor fan
Sep 17 10:14:22 Xport-NT kernel: [ 947.368604] I-pipe domain Linux
Partager