2010-04-12 10 views
5

Así que estaba pensando en idiomas el otro día, y me sorprendió que cualquier programa escrito en un lenguaje compilado que interactúa con Internet se traduce a un ensamblado que tiene que interactuar con Internet. Acabo de comenzar a aprender un poco de ensamblado x86 para ayudarme a entender C++ un poco mejor, y estoy desconcertado por cómo algo de tan bajo nivel podría hacer algo como acceder a Internet.¿Cómo interactúa el lenguaje de ensamblaje con algo como Internet?

Estoy seguro de que la respuesta completa a esta pregunta es mucho más de lo que cabría en una respuesta SO, pero ¿podría alguien darme un resumen básico?

+4

Aquí hay una pregunta similar. http://stackoverflow.com/questions/1837582/how-towrwr-to-read-from-network-card-in-x86-assembly Más allá de eso, debe recordar que "acceder a Internet" simplemente está enviando datos formateados en mensajes TCP/IP a través de un cable a otra computadora. También fue una especie de epifanía para mí cuando me di cuenta de que no había nada mágico en eso. –

+2

Las carreras de Internet enteras en 1 y 0, o más bien, todo el Internet es el producto de un increíble número de fragmentos de código máquina que interactúan. Encuentro que podría decirse que es más sorprendente. :) – deceze

Respuesta

12

Los programas de espacio de usuario que "interactúan con Internet", en todos los sistemas modernos, lo hacen al emitir system calls al sistema operativo subyacente, que suministra la API para una pila TCP/IP.

Las llamadas al sistema en cuestión (como socket, listen, accept, y así sucesivamente) están normalmente documentadas en un nivel C, pero en cada aplicación específica del sistema operativo que se traducirán en código máquina, por supuesto. Pero si los valores van en particular los registros, o las ubicaciones en la memoria apuntadas por registros particulares, etc., es bastante menor y totalmente específico del sistema.

Si se está preguntando cómo el código de máquina (probablemente también compilado de C) en el núcleo y los controladores de dispositivo "interactúa con Internet" (en respuesta a las llamadas al sistema), lo hace construyendo y manteniendo estructuras de datos de memoria para rastrear el estado de varias cosas, e interactuando con el hardware subyacente (por ejemplo, a través de interrupciones, puertos de E/S, áreas de dispositivos mapeados en la memoria o cualquier otra arquitectura en particular), al igual que interactúa con (por ejemplo) una pantalla de video o un dispositivo de disco.

+1

sí ... es difícil imaginar un programa en modo usuario tan pequeño haciendo cosas complejas como esa, pero en realidad es solo hacer una llamada a una biblioteca que estaba escrita en algo de nivel superior (C/C++) que es entonces traducido por el compilador en un BUNCH de código ensamblador, que, en un nivel muy bajo, envía un montón de ALTOS de 5 voltios y BAJOS de 0 voltios a través de un cable de ethernet al otro lado del mundo ... (si entiendo correctamente) – Adam

+1

Bien técnicamente, los pulsos físicos de Ethernet solo llegan hasta su enrutador. El enrutador es luego responsable de retransmitirlos en su nombre al siguiente enrutador, y el siguiente enrutador es responsable de retransmitirlos, etc., etc. –

2

Depende. Cuando lee sobre un script web escrito en C, en realidad es un programa CGI. CGI es un protocolo, no un lenguaje. CGI especifica poner "GET", "POST", etc. en REQUEST_METHOD, "foo = bar? Baz = 42" en QUERY_STRING, publicar datos en stdin, etc. Para acceder a ellos, el programa CGI usa llamadas al sistema. El servidor web usa CGI para comunicarse con un script web. Un programa que se comunica a través de Internet puede usar la API de sockets del sistema.

En resumen, el sistema operativo no se comunica por completo. El programa solo hace las llamadas al sistema correctas.

Si se pregunta cómo se comunica el sistema operativo a través de Internet, la respuesta es que el núcleo del sistema operativo utiliza un controlador para interactuar con la tarjeta de red a través de un puerto IO, IO asignado a memoria, etc. El sistema operativo y la tarjeta de red implementar estándares de Protocolo de Internet para que todo funcione en conjunto.

0

Lo que necesita hacer es buscar algunos de esos proyectos de servidor web de PIC. Algunos de ellos son servidores web escritos en ensamblaje y ejecutados en hardware de 8 bits. Le dará una idea clara de cómo algo tan de bajo nivel como el ensamblaje se puede utilizar para interactuar con el resto del mundo a través de Internet.

Básicamente consiste en

  1. Escribiendo algunos controladores de bajo nivel (capa 2) para interactuar con el hardware de red - esto puede ser a través de Ethernet o incluso módems (con deslizamiento).
  2. Escriba las capas siguientes - IP y TCP - para procesar los paquetes TCP/IP. Esto necesitará algo de magia de ensamblaje ya que estos procesos son bastante complicados.
  3. Escriba la capa de aplicación, ya sea un servidor web o cliente o lo que sea, que explota las capas subyacentes.

Hope this despeja algunas dudas.

0

Es razonable decir que en algún momento, independientemente del programa, el código se transforma (por falta del término adecuado) en algún tipo de lenguaje de "ensamblaje" (creo que hay más de uno) que luego tiene un relación "uno a uno" con el código de máquina? No estoy seguro de cómo .NET y ILASM/Java y su bytecode correspondiente encajan en esto, pero pensé que todo en algún momento se convertiría en ensamblado y luego en código de máquina.

Cuestiones relacionadas