2009-03-30 10 views
14

Dove in un computer l'abstract (lettere sullo schermo) incontra il reale (corrente elettrica che passa attraverso i circuiti nella memoria e nei processori). Come è avvenuta questa evoluzione?Dove e in che modo il software incontra l'hardware?

Sto parlando più a fondo dell'assemblatore qui, penso. Forse un livello più profondo delle istruzioni del processore? Ad un certo punto i comandi sono in realtà interpretati dall'hardware, ma non capisco dove/come ciò accade.

Non sono andato all'università, quindi non ho frequentato un corso CS o altro. Come molti, sono un hobbista diventato "professionista". Di conseguenza, ci sono molti pezzi del puzzle che penso mi manchi. Conosco un po 'di C++ e capisco il concetto di puntatori, ecc. (Anche se non li ho usati molto per la rabbia), tuttavia ho sempre lavorato a un livello elevato. Non sono sicuro che conoscere questo genere di cose mi aiuterà o no, ma è sicuramente interessante.

+5

Fidati di me, un corso di CS probabilmente non sarebbe d'aiuto in queste cose. :( –

+2

La maggior parte dei gradi CS ha un documento di architettura che copre le basi di questa roba – ConcernedOfTunbridgeWells

+0

http://en.wikipedia.org/wiki/Integrated_circuit – vartec

risposta

11

Un processore esegue il cosiddetto ciclo fetch-decode-execute. Le istruzioni del codice macchina sono abbastanza di basso livello (cioè non fanno molto di più in una singola istruzione).Ad esempio, l'aggiunta di due numeri avrebbe una sequenza di istruzioni con semantica come:

  • Carica un puntatore all'indirizzo dell'operando 1 nel registro 1
  • Caricare il valore memorizzato all'indirizzo memorizzato nel registro 1 nel registro 2
  • Carica un puntatore all'indirizzo dell'operando 2 nel registro 1
  • Caricare il valore memorizzato all'indirizzo nel registro 1 nel registro 3
  • Aggiungere il contenuto del registro 2 e registrare 3 e memorizzarlo nel registro 4
  • Caricare un puntatore alla destinazione nel registro 1
  • Conservare il contenuto del registro 4 nell'indirizzo specificate nel registro 1

All'interno del processore è un insieme particolare di memoria veloce noto come 'di registri' , che contiene la memoria utilizzata dal processore per memorizzare i dati su cui sta lavorando al momento. Il file di registro ha diversi registri, che sono identificati in modo univoco. Le istruzioni in genere funzionano sui registri, in particolare sulle architetture RISC; mentre questo non è sempre il caso è un'astrazione abbastanza buona per il momento.

In genere un processore deve caricare o archiviare dati in un registro per fare qualsiasi cosa con esso. Operazioni come il lavoro aritmetico sui registri, prendendo gli operandi da due registri e inserendo il risultato in un terzo (a beneficio della galleria di arachidi, I hanno un valore di utilizzato un 6502: non si può confondere il problema ;-). Il processore ha istruzioni speciali per il caricamento o la memorizzazione dei dati dai registri nella memoria principale della macchina.

Un processore ha un registro speciale chiamato "contatore di programma" che memorizza l'indirizzo della prossima operazione da eseguire. Pertanto, la sequenza per l'esecuzione di un'istruzione equivale approssimativamente a:

  • Scarica l'istruzione memorizzata nell'indirizzo corrente nel contatore del programma.
  • Decodifica l'istruzione, separando l'operazione effettiva, ciò che registra utilizza, la "modalità di indirizzamento" (come funziona dove ottenere o memorizzare i dati) e alcuni altri bit e bob.
  • Eseguire l'istruzione.

L'esecuzione dell'istruzione cambierà i valori in vari registri. Ad esempio, un'istruzione 'carica' copierà un valore in un registro. Un aritmetico o logico (And, Or, Xor) prenderà due valori e calcolerà un terzo. Un'istruzione di salto o salto cambierà l'indirizzo sul contatore del programma in modo che il processore inizi a recuperare le istruzioni da una posizione diversa.

Il processore può disporre di registri speciali. Un esempio di tale è il contatore del programma sopra descritto. Un altro tipico è un registro delle condizioni. Questo avrà diversi bit con significati speciali. Ad esempio può avere un flag che viene impostato se il risultato dell'ultima operazione aritmetica è zero. Questo è utile per le operazioni condizionali. È possibile confrontare due numeri. Se sono uguali, viene impostato il flag 'zero'. Il processore può avere un'istruzione condizionale che viene eseguita solo se questo flag è impostato.

