Linux Native Boot Process

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Linux Native Boot Process"

Transcript

1 by Salvatore D'Angelo Table of contents 1 Introduzione Alcuni concetti di base: modalità reale e protetta Software di test Boot process step 0: stampa di un messaggio di boot Boot Process step 1: copia del boot sector in 0x9000: Boot Process step 2: definizione dello spazio per lo stack Boot Process step 3: stop del motore del floppy Boot Process step 4: caricamento del codice di setup Boot Process step 5: routine di debug e stampa del messaggio Loading system Boot Process step 6: jump al codice di setup Boot Process step 7: caricamento del kernel in memoria Boot Process step 8: spostiamo il kernel all'indirizzo 0x0100: Boot Process step 9: stampiamo un semplice messaggio di setup Boot Process step 10: setting up global e interrupt descriptor tables Boot Process step 11: abilita linea A Boot Process step 12: reset coprocessore Boot Process step 13: PIC programming Boot Process step 14: switch alla modalità protetta Boot Process step 15: jump al codice kernel Boot process step 16: build immagine del kernel Conclusioni Download source code Bibliografia...25 Copyright 2004 The Open Community Group. All rights reserved.

2 1. Introduzione Questo articolo introduce il processo di boot adottato da Linux su architetture Intel. Esso guiderà il lettore, step by step, nella creazione di un floppy di boot capace di avviare una immagine di kernel che, nel nostro caso, sarà una semplice funzione C che stampa il messaggio "Hello Kernel". Gli esempi riportati in questo articolo sono prevalentemente scritte in linguaggio assembly e C, per cui è prerequisita la loro conoscenza. Poichè andremo a lavorare direttamente con l'hardware del PC, verranno illustrati anche i concetti base della gestione della memoria nei processori i386 (e superiori), il funzionamento dei chips PIC 8259 e del keyboard controller Poichè l'obiettivo di questo articolo è prevalentemente didattico, il processo di boot sarà spiegato in una forma semplificata rispetto alle versioni di Linux 2.4, diciamo che come riferimento sono state prese le prime versioni di Linux molto più semplici da comprendere. Il lettore una volta compresi i concetti base potrà provare ad estendere le funzionalità del suo boot loader. 2. Alcuni concetti di base: modalità reale e protetta Un microprocessore a 32 bit della famiglia i386 (o superiori) ha due modalità di funzionamento: reale e protetta. La prima fu introdotta per mantenere la compatibilità con le applicazioni che giravano sui vecchi processori a 16 bit i86/i286. Nella seconda modalità, invece, il microprocessore lavora pienamente a 32 bit e supporta un set di istruzioni molto più ampio. In modalità reale sono disponibili 20 linee di indirizzamento che consentono di indirizzare fino a 1 Mb. Ogni singolo byte della memoria viene indirizzato attraverso una coppia di puntatori SEGMENTO:OFFSET ciascuno a 16 bit. Questa coppia di puntatori vengono combinati dal processore in un particolare registro interno di 20 bit, ottenendo di conseguenza l'indirizzo lineare del byte da indirizzare in memoria. Per poter indirizzare la memoria sono disponibili alcuni registri elencati qui di seguito. CS: punta al segmento codice da eseguire. Questo registro in combinazione con il registro IP punta alla prossima istruzione da eseguire. Entrambi i registri sono modificabili solo attraverso istruzioni di jump e di chiamate a procedure. DS: punta al segmento dati. Spesso durante operazioni di copia di blocchi di dati, questo registro viene utilizzato in coppia con il registro SI (source index) per indicare la cella di partenza dei dati sorgente. ES: extra segment. Registro di segmento ausiliario, spesso utilizzato in coppia con il registro DI (destination index) durante la copia di blocchi di memoria per denotare la cella di partenza dei dati destinazione. SS: punta allo stack segment. Lo stack viene utilizzato per il salvataggio dei registri. I moderni compilatori utilizzano lo stack per salvare i parametri passati a una procedura. In genere questo registro viene utilizzato in coppia con il registro SP per puntare al top dello stack. Oltre a questi registri il processore i386 utilizza i seguenti registri general purpose: AX, BX, CX e DX. Per ognuno di questi registri a 16 bit è possibile accedere agli 8 bit più significativi o meno significativi attraverso i registri a 8 bit: AH-AL, BH-BL, CH-CL e DH-DL. Ad esempio se AH=0x10 e AL=0x10 allora AX=0x1010. Ipotizziamo di avere la coppia DS:SI con i seguenti valori, DS=8000h e SI=8F00h, allora per ottenere l'indirizzo lineare a cui la coppia di registri punta, basta operare in questo modo. Si moltiplica DS per 10h e si somma poi l'offset: 80000h+8F00h = 88F00h. Spiegata questa semplice modalità di indirizzamento, andiamo ad osservare come si presenta il primo Mb di memoria dopo l'accensione. La coppia di registri CS:IP punta all'indirizzo F000h:FFF0h, che è anche l'entry point del BIOS. Quest'indirizzo di conseguenza contiene un'istruzione di JUMP al codice effettivo del BIOS. Page 2

