2016-12-01 1 views
0

VirtualAlloc : 0x1E0000 (Size: 0x39000, Reserve)0x219000 (Size: 0x3000, Commit)으로 할당하고있는 두 개의 메모리 영역이 있습니다. 이들은 모두 동일한 할당 경계 (이 경우는 0x40000 (64K*4)으로 반올림 됨) 내에 있고 두 번째 영역은 첫 번째 끝 부분에서 시작됩니다.단일 통화로 예약하지 않고 같은 할당으로 두 개의 연속 메모리 영역을 예약 할 수없는 이유는 무엇입니까?

이제 분 동안의 커밋 부분을 잊어 버리십시오. MEM_RESERVE 첫 번째 0x39000 다음에 MEM_RESERVE 다음 0x3000이면 ERROR_INVALID_ADDRESS이됩니다. 그러나 만약 내가 MEM_RESERVE 둘 다 가서, 0x39000+0x3000=0x3C000, 그럼, 작동하고, MEM_COMMIT 두 번째 영역을 성공적으로 커밋하는 데 사용할 수 있습니다.

왜 그럴까요? 왜 내가 하나의 큰 예약 구역이 아닌 각 구역을 독자적으로 예약 할 수 없습니까? 첫 번째 영역을 예약 한 후 나머지 영역은 할당 (0x219000-0x21FFFF)MEM_FREE 상태이므로 나머지 0x7000 중 첫 번째 0x3000을 할당 경계에 어떻게 예약 할 수 없습니까?

+0

댓글 올린 코드를 게시하십시오. 나는 당신이하려고하는 것을 따라하기가 어렵습니다. –

답변

4

동일한 할당 경계 내에서 두 개의 개별 예약을 가질 수 없습니다. 에서 VirtualAlloc에 ​​대한 문서에서

: 지역의 [선택에서]

lpAddress 시작 주소를 할당합니다. 메모리를 예약하는 경우 지정된 주소는 할당 단위의 가장 가까운 배수로 반올림됩니다.

(강조 광산)

그래서 요청이 0x219000에서 시작하여 메모리를 예약하기 위해 실제로 기존의 할당 및 따라서 불법 안에있는 0x210000에서 시작하여 메모리를 예약하려고 시도합니다.

(가상 메모리의 특정 영역을 예약 할 수 있다는 보장이 없으므로 Windows는 이미 다른 용도로 예약했을 수 있습니다.) 가장 좋은 방법은 항상 lpAddress 매개 변수를 설정하는 것입니다 NULL으로 변경하면 Windows에서 주소를 선택할 수 있습니다.

1

두 가지 예약을하면 시스템에서 별도로 관리하도록 요청하지만 동일한 예약 경계 내에 있으므로 단일 단위로 관리 될 가능성이 있습니다. 그 유닛의 일부를 요청하면 나머지 부분은 사용되지 않습니다.

그러나 함께 예약하는 경우 함께 관리해야하므로 분할이 필요하지 않습니다. 상기 방법에 대한 documentation 가입일

:

할당 영역의 시작 주소. 메모리가 예약되어있는 경우, 지정된 주소는 할당 단위의 가장 가까운 배수로 내림됩니다.

두 번째 것은 실제로 첫 번째와 동일한 위치에서 예약됩니다.

관련 문제