Posté le 09/09/2018 10:44
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 67 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
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.
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 :
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 ?
Ecrivez vos programmes basic sur PC avec BIDE
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.
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 ?
Ecrivez vos programmes basic sur PC avec BIDE
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...
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...
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 11/09/2018 18:58 | #
Éditeur de texte... ? Vraiment... ?
Citer : Posté le 11/09/2018 20:02 | #
J'ai regardé des implémentations de malloc, mais je comprends absolument rien x)
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.
Ecrivez vos programmes basic sur PC avec BIDE
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).
Citer : Posté le 11/09/2018 20:32 | #
Hmm, il n'y a pas realloc ni calloc dans ton lien aussi :/
Ecrivez vos programmes basic sur PC avec BIDE
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().
Citer : Posté le 12/09/2018 06:54 | #
Elle marcherait comment cette fonction aussi ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 12/09/2018 12:58 | #
Tu dois parcourir la structure de données de l'algorithme.
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 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 ?
Ecrivez vos programmes basic sur PC avec BIDE
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 :
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.
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.
Ecrivez vos programmes basic sur PC avec BIDE
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
Citer : Posté le 19/09/2018 12:52 | #
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
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
Ecrivez vos programmes basic sur PC avec BIDE