3 Il BIOS (Basic Input Output System) non è altro che un insieme di routine software che fornisce il supporto per gestire le periferiche del computer. Oltre a fornire questa interfaccia, il compito del BIOS è quello di verificare il corretto funzionamento dei dispositivi hardware essenziali in un computer, e di segnalare eventuali errori all'utente. Una volta che il diagnostico di sistema termina, viene invocato l'interrupt software 19h, meglio conosciuto come interrupt di boot-strap. Compito di questo interrupt è quello di caricare dai dispositivi di memoria di massa il codice di boot e stampare un messaggio di errore se questo non viene trovato. In modalità protetta il processore i386 (o superiori) hanno piene funzionalità a 32 bit, tuttavia il modo in cui vengono gestite le cose cambia completamente. Per comprendere le potenzialità di un processore i386 in modalità protetta, si consideri la seguente frase estratta da [1]. "L'80386 è un potente microprocessore a 32 bit ottimizzato per i sistemi operativi multitasking e progettato per applicazioni che necessitano di prestazioni molto elevate. Il processore può indirizzare fino a 4 Gb di memoria fisica e 64 Tb (246 bytes) di memoria virtuale. I mezzi di gestione della memoria onchip comprendono i registri per la conversione dell'indirizzo, un avanzato hardware multitasking, un meccanismo di protezione e il sistema di paginazione della memoria virtuale. Speciali registri di debugging forniscono breakpoint di dati e di codice perfino nel software basato su ROM". Queste poche righe dovrebbero dare un idea delle novità introdotte da questi tipi di microprocessori. Il nuovo processore è dotato di un set di registri general purpose chiamati EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI che sono la versione a 32 dei noti registri a 16 bit AX, BX, CX, DX, BP, SP, SI, DI. Infatti è possibile accedere ai primi 16 bit del registro semplicemente usando il vecchio nome e così via anche per le due diverse parti a 8 bit. Tra i registri messi a disposizione dal microprocessore, ci sono quelli di segmento che sono sempre CS, DS, ES, SS a cui si aggiungono FS e GS. In modalità protetta questi registri conterranno il selettore di un determinato indirizzo logico. Più avanti introdurremo il concetto di indirizzo logico e di selettore. Per ora ci basta tener presente che SS e ESP conterranno il valore dello stack pointer, mentre CS e EIP conterranno il valore del program counter. Ci sono poi alcuni registri flags e altri utilizzati nella gestione della memoria tra cui figurano: GDTR, Global Descriptor Table Register; LDTR, Local Descriptor Table Register; IDTR, Interrupt Descriptor Table Register; TR, Task Register. Esistono poi dei registri di controllo come CR0, CR2 e CR3. CR0 contiene i flags di controllo del sistema, che controllano o indicano le condizioni applicabili al sistema nel suo complesso e non ad un singolo task. Il registro CR2 viene impiegato per gestire gli errori di pagina qualora vengano utilizzate tabelle di pagine per convertire gli indirizzi. Il registro CR3 consente al processore di individuare l'elenco di tabelle di pagine per il task corrente. Infine ci sono registri di test e debugging che però non prenderemo in considerazione in questa sede. Ora concentriamo la nostra attenzione su come venga gestita la memoria in modalità protetta. In questa modalità di funzionamento un indirizzo è costituito da una coppia (selettore, offset) detto indirizzo logico. La Fig. 1 riporta il formato di un selettore. E' possibile notare un indice di 13 bit che identifica una entry in una GDT o LDT. C'è poi un Table Indicator (TI) che indica se l'indice fa riferimento a una GDT (TI=0) o LDT (TI=1), (quest'ultima non è presa in considerazione in questo articolo). Infine, ci sono due bits che rappresentano il Requestor Privilege Level (RPL) che in Linux può essere 0 (kernel mode) o 3 (user mode). Page 3

4 Selector Il registro GDTR contiene il base address della GDT, per cui sommando il suo contenuto con quello del selettore moltiplicato per 8 (visto che ogni entry occupa 8 bytes) si ottiene una entry nella GDT che contiene un descrittore di segmento il cui formato è riportato in Fig. 3. Questo descrittore contiene il base address di un segmento nell'area di indirizzamento lineare che, sommato all'offset dell'indirizzo logico ci restituisce un indirizzo lineare, come mostra la Fig. 2. Global Descriptor Table Osservando la Fig. 3 si può constatare che il descrittore è composto da un certo numero di campi di cui diamo una descrizione solo per quelli che ci interessano ai fini del nostro articolo. - LIMIT I due campi Limit 0-15 e Limit costituiscono il limite del segmento. Il limite indica la dimensione del segmento. Concatenando i due campi contenuti nel descrittore otteniamo un indirizzo a 20 bit. Questo indirizzo può assumere un valore da 0 a 2^ GRANULARITY Nel descrittore questo bit è indicato con la lettera G ed indica in che modo deve essere interpretato il campo LIMIT. Qualora questo bit non sia settato, il contenuto di LIMIT viene interpretato come unità in byte, quindi si ha un limite massimo di 1Mb, mentre se il bit G è settato il limite sarà considerato come il numero di unità da 4 Kb, ed in tal caso avremo un max di 4 Gb (come avviene nel nostro caso). - BASE Questo valore identifica la locazione del segmento entro lo spazio d'indirizzi lineare da 4 Gb. In parole semplici, identifica l'indirizzo assoluto in memoria dove si trova il primo byte del segmento. - DPL Questi 2 bit indicano il livello di privilegio del descrittore e di conseguenza i relativi permessi concessi al codice o ai dati in esso contenuti. Nel nostro caso utilizzeremo solo la modalità 0 (kernel mode) e 3 (user mode). Page 4

5 GDT Descriptor La prima entry della GDT viene generalmente settata con 8 bytes nulli (cioè uguali a 0) al fine di una corretta gestione dei page fault. La seconda e terza entry, in genere, sono riservati al code e data segment del kernel. Come ultimo aspetto riguardo la modalità protetta, vediamo invece come viene gestita la tabella degli interrupt. Il registro IDTR contiene l'indirizzo della tabella dei vettori di interrupt. In modalità reale questa tabella è costituita da vettori di 4 bytes per un numero massimo di 256 elementi, collocata all'indirizzo di memoria 0x0. In modalità protetta, ogni task può avere una sua tabella di interrupt. Gli elementi possono essere fino ad un massimo di 256 elementi, ed ognuno di essi è rappresentato da una struttura di 64 bit come riportato in Fig. 4. IDT Descriptor Analizziamo ora in dettaglio i campi di un Interrupt Descriptor. - SELECTOR: insieme ad OFFSET fornisce l'indirizzo logico dell'handler di interrupt. - OFFSET: insieme ad SELECTOR fornisce l'indirizzo logico dell'handler di interrupt. - Bit P: indica la presenza o meno dell'interrupt. - DPL: indica il livello di privilegio dell'interrupt. - Bit T: indica se si tratta di una trap (T=1) oppure di un interrupt (T=0). Quando si verifica un errore, la CPU in modo protetto lo comunica al sistema operativo generando una eccezione. Le eccezioni sono delle interruzioni che mandano in esecuzione i relativi interrupt. Pertanto, i primi 17 interrupt sono riservati al codice di sistema operativo. IDT[00] Errore di divisione IDT[01] Eccezione di debugging IDT[02] Non usato IDT[03] Breakpoint/Debugging IDT[04] Overflow IDT[05] Check limits IDT[06] Codice operativo non valido (istruzione sconosciuta) IDT[07] Coprocessore non disponibile IDT[08] Doppio difetto IDT[09] Superamento del segmento di coprocessore IDT[0A] TSS non valido IDT[0B] Segmento non presente IDT[0C] Eccezione di stack IDT[0D] Protezione generale Page 5

6 IDT[0E] Difetto di pagina IDT[0F] Non usato IDT[10] Errore di processore I rimanenti interrupt possono essere definiti dal sistemista o dall'applicativo. 3. Software di test Gli esempi riportati in questo articolo sono stati testati su una distribuzione Linux RedHat 8.0 dove è disponibile l'utility make, il compilatore gcc, l'assemblatore as ed il linker ld. 4. Boot process step 0: stampa di un messaggio di boot Questa sezione illustrerà come creare un floppy di boot che permette la stampa del messaggio "Hello World" all'avvio del computer. Quando un computer parte e da BIOS viene configurato il floppy come drive di boot, esso cerca di caricare il primo settore nella locazione 0:0x07C0. E' importante che questo settore al primo byte contenga già una istruzione eseguibile e che l'ultima word sia uguale a 0xAA55 (identificativo di un settore di boot). Quindi per stampare il messaggio di "Hello World" al boot basta utilizzare il servizio 0x0E dell'interrupt 0x10 che consente la stampa di un carattere (caricato nel registro AL) a video. In [4] è possibile trovare la specifica di tutte le routines di interrupt del BIOS più comuni..code16.text.global _start _start: movb $0x0E, %ah movb $'H', %al // stampa il carattere 'H' int 0x10 movb $'e', %al // stampa il carattere 'e' int 0x10... // stampa altri caratteri done: jmp done // loop infinito.org 510 boot_flag:.word 0xAA55 Il programma termina con un loop infinito, questo serve per evitare che la CPU esegua codice invalido. Si noti come i bytes finali 510 e 511 siano, rispettivamente, uguali a 0xAA e 0x55. Una volta scritto il programma in un file che chiameremo bootsect.s è possibile compilarlo attraverso i seguenti comandi. as -o bootsect.o bootsect.s ld -Ttext 0x0 -s oformat binary -o bootsect bootsect.o Il primo comando crea un object file partendo dal codice in assembler. Il secondo comando crea l'immagine di boot chiamata bootsect. L'opzione -Ttext 0x0 indica che 0x0 è l'indirizzo di partenza per i segmenti code, data e bss. L'opzione -oformat specifica il formato di output prodotto da ld. A questo punto per creare il dischetto di boot basta eseguire il seguente comando. dd if=bootsect of=/dev/fd0 bs=512 Spegniamo ora il computer e inseriamo il dischetto nel floppy driver (assicuriamoci che il BIOS sia configurato in modo tale da consentire il boot da dischetto). Durante lo startup della macchina ecco che per magia compare il messaggio "Hello World". Page 6

7 A questo punto per velocizzare il processo di sviluppo abbiamo bisogno di due cose, un sistema più rapido del reboot per testare il nostro codice e un Makefile. Il primo problema si risolve semplicemente scaricando da sourceforge (http://sourceforge.net/projects/bochs) il tool bochs che è un emulatore Intel open source. Vediamo, invece, come creare il nostro Makefile. Chi lavora in ambiente Unix sa che l'utility make viene utilizzata per la build automatizzata di progetti sotware. In pratica se la build di un programma richiede l'inserimento di molti comandi questa utility consente allo sviluppatore di definire semplici comandi con cui gestire lo sviluppo del proprio progetto. Il nostro Makefile dovrà fornire tre semplici comandi. make -> per una build completa del progetto make disk -> per creare l'immagine di boot make clean -> rimozione di tutti i file generati in fase di build Qui di seguito è riportato il Makefile utilizzato nel nostro progetto. AS=as LD=ls all: bootsect image bootsect: bootsect.o $(LD) -Ttext 0x0 -s oformat binary -o $< bootsect.o: bootsect.s $(AS) -o $< disk: image dd if=image of=/dev/fd0 bs=512 image: bootsect cat bootsect > image clean: rm bootsect rm image rm *.o Si provi ora a buildare il nostro software con i comandi di build nel seguente ordine: make clean make make disk 5. Boot Process step 1: copia del boot sector in 0x9000:0 Il primo passo del processo di boot è quello di spostare il boot sector dalla locazione 0x07C0:0 a 0x9000:0. Questo per evitare che, quando si caricherà il kernel nello step 7, questi vada a sovrascrivere il codice correntemente in esecuzione. I registri DS:SI punteranno alla cella iniziale dei dati sorgenti, cioè all'indirizzo 0:0x07C0. I registri ES:DI punteranno, invece, all'indirizzo iniziale del blocco destinazione che, nel nostro caso, sarà 0x9000:0. Per fare la copia si utilizzeranno le istruzioni assembler: CLD REP MOVSW con CLD si stabilisce che ad ogni word copiata il registro DI venga incrementato. REP indica che l'istruzione successiva deve Page 7

8 essere ripetuta per un numero di volte pari al contenuto del registro CX (che nel nostro caso conterrà 256 word= 512 bytes). MOVSW muove una word da DS:SI a ES:DI. Dopo questa operazione si fa un jump alla locazione 0x9000:go che conterrà l'istruzione successiva da eseguire nel boot sector. Qui di seguito riportiamo il codice che effettua la copia sopra citata. Per testare che la copia sia avvenuta con successo e che il jump non abbia generato problemi, stampiamo in questa nuova regione il messaggio "Hello World". BOOTSEG=0x07C0 INITSEG=0x9000.code16.text.global _start: _start: movw $BOOTSEG, %ax movw %ax, %ds # DS = 0x07C0 movw $INITSEG, %ax movw %ax, %es # ES = 0x9000 movw $256, %cx # CX = 256 subw %si, %si # SI = 0 subw %di, %di # DI = 0 cld rep movsw # copia boot sector ljmp $INITSEG, $go # jump a 0x9000:go go: <stampa Hello World come l'esempio precedente>.org 510 boot_flag:.word 0xAA55 Compiliamo il nostro programma e creiamo il disco di boot con i comandi make illustrati nello step precedente. 6. Boot Process step 2: definizione dello spazio per lo stack Negli steps che seguiranno, si effettueranno chiamate a procedure, per cui è importante definire uno spazio per lo stack settando opportunamente i registri SS e SP. Abbiamo visto che il boot sector occupa uno spazio compreso tra 0x9000:0 e 0x9000:0x01FF. A partire dall'indirizzo 0x9000:0x0200 nei prossimi steps caricheremo 4 settori (2048 bytes) che conterrano del codice di setup. Per cui la regione di memoria compresa tra 0x9000:0x0200 e 0x9000:0x09FF sarà riservato al codice di setup. Dopo questa regione definiamo la regione dello stack che si estenderà fino a 0x9000:(0x ). Il motivo per cui i primi 12 bytes non fanno parte dello stack è che questi nel vero codice di boot di Linux servono a contenere la Disk Parameter Table utilizzata per ottimizzare la lettura dei settori. L'unica cosa che per ora ci interessa sapere è che la regione stack parte dall'indirizzo 0x9000:(0x ) e si estende verso l'alto fino all'indirizzo 0x9000:0x0A00 (vedi Fig. 5). Page 8

9 Memory Layout Qui di seguito riportiamo il codice per il setting dell'area stack.... go: movw $0x , %di movw %ax, %ds movw %ax, %ss // SS = 0x9000 movw %di, %sp // SP = 0x <stampa Hello World come l'esempio precedente>.org 510 boot_flag:.word 0xAA55 7. Boot Process step 3: stop del motore del floppy In questo step introduciamo una procedura che ci consente di effettuare lo stop del motore del floppy dopo la lettura dei dati da disco. Questo ci consentirà di attivare il kernel in una situazione consistente dal punto di vista del floppy. In questa sezione non entreremo in dettaglio circa l'hardware del floppy, bensì vedremo solo le cose necessrie per i nostri scopi. Di solito i PC utilizzano il controller disco NEC mpd765. I PC AT possono includere anche il controller 82072A, mentre i PS/2 usano un Intel 82077A. Questo controller gestisce un certo numero di registri tra cui il Digital Output Register (DOR) che è un registro a 8 bits a sola scrittura, disponibile all'indirizzo 0x3F2, che si occupa della gestione dei motori dei vari floppy drives disponibili. Page 9

10 FDC Controller Register In Fig. 6 è possibile osservare il formato di questo registro. I bit DR1, DR0 selezionano il floppy driver a cui inviare il comando di stop del motore. La selezione del drive ha senso solo se il motore è attivo. Il bit REST quando è posto a 1 attiva il controller, mentre se vale 0 esegue il reset del controller. Quando si effettua lo start del motore di un floppy drive si può decidere di associare ad esso una linea di DMA con relativo canale IRQ. MOTA, MOTB, MOTC, MOTD controllano lo start/stop per i floppy drive A, B, C e D. Se il bit MOTx è 1, allora il motore del floppy drive x viene avviato, altrimenti viene spento. Visto che il nostro obiettivo è quello di spegnere il motore di tutti i floppy drive disponibili, allora bisogna scrivere il valore 0 nel registro DOR. out[0x3f2] = 0 Qui di seguito riportiamo il codice della routine chiamata kill_motor. kill_motor: movw $0x3f2, %dx xorb %al, %al outb %al, %dx # out[0x3f2] = 0.word 0x00eb, 0x00eb # breve delay ret questa routine verrà invocata nel nostro main program subito dopo la stampa del messaggio di "Hello World". 8. Boot Process step 4: caricamento del codice di setup Il codice di setup segue sul floppy di boot il bootsector, ed esso occupa 4 settori (2048 bytes) di disco. Quindi i settori 2-5 della traccia 0 contengono tale codice. Quest'ultimo deve essere caricato in memoria nel segmento 0x9000 subito dopo il boot sector, per cui a partire dall'offset 0x0200 (512 appunto). Per effettuare questa copia utilizzeremo il servizio 0x02 dell'interrupt 0x13 che consente di copiare n settori dalla locazione di disco (drive, head, track, sector) in memoria a partire dall'indirizzo puntato dai registri ES:BX. Una volta eseguita questa copia, per eseguirlo verrà effettuato un semplice jump alla locazione iniziale del codice di setup (0x9000:0x0200). Prima di effettuare la copia è necessario eseguire un reset del controller del floppy attraverso il servizio 0x00 dell'interrupt 0x13, come mostra il codice seguente. load_setup: xorb %ah, %ah # AH = 0 -> service 0x00 xorb %dl, %dl # DL = 0 -> drive 0 int $0x13 # reset FDC Dal codice si intuisce che il valore del servizio deve essere inserito nel registro AH, mentre il floppy drive da resettare va posto nel registro DL. Dopo questa semplice operazione avviene la vera e propria copia. Page 10

11 Il servizio 0x02 dell'interrupt 0x13 consente di copiare n settori di disco in memoria. Le specifiche di questo servizio sono le seguenti. DH = drive da cui vengono letti i dati (0 nel nostro caso) DL = testina da cui parte la copia (0 nel nostro caso) CH =traccia da cui parte la copia (0 nel nostro caso) CL = settore da cui parte la copia (2 nel nostro caso) ES:BX = indirizzo di memoria destinazione AH = numero servizio (0x02) AL = settori da copiare (4 nel nostro caso) La routine di interrupt ritorna un codice nel registro AX che rappresenta il risultato della copia. Questo valore è 0 se la copia è avvenuta con successo, altrimenti conterrà un opportuno codice di errore. Per semplicità in questo step faremo stampare a video la stringa "Error" se avviene un errore durante la copia, nel prossimo step vedremo come effettuare il dump del codice di errore. Memory Layout Qui di seguito riportiamo il codice assembler utilizzato per fare il loading del codice di setup. movb $0x02, %cl movw $0x0200, %bx movb $0x02, %ah movb $4, %al int $0x13 Page 11

12 jnc ok_load_setup stampa il messaggio Error jmp load_setup # riprova di nuovo ok_load_setup: stampa il messaggio Setup loaded call kill_motor done: jmp done La Fig. 7 mostra come appare la memoria dopo quest'ulima operazione di copia. 9. Boot Process step 5: routine di debug e stampa del messaggio Loading system Dopo aver caricato il codice di setup, stampiamo il messaggio Loading system utilizzando il servizio 0x13 dell'interrupt 0x10. Questo perchè quando verrà passato il controllo al codice di setup, questo inizializzerà alcune componenti di sistema e poi provvederà a caricare il kernel in memoria. Ricordiamo al lettore che nel nostro caso il kernel è una semplice routine C che stampa il messaggio "Hello Kernel". Il servizio 0x13 consente di stampare a video una intera stringa. Le specifiche di questo servizio sono le seguenti. CX= numero caratteri della stringa (compreso lo 0 finale) BH=pagina video (0 nel nostro caso) BL=attributi di stampa (7 nel nostro caso) ES:BP=indirizzo stringa DH=riga dove scrivere la stringa DL=colonna dove scrivere la stringa AH= numero servizio (0x03) Per avere in DH DL la posizione corrente del cursore, utilizzeremo il servizio 0x03 dell'interrupt 0x10. Qui riportiamo il nuovo codice da aggiungere al file bootsect.s subito dopo il codice di caricamento dei settori di setup. Ovviamente è ora possibile rimuovere il codice che stampava il messaggio Setup loaded!!. movb $0x03, %ah # ottieni la posizione del cursore in DH e DL xorb %bh, %bh # BH = 0 int $0x10 movw $17, %cx movw $0x0007, %bx movw $msg1, %bp movw $0x1301, %ax int $0x10... msg1:.byte # new line.ascii Loading system Aggiungiamo a questo punto al nostro codice due routine che potrebbero tornare utile in fase di debugging: print_all e print_hex. La prima stampa le prime 5 word al top dello stack che dovrebbero contenere: codice errore, AX, BX, CX e DX; Questa routine è utile per verificare il valore dei registri in un dato punto del codice o al termine di una routine di interrupt. La seconda routine stampa la word puntata da SS:BP in formato esadecimale. Evitiamo di riportare in tale sede il codice perchè l'introduzione di queste routine è facoltativa e necessita solo di conoscenze assembler. Il lettore potrà trovare il codice + nei files sorgenti relativi a questo step. Ora che abbiamo a disposizione queste routine di debugging anzichè stampare il messaggio Error come facevamo nello step 4, se il caricamento del codice di setup falliva, stampiamo il codice di errore in AX. Page 12

13 pushw %ax # stampa il codice di errore sul video call print_nl # stampa unanew line sul video movw %sp, %bp call print_hex # stampa AX sul video popw %ax jmp load_setup # riprova di nuovo 10. Boot Process step 6: jump al codice di setup In questo step introduciamo un nuovo file che chiameremo setup.s, esso conterrà il codice di setup del boot loader. Questo codice, come già anticipato sopra, dovrà occupare 4 settori (2048 bytes). Per ora nel file setup.s effettuiamo la stampa di un semplice messaggio "Wow I am in setup", mentre in bootsect.s dobbiamo effettuare un jump al codice di setup. Questo è il codice di setup.s..code16.text.global _start _start: stampa il messaggio Wow I am in setup done: jmp done.org 2048 # loop infinito # size 4 settori Nel file bootsect.s, invece, aggiungiamo subito dopo lo stop del floppy motor un jump all'indirizzo di inizio del setup code (0x9000:0x0200). ljmp $INITSEG, $0 E' necessario, a questo punto, modificare il Makefile in modo tale che venga buildato anche setup.s e che il relativo object file venga concatenato al boot sector nel file immagine. all: bootsect setup image... setup: setup.o $(LD) -Ttext 0x0 -s --oformat binary -o $< setup.o: setup.s $(AS) -o $< setup.s: setup.s $(CPP) -traditional $< -o La regola per creare il file immagine, invece, è la seguente. image: bootsect setup cat bootsect > image cat setup >> image Buildiamo il nostro nuovo codice, e avviamo il nostro dischetto di boot. Dovrebbero comparire i seguenti messaggi. Loading system Page 13

14 Wow I am in setup 11. Boot Process step 7: caricamento del kernel in memoria Prima di effettuare il jump al codice di setup, il codice di boot provvede a caricare il codice del kernel nella locazione 0x1000:0. La lettura avviene utilizzando sempre il servizio 0x02 dell'interrupt 0x10 che abbiamo già esaminato nello step 4. La lettura avviene una traccia per volta. Visto che il nostro dischetto di boot lavora prevalentemente con floppy da 1.44Mb, avremo che per ogni traccia leggeremo 18 settori (solo per la prima traccia leggeremo 13 settori, visto che il boot sector e i settori di setup sono già stati letti). E' importante ricordare, inoltre, che la lettura delle tracce avviene in questo modo. Per il drive 0, vengono lette prima le tracce 0 per entrambe le testine, poi la traccia 1 per entrambe le testine e così via, questo ovviamente serve a ridurre al minimo il movimento delle parti meccaniche. Per i floppy 1.44Mb abbiamo 2 traccie per testina, per cui la lettura delle tracce avviene nel seguente ordine: drive=0, testina=0, traccia=0 drive=0, testina=1, traccia=0 drive=0, testina=0, traccia=1 drive=0, testina=1, traccia=1 drive=0, testina=0, traccia=2 drive=0, testina=1, traccia=2... Come abbiamo più volte detto il nostro kernel è una semplice routine C che stampa il messaggio "Hello Kernel". Questo kernel non è altro che un file eseguibile a.out che chiameremo kernel la cui size è definita in bootsect.s attraverso la variabile SYSIZE. Questa variabile deve contenere la size del kernel in CLICKS (16 bytes). In pratica se la size del kernel è x, allora SYSIZE=(x+15)/16. Visto che read_it è una routine abbastanza complessa, riportiamo in questo articolo solo la versione in pseudo codice, rimandando il lettore ai listati sorgenti allegati all'articolo per i dettagli implementativi. head -> testina corrente track -> traccia corrente sread -> settore corrente check iniziali rp_read: se tutti i bytes del kernel sono stati letti dal disco, allora stop; altrimenti vai a ok1_read; ok1_read: es contiene il segmento che conterrà la copia della traccia corrente; bx contiene l'offset di memoria dove si inizierà a copiare; se bx non ha superato i limiti dei 64 Kb allora vai a ok2_read; è stato superato il limite di 64 Kb, per cui meno settori devono essere letti, per sapere quanti settori si dovrà leggere basta calcolare la distanza tra bx e la fine segmento e dividere per 512. ok2_read: leggi la traccia (o parte di essa) attraverso il servizio 0x02 dell'interrupt 0x13; se la traccia non è stata letta completamente vai a ok3_read; se per la testina n solo una traccia è stata letta allora vai a ok4_read; entrambe le tracce sono state lette per la testina n, Page 14

15 quindi head = 1 - n ok4_read: per la testina n entrambe le tracce sono state lette, quindi head = 1 -n track = track+1 ok3_read: update sread se non abbiamo superato i limiti di 64 kb allora vai a rp_read; sono stati superati i limiti di 64 Kb, per cui incrementa il registro ES e a BX assegna 0. salta a rp_read; Questa routine deve essere invocata nel main program prima dell'invocazione alla routine kill_motor. Abbiamo visto come la costante SYSIZE tiene traccia della size del kernel in CLICKS. E' chiaro che in fase di sviluppo la size del kernel varia in continuazione e ad ogni compilazione aggiornare questo valore potrebbe essere dispendioso. Per evitare ciò modifichiamo il Makefile in modo tale che questa venga calcolata a compile time in base alla size del kernel. Ecco la modifica suggerita: bootsect.o: bootsect.s (echo -n "SYSSIZE = ("; \ echo -n `ls -gg kernel cut -c16-24`; \ echo "+ 15 ) / 16") > tmp.s cat bootsect.s >> tmp.s mv tmp.s bootsect.s $(AS) -o $< Per avere un minimo di kernel, scriviamo un file main.c e dentro definiamo la routine start_kernel (entry point del kernel) che effettua un loop infinito. void start_kernel(void) { while(1) ; } Aggiorniamo il Makefile affinchè da questa semplice file C venga creato un file eseguibile (il nostro kernel). all: kernel bootsect setup image... kernel: main.o $(LD) -e stext -Ttext 0x1000 -s --oformat binary head.o \ main.o -o main.o: main.c $(CC) -Wall -O -fstrength-reduce -fomit-frame-pointer \ -c $< -o image: cat bootsect > image cat setup >> image Nel processo di build comparirà un messaggio di warning come il seguente: ld: warning: cannot find entry symbol stext; defaulting to per ora il lettore non si deve preoccupare di questo messaggio, negli step successivi, quando completeremo l'implementazione del kernel, questo messaggio non apparirà più. Page 15

16 12. Boot Process step 8: spostiamo il kernel all'indirizzo 0x0100:0 A questo punto del processo di boot il kernel viene copiato dall'indirizzo 0x1000:0 a 0x0100:0. A questo punto vi chiederete: ma perchè il kernel non è stato copiato direttamente lì? La risposta è semplice, se avessimo copiato il kernel direttamente all'indirizzo 0x0100:0 avremmo coperto tutte l'area BIOS e, quindi, anche le routine di interrupt, tra cui la 0x13, cosa che non ci avrebbe consentito più la lettura da disco. La prima cosa da fare in questo step è quello di disabilitare gli interrupt e NMI bootup, per evitare che da questo punto in poi avvenga un qualche tipo di interruzione. cli # no interrupts movb $0x80, %al # disabilita NMI bootup outb %al, $0x70 # out[0x80] = 0x70 A questo punto inizia la vera e propria fase di copia, dove DS:SI punta all'area sorgente, mentre ES:DI a quella di destinazione. La copia avviene a blocchi di 4Kb. do_move: movw %ax, %es # ES:DI = indirizzo destinazione addw $0x100, %ax cmpw $0x9000, %ax # if (AX == 0x9000) jump a end_move jz end_move movw %bx, %ds # DS:SI = indirizzo sorgente addw $0x100, %bx subw %di, %di subw %si, %si movw $0x800, %cx # copia 0x800 words (4096 bytes == 4Kb) rep movsw jmp do_move end_move:... Si osservi che questo codice copia il kernel fino a coprire l'area da 0x1000 a 0x90000 per un totale di 572 Kb che rappresenta anche la size max del nostro kernel. 13. Boot Process step 9: stampiamo un semplice messaggio di setup Per questo messaggio di setup usiamo il classico servizio 0x0E dell'interrupt 0x10. Stamperemo una stringa finchè non viene trovato il carattere null (0). Questo è il codice da aggiungere al nostro processo di boot. Questo step è opzionale. leaw msg, %si # DS:SI puntano a msg call prtstr # stampa il mesaggio ret prtstr: lodsb # carica il carattere da stampare da # DS:SI in AX andb %al,%al jz fin # stampa finchè AL non è 0 call prnt1 # stampa jmp prtstr fin: ret prnt1: pushw pushw %ax %cx Page 16

17 xorb %bh,%bh movw $0x01, %cx movb $0x0e, %ah int $0x10 popw %cx popw %ax ret... msg:.byte 13, 10.ascii "Setting up system".byte 0x0 14. Boot Process step 10: setting up global e interrupt descriptor tables La prima cosa da fare in questo step è quello di caricare in IDTR e GTDR i base address e le size delle tabelle IDT e GDT. Il seguente codice mostra come ciò viene fatto nel nostro codice. lidt idt_48 # base == 0, limit == 0 lgdt gdt_48 # limit == > 256 entries... idt_48:.word.word 0 0, 0 # idt limit = 0 # idt base = 0L gdt_48:.word 0x8000 # gdt limit=2048, 256 GDT entries.long gdt + SETUPSEG*0x10 Si osservi come la GDT sia stata definita con 256 entries e con base address pari all'indirizzo corrispondente alla label gdt del codice di setup (infatti SETUPSEG*0x10 è l'indirizzo assoluto dove inizia il codice di setup e gdt è la label da dove parte la definizione della tabella). gdt:.word 0, 0, 0, 0 # dummy.word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb).word 0 # base address = 0.word 0x9A00 # code read/exec.word 0x00CF # granularity = 4096, 386 # (+5th nibble of limit).word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb).word 0 # base address = 0.word 0x9200 # data read/write.word 0x00CF # granularity = 4096, 386 # (+5th nibble of limit) Cerchiamo di capire ora cosa significano questi valori. Dalla label gdt inizia la GDT che come abbiamo visto, contiene 256 entries. La prima entry generalmente è usata nella gestione dei page fault, per cui contiene, in genere, valori dummy. Da qui si spiega perchè le prime 4 word (primo descriptor) della GDT sono uguali a 0. Il secondo e terzo descriptor, in genere, descrivono il code e data segment del kernel. Il kernel code segment è definito attraverso il seguente descriptor..word 0xFFFF # size segment = 4Gb.word 0 # base address = 0.word 0x9A00 # code read/exec.word 0x00CF # granularity = 4096, 386 il quale dice che il code segment ha come base address 0x0, size 4Gb e accesso in read/exec. Page 17

18 Il kernel data segment, invece, è definito attraverso quest'altro descriptor..word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb).word 0 # base address = 0.word 0x9200 # data read/write.word 0x00CF # granularity = 4096, 386 # (+5th nibble of limit) Differisce dal precedente per il fatto che l'accesso è di tipo read/write. Si noti come entrambi le aree hanno base 0x0 e size pari a 4Gb. Questo ci semplificherà le cose, perchè tutti gli indirizzi a 32 bit che utilizzeremo, saranno indirizzi assoluti. Le restanti entries della GDT sono lasciati ai processi utenti, per cui non verranno al momento definiti. 15. Boot Process step 11: abilita linea A20 In origine il processore 8088 aveva 20 linee di indirizzamento, con cui poteva gestire uno space address di 1 Mb. Se un programma cercava di far riferimento ad un indirizzo maggiore di 1 Mb un wrap around veniva applicato. Con l'introduzione dei processori 286 le linee di indirizzamento furono portate a 24 dando così la possibilità di indirizzare fino a 16 Mb. Per mantenere la compatibilità verso i vecchi processori di default questi operavano con 20 linee di indirizzamento e la nuova modalità doveva opportunamente essere abilitata via software. Questa nuova funzionalità era ed è tuttora pilotabile attraverso il controller 8042 della testiera. Nell'abilitare la linea A20 è importante che la coda della tastiera non contenga dati da elaborare, a tale scopo viene utilizzata la routine empty_8042 che ritorna non appena tale coda è vuota. empty_8042: call delay # piccolo delay inb $0x64, %al # %al = in[0x64] testb $0x1, %al jz no_output # if (bit %al[0] == 0) jump no_output call delay # piccolo delay inb $0x60, %al # %al = in[0x60] jmp empty_8042 # jump a empty_8042 no_output: testb $2, %al # if (bit %al[1] == 1) jump a # empty_8042 jnz empty_8042 ret... delay:.word ret 0x00eb Si osservi come questo codice controlla che i 2 bits del registro di stato siano 0. Nel caso in cui il bit 0 non sia nullo (quindi ci sono dati in coda), questi vengono rimossi leggendo dalla porta 0x60 gli scan codes o i keybord data. A questo punto si può abilitare la linea A20 ricordandoci di assicurare che prima di ogni write command la 8042 queue sia vuota. call empty_8042 out[ 0x64 ] = 0xD1 # command: write to the output port call empty_8042 out[ 0x60 ] = 0xDF # bit 1 is set -> A20 enabled call empty_8042 Con il primo comando specifichiamo che effettueremo una scrittura sulla porta di output del controller. Con il secondo Page 18

19 comando, invece, abiliteremo la linea A20 impostando a 1 il bit 1 dell'output port. 16. Boot Process step 12: reset coprocessore Il reset del coprocessore si effettua semplicemente scrivendo 0 sulle porte di I/O 0xF0 e 0xF1 come riporta il codice seguente. # Reset coprocessor xorw %ax, %ax outb %al, $0xf0 # out[0xf0] = 0 call delay outb %al, $0xf1 # out[0xf1] = 0 call delay 17. Boot Process step 13: PIC programming Il compito del controller PIC 8259 è quello di notificare la CPU di eventi provenienti da dispositivi hardware attraverso delle linee chiamate IRQs. Quando un evento viene notificato al PIC, questi provvederà poi ad avvertire la CPU che attiverà l'opportuna routine di handling. Se durante il processamento di un evento arriva un altro evento, questi viene messo in coda. Nel caso di arrivo di due eventi contemporanei, essi vengono gestiti in base ad una priorità ben precisa. In un PC con processore i386 o superiore, troviamo due controller PIC 8259 collegati in cascata, ognuno che gestisce 8 linee IRQ (IRQ0-IRQ7), chiamati master e slave. Per comodità chiameremo IRQ0-IRQ7 le linee IRQ del controller master e IRQ8-IRQ15 quelle dello slave. La Fig. 8 mostra il collegamento tra i due controller PIC che avviene attraverso le linee IRQ2 e IRQ12. La seguente tabella illustra i dispositivi che generalmente sono collegati ai due controller. PIC 8259 Master IRQ0 System Timer IRQ1 Keyboard IRQ2 Collegamento al controller slave IRQ3 COM2/COM4 IRQ4 COM1/COM3 IRQ5 LPT2 IRQ6 FDC IRQ7 LPT1 PIC 8259 Slave IRQ8 Real Time Clock Chip IRQ9 Networking adapter IRQ10 Non usato IRQ11 Non usato IRQ12 Collegamento al controller master IRQ13 Floating Processor Unit IRQ14 HDC IRQ15 Non usato Chi ha configurato almeno una volta una scheda audio sa che spesso questa viene associata all' IRQ 5, questo perchè generalmente ad un PC non si collega una seconda stampante, per cui questa associazione non crea alcun conflitto. E' fondamentale, tuttavia, che due dispositivi hardware realmente collegati al PC non utilizzino la stessa linea IRQ, altrimenti si genera un conflitto che provocherà malfunzionamenti nel nostro sistema. La comunicazione tra la CPU ed i due controller avviene attraverso 4 porte I/O (2 per ogni PIC). Page 19

20 PIC 8259 Master-Slave Le porte sono la 0x20 e 0x21 per il controller master, e la 0xA0 e 0xA1 per il controller slave. Il PIC accetta due tipi di comandi: Initialization Command Words (ICW); Operation Command Words (OCW). I comandi sono 7 e vengono spediti uno in coda all'altro seguendo l'ordine numerico. Comando ICW1 (porta 0x20 o 0xA0) Bits _ 1: comando ICW4 verrà inviato; 1: master; 0: slave; 1: dim. vettori interrupt è 8; 0: dim. vettori intr. è 4; 1: level triggered (PS/2); 0: edge triggered; 1: comando ICW1; Comando ICW2 (porta 0x21 o 0xA1) Bits specifica il vettore di interrupt per ogni IRQ partendo da IRQ0. Ad esempio, se questo valore è 0x20, allora IRQ0 -> 0x20, IRQ1 -> 0x21 e così via. Comando ICW3 (porta 0x21 o 0xA1) Bits 0-7. Indica a quale IRQ è collegato il canale slave sul canale master e viceversa. Su architetture AT i due controller sono Page 20

MODBUS-RTU per. Specifiche protocollo di comunicazione MODBUS-RTU per controllo in rete dispositivi serie. Expert NANO 2ZN

MODBUS-RTU per. Specifiche protocollo di comunicazione MODBUS-RTU per controllo in rete dispositivi serie. Expert NANO 2ZN per Expert NANO 2ZN Specifiche protocollo di comunicazione MODBUS-RTU per controllo in rete dispositivi serie Expert NANO 2ZN Nome documento: MODBUS-RTU_NANO_2ZN_01-12_ITA Software installato: NANO_2ZN.hex

Dettagli

Programmare in assembly in GNU/Linux con sintassi AT&T

Programmare in assembly in GNU/Linux con sintassi AT&T Programmare in assembly in GNU/Linux con sintassi AT&T Fulvio Ferroni fulvioferroni@teletu.it 2011.08.05 Questo documento intende dare le basi essenziali per la programmazione assembly in ambiente GNU/Linux

Dettagli

Informatica Applicata

Informatica Applicata Ing. Irina Trubitsyna Concetti Introduttivi Programma del corso Obiettivi: Il corso di illustra i principi fondamentali della programmazione con riferimento al linguaggio C. In particolare privilegia gli

Dettagli

PD32. Esercitazione sull interfacciamento con un dispositivo di IO

PD32. Esercitazione sull interfacciamento con un dispositivo di IO PD32 Esercitazione sull interfacciamento con un dispositivo di IO Domanda #5 14/09/2000 Si dispone di un PD32 per effettuare il collaudo di un circuito integrato combinatorio con 5 ingressi e una uscita,

Dettagli

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. "Generate debugging information"

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. Generate debugging information FASE DEBUGGING: Prima della compilazione, si devono inserire 1 nel progetto informazioni per il debug cioè si devono visualizzare le opzioni di progetto seguendo il percorso: controllando che la voce Genera

Dettagli

Il Concetto di Processo

Il Concetto di Processo Processi e Thread Il Concetto di Processo Il processo è un programma in esecuzione. È l unità di esecuzione all interno del S.O. Solitamente, l esecuzione di un processo è sequenziale (le istruzioni vengono

Dettagli

Integrated Development Environment (IDE) DevC++ 4.9.9.2

Integrated Development Environment (IDE) DevC++ 4.9.9.2 Integrated Development Environment (IDE) DevC++ 4.9.9.2 Manuale utente Data ultima revisione: 22/10/2008 Fondamenti di informatica Università Facoltà Corso di laurea Politecnico di Bari 1 a Facoltà di

Dettagli

INSTALLAZIONE E UTILIZZO DEL COMPILATORE Code::Blocks 8.02

INSTALLAZIONE E UTILIZZO DEL COMPILATORE Code::Blocks 8.02 INSTALLAZIONE E UTILIZZO DEL COMPILATORE Code::Blocks 8.02 Download Si può scaricare gratuitamente la versione per il proprio sistema operativo (Windows, MacOS, Linux) dal sito: http://www.codeblocks.org

Dettagli

Inter Process Communication. Laboratorio Software 2008-2009 C. Brandolese

Inter Process Communication. Laboratorio Software 2008-2009 C. Brandolese Inter Process Communication Laboratorio Software 2008-2009 C. Brandolese Introduzione Più processi o thread Concorrono alla relaizzazione di una funzione applicativa Devono poter realizzare Sincronizzazione

Dettagli

Background (sfondo): Finestra: Una finestra serve a mostrare il contenuto di un disco o di una cartella -, chiamata anche directory.

Background (sfondo): Finestra: Una finestra serve a mostrare il contenuto di un disco o di una cartella -, chiamata anche directory. @ PC (Personal computer): Questa sigla identificò il primo personal IBM del 1981 a cura di R.Mangini Archiviazione: Il sistema operativo si occupa di archiviare i file. Background (sfondo): Cursore: Nei

Dettagli

Architetture CISC e RISC

Architetture CISC e RISC FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Facoltà di Ingegneria Università degli Studi di Udine Architetture CISC e RISC 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n.

Dettagli

Ambienti di sviluppo integrato

Ambienti di sviluppo integrato Ambienti di sviluppo integrato Un ambiente di sviluppo integrato (IDE - Integrated Development Environment) è un ambiente software che assiste i programmatori nello sviluppo di programmi Esso è normalmente

Dettagli

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI mumolo@units.it

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI mumolo@units.it Introduzione ai Device Drivers in Linux E.Mumolo, DEEI mumolo@units.it 1 Device Drivers Moduli software che gestiscono le periferiche attraverso il file system Tutte le periferiche sono viste come file

Dettagli

Architettura degli Elaboratori. Lez. 8 : Il Livello di Sistema Operativo

Architettura degli Elaboratori. Lez. 8 : Il Livello di Sistema Operativo Corso di Laurea Triennale in Informatica Università degli Studi di Bari Aldo Moro Anno Accademico 2012-2013 Lez. 8 : Il Livello di Sistema Operativo Sebastiano Pizzutilo Strutturazione del Sistema Operativo

Dettagli

Cos'é Code::Blocks? Come Creare un progetto Come eseguire un programma Risoluzione problemi istallazione Code::Blocks Che cos è il Debug e come si usa

Cos'é Code::Blocks? Come Creare un progetto Come eseguire un programma Risoluzione problemi istallazione Code::Blocks Che cos è il Debug e come si usa di Ilaria Lorenzo e Alessandra Palma Cos'é Code::Blocks? Come Creare un progetto Come eseguire un programma Risoluzione problemi istallazione Code::Blocks Che cos è il Debug e come si usa Code::Blocks

Dettagli

Cicli in Visual Basic for Application. For contatore = inizio To fine istruzioni Next contatore

Cicli in Visual Basic for Application. For contatore = inizio To fine istruzioni Next contatore Cicli in Visual Basic for Application Le strutture del programma che ripetono l'esecuzione di una o più istruzioni sono chiamate Cicli. Alcune strutture per i cicli sono costruite in modo da venire eseguite

Dettagli

Comandi filtro: sed. Se non si specificano azioni, sed stampa sullo standard output le linee in input, lasciandole inalterate.

Comandi filtro: sed. Se non si specificano azioni, sed stampa sullo standard output le linee in input, lasciandole inalterate. Comandi filtro: sed Il nome del comando sed sta per Stream EDitor e la sua funzione è quella di permettere di editare il testo passato da un comando ad un altro in una pipeline. Ciò è molto utile perché

Dettagli

Lezione n.19 Processori RISC e CISC

Lezione n.19 Processori RISC e CISC Lezione n.19 Processori RISC e CISC 1 Processori RISC e Superscalari Motivazioni che hanno portato alla realizzazione di queste architetture Sommario: Confronto tra le architetture CISC e RISC Prestazioni

Dettagli

> MULTI TASKING > MULTI PROCESS > MULTI CORE

> MULTI TASKING > MULTI PROCESS > MULTI CORE > MULTI TASKING > MULTI PROCESS > MULTI CORE WorkNC V21 multicore 64 bits : Benefici di WorkNC Aumento generale della produttività, grazie alle nuove tecnologie multi-core, 64 bit e Windows 7 Calcolo di

Dettagli

Arduino: Programmazione

Arduino: Programmazione Programmazione formalmente ispirata al linguaggio C da cui deriva. I programmi in ARDUINO sono chiamati Sketch. Un programma è una serie di istruzioni che vengono lette dall alto verso il basso e convertite

Dettagli

Universita' di Ferrara Dipartimento di Matematica e Informatica. Algoritmi e Strutture Dati. Rappresentazione concreta di insiemi e Hash table

Universita' di Ferrara Dipartimento di Matematica e Informatica. Algoritmi e Strutture Dati. Rappresentazione concreta di insiemi e Hash table Universita' di Ferrara Dipartimento di Matematica e Informatica Algoritmi e Strutture Dati Rappresentazione concreta di insiemi e Hash table Copyright 2006-2015 by Claudio Salati. Lez. 9a 1 Rappresentazione

Dettagli

Progettazione di sistemi Embedded

Progettazione di sistemi Embedded Progettazione di sistemi Embedded Corso introduttivo di progettazione di sistemi embedded A.S. 2013/2014 proff. Nicola Masarone e Stefano Salvatori Eccetto dove diversamente specificato, i contenuti di

Dettagli

Virtualizzazione e installazione Linux

Virtualizzazione e installazione Linux Virtualizzazione e installazione Linux Federico De Meo, Davide Quaglia, Simone Bronuzzi Lo scopo di questa esercitazione è quello di introdurre il concetto di virtualizzazione, di creare un ambiente virtuale

Dettagli

MIPS Instruction Set 2

MIPS Instruction Set 2 Laboratorio di Architettura 15 aprile 2011 1 Architettura Mips 2 Chiamata a Funzione 3 Esercitazione Registri MIPS reference card: http://refcards.com/docs/waetzigj/mips/mipsref.pdf 32 registri general

Dettagli

1. Si consideri uno spazio di indirizzamento logico di otto pagine di 1024 parole ognuna, mappate su una memoria fisica di 32 frame.

1. Si consideri uno spazio di indirizzamento logico di otto pagine di 1024 parole ognuna, mappate su una memoria fisica di 32 frame. 1. Si consideri uno spazio di indirizzamento logico di otto pagine di 1024 parole ognuna, mappate su una memoria fisica di 32 frame. (a) Da quanti bit è costituito l indirizzo logico? (b) Da quanti bit

Dettagli

UBUNTU SERVER. Installazione e configurazione di Ubuntu Server. M. Cesa 1

UBUNTU SERVER. Installazione e configurazione di Ubuntu Server. M. Cesa 1 UBUNTU SERVER Installazione e configurazione di Ubuntu Server M. Cesa 1 Ubuntu Server Scaricare la versione deisiderata dalla pagina ufficiale http://www.ubuntu.com/getubuntu/download-server Selezioniare

Dettagli

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni Funzioni Le funzioni Con il termine funzione si intende, in generale, un operatore che, applicato a un insieme di operandi, consente di calcolare un risultato, come avviene anche per una funzione matematica

Dettagli

Le funzioni di shell La bash supporta la programmazione procedurale e prevede la possibilità di definire funzioni utilizzando le sintassi

Le funzioni di shell La bash supporta la programmazione procedurale e prevede la possibilità di definire funzioni utilizzando le sintassi Le funzioni di shell La bash supporta la programmazione procedurale e prevede la possibilità di definire funzioni utilizzando le sintassi alternative: function nome { lista-comandi } oppure nome ( ) {

Dettagli

Perché se ho 4 GiB di RAM ne vedo di meno?

Perché se ho 4 GiB di RAM ne vedo di meno? Perché se ho 4 GiB di ne vedo di meno? di Matteo Italia (matteo@mitalia.net) Abstract In questo articolo mi propongo di spiegare perché utilizzando un sistema operativo a 32 bit su una macchina x86 con

Dettagli

Flops. Ad esempio nel caso del prodotto classico tra matrici, vengono eseguite 2*N 3 operazioni, quindi ad esempio:

Flops. Ad esempio nel caso del prodotto classico tra matrici, vengono eseguite 2*N 3 operazioni, quindi ad esempio: Flops FLOPS e' un'abbreviazione di Floating Point Operations Per Second e indica il numero di operazioni in virgola mobile eseguite in un secondo dalla CPU. (Top500 e il BlueGene) Ad esempio nel caso del

Dettagli

Controllare un nastro trasportatore fischertechnik con Arduino

Controllare un nastro trasportatore fischertechnik con Arduino TITOLO ESPERIENZA: Controllare un nastro trasportatore fischertechnik con Arduino PRODOTTI UTILIZZATI: OBIETTIVO: AUTORE: RINGRAZIAMENTI: Interfacciare e controllare un modello di nastro trasportatore

Dettagli

Appunti di Sistemi Operativi. Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo

Appunti di Sistemi Operativi. Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo Appunti di Sistemi Operativi Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo Indice 1 Cenni su alcuni algoritmi del Kernel di Unix 1 1.1 Elementi di Unix Internals.................................

Dettagli

INTRODUZIONE, LINGUAGGIO, HANDS ON. Giuseppe Cirillo g.cirillo@unina.it

INTRODUZIONE, LINGUAGGIO, HANDS ON. Giuseppe Cirillo g.cirillo@unina.it INTRODUZIONE, LINGUAGGIO, HANDS ON Giuseppe Cirillo g.cirillo@unina.it Il linguaggio C 1972-Dennis Ritchie 1978-Definizione 1990-ANSI C 1966 Martin Richars (MIT) Semplificando CPL usato per sviluppare

Dettagli

Architettura MIPS (RISC) Architetture dei Calcolatori (Lettere. Principi di Progettazione ISA MIPS MIPS R3000 ISA. Il Set di Istruzioni MIPS

Architettura MIPS (RISC) Architetture dei Calcolatori (Lettere. Principi di Progettazione ISA MIPS MIPS R3000 ISA. Il Set di Istruzioni MIPS Architettura MIPS (RISC) Architetture dei Calcolatori (Lettere A-I) Il Set di Istruzioni MIPS Ing.. Francesco Lo Presti Sviluppata e progettata a Stanford (USA) Progettata nei primi anni 80 Prodotta e

Dettagli

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine

Dettagli

Bus di sistema. Bus di sistema

Bus di sistema. Bus di sistema Bus di sistema Permette la comunicazione (scambio di dati) tra i diversi dispositivi che costituiscono il calcolatore E costituito da un insieme di fili metallici che danno luogo ad un collegamento aperto

Dettagli

Corso di Fondamenti di Informatica

Corso di Fondamenti di Informatica Corso di Fondamenti di Informatica L uso delle funzioni in C++ Claudio De Stefano - Corso di Fondamenti di Informatica 1 Funzioni Nel C++ è possibile scomporre problemi complessi in moduli più semplici

Dettagli

Creare una pen drive bottabile con Zeroshell oppure installarlo su hard disk. by Gassi Vito info@gassielettronica.com

Creare una pen drive bottabile con Zeroshell oppure installarlo su hard disk. by Gassi Vito info@gassielettronica.com Creare una pen drive bottabile con Zeroshell oppure installarlo su hard disk by Gassi Vito info@gassielettronica.com Questa breve guida pratica ci consentirà installare Zeroshell su pen drive o schede

Dettagli

Calc è il programma per la gestione di fogli di calcolo della suite OpenOffice.org.

Calc è il programma per la gestione di fogli di calcolo della suite OpenOffice.org. Calc è il programma per la gestione di fogli di calcolo della suite OpenOffice.org. Nuovo documento Anteprima di stampa Annulla Galleria Apri Controllo ortografico Ripristina Sorgente dati Salva Controllo

Dettagli

Programmazione di un dispositivo 1to4INTGEN

Programmazione di un dispositivo 1to4INTGEN Programmazione di un dispositivo 1to4INTGEN Realizzazione di un sistema timesharing Materiale didattico a cura di: Prof. A. Mazzeo Ing. L. Romano Ing. L. Coppolino Ing. A. Cilardo Dipartimento di Informatica

Dettagli

Installazione LINUX 10.0

Installazione LINUX 10.0 Installazione LINUX 10.0 1 Principali passi Prima di iniziare con l'installazione è necessario entrare nel menu di configurazione del PC (F2 durante lo start-up) e selezionare nel menu di set-up il boot

Dettagli

How to Develop Accessible Linux Applications

How to Develop Accessible Linux Applications How to Develop Accessible Linux Applications Sharon Snider Copyright 2002 IBM Corporation v1.1, 2002-05-03 Diario delle Revisioni Revisione v1.1 2002-05-03 Revisionato da: sds Convertito in DocBook XML

Dettagli

APPLICAZIONI SU PIU FILE

APPLICAZIONI SU PIU FILE APPLICAZIONI SU PIU FILE Serve poter sviluppare applicazioni su piú file: - alcune funzioni e alcune definizioni di dati in un file - altre funzioni e dati in file diversi Perché?? 1. Se il programma è

Dettagli

Boot Camp Guida di installazione e configurazione

Boot Camp Guida di installazione e configurazione Boot Camp Guida di installazione e configurazione Indice 3 Introduzione 4 Panoramica dell'installazione 4 Passo 1: Verificare la presenza di aggiornamenti 4 Passo 2: Per preparare il Mac per Windows 4

Dettagli

I Metacaratteri della Shell Unix

I Metacaratteri della Shell Unix I Metacaratteri della Shell Unix La shell Unix riconosce alcuni caratteri speciali, chiamati metacaratteri, che possono comparire nei comandi. Quando l utente invia un comando, la shell lo scandisce alla

Dettagli

Progetti reali con ARDUINO

Progetti reali con ARDUINO Progetti reali con ARDUINO Introduzione alla scheda Arduino (parte 2ª) ver. Classe 3BN (elettronica) marzo 22 Giorgio Carpignano I.I.S. Primo LEVI - TORINO Il menù per oggi Lettura dei pulsanti Comunicazione

Dettagli

Boot Camp Guida all installazione e alla configurazione

Boot Camp Guida all installazione e alla configurazione Boot Camp Guida all installazione e alla configurazione Indice 4 Introduzione 5 Cosa ti occorre 6 Panoramica dell installazione 6 Passo 1: verifica la presenza di aggiornamenti. 6 Passo 2: apri Assistente

Dettagli

Architettura dei Calcolatori

Architettura dei Calcolatori Architettura dei Calcolatori Sistema di memoria parte prima Ing. dell Automazione A.A. 2011/12 Gabriele Cecchetti Sistema di memoria parte prima Sommario: Banco di registri Generalità sulla memoria Tecnologie

Dettagli

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO... Modulo A Programmiamo in Pascal Unità didattiche 1. Installiamo il Dev-Pascal 2. Il programma e le variabili 3. Input dei dati 4. Utilizziamo gli operatori matematici e commentiamo il codice COSA IMPAREREMO...

Dettagli

CRYPTSETUP RAPIDO. man cryptsetup

CRYPTSETUP RAPIDO. man cryptsetup CRYPTSETUP RAPIDO La presente guida non vuole essere completa, si tratta solo della somma degli appunti utilizzati per creare e gestire una zona cifrata ove salvare i documenti. La distribuzione di riferimento

Dettagli

Lezione 1. 1 All inizio di ogni capitolo vengono indicati gli obiettivi della lezione sotto forma di domande la cui risposta è lo scopo

Lezione 1. 1 All inizio di ogni capitolo vengono indicati gli obiettivi della lezione sotto forma di domande la cui risposta è lo scopo Lezione 1 Obiettivi della lezione: 1 Cos è un calcolatore? Cosa c è dentro un calcolatore? Come funziona un calcolatore? Quanti tipi di calcolatori esistono? Il calcolatore nella accezione più generale

Dettagli

Inizializzazione degli Host. BOOTP e DHCP

Inizializzazione degli Host. BOOTP e DHCP BOOTP e DHCP a.a. 2002/03 Prof. Vincenzo Auletta auletta@dia.unisa.it http://www.dia.unisa.it/~auletta/ Università degli studi di Salerno Laurea e Diploma in Informatica 1 Inizializzazione degli Host Un

Dettagli

Introduzione. Esempio 1. Soluzione: SPOSTA_1.BAT

Introduzione. Esempio 1. Soluzione: SPOSTA_1.BAT Introduzione Un file batch è un file di testo di tipo ASCII che contiene una sequenza di comandi DOS. I file batch devono avere estensione.bat I comandi DOS all interno dei programmi batch sono eseguiti

Dettagli

MANUALE UTENTE DEL SOFTWARE DI GESTIONE DEGLI ART. SDVR040A/SDVR080A/SDVR160A

MANUALE UTENTE DEL SOFTWARE DI GESTIONE DEGLI ART. SDVR040A/SDVR080A/SDVR160A MANUALE UTENTE DEL SOFTWARE DI GESTIONE DEGLI ART. SDVR040A/SDVR080A/SDVR160A Leggere attentamente questo manuale prima dell utilizzo e conservarlo per consultazioni future Via Don Arrigoni, 5 24020 Rovetta

Dettagli

MANUALE DOS INTRODUZIONE

MANUALE DOS INTRODUZIONE MANUALE DOS INTRODUZIONE Il DOS è il vecchio sistema operativo, che fino a qualche anno fa era il più diffuso sui PC, prima dell avvento di Windows 95 e successori. Le caratteristiche principali di questo

Dettagli

Setup e installazione

Setup e installazione Setup e installazione 2 Prima di muovere i primi passi con Blender e avventurarci nel vasto mondo della computer grafica, dobbiamo assicurarci di disporre di due cose: un computer e Blender. 6 Capitolo

Dettagli

Guida rapida all uso di ECM Titanium

Guida rapida all uso di ECM Titanium Guida rapida all uso di ECM Titanium Introduzione Questa guida contiene una spiegazione semplificata del funzionamento del software per Chiputilizzare al meglio il Tuning ECM Titanium ed include tutte

Dettagli

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto LEZIONE

Dettagli

Editor vi. Editor vi

Editor vi. Editor vi Editor vi vi 1 Editor vi Il vi è l editor di testo standard per UNIX, è presente in tutte le versioni base e funziona con qualsiasi terminale a caratteri Permette di visualizzare una schermata alla volta

Dettagli

Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment

Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment Bloodshed Dev-C++ Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio IDE = Integrated Development Environment Gerardo Pelosi 01 Ottobre 2014 Pagina 1 di 8 Dev-C++ - Installazione Potete

Dettagli

Funzioni. Corso di Fondamenti di Informatica

Funzioni. Corso di Fondamenti di Informatica Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Funzioni Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti e dei

Dettagli

Guida al ripristino e alla risoluzione dei problemi. Creare i dischi di ripristino subito dopo l'impostazione.

Guida al ripristino e alla risoluzione dei problemi. Creare i dischi di ripristino subito dopo l'impostazione. Guida al ripristino e alla risoluzione dei problemi Creare i dischi di ripristino subito dopo l'impostazione. Indice Trovare le informazioni necessarie... 3 Ripristino e backup... 4 Cos'è il ripristino

Dettagli

VIRTUALIZE IT. www.digibyte.it - digibyte@digibyte.it

VIRTUALIZE IT. www.digibyte.it - digibyte@digibyte.it il server? virtualizzalo!! Se ti stai domandando: ma cosa stanno dicendo? ancora non sai che la virtualizzazione è una tecnologia software, oggi ormai consolidata, che sta progressivamente modificando

Dettagli

Introduzione al linguaggio C Gli array

Introduzione al linguaggio C Gli array Introduzione al linguaggio C Gli array Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome

Dettagli

SubnetMask: come funzionano e come si calcolano le sottoreti (SpySystem.it)

SubnetMask: come funzionano e come si calcolano le sottoreti (SpySystem.it) SubnetMask: come funzionano e come si calcolano le sottoreti (SpySystem.it) In una rete TCP/IP, se un computer (A) deve inoltrare una richiesta ad un altro computer (B) attraverso la rete locale, lo dovrà

Dettagli

Gestione dei File in C

Gestione dei File in C Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania mpalesi@diit.unict.it http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte

Dettagli

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1 Dipartimento di Sistemi e Informatica Università degli Studi di Firenze Dev-C++ Ing. Michele Banci 27/03/2007 1 Utilizzare Dev-C++ Tutti i programmi che seranno realizzati richiedono progetti separati

Dettagli

Test di comunicazione tra due LOGO! 0BA7: Master - Master

Test di comunicazione tra due LOGO! 0BA7: Master - Master Industry Test di comunicazione tra due LOGO! 0BA7: Master - Master Dispositivi utilizzati: - 2 LOGO! 0BA7 (6ED1 052-1MD00-0AB7) - Scalance X-208 LOGO! 0BA7 Client IP: 192.168.0.1 LOGO! 0BA7 Server IP:

Dettagli

Zeroshell su vmware ESXi 4.1

Zeroshell su vmware ESXi 4.1 Zeroshell su vmware ESXi 4.1 Introduzione Vediamo come installare Zeroshell su Vmware ESXi 4.1 usando come immagine quella per IDE,SATA e USB da 1GB. Cosa ci serve prima di iniziare: Una distro Live io

Dettagli

WAN 80.80.80.80 / 24. L obiettivo è quello di mappare due server web interni (porta 80) associandoli agli indirizzi IP Pubblici forniti dall ISP.

WAN 80.80.80.80 / 24. L obiettivo è quello di mappare due server web interni (porta 80) associandoli agli indirizzi IP Pubblici forniti dall ISP. Configurazione di indirizzi IP statici multipli Per mappare gli indirizzi IP pubblici, associandoli a Server interni, è possibile sfruttare due differenti metodi: 1. uso della funzione di Address Translation

Dettagli

Descrizioni VHDL Behavioral

Descrizioni VHDL Behavioral 1 Descrizioni VHDL Behavioral In questo capitolo vedremo come la struttura di un sistema digitale è descritto in VHDL utilizzando descrizioni di tipo comportamentale. Outline: process wait statements,

Dettagli

Indice generale. Modulo 1 Algebra 2

Indice generale. Modulo 1 Algebra 2 Indice generale Modulo 1 Algebra 2 Capitolo 1 Scomposizione in fattori. Equazioni di grado superiore al primo 1.1 La scomposizione in fattori 2 1.2 Raccoglimento a fattor comune 3 1.3 Raccoglimenti successivi

Dettagli

I file di dati. Unità didattica D1 1

I file di dati. Unità didattica D1 1 I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità

Dettagli

FIRESHOP.NET. Gestione Utility & Configurazioni. Rev. 2014.3.1 www.firesoft.it

FIRESHOP.NET. Gestione Utility & Configurazioni. Rev. 2014.3.1 www.firesoft.it FIRESHOP.NET Gestione Utility & Configurazioni Rev. 2014.3.1 www.firesoft.it Sommario SOMMARIO Introduzione... 4 Impostare i dati della propria azienda... 5 Aggiornare il programma... 6 Controllare l integrità

Dettagli

Concetto di Funzione e Procedura METODI in Java

Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile

Dettagli

Lezione 15 File System

Lezione 15 File System Lezione 15 File System Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2014/2015 Dipartimento di Scienze Fisiche, Informatiche e Matematiche Università di Modena e Reggio Emilia http://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi

Dettagli

Import Dati Release 4.0

Import Dati Release 4.0 Piattaforma Applicativa Gestionale Import Dati Release 4.0 COPYRIGHT 2000-2005 by ZUCCHETTI S.p.A. Tutti i diritti sono riservati.questa pubblicazione contiene informazioni protette da copyright. Nessuna

Dettagli

APRS su Linux con Xastir, installazione dai sorgenti

APRS su Linux con Xastir, installazione dai sorgenti APRS su Linux con Xastir Installazione dai sorgenti L installazione di Xastir Per installare Xastir non è richiesto essere un guru di Linux, anche se una conoscenza minima della piattaforma è necessaria.

Dettagli

DEFT Zero Guida Rapida

DEFT Zero Guida Rapida DEFT Zero Guida Rapida Indice Indice... 1 Premessa... 1 Modalità di avvio... 1 1) GUI mode, RAM preload... 2 2) GUI mode... 2 3) Text mode... 2 Modalità di mount dei dispositivi... 3 Mount di dispositivi

Dettagli

Uso del computer e gestione dei file

Uso del computer e gestione dei file 1 di 1 Uso del computer e gestione dei file Argomenti trattati: Sistema operativo Microsoft Windows: interfaccia grafica e suoi elementi di base Avvio e chiusura di Windows Le FINESTRE e la loro gestione:

Dettagli

CIRCUITI INTEGRATI ESEMPI: INTEL

CIRCUITI INTEGRATI ESEMPI: INTEL CIRCUITI INTEGRATI Costruzione di circuiti (logici e non) su un substrato di silicio. Non solo la parte attiva, ma anche le connessioni tra le porte. Incredibile miglioramento nelle prestazioni, nell affidabilità

Dettagli

Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN)

Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN) Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN) System Overview di Mattia Bargellini 1 CAPITOLO 1 1.1 Introduzione Il seguente progetto intende estendere

