programing

memcpy의 내부 구현은 어떻게 이루어집니까?

css3 2023. 10. 7. 12:05

memcpy의 내부 구현은 어떻게 이루어집니까?

표준 C 기능 'memcpy'는 어떻게 작동합니까?RAM의 (큰) 청크를 RAM의 다른 영역에 복사해야 합니다.(이동 명령으로) 조립 시 RAM에서 RAM으로 바로 이동할 수 없다는 것을 알고 있기 때문에 복사 시 중간 메모리로 CPU 레지스터를 사용하는 것이 아닐까요?

하지만 어떻게 복사되는 거지?블록 단위(블록 단위로 어떻게 복사합니까?), 개별 바이트(char) 또는 가장 큰 데이터 유형(long long double's로 복사 - 내 시스템에서 12바이트).

편집: RAM에서 RAM으로 직접 데이터를 이동할 수 있습니다. 저는 조립 전문가가 아니며 조립에 대해 배운 것은 RAM에서 RAM으로 이동할 수 없다는 이동 명령에 대한 섹션에 언급된 이 문서(X86 조립 가이드)에서 나온 것뿐입니다.분명히 이것은 사실이 아닙니다.

경우에 따라 다르지요.일반적으로 단일 주기로 사용 가능한 최대 레지스터보다 더 큰 것을 물리적으로 복사할 수는 없지만, 요즘은 실제로 기계가 작동하는 방식이 아닙니다.실제로는 CPU가 무엇을 하는지에 대해서는 전혀 신경 쓰지 않고 DRAM의 특성에 대해서는 더 신경을 씁니다.기계의 메모리 계층은 이 복사를 가장 빠른 방식으로 수행하는 데 결정적인 역할을 할 것입니다(예: 전체 캐시 라인을 로드하고 있습니까?).복사 작업에 대한 DRAM 행의 크기는 얼마입니까?구현은 대신 구현을 위해 일종의 벡터 명령을 사용하는 것을 선택할 수 있습니다.memcpy. 특정 구현을 참조하지 않아도 사실상 바이트 단위 복사본에 한 자리 버퍼가 있습니다.

여기 한 사람이 최적화하는 모험을 설명하는 재미있는 기사가 있습니다.memcpy. 핵심적인 이점은 저렴한 비용으로 실행할 수 있는 지침에 따라 항상 특정 아키텍처와 환경을 대상으로 한다는 것입니다.

의 구현.memcpy시스템이 구현되는 시스템에 매우 구체적입니다.구현은 하드웨어 지원을 받는 경우가 많습니다.

메모리에서 메모리로 이동하는 명령은 그리 드문 일이 아닙니다. 적어도 그 이후로 존재해 왔습니다.PDP-11당신이 이런 글을 쓸 수 있었던 시간들:

    MOV FROM, R2
    MOV TO,   R3
    MOV R2,   R4
    ADD LEN,  R4
CP: MOV (R2+), (R3+) ; "(Rx+)" means "*Rx++" in C
    CMP R2, R4
    BNE CP

주석이 달린 줄은 대략 C의 것과 맞먹습니다.

*to++ = *from++;

은 의 CPU 는를 있습니다.memcpy직접: 소스 및 대상 주소와 함께 특수 레지스터를 로드하고 메모리 복사 명령을 호출한 후 나머지는 CPU가 수행하도록 합니다.

의 사소한 memcpy다음과 같습니다.

 while (n--) *s2++ = *s1++;

그렇지만glibc보통 어셈블리 코드에 영리한 구현들을 사용합니다.memcpy전화는 보통 줄을 서 있습니다.

는 크기 변수가 x86 에서합니다의 그대로 2수의 일 수도 .4 사용)gcc및수)합니다가 있는 합니다.movl시사))4바이트). 그렇지 않으면 일반적인 경우라고 부릅니다.

는 합니다를 합니다.rep그리고.movsl지침들.

언급URL : https://stackoverflow.com/questions/17498743/how-does-the-internal-implementation-of-memcpy-work