다음과 같은 네트워크 토폴로지가 있다고 가정해 보겠습니다.
4개 호스트 모두의 이론적 총(Tx + Rx) 대역폭을 합하면 최대 100Mbps입니다. 이제 내가 실행하면IPOV4개의 호스트 모두에서 동시에 UDP 모드에 있고 각 Iperf 인스턴스가 -b 50m
유선(Iperf 클라이언트에서)에서 50Mbps의 트래픽을 전송하도록 강제하면 Iperf는 유선에서 그만큼 많은 트래픽을 전송하지 않습니다. 이는 NIC가 충돌을 수신하여 Iperf 클라이언트가 -1
UDP 소켓에서 일부 시스템 호출의 반환 값을 수신했기 때문입니다. write()
커널과 Iperf 클라이언트가 어떻게 통신하는지 이해하지만 NIC와 커널이 어떻게 통신하는지 잘 이해하지 못합니다. NIC 드라이버( tg3
BCM5721 NIC용)에서 이런 일이 발생합니까? 충돌이 발생했음을 커널에 알리는 일종의 시스템 호출이 있습니까?
답변1
커널과 NIC가 통신하는 방식은 커널(특히 커널의 일부인 장치 드라이버)이 다른 장치(예: 키보드, 마우스 또는 RS232와 같은 직렬 통신 장치)와 통신하는 방식과 동일합니다. ), 디스크(또는 디스크) 같은 방식으로 - 대용량 저장 장치, 디스플레이, 보안 토큰 등) - 서로 직접 통신합니다. 그렇습니다. 이는 NIC 드라이버에서 발생합니다. 아니요, 드라이버-장치 통신은 시스템 호출을 거치지 않습니다.
장치 드라이버는 일반적으로 MMIO(메모리 매핑 I/O)와 PMIO(포트 매핑 I/O)라는 두 가지 액세스 방법을 통해 장치와 통신합니다. 이에 대해 자세히 설명하고 논의합니다.뿌리 이 두 가지 질문 중:
당신은 또한 볼 수 있습니다드라이버란 무엇이며 어떻게 작동하나요? 배경 정보가 필요한 경우. 그런데 어떤 액세스 방법이 사용되는지는 컴퓨터 아키텍처에 따라 결정됩니다. 예를 들어,위키피디아"메모리 매핑된 I/O가 선호됩니다.x86건축을 기반으로..."
구체적인 질문으로 돌아가서, 메모리 매핑된 I/O를 가정하면 드라이버는 다음과 같이 간단하게 C 코드와의 충돌을 테스트할 수 있습니다.
if (nic->error_status & 충돌) { // 충돌이 발생하면 여기서 멈춥니다. (충돌을 처리하는 코드) ⋮ }
(여기서 nic
NIC 매핑 주소에 대한 포인터) 드라이버가 시스템 호출에서 사용자 프로세스로 오류를 반환하도록 하는 것은 사소한 문제입니다 write()
.
후속 질문:
드라이버가 커널의 일부라는 것은 드라이버 ⇔ 커널 통신 방식이 없다는 뜻인가요?
이는 또 다른 질문으로 물어볼 가치가 있습니다(또는 최소한 웹 검색과 같은 추가 조사를 수행). 처음에는 유닉스핵심예전에는단단히 짜여 하나로 되어 있는 (당신은 또한 볼 수 있습니다전체 커널). 커널과 드라이버의 관계는 인체와 손의 관계와 같습니다.다른, 팔꿈치나 폐 등과 혼동하지 마십시오. 그러나 신체의 필수적인 부분입니다.
4개가 있는 기계에서도보호 링, Unix는 링 0의 커널과 링 3의 사용자 영역, 두 개만 사용합니다. 장치 드라이버가 포크와 나이프와 같은 다른 운영 체제도 있습니다. 즉, 한 수준이 제거되었습니다(예: 드라이버가 중간 링(1 및 1./또는 2) 중 하나에 있음). 나는 모든 *nix/Linux 개발을 따라잡지는 못합니다(예:선형KM), 일부 유닉스는 다른 유닉스보다 기본 커널과 드라이버를 더 많이 분리할 수 있습니다. 예를 들어
- 커널 드라이버와 커널 모듈의 차이점은 무엇입니까? (존재하다유닉스와 리눅스)
- Linux 커널, 커널 모듈 및 하드웨어 드라이버 … (외부 웹사이트에서)
내가 말했듯이, 이 내용은 내 지식 기반의 가장자리에 있습니다. 위에 대한 후속 질문을 하지 마십시오.
더욱이 질문은 의미상 모호합니다. 몸과 손 사이에 소통이 있나요? 그렇습니다. 신경계를 통해(그리고 어느 정도는 뼈를 통해) 가능합니다. "커널"은 장치 드라이버(커널의 일부)와 통신합니까? 그렇습니다. C 프로그램(예: , , , , 등) cat
이 서브루틴 호출을 통해(때때로 전역 변수를 신중하게 사용하여) C 라이브러리와 통신하는 것과 같습니다 . 사용자 프로세스가 I/O 관련 시스템 호출(예: , , , , , , 등)을 호출할 때 일반 시스템 호출 처리 코드(커널 내)는 적절한 장치 드라이버 루틴(아마도 일부 중간 논리를 사용하여 호출)을 호출합니다. ) . 파일 시스템 관련 코드도 적절한 디스크 드라이버 루틴을 호출합니다. 그리고 커널은 적어도 인터럽트가 수신될 때 장치별 인터럽트 핸들러를 호출하는 데 도움을 줍니다(구현은 다양함).cp
ls
sed
open()
close()
read()
write()
ioctl()
poll()
select()