2009-12-03 2 views
3

메인 보드 나 pci 카드의 이더넷 포트와 같은 장치에 액세스하는 방법을 아는 사람이 있습니까?x86 어셈블리에서 네트워크 카드에 쓰거나 읽는 방법은 무엇입니까?

특수 레지스터가 있습니까? Opcodes? OS에 전화해야합니까? 그렇다면 어떻게?

미리 감사드립니다.

+0

무엇을하려하십니까? 드라이버를 작성 하시겠습니까? 이 종류의 접근은 운전자가 실제로 유일한 장소입니다 ... 어떤 OS입니까? – mch

+0

실험을하고 싶습니다. 아마 패킷 하나 또는 두 개를 전송할 수 있습니까? 저는 현재 어셈블리 (MIPS) 과정에 있으며 네트워크 연구실에서 일하기 때문에 둘을 수렴하는 것이 좋습니다. 어떤 주요 OS에서도 개발할 수 있지만, 기본 설정은 Mac, Linux, Win에서 순서대로 진행됩니다. – Kevin

답변

2

대화하려는 이더넷 MAC 칩에 따라 다릅니다. 같은 가족의 칩조차도 작동 방식에 사소한 차이가있을 수 있습니다. 이것이 최신 OS가 "드라이버"개념을 갖고있는 이유입니다. 하드웨어 제조업체는 대개 하드웨어를 알고 있기 때문에 드라이버를 작성하고 드라이버는 하드웨어와 OS가보고 싶어하는 것 사이의 변환을 제공합니다.

종종 고유 한 드라이버를 작성하기 위해 MAC 칩 제조업체의 설명서를 얻을 수 있습니다. 다시 말하지만 올바른 사양을 얻으려면 어떤 칩을 사용해야하는지 정확히 알아야합니다. 일부 칩은 공개 문서가 없지만 일반적으로 이더넷 칩에는 문제가 없습니다.

+0

와우, 멋지다. (방금 새로운 것을 배웠다는 의미에서). 감사! 그래서 MAC 칩에 맞는 스펙을 찾으면 본질적으로 재미있는 기능이나 다른 기능을위한 드라이버를 작성할 수 있습니다. 응용 프로그램 수준에서 MAC 칩을 쉽게 찾을 수 있습니까? 그리고 드라이버는 분명 바이트 코드로 어셈블되어야하지만 어셈블리로 다시 "분해"하는 쉬운 방법이 있습니까? 이 단계는 리눅스 공동체에서 자주 발생합니다. – Kevin

+0

예, 칩 문서에서 드라이버를 작성할 수 있어야합니다. 상기 문서를 찾는 것이 어려울 수 있습니다. 사용중인 칩을 탐지하기 위해 PCI 장치 테이블을 탐색 할 수 있습니다. 예를 들어, 리눅스에서는 lspci 명령이 있는데, 이것은 당신을 위해서입니다. 네, 드라이버를 해체 할 수는 있지만 칩 사양이 있다면 그렇게 할 이유가 거의 없습니다. 그리고 Linux 이더넷 드라이버는 대개 Windows 드라이버에서 리버스 엔지니어링되지 않습니다. 때로는 다른 유형의 드라이버에서도 발생하지만, 이더넷 칩 사양은 보통 어렵지 않습니다. –

0

inupt 및 출력 지침 또는 유사한 것을 사용하여 카드 자체에 대한 호출을 사용할 수 있습니다. 각 이더넷 카드는 다르기 때문에 제조업체의 설명서가 필요합니다.

다음 단계는 DOS를 호출하는 것입니다. Windows를 사용 중이라고 가정합니다. 이를 통해 표준 MSDOS 호출을 사용하여 이더넷 카드의 제한된 기능에 액세스 할 수 있습니다. 이전의 MSDOS 문서에서 찾을 수 있습니다. 내가 잘못 본 것이 아니라면 대부분의 버전은 여전히 ​​Windows의 이후 버전에서 작동합니다.

+0

9x 이후의 모든 창에서 사용자 모드 코드에서 직접 포트 액세스가 거부되었다고 생각합니다. –

+0

예제가 있습니까? 장치의 메모리 주소를 레지스터에로드합니까? 어떻게 상기 메모리 주소를 얻습니까? x86의 어떤 키워드를 사용합니까? 불행하게도이 경우 Windows에서의 개발은 거의 불가능합니다. 어느 정도의 용량으로 성공했다면 다른 코드와 함께 사용하기를 원할 것입니다. 이들 모두는 유닉스 시스템에서 개발 한 것입니다. – Kevin

+0

아직까지는 직접 포트 액세스에 보안 제한이있을 수 있습니다.이 모든 것에 대한 세부 사항은 하드웨어 제조업체에서 얻을 수 있습니다. 각 제조업체와 대부분의 모델은 다를 수 있습니다. 죄송합니다. 저는 지난 10 년 동안 어떤 사례도 없었습니다. – xpda

0

특정 포트 주소에 작성해야합니다. 이 Wiki 페이지가 시작될 수 있습니다.
MemoryMappedIO

2

가장 간단한 대답은 아마도 당신이 찾고있는 것이 아니지만 카드에 액세스하여 컴파일하고 컴파일러에서 생성 된 코드를 볼 수있는 C 코드를 작성하는 것입니다.

C 코드는 NIC 드라이버를 직접 통과하거나 winpcap과 같은 라이브러리를 사용합니다. 예를 들어 Windows에서 raw sockets에 대한 기본 제공 지원은 보안상의 이유로 해제되었습니다.

그러나 NIC가 작동하는 방법을 배우는 가장 좋은 방법은 아닙니다. 이를 위해서는 널리 사용되는 내장형 NIC의 데이터 시트 (LAN91C111)를 선택하고 액세스 방법을 읽어보십시오. 은 Eterthet를 원시 방식으로 인터페이싱하는 것에 대해 많은 것을 가르쳐 줄 것입니다.

이것은 여전히 ​​IMHO에서 어셈블리 언어를 공부하기에 충분한 샌드 박스가 아닙니다. 이를 위해서는 이진 트리 검색과 같은 어셈블리에서 몇 가지 작은 알고리즘 프로그램을 구현하십시오.

관련 문제