In questo caso, è possibile decrementare un contatore in un registro e se era zero, viene impostato un flag di condizione. Un condizionale (ramo su zero) può essere utilizzato per un ciclo in cui si decrementa un contatore e si esce dal ciclo se il risultato dell'istruzione di decremento è zero. Su alcuni processori (ad es.la famiglia ARM) tutte le istruzioni sono condizionali, con una speciale condizione "fai sempre" per istruzioni non condizionali.

Alcuni esempi di istruzioni tipici processore sono:

  • incrementare o decrementare un registro
  • carico o memorizzare il contenuto di un registro nella memoria. È inoltre possibile avere l'indirizzo per caricare o memorizzare l'offset in base al contenuto di un altro registro. Ciò consente di eseguire facilmente il loop su una matrice di dati incrementando l'altro registro.
  • Aggiungere, sottrarre, moltiplicare, operazioni logiche per calcolare i valori. Questi prendono gli operandi da due registri e inseriscono il risultato in un terzo.
  • Passare a un'altra posizione: sposta il contenuto della posizione nel contatore del programma e inizia a recuperare le istruzioni dalla nuova posizione.
  • Spingere o inserire i valori su una pila.

This stackoverflow post presenta un esempio di un piccolo frammento di codice C compilato e l'uscita linguaggio assembly da quel frammento. Dovrebbe darti un esempio del tipo di relazione tra un linguaggio di alto livello e l'output del codice macchina che esso compila.

Il modo migliore per imparare questo è ottenere un assemblatore e provarlo. Questo era molto più semplice su computer più vecchi e semplici come i micros a 8 bit degli anni '80. La cosa più vicina a questo tipo di architettura disponibile in questi giorni sono i sistemi incorporati. È possibile ottenere una scheda di sviluppo per un processore embedded come un PIC Microchip abbastanza a buon mercato. Dato che questo tipo di architettura ha meno bagagli di un moderno sistema operativo, ci sono meno i-tracing e t-crossing per usare le chiamate di sistema. Ciò renderà più semplice il bootstrap di un programma in linguaggio assembly su questo tipo di architettura; anche l'architettura più semplice è più facile da capire.

Un'altra opzione è ottenere un emulatore come SPIM. Questo emulerà una CPU e ti consentirà di assemblare ed eseguire programmi su di essa. Il vantaggio di un simile emulatore è che avranno anche funzionalità per singoli programmi stepping (molto simili a un debugger) e mostreranno il contenuto del file di registro. Questo può essere utile per ottenere informazioni su cosa sta realmente accadendo.

+2

Ma come viene interpretato il codice macchina dalla CPU? In pratica sono ancora caratteri uniti per formare una parola chiave, sì? –

+0

No, il linguaggio assembly è compilato (da un assemblatore come MASM) in un codice binario chiamato codice macchina Quando la macchina legge un'istruzione, la separa per capire cosa fare con esso. – ConcernedOfTunbridgeWells

0

Il codice macchina, credo, è di basso livello come si può. È compreso direttamente dal processore ed eseguito senza un interprete. Il processore è costruito con un certo insieme di istruzioni che definiscono il codice macchina per una determinata architettura (x86, PPC, ARM, ecc.).

Tutto da lettere di disegno sullo schermo per calcolare il pi è, al suo livello più basso, eseguito in codice macchina. Disegnare lettere sullo schermo è solo questione di creare del codice macchina che calcola l'altezza delle lettere, il colore e le posizioni dei pixel e li stampa su uno schermo usando un dispositivo di uscita video.

+0

No. Vedi la risposta di mxyfc: il microcodice va al di sotto di questo. complicato nelle architetture moderne ... –

3

C'è in realtà un altro livello sotto il linguaggio macchina che ho scoperto di recente da un amico. Si chiama Microcode.

Si veda questo articolo di Wikipedia per i dettagli: http://en.wikipedia.org/wiki/Microcode

0

Stai diventando sbagliato.

Tutto il computer non, sia mostrando le lettere sullo schermo o fare qualche calcolo, può essere visualizzato in diversi (tanti) livelli di astrazione, dalla corrente elettrica alla manipolazione di concetti astratti come il denaro su un conto bancario.

Detto questo, costruire il circuito per un semplice microprocessore non è così difficile, un ALU, alcuni registri e qualche logica di controllo. Altera ha questo tutorial avanzato per la scheda di avvio Cyclone II, ma non riesco a trovarlo sul web.

0

