iocla curs 02 arhitectura x86 - erasmus...

Post on 08-Feb-2020

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Curs2–Arhitecturax86 1

Arhitecturax86De citit: Dandamudi capitolele 3, 14

Modificat:Oct-14-18

Curs2–Arhitecturax86 2

Cuprinscurs2

•  Familiax86•  Registrele*  Data*  Pointer,index*  Control*  Segment

•  Modulprotejat*  RegistreleSegment*  Descriptoridesegment*  Tabelededescriptori*  Modeledesegmentare

•  Modulreal•  Segmentare,Paginare•  Întreruperi•  Demosasm,gdb•  Instrucţiunimov,add,

jmp

Curs2–Arhitecturax86 3

IstoriculprocesoarelorIntelProcesor An Frecvenţa Tranzistoare Registre Busdate Maxaddr

4004 1969 0.74 2.3K 4 12 4K

8080 1974 2 4.5K 8 16 64K

8086 1978 8 29K 16 16 1MB

80386 1985 20 275K 32 32 4GB

Pentium 1993 60 3.1M 32 40? 4GB

Pentium4 2000 1500 42M 32 64GB

Core2 2006 3000 291M 64 64GB

Corei7 2008 3400 1.4G 64 64GB

XeonE5 2012 3600 5.5G 64 768GB

Curs2–Arhitecturax86 4

Arhitecturax86

Curs2–Arhitecturax86 5

•  Registrede32biţipotfifolosite*  Pe32biţi(EAX,EBX,ECX,EDX)*  Pe16biţi(AX,BX,CX,DX)*  Pe8bitbiţi(AH,AL,BH,BL,CH,CL,DH,DL)

•  Uneleregistreauutilizărispeciale*  ECXestenumăratorpentruinstrucţiunealoop

x86registrepe32biţi

Curs2–Arhitecturax86 6

•  Douăregistreindex*  16sau32biţi*  Instrucţiunipestringuri*  source(SI);destination

(DI)*  Potfifolositeînscop

general

•  Douăregistrepointer*  16sau32-biţi*  Exclusivpentrustivă

x86registrepe32biţi

Curs2–Arhitecturax86 7

x86registrepe32biţi

Curs2–Arhitecturax86 8

EFLAGS(Indicatoriidestare)•  CF(CarryFlag)-indicatordetransport-reflectatransportulinexterioralbitului

celmaisemnificativalrezultatuluioperatiiloraritmetice.Astfel,acestindicatorpoatefifolositincazuloperatiilorindublaprecizie.ValoareaCF=1semnificafietransportlaadunarefieimprumutlascadere.Deasemenea,indicatorulCFestemodificatsideinstructiunilededeplasaresirotatie.

•  PF(ParityFlag)-indicatordeparitate-este1dacarezultatulareparitatepara(contineunnumarpardebiti1).Acestindicatorestefolositdeinstructiuniledearitmeticazecimala.

•  AF(AuxiliaryCarryFlag)-indicatordetransportauxiliar-este1dacaafosttransportdelajumatateadeoctetinferioaralajumatateadeoctatesuperioara(delabitul3labitul4).Acestindicatorestefolositdeinstructiuniledearitmeticazecimala.

•  ZF(ZeroFlag)-indicatoruldezero-este1dacarezultatuloperatieiafostzero.•  SF(SignFlag)-indicatoruldesemn-este1dacacelmaisemnificativbital

rezultatului(MSb)este1,adicainreprezentareanumerelorincomplementfatade2(C2)rezultatulestenegativ(aresemn-).

•  OF(OverflowFlag)-indicatoruldedepasirearitmetica(agameidevaloriposibildereprezentat)-este1dacadimensiunearezultatuluidepasestecapacitatealocatieidedestinatiesiafostpierdutunbit(indicalavalorilecusemnfaptulcase"altereaza"semnul).

C2 8

Curs2–Arhitecturax86 9

EFLAGS(Indicatoriidecontrol)

•  DF(DirectionFlag)–esteutilizatdeinstrucţiunilepeşirurişispecificădirecţiadeparcurgereaacestora:*  0–şirurileseparcurgdelaadresemicispreadresemari;*  1–şirurilesuntparcurseinvers.

•  IF(InterruptFlag)–acestindicatorcontroleazăacceptareasemnalelordeîntrerupereexternă.DacăIF=1esteactivatsistemuldeîntreruperi,adicăsuntacceptatesemnaledeîntrerupereexternă(mascabile,peliniaINTR);altfel,acesteasuntignorate.Indicatorulnuareinfluenţăasuprasemnaluluideîntreruperenemascabilă–NMI.

•  TF(TraceFlag)–esteutilizatpentrucontrolulexecuţieiinstrucţiunilorînregimpascupas(instrucţiunecuinstrucţiune),înscopuldepanăriiprogramelor.Dacăindicatoruleste1,dupăexecuţiafiecăreiinstrucţiunisevageneraunsemnaldeîntrerupereintern(penivelul1).Evident,execuţiasecvenţeidetratareaacesteiîntreruperisevafacecuindicatorulTF=0.

