Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Implémenter un malloc() qui tire avantage des 256 ko sur SH4
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Implémenter un malloc() qui tire avantage des 256 ko sur SH4

Posté le 09/09/2018 10:44

Pour CasioPython, il y a assez peu de mémoire disponible (2 ko), il faudrait donc une implémentation de malloc() (et donc aussi de free, realloc, etc) qui puisse allouer dans ce bloc de 256 ko.

Cette implémentation devra allouer dans le bloc normal de 48 ko si ce n'est pas une SH3 (histoire que je puisse toujours tester sur mon émulateur), mais si on peut juste définir un pointeur de départ et une taille, ça devrait se faire avec un simple if et le syscall pour avoir la version de l'OS.

Du coup est ce qu'il y a une implémentation pour laquelle on peut définir le pointeur de départ et la taille allouable ?
Aussi, c'est quoi les adresses du bloc de 256 ko et de celui de 48 ko ?


Pages : 1, 2Suivante
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 09/09/2018 10:48 | #


Allez, un petit effort, on relit ce qui a été dit... #157536 et le message suivant.

Ensuite, on cherche un peu sur Internet (?), il n'y a que deux choix de toute façon, un bloc ou un sbrk(), tu n'auras pas mal à trouver une implémentation qui convienne.

Pour le bloc de 48k, celui-là n'a pas d'adresse fixe, c'est celui qui est géré par le malloc() du système. L'idée c'est que ton malloc() final va essayer les deux :

- Si le système arrive à allouer, tu utilises ça
- Sinon, tu demandes à ton implémentation externe

Ensuite ton free() regarde si le pointeur est dans le gros bloc, auquel cas il appelle le free() de l'implémentation externe) ; sinon il utilise le free() du système.
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 11/09/2018 07:33 | #


Je vois comment faire, mais j'ai un problème de nomenclature.
La fonction serait ce pseudocode :
void* malloc_wrapper(int bytes) {
    if (malloc(bytes) == NULL) {
        return malloc_custom(bytes);
    }
}


Le problème, c'est que malloc_wrapper doit aussi être nommé malloc (pour que les appels à malloc soient redirigés vers ça).
Du coup comment je différencie le malloc_wrapper du malloc système ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 11/09/2018 16:55 | #


Très bonne question.

L'idée c'est que tu dois supprimer le fichier _malloc.robj de ton fxlib.a pour que le nom malloc disparaisse, ensuite tu peux redéfinir le syscall sous le nom malloc_syscall et écrire ton wrapper sous le nom malloc.
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 11/09/2018 18:24 | #


Ah le malloc c'est aussi un syscall ?

En effet je le trouve là : https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_syscalls.htm (0xACD)

Du coup je suis obligé de virer le malloc.robj du fxlib.a ? Parce que j'avais réussi à overwriter pow() en mettant simplement une définition dans un de mes fichiers c, donc redéfinir malloc est suffisant non ?

Aussi, je dois réimplémenter aussi free, realloc, calloc ou non ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 11/09/2018 18:25 | #


Pour pow(), je ne sais pas trop... je te conseille de virer _malloc.robj de l'archive sauf si tu es sûr que ta lib qui contient malloc() arrive toujours avant -lfx sur la commande de link.

Oui, tu dois définir les autres aussi...
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 11/09/2018 18:36 | #


Les fichiers .c sont avant le -lfx donc je dirais que oui. (de toute façon je vais tester)

Par contre comment tu veux que j'enlève le malloc.robj ? Ca m'a pas l'air d'un truc éditable facilement ça...

Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 11/09/2018 18:58 | #


Éditeur de texte... ? Vraiment... ?

sh3eb-elf-ar -d libfx.a _malloc.robj

Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 11/09/2018 20:02 | #


J'ai regardé des implémentations de malloc, mais je comprends absolument rien x)

il n'y a que deux choix de toute façon, un bloc ou un sbrk(), tu n'auras pas mal à trouver une implémentation qui convienne.


Ca me conviendrait mieux d'utiliser un bloc (j'ai pas trop envie de réimplémenter sbrk, mmap et autres) mais j'ai aucune idée de ce qu'utilisent les implémentations que j'ai vues. J'ai regardé celle de la glibc : https://github.com/lattera/glibc/blob/master/malloc/malloc.c et ptmalloc, mais j'ai rien trouvé concernant comment mettre le début de la heap et sa taille.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 11/09/2018 20:20 | #


