• Aucun résultat trouvé

aièe aie Déaage d  yèe 64 bi 251

N/A
N/A
Protected

Academic year: 2022

Partager "aièe aie Déaage d  yèe 64 bi 251"

Copied!
40
0
0

Texte intégral

(1)

Démarrage d'un système 64 bits

(2)
(3)

Démarrage d'un système 64 bits

Commenousl'avonsdéjàditdansl'introdution, ledémarraged'unmiroproesseurIntelà

arhiteturex86-64ressembleaulanementd'unefuséeàtroisétages:

Lorsd'uneréinitialisation,untelmiroproesseursetrouveenmode réel,danslequelilse

omporteommeun8086(avequelquesinstrutionssupplémentaires).

Uneinstrutionmovsurleregistre32bitsCR0,nonprésentsurle8086,permetdepasser

aumodeprotégé,modeparexellenedesmiroproesseursInteld'arhitetureIA-32.

Unefoisenmodeprotégéonpeut,sionledésire,pourunmiroproesseurd'arhiteture

x86-64 (maispas ave l'arhiteture IA-32), dit aussi IA-32e (ave `e' pourExtended),

passer dans un nouveaumode, appelé mode long,omportant deux sous-modes, dont

l'und'entreeuxestappelé mode64 bits.

(4)

13.1 Le mode 64 bits

Pourlemode64bits, onrevientaumodèleplatde lamémoire,sepassantavantageusement

ainsidumodèlesegmentédumoderéel.

13.1.1 Modèle plat de mémoire

Bien qu'unmiroproesseur64 bitspuisse a priorimanipuler desadressesphysiques sur64

bits('est-à-direave64brohesd'adresse),ellessont,toutaumoins pourl'instant,restreintes

à 36 bits (depuis le Pentium Pro, d'arhiteture IA-32 et non IA-32e d'ailleurs), permettant

d'aéderà64GiOdemémoirevive,ouà40bits,permettantd'aéderà1TiO(untéra-otet)

demémoire,pourl'arhitetureIA-32e.

Lemodèledemémoireutilisédanslesous-mode64bits estequiappelémodèleplat (at

modememoryenanglais)danslequeliln'yapasdesegmentation:l'adressephysiquedupremier

otetdelamémoireest0x00 0000 0000et elledudernierest0xFF FFFF FFFF.

Les registresdesegmentn'ontdonplusd'utilité apriori.En fait leregistredesegmentde

odeCSestenoreutilisépourspéierundesripteurpréisantlesdroitsd'aès(maisnonson

adressedebaseetsalimite).Lesdonnéeset lapile sontontenuesdanslesegmentdeode.

13.1.2 Desripteur du segment de ode

Lastrutured'undesripteur(desegmentdeodedon)estelledel'arhitetureIA-32mais

dontseulsquelqueshamps sontprisenompte:

7 0000 0000 G D L A 0000 6

V

5 Aess rights 0000 0000) 4

3 0000 0000 0000 0000 2

1 0000 0000 0000 0000 0

L'adressedebaseetlalimitenesontpasprisenompte.Ilyaparontreunnouveauhamp,le

bit L(pourLongbien qu'Intell'appellelebit 64),permettantdehoisir entre desadressessur

64bits(L = 1)ousur32bits(L = 0),ommenousleverronsdanslasous-setionsuivante.

LeregistreCSspéiedonunsegmentdeode:ildébutenéessairementàl'adresse0,iln'y

(5)

13.1.3 Le mode long

Lemodelongadeuxsous-modes,oumodesd'opération,appelésmodeompatible(Com-