Bene, se si sa come il processore accede alla memoria, si conosce già la risposta. La memoria e altri componenti hardware sono accessibili (quasi) allo stesso modo, a seconda che il processore utilizzi "IO mappato in memoria" o "IO mappato IO". Nel primo caso, il processore prova solo a leggere e scrivere su un indirizzo di memoria - ma non c'è memoria lì - invece è un altro dispositivo hardware, ma il processore in realtà non può dire la differenza. Quest'ultimo caso è molto simile.

D'altra parte, se non si ha idea di come il processore acceda alla memoria, si dovrebbe cercare cosa sia un "bus di indirizzo" e un "bus di dati" per iniziare.

1

Bene, il punto in cui si incontra l'hardware dipende da cosa si sta facendo, ovviamente.Ma per prendere il vostro (eccellente) esempio di "visualizzazione del testo":

dall'astratto al hardware:

  • utente digita le lettere nel suo word processor (wp)
  • software wp primi negozi le lettere in memoria come parte del documento che si sta modificando
  • il software wp indica quindi alla libreria dell'interfaccia utente che utilizza di voler visualizzare il testo che viene modificato in una finestra (ciò accade continuamente, ovviamente). La libreria dell'interfaccia utente sarà dipendente dal sistema (l'API di Windows su MS Windows, X Windows o QT ecc. Su Linux, AWT/Swing su Java, ecc.)
  • La libreria dell'interfaccia utente passerà i dati attraverso altri livelli di astrazione. In particolare, eseguirà la rasterizzazione (converti le informazioni "mostra una A" nella griglia di pixel che rappresenta una A)
  • Infine, le informazioni verranno passate al driver di periferica della scheda grafica. Qui è dove incontriamo l'hardware "reale" :-). Normalmente, la scheda grafica espone la "memoria video", cioè la memoria sulla scheda su cui la CPU può scrivere. Il driver della scheda grafica (che gira sulla CPU) scriverà i pixel per una memoria da A a video.
  • I circuiti della scheda grafica leggeranno la memoria video e convertiranno i dati in un segnale video che esce dal connettore video sulla scheda e sul monitor.
  • Il monitor visualizzerà quello che appare come un spera Un :-)
+0

"il software wp memorizza prima le lettere in memoria", come il secondo passo? Penso che tu sia sorley errato Tra le lettere 'tipi di utente' e 'il software wp memorizza le lettere in memoria' come 'la tastiera invia segnali di interrupt alla CPU'. –

+0

Il primo passo dovrebbe essere "l'utente preme il tasto sulla tastiera" - la pressione di un tasto passa dall'hardware (kb) all'hardware (schermo/memoria/disco). –

+0

Inoltre, perché la femanina dell'utente? sembra molto il sessismo per me. –

-1

Questo non è facile rispondere in una sola frase. Leggi un libro sull'architettura del computer, impara un po 'di assemblaggio e sono certo che capirai come questo accadrà.

5

Suggerisco molto di leggere il libro Code, fornisce una cronologia dettagliata di come il computer si è evoluto da sistemi diversi.

È molto coinvolgente e ti spiegherà come le cose si sono evolute dal codice morse a una semplice macchina addizionatrice e poi a qualche assemblaggio. Dovrebbe darti una descrizione di come esattamente le istruzioni della macchina sono interpretate e utilizzate dall'hardware di una CPU, memoria, ecc.

1

Questa spiegazione potrebbe non essere troppo accademica ma questo è il modo in cui la capisco (non è andata a università)

Il primo passo riguarda l'algebra Boole che ha dimostrato nel 19 ° secolo che qualsiasi operazione matematica può essere espressa utilizzando una serie di simboli e alcuni operatori associati. Quindi l'aritmetica di base 10 con gli operatori comuni di +, -, *,/può essere espressa usando solo due simboli (0, 1/vero, falso) e operatori logici (AND, OR ecc.) Che portano alla logica booleana che è la basi matematiche del calcolo digitale.

Il secondo passo è il lavoro di Alan Turing che ha costruito un modello matematico di una macchina immaginaria in grado di elaborare i simboli. L'ingenua descrizione di una macchina di Turing sarebbe un qualsiasi automa che ha memoria (per memorizzare il suo stato), opera su una serie di simboli che rappresentano il suo stato e interpreta un'altra serie di simboli che definiscono la transizione da uno stato all'altro.

