Как язык ассемблера взаимодействует с чем-то вроде Интернета? - PullRequest
5 голосов
/ 12 апреля 2010

Итак, я думал о языках на днях, и меня поразило, что любая программа, написанная на скомпилированном языке, который взаимодействует с Интернетом, затем переводится в сборку, которая должна взаимодействовать с Интернетом. Я только начал изучать сборку x86, чтобы помочь мне немного лучше понять C ++, и я сбит с толку тем, как что-то такое низкоуровневое может сделать что-то вроде доступа в Интернет.

Я уверен, что полный ответ на этот вопрос намного больше, чем вписывается в SO-ответ, но может кто-нибудь дать мне, может быть, базовое резюме?

Ответы [ 4 ]

12 голосов
/ 12 апреля 2010

Программы пользовательского пространства, которые «взаимодействуют с Интернетом» во всех современных системах, делают это путем выполнения системных вызовов для базовой операционной системы, которая предоставляет API для стека TCP / IP.

Рассматриваемые системные вызовы (такие как socket, listen, accept и т. Д.) Обычно документируются на уровне C, но в каждой конкретной реализации ОС они, конечно, преобразуются в машинный код. , Но то, идут ли значения в определенных регистрах или места в памяти, на которые указывают конкретные регистры и т. Д., Довольно незначительно и полностью зависит от системы.

Если вам интересно, как машинный код (возможно, также скомпилированный из C) в ядре и драйверах устройств «взаимодействует с Интернетом» (в ответ на системные вызовы), он делает это как путем создания, так и обслуживания в памяти. структуры данных для отслеживания состояния различных вещей и взаимодействия с нижележащим оборудованием (например, через прерывания, порты ввода-вывода, области устройств с отображенной памятью или все, что использует конкретная архитектура) - точно так же, как оно взаимодействует (скажем) с видео дисплей или дисковое устройство.

2 голосов
/ 12 апреля 2010

Это зависит. Когда вы читаете о веб-скрипте, написанном на C, это на самом деле программа CGI. CGI - это протокол, а не язык. CGI указывает, что нужно поместить «GET», «POST» и т. Д. В REQUEST_METHOD, «foo = bar? Baz = 42» в QUERY_STRING, отправить данные в stdin и т. Д. Для доступа к ним CGI-программа использует системные вызовы. Веб-сервер использует CGI для связи с веб-скриптом. Программа, которая взаимодействует через Интернет сама по себе, может использовать API системных сокетов.

Таким образом, операционная система выполняет все коммуникации. Программа просто делает правильные системные вызовы.

Если вам интересно, как операционная система взаимодействует через Интернет, ответ таков: ядро ​​ОС использует драйвер для взаимодействия с сетевой картой через порт ввода-вывода, сопоставленный с памятью ввод-вывод и т. Д. ОС и сетевая карта реализуют Стандарты интернет-протокола для всего, чтобы работать вместе.

0 голосов
/ 07 января 2011

Разумно ли сказать, что в какой-то момент, независимо от программы, код преобразуется (из-за отсутствия правильного термина) в некоторую форму языка "ассемблера" (я думаю, что существует более одного), который затем имеет " один в один "отношение к машинному коду? Не уверен, как .NET и ILASM / Java и соответствующий им байт-код вписываются в это, но я думал, что все это в какой-то момент превратилось в сборку, а затем в машинный код.

0 голосов
/ 12 апреля 2010

Что вам нужно сделать, это посмотреть некоторые из этих проектов веб-сервера PIC. Некоторые из них являются веб-серверами, написанными на ассемблере и работающими на 8-битном оборудовании. Это даст вам четкое представление о том, как что-то такое низкое, как сборка, можно использовать для взаимодействия с остальным миром через Интернет.

Это в основном включает в себя

  1. Написание некоторых низкоуровневых драйверов (уровень 2) для взаимодействия с сетевым оборудованием - это может быть использование Ethernet или даже модемов (с SLIP).
  2. Запишите следующие уровни - IP и TCP - для обработки пакетов TCP / IP. Это потребует некоторой магии сборки, поскольку эти процессы довольно сложны.
  3. Напишите прикладной уровень - будь то веб-сервер или клиент или что-то еще - который использует базовые уровни.

Надеюсь, это прояснит некоторые сомнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...