patibility Mode Operation) et mode 64 bits (64-bit Mode, voir[Int℄, volume 3, Ÿ9.8.5.3). On

utilise les deux bits CS.L et CS.D du desripteur du segment de ode pour spéier le mode

d'opération,unefoislemodelonginitialisé:

Lorsque CS.L = 1 et CS.D = 0, le proesseur opère en mode 64 bits. Dans e mode

d'opération, par défaut la taille d'opérande est de 32 bits et la taille d'adresse 64 bits.

Enutilisantlespréxesd'adresse,d'opérande etunnouveaupréxe,appelé REX,lataille

d'opérande peutêtrehangéeen64 bits ou16bits, lataille d'adresse peut êtrehangée

en32bits.

Lorsque CS.L = 0, le proesseur opère en mode ompatible. Dans e mode, CS.D

ontrlelestaillesd'opérandeetd'adresse pardéfautdelamêmefaçonqu'enmode pro-

tégé:

CS.D = 1spéie lestailles d'adresseetd'opérandepardéfautsur32bits.

CS.D = 0spéie lestailles d'adresseetd'opérandepardéfautsur16bits.

LaombinaisonCS.L = 1et CS.D = 1est réservée.

13.1.4 Les registres

En mode 64 bits, les registres ont une taille de 64 bits, permettant ainsi d'eetuer des

opérationsarithmétiquessur64bitsenuneseuleopération.

Registresgénéraux.-Les64bitsdesregistresgénérauxnepeuventêtreutilisésquedansesous-

mode 64 bits. Les registresgénérauxsontdésignés par RAX, RBX et ainsi de suitepourles

huit premiers, R8, R9,..., R15 pourles huit suivants (ave `R' pour Re-extended). On peut

donérireenlangagesymbolique:

add rx,rbx

Les huit derniersregistrespeuvent êtreadressés ommeotet, mot, motdouble ou mot qua-

druple (quadworden anglais),maisseulementeuxde poidsfaible. Onutiliselessuxes b,w

etdenlangagesymboliquepourlesdésigner.Ona,parexemple:

mov r9b,r10b

mov r10w,ax

mov r14d,r15d

mov r13,r12

Sionveutvraimentaéder àd'autresparties,ilyalapossibilitéd'utiliser desrotations.

Registredesindiateursetpointeurd'instrutions.-Le registredesindiateursaégalementune

taillede64bits,appeléalorsRFLAGS,maisseulsles32bitsdepoidsfaibleontunesigniation.

OnretrouvealorsleregistreEFLAGSdel'arhitetureIA-32.

Lepointeurd'instrutionRIPestunregistrede64bitsmaisseulsles40bitsdepoidsfaible

sontprisenomptepourl'instant.

Registresdesegment.-Iln'yapasd'évolutionparrapportàIA-32:ilyasixregistresdesegments

(CS,DS,ES,SS,FSetGS)de16bitsmaisseulleontenuduregistreCSauneinidenedansle

sous-mode64bits.Lesautresregistressonttraitésommeayantunontenunul.

Registresdetablesdedesripteurs.-LesregistresGDTR,LDTR,IDTRetTRontunhampd'adresse

(6)

Registresdeontrle.-DepuislePentium, ilexisteuninquièmeregistredeontrle,dénommé

CR4.Lastruturedesregistresdeontrleestalorslasuivante :

31 30 29 28 19 18 17 16 12 11 7 6 5 4 3 2 1 0

PG CD NW AM WP NE ET TS EM MP PE

CR0

Notused CR1

Pagefaultlinearaddress CR2

Pagediretorybase

PCD PWT

CR3

PGE MCE PAE PSE DE TSD PVI VME

CR4

LeregistreCR0aquatrebitsayantuneinidenedeplus:

Lebit30,appeléCD(pourCahe Disable)ontrleleaheinterne:

LorsqueCD = 1,leahenepeutplusêtresurhargépardenouvellesdonnéesmais

ilontinueàfontionnerpourlesdonnéesdéjàenplae.

LorsqueCD = 0,denouvellesdonnéespeuventêtreajoutéesoupeuevntremplaer

d'aniennesdonnées.

Lebit29,appeléNW(pourNotWrite-through),permetdehoisirlemodeahedes

données.SiNW = 1,leaheest inhibé.

Le bit 18, appelé AM (pour Aligment Mask), ative la vériation de l'alignement

lorsqu'ilestpositionné,maisuniquementpourleniveaudeprivilège3dumodeprotégé.

Le bit 5,appelé NE(pourNumeri Error),ativelapriseen ompte deserreursdu

oproesseurarithmétique.Si NE = 1, labrohe

FERR

devientativepourune erreur duoproesseurnumérique.SiNE = 0,touteerreurduoproesseurest ignorée.

CinqbitsseulementduregistreCR4ontunesigniation:

Lebit0,appeléVME(pourVirtualModeExtension),ativelesupportdel'indiateur

d'interruptionvirtuelleduregistredesindiateursenmodeprotégélorsqueVME = 1.

Lebit1,appelé PVI(pourProtetedMode VirtualInterrupt),ative??

Lebit2,appelé TSD(pourTimeStampDisable), ontrlel'instrutionRDTSC.

Lebit3,appeléDE(pourDebuggingExtension),ativelesextensionsdedébogageau

pointd'arrêtdesentrées-sortieslorsqu'ilestpositionné.

Lebit4,appeléPSE(pourPageSizeExtension),permetd'obtenirunetailledepages

de4MiO,aulieude4kiO,lorsqu'ilestégalà1.

Lebit6,appeléMCE(pourMahineChekEnable),ativel'interruptiondevéria-

tiondelamahine.

Depuis le Pentium Pro, pour lequel on peut passer d'un adressage mémoire de 4 GiO à

un adressage sur 64 GiO, grâe à quatre brohes d'adresse supplémentaires, il y a deux bits

signiatifsdepluspourleregistreCR4:

Lebit 7,appelé PGE(pourPaGe Extension),ontrlelenouveaumode d'adressagede

64GiOlorsqu'ilestpositionné,onjointementavelesbitsPAEet PSE.

Lebit5,appeléPAE(pourPageAddressExtension),ativelesbrohesd'adresseA35A32

lorsquelenouveaumodespéial d'adressage,ontrléparlebitPGE,estativé.

Lebit 4,appelé PSE,alamême signiation siPGEn'estpaspositionné. Si PGEet PSE

(7)

13.1.5 Codage des instrutions

Enmode64bits,onpeutajouterunnouveaupréxe,appeléREX(pourRegisterEXtension),

devant être plaé entre les préxes déjà onnus pour IA-32 et le ode opération. Sa valeur,

omprise entre 0x40 et 0x4F, modie la signiation des hamps reg et r/mdu seond otet

(éventuel)duodeopérationdel'instrution.Ilest,enpartiulier,néessairepourpouvoiraéder

auxregistresR8àR15.

LastruturedeREXest:

0100 W R X M/B

LebitW(pourWord)permetdehoisirentre64bits(W = 1)etlataillespéiéeparle

desripteurdeCS(W = 0).

LebitR(pourRegister)permet d'ajouterunquatrièmebit, eluidepoidsfort,auxtrois

bits du hampreg du seond otet du ode opération. Le registreséletionné est alors

spéié parletableausuivant:

Code Registre Mémoire

0000 RAX [RAX℄

0001 RCX [RCX℄

0010 RDX [RDX℄

0011 RBX [RBX℄

0100 RSP

0101 RBP [RBP℄

0110 RSI [RSI℄

0111 RDI [RDI℄

1000 R8 [R8℄

1001 R9 [R9℄

1010 R10 [R10℄

1011 R11 [R11℄

1100 R12 [R12℄

1101 R13 [R13℄

1110 R14 [R14℄

1111 R15 [R15℄

Lebit M (pour Mode) permet d'ajouterunquatrième bit, eluide poidsfort, auxtrois

bitsdu hampr/mduseond otetdu ode opération.Le tableaupréédent donnel'in-

terprétation,saufdansleas0100b.

En eet,si r/m = 0100b,leseond otetduodeopération est suivid'un otetd'index

aveéhelle. Dansle as del'arhiteture IA-32sastruture est Sale-Index-Base,les

hamps ayantrespetivement2,3et3bits.Dans leasdumode64bits, lebit Xdonne

lebit depoidsfortdel'éhelle, quipeutdonêtre 1

×

,2

×

,4

×

ou 8

×

.Le bitBest alors

utiliséommequatrième bit,eluidepoidsfort,pourdéterminerlabase.

Remarque.-Commentfaireladiéreneentrel'otetREXetleodeopérationquiviendraitalors?

Remarquonsque,pourl'arhitetureIA-32,lesodesopération0x400x4Fsonteuxdeer-

taines variantes,ditesourtes, desinstrutionsINCet DEC.En mode64 bits,lesvaleurs0x40à

0x4Fnesontpasdesodesopérations(maisdesvaleursdeREX).Sionveututiliseresvariantes

deINC etDEC,on doitnéessairementen utiliserlaversionlongue,laversionourten'existant

(8)

13.1.6 Nouvelles instrutions IA-32

Le Pentium a introduit de nouveaux registreset de nouvelles instrutions dont deux nous

sontutilespourdémarrerlemode64bits.

Compteurdetemps.-LeompteurdetempsTSC(pourl'anglaisTime-StampCounter)ontient

lenombredetopsd'horlogedepuisquelemiroproesseuraétéréinitialisé plusuneonstante,

TSCétantinitialisédefaçonaléatoireàhaqueredémarrage.Ils'agitd'unompteurde64bitssi

bien qu'unmiroproesseuradenéà1GHzpeutaumuler undéompte eetué sur580ans

sansreveniràsavaleurinitiale.

L'instrutionRDTSC(pourReaDTSC)litleTSCetenplaesonontenudansEDX:EAX,EDX

ontenantlemot doubledepoidsfort.On utilisedeuxregistresde32 bitspuisque lesregistres

de64bitsn'existaientpassurlePentiumet qu'ilfautonserverlaompatibilité.

Registresspéiquesàunmodèle.- À partir du Pentium, les miroproesseurs Intel possèdent

unertainnombrederegistres,apriori spéiquesàhaquemodèledemiroproesseur(MSR

pour Model Spei Register). Le hapitre 35 du volume 3 de [Int℄ doumente ertains de es

deuxmilliersderegistres.

Les instrutionsRDMSR (pour ReaD Model Spei Register) et WRMSR(pourWRite

Model SpeiRegister),exéutablesenmode réel ainsiqu'en mode protégéau niveau0seule-

ment, permettent de lire es registres, et, pour ertains d'entre eux, d'y érire. Le numéro

(adresse)duregistreMSRdoitd'abordêtreplaédansleregistreECXavantuneopération;avant

uneériture,ladonnéeàériredoitsetrouverdansEDX:EAX.

Par exemple le registre d'adresse 0x10 permet de retrouver TSC, qu'on peut lire, omme

ave RDTSC, mais également érire. La plage d'adresses pour un Pentium va de 0x00 à 0x13.

LesmiroproesseursPentium 4et Core 2ontiennent1743MSR, d'adressesallantde0x00à

0x6CF.

L'instrution RDMSRest odéepar0000 1111 0011 0010b,soit0xF32.alorsqueWRMSRl'est

par0000 1111 0011 0000b,soit0xF30.

RegistreEFER .-InteladéidéqueertainsMSR,registresapriorispéiquesàunmodèle,seront

présentsavelesmêmesfontionssurtouslesmiroproesseurssuivantslemodèledanslequelils

ontétéintroduits(d'oùuneompatibilitéasendante).LeursnomsommenentalorsparIA32_.

Ilenestainsi,depuisleCore2,duMSRd'adresse0xC0000080,appeléIA32_EFER(lesuxe

signiantExtendedFEatuRes enables),dontlastrutureest:

63 12 11 10 9 8 7 1 0

LMA LME SCE

On positionne le bit 0 (SCE pour System Call Enable), pour ativer les instrutions

SYSCALLetSYSRETenmode64bits.

Onpositionnelebit 8(LMEpourLongMode Enable), pourpasseraumodelong.

Le bit 11 (LMA pour Long Mode Ative), en leture uniquement, montre, lorsqu'il est

(9)

13.1.7 Pagination

Lamiseenplaedelapaginationévolue,parrapportàelledel'arhitetureIA-32,pourle

mode64bitsdefaçonàequel'unitédepaginationpuissetraduiredesadressesvirtuellessur64

bits(donsuruneplagede16exa-otets)enadressesphysiquessur52bits(donsuruneplage

de4péta-otets).Dansunepremièreétape,Intelutilisedesadressesvirtuellessur48bits(don

suruneplagede256téra-otets)etdesadressesphysiquessur40bits(donsuruneplaged'un

téra-otets).

Quatreniveauxdetables.- Pourle mode 64 bits, on utilisequatre niveaux detables de pages.

L'indiateurPAE(PageAddressExtension)duregistreCR4doitêtrepositionné.Onpeuthoisir,

grâeauxindiateursPSE,PAEetPGEdeCR4,une taillede pagede4KiO,2MiO,4MiOou4

GiO.Pardéfaut, 'est-à-diresil'onne positionne auundees indiateurs,latailled'unepage

restede4KiO(ommepourle80386)et uneadressevirtuelleaalorslastruturesuivante:

63 48 47 39 38 30 29 21 20 12 11 0

Sign-extension PML4 PDPT PDIR PTBL offset

Lesbits63à48doiventavoirlamêmevaleurquelebit47(onparled'adresseanonique

lorsque'estbienleas).Remarquonsquepourles

hh

petites

ii

valeursd'adressequenous

utiliserons,nousn'avonspasànousenpréouper: ils'agitde0.

Les9 bits de 47 à39 spéient l'indexdans la table de niveau4(appelée PML4 pour

PageMap Level-4 Table).

Les9 bits de 38à 30spéient l'indexdans la table deniveau 3(appelée PDPT pour

PageDiretoryPointer Table,'est-à-diretabledepointeurderépertoire).

Les9bitsde29à21spéientl'indexdanslatabledeniveau2(onretrouvePDIR,pour

PageDIRetory,répertoiredetables depages,del'arhitetureIA-32).

Les9bitsde20à12spéientl'indexdanslatabledeniveau1(onretrouvePTBLpour

PageTaBLe,tabledepages).

Etennles12derniersbitsspéientledéalagedanslapage,ommepourlapagination

deIA-32.

(10)

Strutured'uneentréedansunetable.-Lesentréesdanslestablesdesdiérentsniveaux,toutes

de64bits(aulieudes32bits dansleasdeIA-32),ontlastruturesuivante :

63 62 52 51 40 39 32

E reserved Base

X available (must be 0) Address

B [39..32℄

31 12 11 9 8 7 6 5 4 3 2 1 0

P P P S R

Base Address [31..12℄ avail. G A D A C W / / P

T D T U W

Les32premiersbitsreprennentlastruturedesentréespourIA-32:

Le bit 0 (P pour Present) indique si la table de pages de niveau 1 à 3 ou la page est

présente en mémoirevive.La table PML4, devant toujoursêtre présente dans une zone

demémoire

hh

identitymapped

ii

,e bitn'apasdesigniationpourelle.

Lebit1(R/WpourRead/Write) spéielesdroitsdeletureetd'ériturelorsquequele

bit2vaut1:lorsqu'ilestégalà0,latabledepagesoulapagepeutêtrelueet ériteau

niveaudeprivilège3;lorsqu'ilest égalà1,ellenepeutqu'être lueàeniveau.

Lebit2(U/SpourUser/System)spéielesprivilèges:lorsqu'ilestégalà0,latablede

pagesoulapagen'estaessiblequ'auxniveauxdeprivilège0à2.

Lesbit3(PWTpourPage-levelWrite-Through)et4(PCDpourPage CahingDisable)

ontrlentlamiseenaheet nenousintéresserontpasdansune premièreétape.

Lebit5(ApourAessed) indiquesionaeuaès àette tabledepageouàettepage

(enleture ouenériture).

Lebit6(DpourDirty,'est-à-diremodié)estpositionnéparlemiroproesseurhaque

foisqu'uneopérationd'ériture estréaliséesurlatabledepageoulapage.

Lebit7(PATpourPage-AttributeTable-index)estnouveau.

Le bit 8 (G pour Global page), nouveau également, est égal à 1 s'il s'agit d'une page

(11)

13.1.8 Passage au mode long

13.1.8.1 Initialisationdu modelong

Surlesmiroproesseursd'arhiteturex86-64,leregistrespéiqueIA32_EFERestmisàzéro

lorsdelaréinitialisation.OndoitsetrouverenmodeprotégéavepaginationIA-32e,'est-à-dire

avedes strutures de paginationàquatre niveau,ativée avant d'essayerd'initialiser le mode

long.

Pourinitialiserlemodelong,ondoit:

1.Partirdumodeprotégé,désativer(éventuellement)lapagination(dumodeIA-32)en

baissantlebitPGdeCR0(CR0.PG = 0),enutilisantuneinstrutionMOV CR0,évidemment

dansunepagemappéeàl'identique.

2.Ativerlesextensionsd'adressesphysiques(PAEpourPhysial-Address Extensions)en

levantlebit PAEdeCR4(CR4.PAE = 1),sinon unefautede protetiongénérale estlevée

lorsqu'onessaied'initialiserlemodelong(eiestégalementvraipourlesétapes3à5).

3.ChargerCR3avel'adressephysiquedebasedelatabledepagesdeniveau4(PML4).

Cesétapes2et 3s'eetuentdansl'ordrequel'on veut,elui-in'ayantpasd'impor-

tane.

4.AtiverlemodelongenlevantIA32_EFER.LME:

movl 0xC0000080,%ex

rdmsr

orl 0x100,%eax

wrmsr

5.Ativerlapagination(enmode IA-32e)enpositionnantCR0.PG = 1.Àemoment,le

miroproesseurpositionnelebitIA32_EFER.LMAà1.

6.Exéuterunsautlointainpourpasserausous-modedésiré,modeompatibleoumode

64bits, la nature de elui-iétantdéterminé parle desripteurdu ode desegment. Le

déalagedee sautnedoitpasdépasser32bits.

7.C'estseulementalorsquel'onpeut,sionveut,seplaersurdespagesnonidentiquement

mappées.

Lestables depaginationdumode64bits doiventsetrouverdans les4premiers GiO

de lamémoire physique avant l'ativation du mode long: puisque MOV CR3 est exéuté

en mode protégé, seuls les 32 bits de poids faible du registre sont érits, e qui limite

l'emplaementdestablesaux4premiersGiOdemémoire.

Onpeutdéplaerlestablesdepagesoùl'onveutunefoislemodelongativé.

8.Aprèsativationdumodelong,lesregistresdestablesdedesripteurssystème(GDTR,

LDTR,IDTR,TR)ontinuentàfaireréféreneauxtablesde desripteursdumode pro-

tégé.Lestables référenéespares desripteurs résidenttoutesdans les4premiers GiO

del'espaed'adresse linéaire.

Aprèsavoirativélemodelong,utiliserlesinstrutionsLGDT,LLDT,LIDTetLTRpour

hargerlesregistresdetables dedesripteurs système pourréférenerdestables dedes-

(12)

13.1.8.2 Retour aumode protégé IA-32

PourrevenirdumodelongaumodeprotégéIA-32,ilfaut([Int℄,Ÿ9.8.5.4):

1.Passerausous-modeompatible (sionsetrouvedanslesous-mode64bits).

2. Désativer la pagination IA-32e en mettant à zéro le bit CR0.PG. Cei a pour eet

de mettre le bit IA32_EFER.LMA à zéro. La plupart des instrutions suivantes doivent

évidemmentsetrouverdansune pageidentiquementmappée.

3.Charger(éventuellement)CR3avel'adressephysiquedebasedurépertoiredepagina-

tionIA-32.

4.DésativerlemodelongenmettantlebitIA32_EFER.LMEà0.

5.Préparer(éventuellement)lapaginationenmodeprotégéenmettantlebitCR0.PGà1.

6.Eetueruneinstrutiondesautaprèsl'instrutionMOV CR0pourativerlapagination.

Remarque.- On eetue en généraldes passages d'un mode àl'autre pour pouvoirutiliser les

programmes16et32bitséritsantérieurement.Lesontenusdesregistresseulementdisponibles

enmode64bits(R8R15et XMM8XMM15)sontpréservéslorsdestransitionsdumode64bitsau

mode ompatible et retour.Parontre, lesvaleursdeR8R15et deXMM8XMM15sontindénies

après transitions dumode 64bits mode aumodesompatible puisprotégé ou aumode réel et

retour.

(13)

13.2 Exemples

13.2.1 Utilisation des registres spéiques à un modèle en mode pro-

tégé

Donnonsunexempled'utilisationd'unregistrespéiqueàunmodèle.Anqu'ilnesoitpas

hh

trop

ii

spéique, hoisissonsun de eux présents sur tous les miroproesseursà partirdu

Pentium.

Érivonsunprogrammepermettantdelireleompteurdetopsd'horlogeTSCet d'enplaer

leontenuàl'emplaement6000:0.Puisqueleprogrammen'eetueauunevériation,ilfaut

s'assurerparailleursquelePCutiliséaitauminimumununPentiumommemiroproesseur:

#--- ;

# boot1.s ;

# Example program reading TSC ;

#--- ;

.setion .text

.globl _start

.ode16

.org 0x100

_start:

#

# Save flags and DS for return to real mode

#

movw %s,%dx

movw %dx,%ds

movw %dx,%ss

pushf

push %ds

movw %ds,%dx

movw %dx,seg

#

#Setting base for ode segments

#

movw %s,%ax

movzx %ax,%eax

shll $4,%eax # eax=base for ode segment

movl %eax,DESC1B

movb $0x9a,DESC1C # set segment attribute

#

# Setting of GDTA

#

movl $0,%eax # deja fait mais prudene

movl $0,%ebx

movw %s,%ax # deja fait mais prudene

movw $DESC0,%bx

shll $4,%eax # deja fait mais prudene

addl %ebx,%eax

movl %eax,GDTA

#

# Make sure no ISR will interfere now

#

li

(14)

# LGDT is neessary before swith to PM

#

lgdtl GDTL

#

# Swith to PM

#

movl %r0,%eax

orb $1,%al

movl %eax,%r0

#

# Far jump to set CS & lear prefeth queue

#

.byte 0x0ea

.word pm_in

.word 8

#

# Load long segment desriptor from GDT into DS

#

pm_in: movw $0x10,%dx

movw %dx,%ds

movw %dx,%ss

movw %dx,%es

#---;

# A sample in proteted mode: ;

#---;

#

# Enable physial-address extensions

#

movl $0x20,%eax

movl %eax,%r4

#

# MSR

#

movl $0x10,%ex

movl $0,%eax

movl $0,%edx

wrmsr

movl $0x12345678,%eax

rdmsr

addr32 movl %eax,%ds:(0x60000)

#--- ---- ---;

# End of the sample in proteted mode ;

#--- ---- ---;

#

# Load 64kB segment desriptor from GDT into DS for return

#

movb 0x18,%dl

movw %dx,%ds

#

# Return from PM ro real mode

#

andb $0x0fe,%al

movl %eax,%r0

(15)

# Far jump to restore CS & lear prefeth queue

#

.byte 0x0ea

.word pm_out

seg: .word 0

pm_out:

#

# Restore DS and flags

#

movw %s,%dx

movw %dx,%ss

pop %ds

popf

#

# Exit to MS-DOS

#

ret

#

#--- --- ---- --;

# GDT to be used in Proteted Mode ;

#--- --- ---- --;

#

# null desriptor

#

DESC0: .long 0 # null desriptor

.long 0

#

# desriptor for ode segment in PM

#

DESC1: .word 0x0FFFF # limit 64kB

DESC1B: .word 0 # base = 0 to set

.byte 0 # base

DESC1C: .byte 0x9A # ode segment

.byte 0 # G = 0

.byte 0

#

# desriptor for data segment in PM

#

DESC2: .word 0x0FFFF # limit 4GB

.word 0 # base = 0

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0x8F # G = 1, limit

.byte 0

#

# desriptor for data segment return to real mode

#

DESC3: .word 0x0FFFF # limit 64kB

.word 0 # base = 0 to set

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0 # G = 0, limit

.byte 0 # base

(16)

# GDT table data

#

GDTL: .word 0x1F # limit

GDTA: .long 0 # base to set

Assemblonsehierboot1.ssousLinux:

$ as boot1.s --32 -o ./boot1.o

$ objopy -O binary ./boot1.o ./boot1.om

$ ls -l boot1.om

-rwxr-xr-x 1 patrik patrik 449 ot. 12 10:08 boot1.om

$

Ilnefautengarderqueles193derniersotetsdubinaire:

$ objopy -O binary -i 1500 --interleave-width 193 -b 256 boot1.o ./boot1.om

$

ExéutonssousMS-DOS:

C:\BOOT>boot1

C:\BOOT>debug

-D 6000:0 L 10

7000:0 D2 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

Exerie.-Vérier quesionn'ative pas PAE,onaunredémarrage.

(17)

13.2.2 Passage au mode ompatible

Érivonsunprogrammequipasseaumodeompatible,ahe`A'àlaseondelignedel'éran,

puisrevientaumoderéel.

#--- --- ---- --- --- -;

# boot2.s ;

# Example program swithing to ompatibility mode ;

#--- --- ---- --- --- -;

.setion .text

.globl _start

.ode16

.org 0x100

_start:

#

# Save flags and DS for return to real mode

#

movw %s,%dx

movw %dx,%ds

movw %dx,%ss

pushf

push %ds

movw %ds,%dx

movw %dx,seg

#

#Setting base for ode segments

#

movw %s,%ax

movzx %ax,%eax

shll $4,%eax # eax=base for ode segment

movl %eax,DESC1B

movb $0x9a,DESC1C # set segment attribute

#

# Setting of GDTA

#

movl $0,%eax # deja fait mais prudene

movl $0,%ebx

movw %s,%ax # deja fait mais prudene

movw $DESC0,%bx

shll $4,%eax # deja fait mais prudene

addl %ebx,%eax

movl %eax,GDTA

#

# Make sure no ISR will interfere now

#

li

#

# LGDT is neessary before swith to PM

#

lgdtl GDTL

#

# Swith to PM

#

movl %r0,%eax

(18)

movl %eax,%r0

#

# Far jump to set CS & lear prefeth queue

#

.byte 0x0ea

.word pm_in

.word 8

#

# Load long segment desriptor from GDT into DS

#

pm_in: movw $0x10,%dx

movw %dx,%ds

movw %dx,%ss

movw %dx,%es

#---;

# A sample in proteted mode: ;

#---;

#

# Clear the page tables

#

movl $0x70000,%edi

movl $0x1000,%ex

xorl % eax,%eax

REPETER:

movl %eax,%es:(%edi)

addl $4,%edi

del %ex

jexz FIN

jmp REPETER

FIN:

#

# First entry of PML4

#

addr32 movl $0x71007,%ds:(0x70000)

#

# First entry of PDP table

#

addr32 movl $0x72007,%ds:(0x71000)

#

# First entry of Diretory

#

addr32 movl $0x73007,%ds:(0x72000)

#

# Fill up 256 first page tables

#

movl $0x73000,%edi # address of first page table

movl $7,%eax # ontent of first page table

movl $256,%ex # number of pages to map (1 MB)

make_page_entries:

movl %eax,%es:(%edi)

addl $8,%edi # address next entry, 8 bytes

addl $0x1000,%eax # ontent next entry

del %ex

(19)

jmp make_page_entries

FIN2:

#

# Load page-map level-4 base (without enabling)

#

movl $0x70000,%eax

movl %eax,%r3

#

# Enable long mode

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

orl $0x100,%eax # enable long mode

wrmsr

#

# Enable physial-address extensions

#

movl $0x20,%eax

movl %eax,%r4

#

# Enable paging

#

movl %r0,%eax

orl $0x80000000,%eax

movl %eax,%r0 # enable paging

#

# Far jump to Comptaibility Mode (Seletor 0x8)

#

ljmp $0x8,$suite

suite:

#

# Sample in Compatibility Mode

movb $65,%al

addr32 movb %al,%ds:(0x0B80A0)

#

# Disable paging

#

movl %r0,%eax

btrl $31,%eax

movl %eax,%r0

#

# Disable long mode

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

btrl $8,%eax # enable long mode

wrmsr

#--- --- ---;

# End of the sample in proteted mode ;

#--- --- ---;

#

# Load 64kB segment desriptor from GDT into DS for return

#

(20)

movw %dx,%ds

#

# Return from PM ro real mode

#

andb $0x0fe,%al

movl %eax,%r0

#

# Far jump to restore CS & lear prefeth queue

#

.byte 0x0ea

.word pm_out

seg: .word 0

pm_out:

#

# Restore DS and flags

#

movw %s,%dx

movw %dx,%ss

pop %ds

popf

#

# Exit to MS-DOS

#

ret

#

#--- ---- --- -;

# GDT to be used in Proteted Mode ;

#--- ---- --- -;

#

# null desriptor

#

DESC0: .long 0 # null desriptor

.long 0

#

# desriptor for ode segment in PM and long mode

#

DESC1: .word 0x0FFFF # limit 64kB

DESC1B: .word 0 # base to set

.byte 0 # base

DESC1C: .byte 0x9A # ode segment

.byte 0 # G = 0

.byte 0

#

# desriptor for data segment in PM

#

DESC2: .word 0x0FFFF # limit 4GB

.word 0 # base = 0

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0x8F # G = 1, limit

.byte 0

#

# desriptor for data segment return to real mode

(21)

DESC3: .word 0x0FFFF # limit 64kB

.word 0 # base = 0 to set

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0 # G = 0, limit

.byte 0 # base

#

# desriptor for ode segment in Long Mode

#

DESC4: .word 0x0FFFF # limit 64kB

.word 0 # base = 0

.byte 0 # base

.byte 0x9A # ode segment

.byte 0xAF

.byte 0

#

# GDT table data

#

GDTL: .word 0x27 # limit

GDTA: .long 0 # base to set

Assemblonsehierboot2.ssousLinux:

$ as boot2.s --32 -o ./boot2.o

$ objopy -O binary ./boot2.o ./boot2.om

$ ls -l boot2.om

-rwxr-xr-x 1 patrik patrik 605 ot. 13 10:26 boot2.om

$

Ilnefautengarderqueles349derniersotetsdubinaire:

$ objopy -O binary -i 1500 --interleave-width 349 -b 256 boot2.o ./boot2.om

$

Lorsqu'on exéuteboot2.omsous MS-DOS, on voit apparaîtreun `A' àla premièreligne,

unefoisrevenuauprompteur.

Remarques.- 1

o

) On ommene par se plaer en mode protégé sans pagination, de la façon

habituelle.

-2

o

)Onpréparelesstruturespourlapagination:

