2010-04-12 5 views
5

그래서 저는 다른 언어로 생각하고 있었는데, 인터넷과 상호 작용하는 컴파일 된 언어로 작성된 프로그램은 인터넷으로 상호 작용해야하는 어셈블리로 번역되었습니다. 나는 C++을 조금 더 잘 이해할 수 있도록 약간의 x86 어셈블리를 배우기 시작했으며, 저수준이 인터넷에 액세스하는 것과 같은 것을 할 수있는 방법에 대해 당황 스럽다.어셈블리 언어는 인터넷과 어떻게 상호 작용합니까?

나는이 질문에 대한 완전한 대답이 SO 대답에 적합 할 것이라고 생각하지만, 누군가가 나에게 기본 요약을 줄 수 있겠는가?

+4

다음은 비슷한 질문입니다. http://stackoverflow.com/questions/1837582/how-to-write-to-read-from-network-card-in-x86-assembly 그 외에도 "인터넷에 액세스" 그냥 전선을 통해 TCP/IP 메시지로 포맷 된 데이터를 다른 컴퓨터로 보냅니다. 저도 마법에 걸린 게 없다는 것을 깨달았을 때 저를위한 일종의 떠벌임이었습니다. –

+2

전체 인터넷은 1과 0으로 실행됩니다. 오히려 전체 인터넷은 엄청난 수의 기계 코드 스 니펫이 상호 작용하는 결과물입니다. 나는 그것이 틀림없이 더 놀랍다는 것을 안다. :) – deceze

답변

12

모든 현대 시스템에서 "인터넷과 상호 작용하는"사용자 공간 프로그램은 TCP/IP 스택 용 API를 제공하는 기본 운영 체제에 system calls을 발행하여 수행합니다.

시스템은 문제의 호출 (예 : socket, listen, accept, 등) 일반적으로 C 수준에서 설명되어 있지만, 각각의 특정 OS 구현에 그들은 물론, 기계 코드로 변환합니다. 그러나 값이 특정 레지스터에 있는지 또는 특정 레지스터에 의해 지시되는 메모리의 위치에 있는지 여부는 아주 사소하고 전적으로 시스템에 따라 다릅니다.

(시스템 호출에 대한 응답으로) 커널 및 장치 드라이버의 기계 코드 (C로 컴파일되었을 수도 있음)가 어떻게 "인터넷과 상호 작용하는지"궁금해지면, (예 : 인터럽트, I/O 포트, 메모리 맵핑 된 디바이스 영역 또는 특정 아키텍처가 사용하는 모든 것)를 통해 기본 하드웨어와 상호 작용함으로써 다양한 하드웨어 상태를 추적하는 메모리 데이터 구조 - 비디오 디스플레이 또는 디스크 장치 일 수 있습니다.

+1

예 ... 그런 작은 사용자 모드 프로그램이 그런 복잡한 작업을한다고 상상하기는 어렵지만 실제로는 더 높은 수준 (C/C++)으로 작성된 라이브러리를 호출하는 것입니다. 컴파일러에 의해 어셈블리 코드의 묶음으로 변환됩니다. 어셈블리 코드는 이더넷 케이블을 통해 5 볼트의 고온 및 0 볼트의 저울을 세계의 다른쪽에 보내는데, 정확하게) – Adam

+1

기술적으로 실제 이더넷 펄스는 라우터까지만 이동합니다. 라우터는 다음 라우터를 위해 사용자를 대신하여 라우터를 재전송 할 책임이 있으며, 다음 라우터는 다시 라우터를 담당합니다. –

2

에 따라 다릅니다. C로 작성된 웹 스크립트에 대해 읽었을 때 실제로 CGI 프로그램입니다. CGI는 언어가 아닌 프로토콜입니다. CGI는 REQUEST_METHOD에 "GET", "POST"등을 넣고 QUERY_STRING에 "foo = bar? baz = 42"를 입력하고 표준 입력란에 데이터를 게시하도록 지정합니다. 이들에 액세스하기 위해 CGI 프로그램은 시스템 호출을 사용합니다. 웹 서버는 CGI를 사용하여 웹 스크립트와 통신합니다. 자체적으로 인터넷을 통해 통신하는 프로그램은 시스템 소켓 API를 사용할 수 있습니다.

요약하면 운영 체제는 모든 통신을 수행합니다. 이 프로그램은 올바른 시스템 호출 만 수행합니다.

운영 체제가 인터넷을 통해 통신하는 방법을 궁금하게 생각하면 OS 커널이 드라이버를 사용하여 IO 포트, 메모리 매핑 IO 등을 통해 네트워크 카드와 인터페이스합니다. OS 및 네트워크 카드 함께 작동하는 모든 것에 대한 인터넷 프로토콜 표준을 구현하십시오.

0

필요한 작업은 해당 PIC 웹 서버 프로젝트 중 일부를 찾는 것입니다. 일부는 어셈블리로 작성되고 8 비트 하드웨어에서 실행되는 웹 서버입니다. 어셈블리를 인터넷을 통해 다른 세계와 상호 작용하는 데 사용할 수있는 저급 수준의 방법에 대한 명확한 아이디어를 제공합니다.

그것은 기본적으로 네트워킹 하드웨어와 인터페이스 일부 낮은 수준의 드라이버 (레이어 2)를 작성

  1. 을 포함 -이 이더넷 또는 (SLIP와)도 모뎀을 사용하고있을 수 있습니다.
  2. 다음 계층 (IP 및 TCP)을 작성하여 TCP/IP 패킷을 처리하십시오. 이 과정은 꽤 복잡하기 때문에 어셈블리 매직이 필요합니다.
  3. 응용 프로그램 계층 (웹 서버 이건 클라이언트 이건간에)은 기본 계층을 이용합니다.

희망 사항은 다소 의문의 여지가 있기를 바랍니다.

0

프로그램에 상관없이 어떤 시점에서 코드는 적절한 용어가없는 경우 어셈블리 언어로 변환됩니다 (두 개 이상 있다고 생각합니다). 기계 코드와 "일대일"관계? NET과 ILASM/Java와 이에 상응하는 바이트 코드가이 문제에 어떻게 부합되는지는 잘 모르겠지만 모든 부분이 어셈블리와 머신 코드로 바뀌 었다고 생각했습니다.

관련 문제