최근 수정 시각 : 2026-08-10 22:13:17

DMA


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 스타트렉에 등장하는 현상}}}에 대한 내용은 [[암흑 물질 변칙]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[암흑 물질 변칙#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[암흑 물질 변칙#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
스타트렉에 등장하는 현상: }}}[[암흑 물질 변칙]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[암흑 물질 변칙#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[암흑 물질 변칙#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

1. Direct Memory Access
1.1. Remote Direct Memory Access
2. Dynamic Memory Allocation3. Digital Markets Act4. 서울특별시 시내버스 회사 다모아자동차의 약칭

1. Direct Memory Access

직접 메모리 접근(Direct Memory Access, DMA)은 컴퓨터 주변 기기(chip 또는 device) 혹은 다른 메모리 간 CPU[1]를 거치지 않고 시스템 메모리(RAM)에 직접 접근하여 필요한 데이터를 적재(loading)하거나 이를 가져오는 기술을 가리킨다.

전형적이고 일반적인 경우 관례적으로 컴퓨터 주변 기기나 부품이 시스템 메모리에 접근하여 쓰기/읽기 작업을 수행할 경우 CPU가 memcpy 등을 통해 장치의 레지스터와 대상 주소 간에 메모리를 복사하는 방식으로 동작한다. 하지만 이 경우 CPU가 메모리를 복사하는 동안 다른 작업을 하지 못하기 때문에 오버헤드가 발생하게 된다. 그래서 등장한 것이 DMA로 CPU와는 독립적으로 동작하며 DMA 컨트롤러를 통해 CPU를 거치지 않고 바로 RAM에 접근하여 데이터를 쓰거나 불러오는 기능이다. DMA 기능을 사용하면 CPU에 부담을 주지 않으면서 빠르게 RAM에서 데이터를 쓰거나 가져올 수 있다. 그래서 대용량 메모리를 실시간으로 읽고 쓰는 주변 기기나 부품들은 기본적으로 DMA 기능을 사용하고 있다. 대표적인 예시가 HD Audio 장치로 DMA를 사용하여 오디오 버퍼를 자동으로 복사하는 동작을 구현한다. 주변장치 외에도 CPU의 간섭 없이 메모리를 복사하는 데에도 사용할 수 있다. 사실상 대부분의 컴퓨터는 DMA가 없으면 동작하지 못하는 수준으로 많이 사용한다.

그러나 DMA는 CPU와는 독립적으로 동작하며 아무런 제한 없이 직접 RAM에 접근하여 데이터를 읽거나 쓸 수 있다는 점에서 사실상 RAM의 모든 부분을 볼 수 있으므로 보안 문제가 발생할 수 있다. 대표적으로 Thunderbolt에서 발견된 보안 취약점인 Thunderclap는 DMA 기능을 이용한 것이다.

이것이 악용된 가장 또 다른 유명 사례가 게임 해킹 프로그램인데 최근들어 DMA를 활용하여 안티 치트의 탐지를 우회하는 핵 프로그램들이 기승을 부리고 있다. 이들은 게임을 실행하는 주 컴퓨터에 DMA 카드를 장착하고 게임을 플레이하면서 DMA 카드가 게임 메모리에 접근하여 수집한 데이터를 서브 컴퓨터로 보내고 서브 컴퓨터에서 해킹 프로그램이 이를 분석하고 주 컴퓨터의 모니터에 정보를 표시하는 식으로 사용한다. 이렇게 되면 당연히 게임과 안티 치트가 돌아가는 주 컴퓨터에서는 DMA가 단지 메모리를 읽어가기만 할 뿐이고 핵은 주 컴퓨터가 아닌 서브 컴퓨터에서 돌아가기 때문에 커널 수준에서 동작하는 그 어떤 안티 치트도 해킹 프로그램 자체는 절대 감지할 수가 없다.[2] 물론 이런 식으로 핵을 쓰기 위한 DMA 카드를 감지할 수는 있지만 핵 사용자도 이를 알고 DMA 카드의 펌웨어를 교체하여 랜카드나 오디오 장치 등 다른 정상적인 장치로 위장시키기 때문에 완전히 잡아내기가 매우 어렵다.[3] 따라서 안티 치트는 다양한 방법들을 동원해 DMA 카드 존재 여부를 확인하고 있다.[4]

이렇다보니 이 문제를 해결하기 위해 최신 OS에서 제공하는 가상화 기능인 IOMMU[5]를 사용하여 DMA 등록을 감시하는 방법이 있으며 Windows Defender 가상화 기반 보안에서는 이를 활용한 커널 DMA 보호가 존재한다. 일부 온라인 게임은 DMA을 이용한 핵을 막기 위해 IOMMU 활성화를 요구한다.[6]

1.1. Remote Direct Memory Access

RDMA. DMA와의 차이점은 로컬 메모리가 아닌 원격 메모리에 액세스한다.

이 Remote Memory는 시스템 메모리가 아닌 전혀 다른 시스템에 장착된 메모리에 직접 액세스하게 되는데 원격지라는 특징에서도 유추할 수 있듯이 이더넷 카드(NIC)에서 주로 사용된다. 10Gbps가 넘어가는 시스템에서 대량의 데이터를 액세스하게 되면 기존의 네트워크 스택은 TCP/IP로 인한 CPU의 오버헤드와 메모리 복사로 인해 오버헤드가 커지지만 RDMA를 지원하면 NIC이 각 시스템의 메모리에 직접 액세스하므로 CPU로 인한 오버헤드가 줄어든다.

2. Dynamic Memory Allocation

동적 메모리 할당이라고 부르며 컴파일 당시에 메모리를 할당하는 게 아닌 프로그램 동작 중에 임의로 필요한 만큼 할당해서 사용하는 행위이다.

C나 C++에서 Malloc 함수 등을 이용해 메모리를 새로 할당하는 행위 등이 대표적인 동적 메모리 할당이며 C#이나 Java 등의 언어에서는 인터프리터, JIT가 실시간으로 메모리 할당을 자동으로 수행한다.

이 기능을 쓰면 들어오는 자료량에 따라서 필요한 메모리양을 능동적으로 줄이고, 키우고 할 수 있기 때문에 처음부터 스택 영역에 많은 메모리를 할당할 필요가 없지만 대신에 힙 영역 메모리에 임의로 공간을 추가하는 셈이라 제대로 관리를 안 할 경우 메모리 누수의 원흉이 된다.

3. Digital Markets Act

디지털 시장법. 유럽 연합(EU)이 빅테크 기업의 시장 지배력을 억제하려는 목적으로 제정을 추진하고 있는 법안. # #

시장 지배력을 이용해 소비자의 선택권을 제한하는 소수 거대 플랫폼 사업자를 게이트키퍼(gatekeeper)로 지정하여 이들 기업을 대상으로 특별 규제를 적용하는 것이 골자이다.

4. 서울특별시 시내버스 회사 다모아자동차의 약칭

파일:상세 내용 아이콘.svg   자세한 내용은 다모아자동차 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[다모아자동차#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
{{{#!if 문서명 = 문서명 != null ? 문서명 : calleeTitle
의 [[다모아자동차#|]] 부분을}}}
참고하십시오.
[1] CPU 코어는 거치지 않지만, CPU의 메모리 컨트롤러는 거쳐간다. 오늘날 컴퓨터가 RAM을 읽고 쓰는 방식과 규칙은 대단히 복잡한데, 이걸 알고 있는 장치가 메모리 컨트롤러밖에 없어서 이건 피해갈 방법이 없다.[2] 참고로 DMA 말고도 구조 상 안티 치트가 탐지하기 어려운 핵이 있는데 바로 안티 치트 프로그램들의 한계인 커널 수준(Ring 0) 보다 상위 계층에서 돌아가는 핵들이다. 예시로 인텔 CPU에서만 사용할 수 있는 핵이 있는데 이 핵은 인텔 관리 엔진의 취약점을 활용하여 인텔 관리 엔진에 붙어서 돌아가기 때문이다. 인텔 관리 엔진은 커널보다 더 아래쪽에서 돌아가는 상위 계층(Ring -1) 프로그램이라 안티 치트가 감시할 수 없어서 그대로 무력화된다.[3] 이런 펌웨어의 경우 얼마나 정교하게 만들어졌는지에 따라 수 몇 만원에서 수 백만원이나 된다.[4] 대표적으로 펌웨어 기반 탐지 기법이 있는데, 확실하게 핵을 사용한 플레이 패턴이 확인된 계정의 접속 환경을 분석해서 똑같은 펌웨어 장치가 확인된 핵 의심자들을 모두 찾아내서 한꺼번에 제재를 먹이는 방식이다. 이런 식으로 한 번에 많은 계정들이 핵 사용 제재를 먹는 경우를 통칭 '밴웨이브'라 부른다. 따라서 DMA를 사용하는 수준의 초고가 핵 프로그램들은 이런 밴웨이브에서 벗어나기 위해 일명 '슬롯'이라고 해서 핵과 DMA 장비를 아예 소수 정예로만 한정 판매하고 구매 고객 개인별로 맞춤 펌웨어를 제작해서 이런 펌웨어 기반 탐지를 회피하는 경우도 있다.[5] Input/Output Memory Management Unit[6] 가장 대표적인 예시로 뱅가드를 사용하는 라이엇 게임즈의 발로란트리그 오브 레전드가 있다. 뱅가드는 Windows 11부터 이런 DMA 우회 자체를 원천 차단하기 위해 가상화 기능을 사용할 것을 요구한다. 또한 안티 바이러스와 같은 서명을 사용하여 컴퓨터가 부팅될 실행되어 모든 하드웨어 장치를 상시 감시하는 방식으로 동작한다. 이 때문에 중간에 한번이라도 뱅가드가 종료되면 다시 뱅가드를 실행하더라도 재부팅해서 처음부터 실행됨으로써 무결성이 보장될 때 까지 게임 플레이가 불가능하며, 이로 인해 접근성이 불편해진 것은 물론이고 수많은 정상 프로그램들과 OS와 충돌을 일으켜 원성이 자자하다. 심지어 해커들이 UEFI 펌웨어 취약점을 이용하자 컴퓨터 제조사에 보안 취약점을 제보하기도 했다.