la PML4, qui ne ontient qu'une seule entrée, est plaée à l'adresse physique 0x70000,

multiplede0x1000;

laPDPT, qui ne ontientégalementqu'uneseuleentrée, est plaéeàl'adresse physique

0x71000,égalementmultiplede0x1000;

LaPDIR,quineontientaussiqu'uneseuleentrée,estplaéeàl'adressephysique0x72000,

toujoursmultiple de0x1000;

La table de pages, qui ontient 256 entrées de façon à

hh

mapper

ii

le premier MiO de mémoirevive,estplaéeàl'adressephysique0x73000,toujoursmultiplede0x1000.

- 3

o

) Par préaution, on met à zéro les entrées qu'on n'initialisera pas. Elles ne

devraientependantpasêtreutilisées.

- 4

o

)On remplit la premièreentrée des trois premiers niveaux de pagination ainsi

queles256premièresentréesdelatable depage. L'adressephysique dePML4est plaéedans

(22)

-5

o

)Onativelemodelongenmettantà1lebit8(LME)duMSREFER.

-6

o

)OnativelaPAEenmettantà1lebit6duregistreCR4.

-7

o

)OnativelapaginationIA-32eenmettantà1lebit 31(PGE)deCR0.

-8

o

)Ilfautalorseetuerunsautinter-segmentaire,parexempleàlalignesuivante.

