Assembleur x86-64 made in kernel

Page principale

Répondre à ce message
Auteur: Patrice Karatchentzeff
Date:  
À: GUILDE
Sujet: Assembleur x86-64 made in kernel
Salut,

J'ai un truc que je ne comprends pas. Le rôle de la fonction shrq dans
le code suivant :

xorl %eax, %eax
leaq    _bss(%rip), %rdi
leaq    _ebss(%rip), %rcx
subq %rdi, %rcx
shrq $3, %rcx
rep stosq


Le code est tiré de l'installateur du noyau. Le but est de faire un
reset de la section .bss avant de décomprimer le noyau comprimé qui
vient d'être recopié. C'est l'ultime étape avant la décompression du
noyau.

On met l'accumulateur à zéro pour servir d'écrase... registre (xor)
On charge l'adresse de base de la section .bss (1er leaq)
On charge l'adresse de fin de la section .bss (2e leaq)
On calcule la différence relative que l'on place dans RCX
????
On répète RCX fois la copie de EAX (cela devrait être RAX : je pense
qu'il y a une typo ici, comme à la première ligne) à l'adresse mémoire
contenue dans RDI (donc la base de la section la première fois), avec
un incrément de RDI à chaque fois. Bref, on écrit des zéros partout
dans la zone .bss sur la bonne longueur. (rep...)

Le shrq est un décalage logique de CRX et je ne comprends pas son
intérêt. Il est aussi présent lorsque l'installateur copie le noyau
(avec rep movsq cette fois).

Merci de votre aide,

PK

-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff@gmail.com
     |,4-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)