habib.bouaziz-viallet a écrit :
>Bonsoir la liste Guilde !
>
>Je suis en train de modifier un pilote de port série synchrone sur une
>plateforme légère (Cf. developer.axis.com) pour qu'il s'adapte à un
>codec particulier (CS4334)
>
>l'objectif etant de faire ceci : ./madplay < mon_morceau.mp3 |
>./transfert_sser
>
>le programme "transfert_sser" ouvre le port serie synchrone
>(/dev/sser0), recoit le flux standard en entrée et le redirige vers
>/dev/sser0. Le codec est connecté en hard sur ce port série.
>
>Mon problème : C'est que *kmalloc() échoue dans mon code pilote de
>/dev/sser0 au bout de quelques appels (j'en suis sûr mais je ne peux pas
>donner de copie d'ecran vu qu'il n'y a pas d'écran ...)
>
>La question : Y a t'il des précautions avec *kmalloc() ?? ca fait déja
>longtemps que j'y suis et je cherche de l'aide aussi sur la liste de
>axis
>
>HELP !!, Habib.
>
>
>
>
>
The data sizes available are generally powers of two. In the 2.0 kernel,
the available sizes were actually slightly less than a power of two, due
to control flags added by the management system. If you keep this fact
in mind, you'll use memory more efficiently. For example, if you need a
buffer of about 2000 bytes and run Linux 2.0, you're better off asking
for 2000 bytes, rather than 2048. Requesting exactly a power of two is
the worst possible case with any kernel older than 2.1.38 -- the kernel
will allocate twice as much as you requested. This is why /scull/ used
4000 bytes per quantum instead of 4096
In any case, the maximum size that can be allocated by /kmalloc/ is 128
KB -- slightly less with 2.0 kernels. If you need more than a few
kilobytes, however, there are better ways than /kmalloc/ to obtain
memory, as outlined next.
kmalloc a aussi d'autres inconvénients il alloue des chuncks de
mémoires : si tu spécifie une taille trop grande il se peut que
l'allocation échoue si aucun chunk de mémoire n'est assez grand (si la
mémoire est très fragmentée
get_free_page and Friends
If a module needs to allocate big chunks of memory, it is usually better
to use a page-oriented technique. Requesting whole pages also has other
advantages, which will be introduced later, in "The mmap Device
Operation" in Chapter 13, "mmap and DMA".
http://www.xml.com/ldd/chapter/book/ch07.html
dans un de mes drivers j'avais besoin de grosse tailles de mémoire pour
faire du DMA, j'allouais des petits chunks de pages que je linkais entre
eux pour faire du scatter gather (sur les périfs le supportant on passe
directement la liste et le dma s'éffectue au fur et à mesure,
remplissant les différents chunks... sur les dma ne le supportant pas il
existe en général deux jeux de registres un jeu dit "working" et un jeu
de "programation" en général on peut programmer celui de programmation
pendant que le working et en travail, et on peut programmer
automatiquement le swap entre les deux.... sur l'IT de fin de dma on
reprogramme celui de programmation et ainsi de suite....)
il faut mieux utiliser des buffers tournants plutôt que
d'allouer/désallouer....