Utilisonslemêmeodedesegmentquepourlemodeprotégé.OnaCS.L = CS.D = 0,nousnous

retrouvonsdonave unmodeompatible enmoded'instrutions16bits.

-9

o

)Ahons,equiestmaintenantlassique,`A'audébutdeladeuxièmelignede

l'éran.

- 10

o

) Pour quitter le mode long, il faut d'abord désativer la pagination IA-32e

(sinononaura unredémarragelorsdelaprohaineation)puismettreàzérolebit 8duMSR

EFER.

- 11

o

) Onseretrouvealorsenmodeprotégé,depuislequelonsait revenir aumode

réel.

(23)

13.2.3 Passage au mode 64 bits

Érivonsunprogrammepassantaumodeompatibleaveinstrutions32bits,puisaumode

64bitsetexéutantleprogramme(enmode64bits)situéàl'adresseabsolue 6000:0.

#--- --- ---- --- ;

# boot3.s ;

# Example program swithing to 64-bits mode ;

#--- --- ---- --- ;

.setion .text

.globl _start

.ode16

.org 0x100

_start:

#

#Setting base for ode segment in PM

#

movw %s,%ax

movzx %ax,%eax

shll $4,%eax # eax=base for ode segment

movl %eax,DESC1B

movb $0x9a,DESC1C # set segment attribute

#

# Setting of GDTA

#

movl $0,%eax # deja fait mais prudene

movl $0,%ebx

movw %s,%ax # deja fait mais prudene

movw $DESC0,%bx

shll $4,%eax # deja fait mais prudene

addl %ebx,%eax

movl %eax,GDTA

#

# Make sure no ISR will interfere now

#

li

#

# LGDT is neessary before swith to PM

#

lgdtl GDTL

#

# Swith to PM

#

movl %r0,%eax

orb $1,%al

movl %eax,%r0

#

# Far jump to set CS & lear prefeth queue

#

.byte 0x0ea

.word pm_in

.word 8

#

# Load long segment desriptor from GDT into DS

(24)

.ode32

pm_in: movw $0x10,%dx

movw %dx,%ds

movw %dx,%ss

movw %dx,%es

#---;

# A sample in proteted mode: ;

#---;

#

# Clear the page tables

#

movl $0x70000,%edi

movl $0x1000,%ex

xorl %eax,%eax

REPETER:

movl %eax,%es:(%edi)

addl $4,%edi

del %ex

jexz FIN

jmp REPETER

FIN:

#

# First entry of PML4

#

movl $0x71007,%ds:(0x70000)

#

# First entry of PDP table

#

movl $0x72007,%ds:(0x71000)

#

# First entry of Diretory

#

movl $0x73007,%ds:(0x72000)

#

# Fill up 256 first page tables

#

movl $0x73000,%edi # address of first page table

movl $7,%eax # ontent of first page table

movl $256,%ex # number of pages to map (1 MB)

make_page_entries:

movl %eax,%es:(%edi)

addl $8,%edi # address next entry, 8 bytes

addl $0x1000,%eax # ontent next entry

del %ex

jexz FIN2

jmp make_page_entries

FIN2:

#

# Load page-map level-4 base (without enabling)

#

movl $0x70000,%eax

movl %eax,%r3

#

(25)

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

orl $0x100,%eax # enable long mode

wrmsr

#

# Enable physial-address extensions

#

movl $0x20,%eax

movl %eax,%r4

#

# Enable paging

#

movl %r0,%eax

orl $0x80000000,%eax

movl %eax,%r0 # enable paging

#

# Far jump to Compatibility Mode (Seletor 0x8)

#

ljmp $0x8,$suite

suite:

#

# Far jump to 64-bit Mode

#

.byte 0xea

.long 0x60000

.word 0x18

#--- --- ---;

# End of the sample in proteted mode ;

#--- --- ---;

#

#--- --- ---- --;

# GDT to be used in Proteted Mode ;

#--- --- ---- --;

#

# null desriptor

#

DESC0: .long 0 # null desriptor

.long 0

#

# desriptor for ode segment in PM and long mode

#

DESC1: .word 0x0FFFF # limit 64kB

DESC1B: .word 0 # base to set

.byte 0 # base

DESC1C: .byte 0x9A # ode segment

.byte 0xC0 # G = 0, D = 1

.byte 0

#

# desriptor for data segment in PM

#

DESC2: .word 0x0FFFF # limit 4GB

.word 0 # base = 0

(26)

.byte 0x92 # R/W segment

.byte 0x8F # G = 1, limit

.byte 0

#

# desriptor for ode segment in 64-bits Mode

#

DESC3: .word 0 # no limit

.word 0 # no base

.byte 0 # no base

.byte 0x9A # ode segment

.byte 0x20 # L = 1 (64-bit mode)

.byte 0

#

# GDT table data

#

GDTL: .word 0x1F # limit

GDTA: .long 0 # base to set

Assemblonsehierboot3.ssousLinux:

$ as boot3.s --32 -o ./boot3.o

$ objopy -O binary ./boot3.o ./boot3.om

$ ls -l boot3.om

-rwxr-xr-x 1 patrik patrik 510 ot. 16 10:34 boot3.om

$

Ilnefautengarderqueles254derniersotetsdubinaire:

$ objopy -O binary -i 1500 --interleave-width 254 -b 256 boot3.o ./boot3.om

$

Remarques.-1

o

)LedesripteurDESC1 pourlesegmentdeodeenmodeprotégéamaintenant

0xC0ommeavant-dernierotet:G = 1maissurtoutD = 1pourinstrutions32bits.

-2

o

)Onn'aplusbesoindudesripteurpourleretouraumoderéelmaisonabesoin

d'un desripteur,DESC3, pourlesegment deodeen mode 64bits : l'otet desdroitsd'aès

est 0x9A omme d'habitude pour un segment de ode; l'avant-dernier otet est égal à 0x20,

'est-à-direqueL = 1.

-3

o

)Onajouteladiretive`.ode32'lorsqu'onestparvenudanslesegmentdeode