C2 9

Curs2–Arhitecturax86 10

x86registrepe32biţi

•  registredecontrol*  EIP

»  Instructionpointer(instrucţiuneacurentă)*  EFLAGS

»  Statusflags–  Seactualizeazădupăoperaţiiaritmetice/logice

»  Directionflag–  Forward/backwarddirecţiacopierii

»  Systemflags–  IF:activareintreruperi–  TF:Trapflag(pentrudebugging)

Curs2–Arhitecturax86 11

x86registrepe32biţi

•  Registresegment*  16biţi*  Memoriasegmentată*  Conţinutdistinct

»  Code»  Data»  Stack

Curs2–Arhitecturax86 12

Modurile86

•  Toateprocesoarelex86audouămoduriimportante*  Modul“real”

»  Adreseșiregistrepe16biţi»  Memorie1MB

–  640Kshouldbeenoughforeveryone»  Folositdupăreset(grub)

*  Modulprotejat»  Registrede32biţi»  Segmentareșipaginare»  Protecţiakerneluluișiaproceselor»  FolositdeLinux,Windows

Curs2–Arhitecturax86 13

•  Segmentarea&paginarea=translatareadrese32biţi•  Segmentarea:adreselogice→ adreselineare•  Paginarea:adreselineare→ adresefizice•  Segmentare,paginare->cursurileSO,SO2

ModulProtejat

(ceadinprogram)

Curs2–Arhitecturax86 14

Imagineaunuiprocesînmemorie

Adreselogice(înprogram)

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/

Curs2–Arhitecturax86 15

Adresareamemoriei

Curs2–Arhitecturax86 16

Adresareamemoriei

calcululadreseilogice

:[++]]]Registrusegment

Registrudebaza

Registruindex

Deplasament

AdresadeoffsetAdresadesegment

Curs2–Arhitecturax86 17

Adresareamemoriei

mov eax, [mybuffer + ebx + esi*4 + 9] ; un dword

mov ebx, mybuffer ; adresa lui mybuffer, deci valoare imediată

Curs2–Arhitecturax86 18

Procesareaîntreruperilor

De citit: Capitol 14, fără 14.3

Curs2–Arhitecturax86 19

Cesuntîntreruperile?

•  Intreruperilealtereazăfluxulprogramului*  Comportamentsimilarapeluluideprocedură*  Existădiferenţesemnificative

•  IntrerupereatransferăcontrolulcătreISR*  ISR=interruptserviceroutine,interrupthandler

•  LaterminareaISRprogramuloriginalcontinuă•  Intreruperile=modefficientdeatrataevenimente

neanticipate

Curs2–Arhitecturax86 20

Intreruperivs.Proceduri

Intreruperi

•  Iniţiatedesoftwaresauhardware

•  Trateazăevenimenteanticipateșineanticipate

•  ISRsuntmereuînmemorie•  Suntidentificatecunumere•  registrulEFLAGSsalvat

automat

Proceduri

•  Iniţiatedoardesoftware•  Trateazăevenimente

anticipatedinprogram•  Suntîncărcatecuprogramul•  Suntidentificatecunume•  NusalveazăregistrulEFLAGS

Curs2–Arhitecturax86 21

Taxonomiaîntreruperilor

Curs2–Arhitecturax86 22

Declanșareauneiîntreruperi

1.  PushEFLAGSontothestack2.  ClearIF&TF(interruptandtrapflags)*  Sedezactiveazăalteîntreruperi

3.  PushCSandEIPontothestack4.  seîncarcăCS:EIPdinIDT(interruptdescriptiontable)

Curs2–Arhitecturax86 23

InterruptFlag

•  IF(Interruptflag)[dez]activeazăîntreruperile•  IF==0→ nusepermitîntreruperi*  Instrucţiuneacli(clearinterrupts)*  LadeclanșareaintreruperiiIFdevine0*  Instrucţiuneasti(setinterrupts)

Curs2–Arhitecturax86 24

ÎntoarcereadinISR

• UltimainstrucţiunedinISResteiret

• Acţiunileexecutatelairetsunt:1.  PopEIP2.  PopCS3.  PopEFLAGS

•  ISRsuntresponsiblepentru*  ArestauraTOATEregistrelefolosite*  Anulăsadatepestivă

Curs2–Arhitecturax86 25

Excepţii

•  3tipuri:Fault,Trap,Abort•  Faultșitrapsuntdeclanșateîntreinstrucţiuni• Abortedeclanșatălaerorisevere*  Erorihardware*  Valoriinconsistenteînsistem

Curs2–Arhitecturax86 26

FaultșiTrap

•  Fault»  Sedeclanșeazăînaintedeinstrucţiuneaîncauză»  Sereporneșteinstrucţiunea»  Exemplu:page-not-foundfault