Il moderno processore digitale è un'implementazione di una macchina di Turing che utilizza l'algebra logica di Boole come simbolo e base operativa (dai un'occhiata a How Stuff Works detailed explanation of Boole's logic at work). La ragione di ciò è che gli stati logico vero/falso possono essere facilmente mappati a segnali elettrici (+, -) ed i loro operatori associati possono essere implementati in circuiti a transistor che a fronte di un ingresso binario (segnale elettrico) possono emettere il risultato secondo il operatori booleani.Quindi qualsiasi computer moderno è una macchina che ha memoria per memorizzare il suo stato (codificato in forma binaria elettrica/magnetica) e una serie di circuiti che accettano impulsi elettrici e operatori (le istruzioni del processore) e risultati di uscita ad una velocità molto elevata.

Così ogni programma scritto in qualsiasi linguaggio di programmazione è infine tradotto dal compilatore o runtime in una serie di operazioni booleane per il processore per eseguire

3

lascia supporre che il più reale è corrente e tensione (se si va più in profondità , potresti scoprire che anche un elettrone è un'astrazione). Il primo passo dell'astrazione è considerare che una tensione di + 5V rappresenta un bit impostato su '1' e una tensione di 0V rappresenta un bit impostato su '0'. Con un interruttore, puoi decidere il valore del filo.

Con un secondo filo e un secondo interruttore, si ottengono due valori binari. La cosa più interessante da fare è combinare i loro valori binari con operazioni come AND, OR e NOT. Qui sono coinvolti due concetti: transistor per il reale e logic per l'astrazione. Con questo, puoi eseguire addizione, sottrazione e molte altre operazioni sui tuoi due input binari. Puoi aggiungere più cavi per rappresentare valori diversi da "0" e "1". Andando in questo modo, si ottiene un ALU.

Ora è il momento di includere il tempo. Se vuoi ottenere diversi risultati dalla tua ALU, devi fornire i dati di input uno alla volta, quindi hai bisogno di un orologio e un'unità di controllo per le operazioni di sequenziamento. È inoltre necessaria memoria per la memorizzazione di valori e risultati di input e dispositivi di input e output per il comando e l'osservazione. Andando in questo modo, si ottiene un Von Neuman Architecture, che è la base di quasi tutte le architetture dei computer.

Il prossimo livello di astrazione si ha quando si decide, con l'elettronica appropriata, che questo particolare bit in memoria stimolerà quel particolare pixel del display LCD.

2

La premessa della tua domanda non è corretto. Non c'è divisione. Il software viene inserito e salvato elettronicamente. È solo che il software ti viene mostrato in un linguaggio simile all'inglese, così che gli umani possano seguirlo facilmente.

Quindi, ad esempio, quando si inserisce "Cambia schermo del mio desktop in verde", tramite tastiera, sta funzionando direttamente su metallo elettronicamente (leggi come tastiera/mouse/touchscreen) funziona. È solo che lo vedi come testo inglese sul tuo schermo. Fai un passo avanti, il testo che inserisci è in linguaggio di alto livello, viene convertito in codice macchina in modo che la CPU possa eseguire la logica su di esso. Anche il codice macchina è in formato elettronico. Ad esempio, il testo verrà convertito in opcode, ecc, ma gli opcode sono in formato elettronico e la CPU può elaborarli.

La linea di fondo è che tutto all'interno del computer è in formato elettronico dal momento in cui viene inserito. È sul tuo hard disk o memoria (transistor, ecc.). È solo che lo vedi in testo sullo schermo.

Ancora una volta, non c'è divisione. Il software salvato in memoria (transistor ecc.) O l'hard disk è già lì elettronicamente. L'hardware (hard logic - gates) è necessario per eseguire il software (cosa vuoi che l'hardware faccia con il tuo software). NON è possibile inserire nulla nel computer in forma non elettronica.

Spero che abbia senso.

+0

Non sono sicuro di essere "errato". Fondamentalmente ho risposto alla mia domanda leggendo il libro "CODICE" di Charles Petzold. :) –

-1

Quando entriamo qualsiasi tasto o dare qualsiasi comando poi piccole onde elettriche è diventato a causa premendo chiave è in realtà abbiamo completare il circuito

0

Ecco il vero affare. Il mio punto di partenza Tutto richiede energia per operare. L'accensione/spegnimento è definito entro un limite. per esempio se tra 3 e 5 v è acceso se meno di 3 volt è spento. Un concetto di codice morse. Sto lavorando su un termometro, quindi ho bisogno di creare o acquistare un sensore. Quindi ho bisogno di calibrarlo. Tradurre i segnali dal segnale nessun segnale o forza del segnale ad una temperatura. Questo è dove sono ora.

Problemi correlati