IOCLA curs 02 Arhitectura x86 - ERASMUS...
Transcript of IOCLA curs 02 Arhitectura x86 - ERASMUS...
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?