enmodeprotégé,puisquelesinstrutionsnesontpastraduites enlangagemahinedelamême

façonsuivantquel'onsetrouveenmoded'instrutions16bitsou32bits.

- 4

o

) Pour passer du mode ompatible au mode long, on eetue un saut long à

(27)

Programme64bits.- Érivonspar ailleurs un programme 64 bits, disons test.s,plaçant,par

exemple,`LONG'àladeuxièmelignedel'éranpuisgelantleprogramme:

.setion .text

.globl _start

.ode64

.org 0x60000

_start:

movq $0x2047204E204F204C,%rax #'L O N G '

movl $0x0B80A0,%ebx

movq %rax,(%ebx)

here: jmp here

Remarquonsl'utilisationdeladiretive`.ode64'.

Assemblons-le pour obtenir unprogramme binaire test.bin. Utilisons un éditeurde texte

hexadéimalpourenobserverleontenu:

48 B8 4C 20 4F 20 4E 20 47 20

48 89 05 8F 80 05 00

EB FE

La première instrution ommene par le préxe REX 0x48 pour indiquer l'utilisation

d'un registre de 64 bits. Le ode opération 0xB8, orrespondant d'habitude à mov ax,

suivi d'une onstante sur deux otets, doit donêtre traduit par mov rax, suivi d'une

