1

Ca se passe comment le chargement d'un programme kernel ?

Au début d'un programme, on a un :
Org:    bsr Stub

        <header statique>
        <header dynamique>
        <extra header dynamique>

Stub:   move.l  ($34).w,-(a7)
        bne.s   \run
        addq.l  #8,a7
\run:   rts

Mais j'imagine bien qu'un programme kernel a été relogé au préalable par EX_patch ? Bon la table est vide, donc EX_patch ne fait rien. Il fait donc un jsr vers Org. Le programme lit l'adresse du loader kernel.
Mais pourquoi on ne pop rien si le kernel exécute le programme comment retombe-t-il sur ses pieds ? C'est le kernel qui dépile l'adresse pour EX_patch et celle du bsr de force ?

2

Mais j'imagine bien qu'un programme kernel a été relogé au préalable par EX_patch ?

Oui.
Bon la table est vide, donc EX_patch ne fait rien

Voilà.
C'est le kernel qui dépile l'adresse pour EX_patch et celle du bsr de force ?

Très probable, car sinon ça va merder très fort grin
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3

Donc truc rigolo : on remplace l'adresse du kernel à $34 par un tsr, on fait ce qu'on veut, puis on lance le programme via le kernel. Ca devrait marcher ? cheeky

4

Seulement si le kernel n'appelle pas le vecteur $34 pour executer un programme (ce que seul preos fait, tous les autres l'appellent).

5

PreOS utilise le vecteur $50 ? Ces deux vecteurs semblent très similaires, non ? Mais le $50 a été mis en place pour les packs archive peut-être ?
De toute façon, le seul kernel qui m'intéresse est PreOS. Les autres, ils n'ont qu'à être compatibles. grin

En fait, mon idée est simple. Je réfléchis à la manière de faire une couche pedrom-like sous AMS. Comment faire tourner un programme fait spécifiquement pour PedroM sous AMS. Voilà ce qui me vient à l'idée :
- ajuster quelques vecteurs (f-line, trap #3, $30.w et $32.w)
- initialiser un terminal
- écrire une lib appelée "pedrom" exportant les mêmes fonctions que la lib de PedroM (tester dans un premier temps avec les fonctions que j'utilise, ie printf/fprtintf/tmpnam/unlink/+1 ou 2 autres)
- désactiver le flag read-only pour forcer le relogement en RAM (on a une adresse de retour sur la pile, donc on doit retrouver le handle du programme, donc son stub et son flag => c'est faisable)

Par contre, je ne sais pas comment intercepter le chargement d'une lib qui a le flag ro. Une idée ?




Pour que le kernel tienne compte du flag read-only sous AMS, il faut que kernel::exec soit utilisé ? Parce que sinon, j'imagine que EX_patch a déjà poppé le programme en RAM ?

Et est-ce que le flag ro signifie bien ces deux choses :
- on ne crée pas de twin, où que soit le fichier
- on n'exécute pas kernel::relocation

6

Folco (./5) :
PreOS utilise le vecteur $50 ? Ces deux vecteurs semblent très similaires, non ? Mais le $50 a été mis en place pour les packs archive peut-être ?

Oui tout à fait. C'est depuis PreOS 0.70 que ces 2 points d'entrées pointent vers le même programme car PreOs fait la différence plus tard.
Mais les programmes appelés via kernel::exec n'appelent pas ce point d'entrée.
Folco (./5) :
Par contre, je ne sais pas comment intercepter le chargement d'une lib qui a le flag ro. Une idée ?

Non.
Folco (./5) :
- désactiver le flag read-only pour forcer le relogement en RAM (on a une adresse de retour sur la pile, donc on doit retrouver le handle du programme, donc son stub et son flag => c'est faisable) Par contre, je ne sais pas comment intercepter le chargement d'une lib qui a le flag ro. Une idée ?

Demander à avoir le mod AMS de Lionel smile
Folco (./5) :
Pour que le kernel tienne compte du flag read-only sous AMS, il faut que kernel::exec soit utilisé ? Parce que sinon, j'imagine que EX_patch a déjà poppé le programme en RAM ?

Oui
Folco (./5) :
Et est-ce que le flag ro signifie bien ces deux choses : - on ne crée pas de twin, où que soit le fichier

On ne crée jamais de twin avec PreOs. Seul AMS le fait. Et PreOS ne fait une copie RAM que si pas ce flag.
Folco (./5) :
- on n'exécute pas kernel::relocation

Non

7

Le patcher d'AMS est sous GPLv2, le patchset est sous WTFPL, et les deux sont librement téléchargeables à https://github.com/debrouxl/tiosmod wink

Il y a des chances que si on peut facilement intercepter des choses au chargement d'un programme, ce soit dans push_user_func ou une de ses sous-routines.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

8

PpHd ->Merci pour tout. Je crois que Tiosmod tombe à point nommé en effet grin

Lionel -> oui, sauf qu'on se rate sur les kernel::exec.