Dettagli

Routing (instradamento) in Internet. Internet globalmente consiste di Sistemi Autonomi (AS) interconnessi:

Routing (instradamento) in Internet. Internet globalmente consiste di Sistemi Autonomi (AS) interconnessi: Routing (instradamento) in Internet Internet globalmente consiste di Sistemi Autonomi (AS) interconnessi: Stub AS: istituzione piccola Multihomed AS: grande istituzione (nessun ( transito Transit AS: provider

Dettagli

Marco Giorgi. Palazzo di Giustizia di Torino 30 marzo 2012

Marco Giorgi. Palazzo di Giustizia di Torino 30 marzo 2012 Marco Giorgi Palazzo di Giustizia di Torino 30 marzo 2012 Post mortem (Dopo lo spegnimento del sistema) Si smonta il dispositivo e lo si collega ad un PC dedicato all'acquisizione Live forensics (Direttamente

Dettagli

Inter-Process Communication

Inter-Process Communication Inter-Process Communication C. Baroglio a.a. 2002-2003 1 Introduzione In Unix i processi possono essere sincronizzati utilizzando strutture dati speciali, appartenti al pacchetto IPC (inter-process communication).

Dettagli

I μ-controllori ARM: la logica RISC

I μ-controllori ARM: la logica RISC I μ-controllori ARM: la logica RISC I μ-controllori ARM (ARM è l acronimo di Advanced RISC Machines Ltd) sono molto interessanti perché basati su di una architettura di funzionamento diversa da quella

Dettagli

Nuovo metodo per l'installazione delle stampanti su Windows

Nuovo metodo per l'installazione delle stampanti su Windows Nuovo metodo per l'installazione delle stampanti su Windows Questo documento illustra come installare una stampante in ambiente Windows con un nuovo metodo. Il vecchio metodo, principalmente consigliato

Dettagli

---------------------------------------------------------------- Puntatori a funzione. In C è possibile utilizzare dei puntatori a funzioni, ovvero

---------------------------------------------------------------- Puntatori a funzione. In C è possibile utilizzare dei puntatori a funzioni, ovvero ---------------------------------------------------------------- Puntatori a funzione. In C è possibile utilizzare dei puntatori a funzioni, ovvero delle variabili a cui possono essere assegnati gli indirizzi

Dettagli

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1) Strutture Strutture e Unioni DD cap.10 pp.379-391, 405-406 KP cap. 9 pp.361-379 Strutture Collezioni di variabili correlate (aggregati) sotto un unico nome Possono contenere variabili con diversi nomi

Dettagli

Configuration Managment Configurare EC2 su AWS. Tutorial. Configuration Managment. Configurare il servizio EC2 su AWS. Pagina 1

Configuration Managment Configurare EC2 su AWS. Tutorial. Configuration Managment. Configurare il servizio EC2 su AWS. Pagina 1 Tutorial Configuration Managment Configurare il servizio EC2 su AWS Pagina 1 Sommario 1. INTRODUZIONE... 3 2. PROGRAMMI NECESSARI... 4 3. PANNELLO DI CONTROLLO... 5 4. CONFIGURARE E LANCIARE UN ISTANZA...

Dettagli

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1 DIAGRAMMI A BLOCCHI TEORIA ED ESERCIZI 1 1 Il linguaggio dei diagrammi a blocchi è un possibile formalismo per la descrizione di algoritmi Il diagramma a blocchi, o flowchart, è una rappresentazione grafica

Dettagli

CALCOLATORI ELETTRONICI 29 giugno 2010

CALCOLATORI ELETTRONICI 29 giugno 2010 CALCOLATORI ELETTRONICI 29 giugno 2010 NOME: COGNOME: MATR: Scrivere chiaramente in caratteri maiuscoli a stampa 1. Si disegni lo schema di un flip-flop master-slave S-R sensibile ai fronti di salita e

Dettagli

GUIDA alla configurazione di un DVR o Router su dyndns.it. in modalità compatibile www.dyndns.org

GUIDA alla configurazione di un DVR o Router su dyndns.it. in modalità compatibile www.dyndns.org GUIDA alla configurazione di un DVR o Router su dyndns.it in modalità compatibile www.dyndns.org Questa semplice guida fornisce le informazioni necessarie per eseguire la registrazione del proprio DVR

Dettagli

Introduzione alle applicazioni di rete

Introduzione alle applicazioni di rete Introduzione alle applicazioni di rete Definizioni base Modelli client-server e peer-to-peer Socket API Scelta del tipo di servizio Indirizzamento dei processi Identificazione di un servizio Concorrenza

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 009-10 prof. Viviana Bono Blocco 9 Metodi statici: passaggio parametri, variabili locali, record

Dettagli

Installare e configurare Easy Peasy (Ubuntu Eee) su Asus Eee PC mini howto

Installare e configurare Easy Peasy (Ubuntu Eee) su Asus Eee PC mini howto Installare e configurare Easy Peasy (Ubuntu Eee) su Asus Eee PC mini howto Augusto Scatolini (webmaster@comunecampagnano.it) Ver. 1.0 (marzo 2009) ultimo aggiornamento aprile 2009 Easy Peasy è una distribuzione

Dettagli

Cross Software ltd Malta Pro.Sy.T Srl. Il gestionale come l'avete sempre sognato... Pag. 1

Cross Software ltd Malta Pro.Sy.T Srl. Il gestionale come l'avete sempre sognato... Pag. 1 Il gestionale come l'avete sempre sognato... Pag. 1 Le funzionalità di X-Cross La sofisticata tecnologia di CrossModel, oltre a permettere di lavorare in Internet come nel proprio ufficio e ad avere una

Dettagli

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Lezione 1 Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Definizione di utente e di programmatore L utente è qualsiasi persona che usa il computer anche se non è in grado di programmarlo

Dettagli