onstante surhuitotets.LeshuitotetsquisuiventsonteuxdesodesASCII pourles

aratèresdésirés.

LaseondeinstrutionommeneégalementparlemêmepréxeREX.Leodeopération,

surdeuxotets,0x89 05,signiantd'habitudemov [℄,ax,signiedondanseontexte

mov [℄,rax ave un déalage (entre rohets) sur 32 bits. Les quatre otets suivants

spéientdonedéalage,àsavoir0x0005808F.

La troisième instrution est un saut relatif ourt à l'adresse -2 par rapport à l'adresse

del'instrutionqui lasuit, 'est-à-direqu'on revientàette instrution,d'où uneboule

innieassurantlegeldusystème.

Plaçons boot3.om dans le répertoire BOOT de notre lé USB démarrant sur MS-DOS.

Plaçons,àlamain,leodeduprogrammedetestàl'emplaement6000:0etlançonsboot3.om:

C:\BOOT>debug

-E 6000:0 48 B8 4C 20 4F 20 4E 20 47 20 48 89 05 8F 80 05 00 EB FE

-q

C:\BOOT>boot3

_

(28)

13.2.4 Amélioration du passage au mode 64 bits

Ce n'estpas trèsonvivial, maisombien instrutif,d'avoiràérireleprogramme 64bits

enodemahineetàallerleplaeràlamainàl'emplaementmémoire6000:0.C'estenfaitun

peuplusfailelorsdelaoneptiond'unsystèmed'exploitationaronnepartpas,etsurtouton

n'apas l'intentionde revenir,d'un système d'exploitationde lanementqui déidedel'endroit

oùplaerleprogramme:onpeuthoisirertainesadressesdefaçonabsolue.

Bienentendu,même lorsqu'onpartde MS-DOS,onpeutlanerleprogramme 64bitsauto-

matiquement.C'estjusteunpeuplusompliquéarilfautsansessesepréouperdesadresses

hoisiesparMS-DOS.

Réérivonsleprogrammepréédentdefaçonàequ'onn'aitpasàallerplaerleodemahine

àlamain :

#--- ---- --- ----;

# boot4.s ;

# Example program swithing to 64-bits mode ;

# and loading a sample ;

#--- ---- --- ----;

.setion .text

.globl _start

.ode16

.org 0x100

_start:

#

#Setting base for ode segment in PM

#

movw %s,%ax

movzx %ax,%eax

shll $4,%eax # eax=base for ode segment

movl %eax,DESC1B

movb $0x9a,DESC1C # set segment attribute

#

# Setting of GDTA

#

movl $0,%eax # deja fait mais prudene

movl $0,%ebx

movw %s,%ax # deja fait mais prudene

movw $DESC0,%bx

shll $4,%eax # deja fait mais prudene

addl %ebx,%eax

movl %eax,GDTA

#

# Address of beginning of program in 64-bits mode

#

movl $0,%eax

movl $0,%ebx

movw %s,%ax

movw $suiteL,%bx

shll $4,%eax

addl %ebx,%eax

movl %eax,offL

#

# Make sure no ISR will interfere now

(29)

li

#

# LGDT is neessary before swith to PM

#

lgdtl GDTL

#

# Swith to PM

#

movl %r0,%eax

orb $1,%al

movl %eax,%r0

#

# Far jump to set CS & lear prefeth queue

#

.byte 0x0ea

.word pm_in

.word 8

#

# Load long segment desriptor from GDT into DS

#

.ode32

pm_in: movw $0x10,%dx

movw %dx,%ds

movw %dx,%ss

movw %dx,%es

#--- ;

# A sample in proteted mode: ;

#--- ;

#

# Clear the page tables

#

movl $0x70000,%edi

movl $0x1000,%ex

xorl %eax,%eax

REPETER:

movl %eax,%es:(%edi)

addl $4,%edi

del %ex

jexz FIN

jmp REPETER

FIN:

#

# First entry of PML4

#

movl $0x71007,%ds:(0x70000)

#

# First entry of PDP table

#

movl $0x72007,%ds:(0x71000)

#

# First entry of Diretory

#

movl $0x73007,%ds:(0x72000)

(30)

# Fill up 256 first page tables

#

movl $0x73000,%edi # address of first page table

movl $7,%eax # ontent of first page table

movl $256,%ex # number of pages to map (1 MB)

make_page_entries:

movl %eax,%es:(%edi)

addl $8,%edi # address next entry, 8 bytes

addl $0x1000,%eax # ontent next entry

del %ex

jexz FIN2

jmp make_page_entries

FIN2:

#

# Load page-map level-4 base (without enabling)

#

movl $0x70000,%eax

movl %eax,%r3

#

# Enable long mode

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

orl $0x100,%eax # enable long mode

wrmsr

#

# Enable physial-address extensions

#

movl $0x20,%eax

movl %eax,%r4

#

# Enable paging

#

movl %r0,%eax

orl $0x80000000,%eax

movl %eax,%r0 # enable paging

#

# Far jump to Compatibility Mode (Seletor 0x8)

#

ljmp $0x8,$suite

suite:

#

# Enable 64-bit Mode

#

.byte 0xea

offL: .long 0

.word 0x18

#

# Sample in 64-bit Mode

#

.ode64

suiteL:

movq $0x2047204E204F204C,%rax #'L O N G '

(31)

movq %rax,(%ebx)

here: jmp here

#

#--- --- ---;

# End of the sample in proteted mode ;

#--- --- ---;

#

#--- --- ---- --- --- -;

# GDT to be used in Proteted and long Mode ;

#--- --- ---- --- --- -;

#

# null desriptor

#

DESC0: .long 0 # null desriptor

.long 0

#

# desriptor for ode segment in PM and long mode

#

DESC1: .word 0x0FFFF # limit 64kB

DESC1B: .word 0 # base to set

.byte 0 # base

DESC1C: .byte 0x9A # ode segment

.byte 0xC0 # G = 0, D = 1

.byte 0

#

# desriptor for data segment in PM

#

DESC2: .word 0x0FFFF # limit 4GB

.word 0 # base = 0

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0x8F # G = 1, limit

.byte 0

#

# desriptor for ode segment in 64-bits Mode

#

DESC3: .word 0 # no limit

.word 0 # no base

.byte 0 # no base

.byte 0x9A # ode segment

.byte 0x20 # 64-bit mode

.byte 0

#

# GDT table data

#

GDTL: .word 0x1F # limit

GDTA: .long 0 # base to set

Assemblonsehierboot4.ssousLinux:

$ as boot4.s --32 -o ./boot4.o

$ objopy -O binary ./boot4.o ./boot4.om

$ ls -l boot4.om

-rwxr-xr-x 1 patrik patrik 559 ot. 16 09:59 boot4.om

(32)

Ilnefautengarderqueles303derniersotetsdubinaire:

$ objopy -O binary -i 1500 --interleave-width 303 -b 256 boot4.o ./boot4.om

$

Lorsqu'on exéute boot4.omsous MS-DOS, onvoit apparaître `LONG' en noir sousfond

vertàladeuxièmeligne.Toutestgelé,equi estnormal.

Commentaires.-1

o

)Lorsdupassageaumode64bits, nousavonstoujourslemême problème:

ledéalagedoitêtreégalàl'adresse

hh

absolue

ii

,'est-à-direàpartirde0.Appelons-làOffL.Ne

sahantpasoùMS-DOSvaplaerleprogramme,ilfautl'initialiser,enmoderéel,àpartirdela

valeurdeCShoisieparMS-DOS.

-2

o

)Lorsquenoussommesenmode64bits,nousnepouvonspasnousontenter

del'instrution:

movq %rax,(0xB80A0)

arl'adresse0xB80A0n'estpastraduiteenodemahineommeuneadresseabsoluemaisomme

undéplaement.D'oùlereoursàl'adressageindiret,enutilisantleregistreEBX.

(33)

13.2.5 Passage au mode 64 bits et retour au mode réel

On peutpartir dumode réel,passer au mode protégé,au mode longpuis aumode 64 bits

puisrevenir,àl'inverse,enpassantd'abordaumodedeompatibilité,aumodeprotégépuisau

moderéel,ommelemotrel'exemplesuivant.

#--- --- ---- ----;

# boot5.s ;

# Example program swithing to 64-bit mode ;

# with return to real mode ;

#--- --- ---- ----;

.setion .text

.globl _start

.ode16

.org 0x100

_start:

#

# Save flags and DS for return to real mode

#

movw %s,%dx

movw %dx,%ds

movw %dx,%ss

pushf

push %ds

movw %ds,%dx

movw %dx,seg

#

#Setting base for ode segment in PM

#

movw %s,%ax

movzx %ax,%eax

shll $4,%eax # eax=base for ode segment

movl %eax,DESC1B

movb $0x9a,DESC1C # set segment attribute

#

# Setting of GDTA

#

movl $0,%eax # deja fait mais prudene

movl $0,%ebx

movw %s,%ax # deja fait mais prudene

movw $DESC0,%bx

shll $4,%eax # deja fait mais prudene

addl %ebx,%eax

movl %eax,GDTA

#

# Address of beginning of program in 64-bits mode

#

movl $0,%eax

movl $0,%ebx

movw %s,%ax

movw $suiteL,%bx

shll $4,%eax

addl %ebx,%eax

movl %eax,offL

(34)

# Make sure no ISR will interfere now

#

li

#

# LGDT is neessary before swith to PM

#

lgdtl GDTL

#

# Swith to PM

#

movl %r0,%eax

orb $1,%al

movl %eax,%r0

#

# Far jump to set CS & lear prefeth queue

#

.byte 0x0ea

.word pm_in

.word 8

#

# Load long segment desriptor from GDT into DS

#

pm_in: movw $0x10,%dx

movw %dx,%ds

movw %dx,%ss

movw %dx,%es

#---;

# A sample in proteted mode: ;

#---;

#

# Clear the page tables

#

movl $0x70000,%edi

movl $0x1000,%ex

xorl %eax,%eax

REPETER:

movl %eax,%es:(%edi)

addl $4,%edi

del %ex

jexz FIN

jmp REPETER

FIN:

#

# First entry of PML4

#

addr32 movl $0x71007,%ds:(0x70000)

#

# First entry of PDP table

#

addr32 movl $0x72007,%ds:(0x71000)

#

# First entry of Diretory

#

(35)

#

# Fill up 256 first page tables

#

movl $0x73000,%edi # address of first page table

movl $7,%eax # ontent of first page table

movl $256,%ex # number of pages to map (1 MB)

make_page_entries:

movl %eax,%es:(%edi)

addl $8,%edi # address next entry, 8 bytes

addl $0x1000,%eax # ontent next entry

del %ex

jexz FIN2

jmp make_page_entries

FIN2:

#

# Load page-map level-4 base (without enabling)

#

movl $0x70000,%eax

movl %eax,%r3

#

# Enable long mode

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

orl $0x100,%eax # enable long mode

wrmsr

#

# Enable physial-address extensions

#

movl $0x20,%eax

movl %eax,%r4

#

# Enable paging

#

movl %r0,%eax

orl $0x80000000,%eax

movl %eax,%r0 # enable paging

#

# Far jump to Compatibility Mode (Seletor 0x8)

#

ljmp $0x8,$suite

suite:

#

# Enable 64-bit Mode

#

.byte 0x66 # 16-bit instrution mode

.byte 0xea

offL: .long 0

.word 0x18

#

# Sample in 64-bit Mode

#

.ode64

(36)

movq $0x2047204E204F204C,%rax #'L O N G '

movl $0x0B80A0,%ebx

movq %rax,(%ebx)

#here: jmp here

#

# Return to ompatibility mode

#

# jmp [suiteC℄

#

.byte 0xFF

.byte 0x2D

.word 0

.word 0

offC: .long suiteC

.word 0x8

suiteC:

.ode16

movb $65,%al

addr32 movb %al,%ds:(0x0B80A0)

#

# Disable paging

#

movl %r0,%eax

btrl $31,%eax

movl %eax,%r0

#

# Disable long mode

#

movl $0xC0000080,%ex # EFER MSR

rdmsr

btrl $8,%eax # enable long mode

wrmsr

#

# Sample in PM

#

movb $67,%al

addr32 movb %al,%ds:(0x0B80A0)

#--- ---- ---;

# End of the sample in proteted mode ;

#--- ---- ---;

#

# Load 64kB segment desriptor from GDT into DS for return

#

movb $0x20,%dl

movw %dx,%ds

movb $0x10,%dl

movw %dx,%es

#

# Return from PM to real mode

#

andb $0x0fe,%al

movl %eax,%r0

#

(37)

#

movb $69,%al # `E'

addr32 movb %al,%es:(0x0B80A0)

#

# Far jump to restore CS & lear prefeth queue

#

.byte 0x0ea

.word pm_out

seg: .word 0

pm_out:

#

# Sample

#

movb $70,%al # `F'

