2010-04-12 9 views
5

Quindi stavo pensando alle lingue l'altro giorno, e mi ha colpito il fatto che qualsiasi programma scritto in un linguaggio compilato che interagisca con Internet sia poi tradotto in assembly che deve interagire con Internet. Ho appena iniziato a imparare un po 'di assembly x86 per aiutarmi a capire meglio il C++, e sono sconcertato da come qualcosa di così basso livello possa fare qualcosa come accedere a Internet.In che modo il linguaggio assembly interagisce con qualcosa come Internet?

Sono sicuro che la risposta completa a questa domanda è molto più di una risposta SO, ma qualcuno potrebbe darmi un sommario di base?

+4

Ecco una domanda simile. http://stackoverflow.com/questions/1837582/how-to-write-to-read-from-network-card-in-x86-assembly Oltre a ciò, è necessario ricordare che "l'accesso a Internet" è solo l'invio di dati formattati in messaggi TCP/IP su un filo a un altro computer. È stata una specie di epifania anche per me quando ho capito che non c'era nulla di magico in questo. –

+2

Tutta la rete funziona su 1 e 0, o meglio, l'intera Internet è il prodotto di un incredibile numero di snippet di codice macchina che interagiscono. Trovo che sia probabilmente più sorprendente. :) – deceze

risposta

12

I programmi di spazio utente che "interagiscono con Internet", in tutti i sistemi moderni, lo fanno immettendo system calls nel sistema operativo sottostante, che fornisce l'API per uno stack TCP/IP.

il sistema chiama in questione (ad esempio socket, listen, accept, e così via) sono tipicamente documentati a livello C, ma in ogni particolare implementazione OS si tradurranno in codice macchina, naturalmente. Ma se i valori vanno in particolari registri, o posizioni in memoria puntate da registri particolari, ecc., È piuttosto secondario e totalmente specifico per il sistema.

Se vi state chiedendo come il codice macchina (probabilmente anche compilato da C) nei driver del kernel e del dispositivo "interagisce con Internet" (in risposta alle chiamate di sistema), lo fa sia costruendo e mantenendo strutture di dati di memoria per tracciare lo stato di varie cose e interagendo con l'hardware sottostante (ad esempio tramite interrupt, porte I/O, aree di dispositivi mappati in memoria o qualsiasi altra architettura particolare) - proprio come interagisce con (diciamo) un display video o un dispositivo a disco.

+1

sì ... è difficile immaginare un così piccolo programma in modalità utente che faccia cose così complesse, ma in realtà sta solo facendo una chiamata ad una libreria che è stata scritta in qualcosa di più alto livello (C/C++) che è poi tradotto dal compilatore in un BUNCH di codice assembly, che, ad un livello veramente basso, invia un gruppo di HIGH-HIGH da 5 volt e LOW da 0 volt attraverso un cavo ethernet all'altro capo del mondo ... (se capisco correttamente) – Adam

+1

Benché tecnicamente gli impulsi Ethernet fisici arrivano solo al router. Il router è quindi responsabile della ritrasmissione per conto dell'utente al router successivo e il router successivo è responsabile della ritrasmissione, ecc. Ecc. –

2

Dipende. Quando leggi di uno script web scritto in C, in realtà è un programma CGI. CGI è un protocollo, non una lingua. CGI specifica di inserire "GET", "POST", ecc. In REQUEST_METHOD, "foo = bar? Baz = 42" in QUERY_STRING, inserire i dati in stdin, ecc. Per accedere a questi, il programma CGI utilizza le chiamate di sistema. Il server Web utilizza CGI per comunicare con uno script Web. Un programma che comunica su Internet da solo può utilizzare l'API dei socket di sistema.

In sintesi, il sistema operativo esegue tutte le comunicazioni. Il programma fa solo le giuste chiamate di sistema.

Se ti chiedi come il sistema operativo comunica su Internet, la risposta è che il kernel del sistema operativo utilizza un driver per interfacciarsi con la scheda di rete su una porta IO, IO mappato in memoria, ecc. Il sistema operativo e la scheda di rete implementare gli standard del protocollo Internet affinché tutto funzioni insieme.

0

Quello che devi fare è cercare alcuni di questi progetti di server web PIC. Alcuni di questi sono server Web scritti in assembly e in esecuzione su hardware a 8 bit. Vi darà un'idea chiara di come qualcosa di basso livello come assemblaggio possa essere usato per interagire con il resto del mondo attraverso Internet.

Si tratta fondamentalmente

  1. Scrivendo alcuni driver di basso livello (livello 2) per interfacciarsi con l'hardware di rete - questo può essere tramite Ethernet o anche modem (con SLIP).
  2. Scrivere i livelli successivi - IP e TCP - per elaborare i pacchetti TCP/IP. Questo richiederà un po 'di magia di assemblaggio poiché questi processi sono abbastanza coinvolti.
  3. Scrivi il livello dell'applicazione, che si tratti di un server Web o client o altro, che sfrutta i livelli sottostanti.

Spero che questo chiarisca alcuni dubbi.

0

È ragionevole dire che ad un certo punto indipendentemente dal programma, il codice viene trasformato (per mancanza del termine appropriato) in una qualche forma di linguaggio di "assemblaggio" (penso che ce ne sia più di uno) che poi ha un rapporto "uno a uno" con il codice macchina? Non sono sicuro di come .NET e ILASM/Java e il relativo bytecode corrispondente si adattino a questo, ma ho pensato che tutto a un certo punto si sarebbe trasformato in assembly e quindi in codice macchina.

Problemi correlati