Mais... mais... il faut que tu cherches des implémentations freestanding (ie. isolées/indépendantes/pas au milieu d'un gros projet). Le malloc de la glibc pris dans les sources de la glibc est clairement hors de question...

ptmalloc et son ancêtre dlmalloc utilisent mmap() comme système d'allocation, tu n'as pas ça ; il faut chercher quelque chose de beaucoup plus simple, genre ça : https://gist.github.com/bellbind/507a426b0958eedb0fcf (très basique).
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 11/09/2018 20:32 | #


Hmm, il n'y a pas realloc ni calloc dans ton lien aussi :/
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 11/09/2018 20:36 | #


Pour calloc(), tu peux faire un malloc() du produit et ensuite un memset() pour vider la zone.

Pour realloc(), c'est bourrin, mais tu réalloues une zone de la nouvelle taille (il te faudra une fonction pour connaître la taille d'une zone allouée), tu copies, tu free().
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 12/09/2018 06:54 | #


il te faudra une fonction pour connaître la taille d'une zone allouée


Elle marcherait comment cette fonction aussi ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 12/09/2018 12:58 | #


Tu dois parcourir la structure de données de l'algorithme.
Rise.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 17/09/2018 10:41 | #


Je comprends toujours rien

- Pour définir l'adresse de départ et l'adresse de fin (ou la longueur) c'est ce code là ? Si oui, je change quoi ?
static union chunk head = {.node = {{NULL, NULL, 0}, 0}};
static union chunk tail = {.node = {{NULL, NULL, 0}, 0}};


- Pour le realloc, la fonction relink() ferait pas ce boulot ? Sinon, je crois bien qu'il n'y a aucune utilisation de realloc dans MPy (y'en a une dans gc.h mais c'est juste une définition). Comment je pourrais être 100% sûr qu'il n'y a bien aucune utilisation (lors de la compilation, pas avec des trucs genre grep), par exemple en mettant une erreur si realloc est utilisée ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
LephenixnoirHors ligneAdministrateurPoints: 13570 Défis: 136 Message

Citer : Posté le 17/09/2018 18:54 | #


Tu vois pool ? En gros c'est des chunks de taille fixe, quand le programme a besoin de mémoire il prend des chunks consécutifs dans le tableau. Pour spécifier l'adresse et la taille, il te suffit de remplacer le tableau pool par un pointeur vers le début et CHUNK_MAX par le nombre de chunks disponibles, essentiellement c'est la taille de ta zone divisée par sizeof(union chunk).

Pour savoir si realloc() est utilisée, tu compiles et ensuite tu cherches le symbole associé dans l'ELF :

% sh3eb-elf-objdump -t micropy.elf | grep '_realloc'

Rise.
CritorEn ligneAdministrateurPoints: 1051 Défis: 0 Message

Citer : Posté le 19/09/2018 12:34 | #


A tout hasard, y a-t-il eu du nouveau ?

Pour savoir si j'ai encore une chance de porter le script Python du concours cette semaine, et ouvrir ainsi la participation à un maximum de personnes :
https://tiplanet.org/forum/viewtopic.php?t=21853&p=235402#p235402

Merci.
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 19/09/2018 12:46 | #


Avec le stage et les leçons de conduite, j'ai pas trop le temps malheureusement :/ (et si j'ai du temps, ce sera pour participer au concours )

Si on me fait une fonction malloc (et realloc, calloc, free) qui convient, je veux bien la mettre, mais là je peux pas les faire.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
HackcellHors ligneMembrePoints: 919 Défis: 6 Message

Citer : Posté le 19/09/2018 12:48 | #


Excellente idée, greffons un bout de code sur ton code dont personne ne connait l'organisation des sources
Au pire ça casse tout, au mieux ce sera un enfer a maintenir
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
CritorEn ligneAdministrateurPoints: 1051 Défis: 0 Message

Citer : Posté le 19/09/2018 12:52 | #


Hackcell a écrit :
Excellente idée, greffons un bout de code sur ton code dont personne ne connait l'organisation des sources
Au pire ça casse tout, au mieux ce sera un enfer a maintenir

Dixit Hackcell
ZezombyeHors ligneRédacteurPoints: 1573 Défis: 12 Message

Citer : Posté le 19/09/2018 12:53 | #


Y'a pas besoin de connaître mes sources : me faut juste un malloc qui utilise les 256k des SH4 (si ça détecte que c'est une SH4, à l'aide du syscall OSGetVersionAsInt) en plus des 48k normaux
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Pages : 1, 2Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 47 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd