2013-11-25 3 views
2

나는 C 컴파일러 (www.cc65.org)에 NES FC는 8 비트 6502 프로세서와 2K RAM이8 비트 NES 프로그램 메모리 제한

8 비트 6502 프로그래밍을 배우고있다. 그러나 다음 C는 (nes 파일로) 컴파일하고 VirtualNES 에뮬레이터에서 성공적으로로드합니다.

#include "conio.h" 
#include "stdlib.h" 

int dump[1000]; 

void main() 
{ 
    int *a; 
    a = (int*)malloc(19222999); 
    cputs("Hello, World!"); 
    a[0] = 1; 
    for(;;); // loop forever, never ends 
} 

왜 괜찮습니까? 분명히 위의 C 코드에서 2K보다 많은 메모리를 할당했습니다.

+1

[C에서 malloc()의 반환 값을 캐스팅하지 마십시오 (http://stackoverflow.com/a/605858/28169). – unwind

+0

레코드의 경우 기본 CC65 NES 설정/링커 스크립트는 8kB RAM 확장 (기본적으로 카트의 추가 메모리 칩)에 의존합니다. 그렇지 않으면 1000 정수 배열이 런타임으로 2048 바이트의 RAM에 맞지 않습니다 다른 것들을위한 공간도 필요합니다. 아, 그리고 NES에서 이러한 유형의 동적 메모리 할당을 피할 것을 강력히 제안합니다. 그렇지 않으면 조각화 문제가 발생합니다. – doynax

+0

@doynax Full ack. 임베디드 시스템에서는 'malloc()'의 사용을 단명하고 작은 메모리 블록으로 제한하고 메모리 매개 변수에서 할당 할 메모리 양을 계산하는 "나머지 모든 RAM"이 필요한 메모리 블록으로 제한하는 것이 가장 좋습니다 할당은 링커에서 나에게 제공된다. – glglgl

답변

3

a의 값을 확인하지 마십시오. (BTW, 왜 당신은 반환 값을 캐스팅합니까?)

나는 그것이 NULL이라고 가정합니다. 따라서 a[0]에 대한 쓰기 액세스는 유효하지 않지만 아키텍처에 따라 작동 할 수도 있습니다. 그럼에도 불구하고 혼란과 혼란을 야기 할 수 있습니다.

컴파일러와 링커의 경우 malloc()이 다른 함수이기 때문에 컴파일 프로세스가 예상대로 작동합니다. 실수는 런타임에만 발생합니다.

7

Segfault는 현대 시대의 훌륭하고 기적적인 보탬입니다. 그들은 순간적으로 자신의 버그를 스스로 진단하는 컴퓨터를 나타냅니다.

옛날에는 컴퓨터가 무언가가 잘못되어 다른 것을해야한다는 인식이 있었기 때문에 옛날에는 컴퓨터를 "충돌"시키는 방법이 거의 없었습니다. 여기에서 1을 어딘가에 쓰면 (중요한 것을 덮어 쓸 가능성이 있습니다!), 컴퓨터가 계속 켜집니다.

테이크 어웨이 : 오래된 아키텍처 및 임베디드 시스템에서 "크래시는 발생하지 않습니다"는 제거 할 수있는 매우 낮은 수준이며 문제가 없다는 것을 나타내지는 않습니다.

+2

좋은 답변입니다. – alex