•  Trap»  Sedeclanșeazădupăinstrucţiuneaîncauză»  NUsereporneșteinstrucţiunea»  Exemplu:Overflowexception(intreruperea4)»  Exemplu:întreuperidefinitedeutilizator

Curs2–Arhitecturax86 27

Numeredeîntreruperirezervate

intrerupere Scop0 Divideerror1  Single-step2  Nonmaskableinterrupt(MNI)5  Breakpoint6  Overflow

13 Generalprotectionexception14 Pagefault16 Floatingpointerror

Curs2–Arhitecturax86 28

Întreruperirezervate

• DivideErrorInterrupt*  Instrucţiuneadiv/idivcâtulnuîncapeîndestinaţie

•  Single-StepInterrupt*  DacăTrapFlagestesetat(TF==1)

»  CPUgenereazăautomatint1dupăexecuţiafiecăreiinstrucţiuni

*  folositorpentrudebugger• BreakpointInterrupt*  int 3încodmașinăesteunoctet(CCH)*  Cumestefolosităladebug?

• PagefaultInterrupt*  Seacceseazăopaginăvirtualăcarenuesteîncămapată*  SOaducepaginasauterminăprocesul

Curs2–Arhitecturax86 29

Întreruperisoftware

•  Iniţiatedeexecuţiainstrucţiuniiint interrupt-number

interrupt-number=[0..255]

•  înLinuxint 0x80esteapeluldesistem*  180serviciidiferite*  EAXconţinenumărulserviciului

•  Funcţionalsimilarecuapeluriledeproceduri

Curs2–Arhitecturax86 30

Exempleint 0x80 (Linux)

*  Tastaturașiecranulsunttratatecafișiere*  Fișierestandard,dejadeschise

»  Standardinput(stdin),descriptor0–  Dispozitivasociat:tastatura

»  Standardoutput(stdout)descriptor1–  Dispozitivasociat:terminal

»  Standarderror(stderr)descriptor2–  Dispozitivasociat:terminal

Curs2–Arhitecturax86 31

Exempleint 0x80 (Linux)

•  CiteștedinfișierSystemcall3Inputs: EAX=3 EBX=filedescriptor ECX=pointertoinputbuffer EDX=max.#ofbytestoreadReturns: EAX=#ofbytesreadError: EAX=errorcode

Curs2–Arhitecturax86 32

Exempleint 0x80 (Linux)

•  ScrieînfișierSystemcall4Inputs: EAX=4 EBX=filedescriptor ECX=pointertooutputbuffer EDX=#ofbytestowriteReturns: EAX=#ofbyteswrittenError: EAX=errorcode

Curs2–Arhitecturax86 33

Proceduraputch; primește caracterul in AL. putch: pusha mov [temp_char],AL mov EAX,4 ; 4 = write mov EBX,1 ; 1 = std output (display) mov ECX,temp_char ; pointer to char buffer mov EDX,1 ; # bytes = 1 int 0x80 popa ret

Curs2–Arhitecturax86 34

Proceduragetstr; primește EDI = buffer, ESI = lungimea getstr: pusha pushf mov EAX,3 ; file read service mov EBX,0 ; 0 = std input (keyboard) mov ECX,EDI ; pointer to input buffer mov EDX,ESI ; input buffer size int 0x80 dec EAX mov byte[EDI+EAX],0 ; append NULL character popf popa ret

Curs2–Arhitecturax86 35

Întreruperihardware

•  Suntasincrone,produsedehardware*  Seaplicăunsemnalexternprocesului

•  Întreruperilehardwarepotfi*  Maskable*  Non-maskable

»  Întreruperearezervată2 (NMI)

Curs2–Arhitecturax86 36

Cumsedeclanșeazăîntreruperilehardware?

•  ÎntreruperileNon-maskablesuntdeclanșatedepinulNMIalprocesorului*  Procesorulrăspundeîntotdeauna*  Nupoatefidezactivatprinprogram

•  ÎntreruperileMaskablesuntdeclanșatedepinulINTRalprocesorului*  declanșatedoardacăIF==1*  Mascatecucli,activatecusti

Curs2–Arhitecturax86 37

Demo

• Programulbc–conversiifolosindobase,ibase•  curs-02-demo–sasm*  RegistreleEAX,AX,AH,AL*  EFLAGS*  EIP*  InstrucţiunileMOV,ADD,JMP

•  curs-02-demo–Makefile+gdb*  Comenzilebmain,r,n*  set$eax=0xffffffff*  set$eip=main*  Decomentaţiinstrucţiuneajmpșireasamblaţi

Curs2–Arhitecturax86 38

Demo

• Programulbc–conversiifolosindobase,ibase•  curs-02-demo–sasm•  curs-02-demo–Makefile+gdb

• Atenţiela~/.gdbinit*  sasmfoloseștegdb!*  sasmdoarintroductiv

Curs2–Arhitecturax86 39

Intrebări?

top related