comment utiliser le bios en mode protegé ? (i.e comment repasser temporairement en mode reel pour l'executer)On ne fait pas comme ça. T'as deux possiblités, pour chaque groupe de fonctionnalités du bios :
mov eax, 0x00001337 mov [eax],0x42C'est inexact. En fait là ce que tu fais c'est "mov ds:[eax],0x42". Mais l'assembleur complète tout seul, parce que de toutes façons sous un os en mode protégé tu utilises rarement un autre segment.
est-ce qu'on peu afficher un pixel a l'ecran sans avoir a se faire chier avec les bankswitching ?Ben si t'utilises que les fonctions vesa standard faudra forcément que tu travailles avec une fenetre et que tu la déplaces. Pour faire mieux, il faut mapper la mémoire vidéo. Pour ça faut que tu gères correctement le contrôleur pci, c'est lui qui fait ça.
y'a bien des standards la dessus non ?- Pour le standard ide/atapi c'est le t13 qui gère ça.
Le mode protégé demande avant d'être activé de préparer une table de descripteurs, dont nous parlerons au chapitre suivant. Pour l'instant, on supposera que tout est prêt pour activer le mode protégé. Regardez ce code : ; L'exemple ne gère pas les interruptions, donc on les désactive cli ; Chargement de la table des segments lgdt [gdtr] ;Ici, on active le mode protégé (bit PE) mov eax,cr0 or al,01h mov cr0,eax ; Seulement, on n'est pas encore en mode protégé, car le processeur dispose d'un cache qui mémorise les ; informations sur le segment de code. Il faut donc recharger ce cache, en rechargeant cs : jmp CODE_SEGMENT:protege ;CODE_SEGMENT : voir plus loin protege: ; Voilà, on est en mode protégé. Mais les autres registres de segment doivent être chargés avec des ; valeurs valides, sinon, ils fonctionnent encore comme en mode réel. mov eax,STACK_SEGMENT mov ss,eax mov esp,0FFFFFFFFh ;Ou 0000FFFFh si mode protg 16bits mov eax,DATA_SEGMENT mov ds,eax ;... avec tous les registres utiliss dans le programme ;------------------------------ gdtr: dw gdtend - gdt - 1 dd gdt gdt: dd 0,0 ;La première entrée est réservée et doit être nulle CODE_SEGMENT equ 0008h ;Index = 1, TI=0, RPL=0 dw 0010h ;Limit : 00010 x 4K - 1 = 0000FFFFh dw 0000h ;Base : 00000000h db 00h db 10011011b ;P R A db 11000000b ;G DB db 00h STACK_SEGMENT equ 0010h ;Index = 2, TI=0, RPL=0 dw FFF0h ;Limit : FFFF0 x 4K = FFFF0000h dw 0000h ;Base : 00000000h db 00h db 10010111b ;P E W A (une pile croît vers le bas) db 11001111b ;G DB db 00h ;Ce segment s'étend de l'adresse physique ; 00010000h à l'adresse 00020000h et accepte des offsets de FFFF0000h à FFFFFFFFh DATA_SEGMENT equ 0018h ;Index = 3, TI=0, RPL=0 dw FFFFh ;Limit : 0FFFF x 1 = 0000FFFFh dw 0000h ;Base : 00000000h db 00h db 10010011b ;P W A db 01000000b ;DB db 00h gdtend:Voilà, à titre indicatif (je le mets parce que en recherchant les infos que j'ai sur le sujet je suis retombé dessus
spectras
: Edit: Ah et euh oui, kochise : un os n'alloue pas la mémoire comme ça. Il utilise la pagination pour justement pouvoir fragmenter la mémoire, et l'allouer par bloc (4ko les blocs sur x86).
spectras :
J'ai retrouvé un truc intéressant. Attends, je l'uploade...voilà
Ah oui mais attend, la granularité de l'OS, c'est comme les clusters sur disque dur, et ça dépend du reglage de l'allocateur.Non. La taille des pages est fixe et dépend du processeur. En l'occurence sur ix86 le processeur gère deux tailles : 4ko et 4Mo (un bit à changer dans le cr0 ou le cr1).
On utilise bien un allocateur de mémoireL'allocation de mémoire du système d'exploitation aux applications se résume à une liste chaînée des pages inutilisées. C'est tout. Les liens que tu as mis n'ont rien à voir, ils concernent la gestion de la mémoire sans pagination justement (par exemple dans une application, ou sur un système d'exploitation très simpliste).
la PMMU quand à elle sert à faire de la pagination dans le sens 'protection hardware' et générer une erreur de page si un processus écrit là où il n'est pas sensé écrireC'est l'un des rôles, mais en fait c'est un effet de bord. La pagination a pour but de permettre justement la fragmentation de la mémoire, en établissant un mapping spécifique à chaque processus, faisant correspondre les adresses qu'il utilises à l'adresse réelle de la mémoire physique. La détection d'un accès erroné (Page Fault) n'est qu'un effet de bord de cette traduction, qui se produit quand justement il n'y a pas d'adresse réelle correspondant à l'adresse virtuelle demandée.
Mais l'arbitre de la mémoire, celui qui va allouer au processus tant et tant de mémoire, l'alignement, la granularité, etc... c'est bien un allocateur comme celui de Doug Lea. D'ailleurs, celui-ci surclasse le malloc du compilateur C si t'inclus malloc.c dans ton projet.La gestion de la mémoire dans le processus est spécifique au processus, le système d'exploitation ne s'en mèle pas, il se contente juste de répondre à des ^H^H^H la requête de modification de l'espace dispo pour le processus (appel système brk() sous linux).
Voir mon post de 16H14Au temps pour moi.