addr32 movb %al,%es:(0x0B80A0)

#

# Restore DS and flags

#

movw %s,%dx

movw %dx,%ss

pop %ds

popf

#

# Exit to MS-DOS

#

ret

#

#--- --- ---- --;

# GDT to be used in Proteted Mode ;

#--- --- ---- --;

#

# null desriptor

#

DESC0: .long 0 # null desriptor

.long 0

#

# desriptor for ode segment in PM and long mode

#

DESC1: .word 0x0FFFF # limit 64kB

DESC1B: .word 0 # base to set

.byte 0 # base

DESC1C: .byte 0x9A # ode segment

.byte 0 # G = 0, D = 0

.byte 0

#

# desriptor for data segment in PM

#

DESC2: .word 0x0FFFF # limit 4GB

.word 0 # base = 0

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0x8F # G = 1, limit

.byte 0

(38)

# desriptor for ode segment in 64-bits Mode

#

DESC3: .word 0 # no limit

.word 0 # no base

.byte 0 # no base

.byte 0x9A # ode segment

.byte 0x20 # 64-bit mode

.byte 0

#

# desriptor for data segment return to real mode

#

DESC4: .word 0x0FFFF # limit 64kB

.word 0 # base = 0 to set

.byte 0 # base

.byte 0x92 # R/W segment

.byte 0 # G = 0, limit

.byte 0 # base

#

# GDT table data

#

GDTL: .word 0x27 # limit

GDTA: .long 0 # base to set

Assemblonsehierboot5.ssousLinux:

$ as boot5.s --32 -o ./boot5.o

$ objopy -O binary ./boot5.o ./boot5.om

$ ls -l boot5.om

-rwxr-xr-x 1 patrik patrik 702 ot. 18 16:41 boot5.om

$

Ilnefautengarderqueles446derniersotetsdubinaire:

$ objopy -O binary -i 1500 --interleave-width 446 -b 256 boot5.o ./boot5.om

$

Lorsqu'on exéute boot5.omsous MS-DOS, onvoit apparaître `LONG' en noir sousfond

vertàlapremièreligne,unefoisrevenuauprompteur.Cettefois-i,leprogrammen'estpasgelé.

Commentaires.- 1

o

) Pourrevenir au mode d'instrutions 16 bits en mode protégé et en mode

ompatible,on utilise ledesripteur DESC1, ave 0x00omme otetdes droitsd'aès et non

plus0xC0.

Remarquez,paronséquent,l'ajout dupréxe0x66lorsdupassageaumode64bitspar

rapportauprogrammepréédent.

-2

o

)Pourreveniraumodeompatible,ilfaut,ommed'habitude,utiliserunsaut

lointain.Lesautaveadressagediretn'existepasenmode64bits,ommeonpeutleonstater

enparourantladesriptiondesinstrutionsdanslemanuel,AMDouIntel.Ilfautdonutiliser

unsautlointainaveadressageindiret:

jmp [displaement℄

Cesmêmesmanuelsindiquentqueleodemahinedusautlointainest FF /5,'est-à-dire:

(39)

ave ommepremier otetd'opode0xFF, laseonde partie de l'opodese trouvedans l'otet

suivant ModR/M: le hampREG onstitue en fait la seonde partie du ode opération, égale à

101b.

Choisissonsleasleplussimple,eluioùledéplaementestdonnéparuneonstante(sur32

bits).Ilfauthoisirmod = 00et R/M = 101.Ceionduitauodeopération:

| 0xFF | 00 101 101 |

soit0xFF 0x2D.Ce odeopérationdoitêtresuividudéplaementsur32bits.Sinousregardons

notreprogramme,nousavonshoisi:

FF 2D 00 00 00 00

soitundéplaementde0.

En eet,enmode64bits,undéplaementest relatifauRIP,'est-à-direàl'adressequi suit

l'instrution. Ave 0, ei signie que le saut lointain aura lieu par rapport aux données (un

déplaementsur32bitssuivid'unséleteursur16bits)suivantette instrution.

#

# jmp [suiteC℄

#

.byte 0xFF

.byte 0x2D

.word 0

.word 0

offC: .long suiteC

.word 0x8

suiteC:

Onytrouveequenousaurionsaiméplaerenimmédiat,'est-à-direledéalagedel'étiquette

quisuit, puisleséleteurduodedesegmentpourlesmodesréel,protégéetompatible.

Nousdevrionsêtreplaé,enmodeompatible,àl'étiquettesuiteC,equelebondéroulement

duprogrammeonrme.

Exerie.-Pour onrmere qui vientd'être dit, prenonsun déplaementde 1au lieu de0 et

déplaçonslesdonnéesd'unotet:

#

# jmp [suiteC℄

#

.byte 0xFF

.byte 0x2D

.word 1 # displaement of 1

.word 0

.byte 0 # extra byte

offC: .long suiteC

.word 0x8

suiteC:

(40)

13.3 Bibliographie

[AMD-02-1℄ AdvanedMiroDevies, AMD64Arhiteture Programmer'sManual,vo-

lume1 : Appliation Programming,publiation24592,2002,Marh2012for

Revision3.19,xxii+352p.

[AMD-02℄ AdvanedMiroDevies, AMD64Arhiteture Programmer'sManual,vo-

lume 2 : System Programming,publiation 24593,2002, September 2012for

Revision3.22.

[AMD-02-3℄ AdvanedMiroDevies, AMD64Arhiteture Programmer'sManual,vo-

lume3:General-PurposeandSystemInstrutions,publiation24594,2002,

September2012forRevision3.19,xxxii+538p.

[Bre-09℄ Brey,BarryB.,The Intel Miroproessors:Arhiteture,Programming,

andInterfaing:8086/8088,80186/80188,80286,80386,80486,Pentium,

PentiumPro Proessor,PentiumII,PentiumIII,Pentium4,and Core2

with 64-bit Extensions,Pearson,EightEdition,2009,xviii+926p.

[Dernière édition d'un lassique publié depuis 1987, n'abordant alors que le

8086/8088.Desouhessontajoutéesàhaqueéditionsansqueletexteantérieur

nesoittouhé(niorrigé).Commelaplupartdeslivres,ils'agitd'uneadaptationde

ladoumentationoielled'Intel,dont[Int℄,moinsomplètemaisaveuneformu-

lationpluspédagogique,utilepourommener.Cettedernièreéditiondébrousaille

lemode64bits,maissansauun exempledeprogrammespéique.℄

[Ceg-04℄ PatrikCégielski,Coneption des systèmesd'exploitation: Le aslinux.

Deuxièmeédition,Eyrolles,XIII+680p.,septembre2004.

[Int℄ Intel 64and IA-32 ArhiteturesSoftware Developper's,3volumesset.

[Àlafoisladoumentationoielle d'Intelen plusde 3000pagesetlaréférene.

Laplupartdeslivresreprennentunepartiedeelle-i.Touslessujetssontabordés

maisiln'yaauunexempleomplet.℄

Références

Documents relatifs

[r]

(pour Integer DIVision), où le dividende de 16 bits (resp. 32 bits) est plaé dans l'aumulateur. AX (resp. AX et DX, e dernier ontenant le mot de poids fort) et le diviseur de 8

Pour une valeur se trouvant à l'adresse (de mémoire vive) désignée par le ontenu d'uno. registre (de seize bits, puisque 'est la taille du déplaement), on indique le nom de

Jusqu'à maintenant nous avons érit des programmes soit dans un langage évolué (omme le. langage C, Pasal,...), soit dans un

La taille d'un registre est par défaut de 16 (ou 8) bits en mode réel.. Si le

mode protégé : elle doit être égale à la valeur du segment de ode du mode réel (adresse hoisie.. Puisque nous sommes en mode réel, l'adresse physique est égale au ontenu du

Cei doit être eetué à partir d'une page pour laquelle les adresses virtuelles sont. égales aux adresses physiques ( hh identity mapped ii

• La fréquene des solutions qui permet de synhronisés une ligne de fusiliers de taille 5 ou 6 plus grande que pour les autres solutions. • La fréquene des solutions qui permet