2010-06-20 6 views
1

저는 Mac OS 용 C/C++에서 NES 에뮬레이터를 작성하고 있습니다 (이미 하나를 작성 했으므로 기본을 알고 있습니다). 많은 하드웨어 레지스터가 메모리 위치에 매핑되어 있기 때문에 주소를 함수 결과에 매핑하는 데 사용할 수있는 시스템 호출이 있는지 궁금합니다. 액세스 할 때 함수가 호출됩니다. (나는 할 수 없습니다 확신 해요,하지만 헤이, 그것은 물어 가치가있다.)주소를 함수의 결과에 매핑 할 수 있습니까?

여기

는 내가하고 싶은 것입니다 :이 프로젝트는 LLVM에서 내 시도가 될 것입니다

int getStatusRegisterValue() 
{ 
    return 0xCAFEBABE; 
} 

// obviously, more parameters than just this would be involved I suppose 
int* statusRegister = syscall_to_map_function_to_address(getStatusRegisterValue); 

// from here on, doing (*statusRegister) should call getStatusRegisterValue and 
// return its value 
*statusRegister == 0xCAFEBABE; 

, 그리고 내 목표는 LLVM 바이트 코드에 ROM을 다시 컴파일하는 것입니다. 단순 메모리 액세스가 실제 NES 하드웨어처럼 기능을 트리거 할 수 있다면 편리 할 것입니다. 내 문제를 해결하기위한 또 다른 두 가지 가능성은 레지스터 값을 캐시하여 실제 메모리에 저장하거나 다시 컴파일 된 코드에서 함수를 호출하여 메모리 위치를 실제 위치에 매핑하는 것입니다.

감사합니다.

+0

C/C++과 같은 것은 없습니다. –

+0

@wowus : "C/C++"은 "C++과 C의 상호 작용"을 요약하는 좋은 방법입니다. 나는 Objective-C와 그 언어에 포함 된 집회의 꼬집기가 될 것이라고 덧붙여 야합니다. – zneak

+0

몇 가지 샘플 코드를 보여줄 수 있습니까? 또는 유스 케이스? 나는 이것을 아주 시각화 할 수 없다. –

답변

3

아마도 SEGV 처리기를 설치하고 거기에 오류가있는 주소를 확인하려고 할 수 있습니다. Mac OS를 사용하지 않기 때문에 더 이상 당신을 도울 수 없습니다.

+0

그 * 수 * 좋은 생각이 될 수 있습니다. 그러나 다른 좋은 주소와 연속적이어야하므로 아마 그렇게하지 않을 것입니다. – zneak

+0

NES 레지스터가 실제 메모리와 같은 페이지에 있다는 것을 의미합니까? 아니면 일반적인 오래된 변수를 사용하여 일부 레지스터를 에뮬레이트 할 수 있습니까? 같은 페이지에있는 다른 모든 것들에 대해 성능이 좋지 않더라도이 방법이 효과적입니다. – ninjalj

+0

$ 2000 - $ 5FFF 범위 내의 모든 액세스에 문제가있는 것 같습니다. 물론, 그것은 확장 ROM 접근에 대해서는 느릴 수 있지만, 그것은 처음에는 빠르지 않았습니다. – MSalters

0

C++에서 사용자 정의 클래스에 대해 *-> 연산자를 오버로드 할 수 있습니다. 이것은 당신이 원하는 것을 얻을 수있게 해 줄 것입니까?

typedef int(*function_type)(void); 

function_type = &getStatusRegisterValue; // store 
int i = function_type(); // call 

다른 구문, 같은 생각 :

+0

좋은 생각이지만 실행 엔진은 C++보다 훨씬 낮은 수준에서 기능을 필요로 할 것입니다. ROM을 LLVM 바이트 코드로 다시 컴파일하려고 시도합니다. 그래서 유일한 메모리 액세스가이 기능을 실행할 수 있다면 더 간단 할 것입니다. – zneak

1

이 거의 단지 일반 함수 포인터 같은 소리?

+0

정확히는 않습니다 : NES에는 실제 RAM 주소 대신 하드웨어 레지스터에 액세스하는 여러 메모리 위치가 있으며이 동작을 모방하려고합니다.함수를 직접 호출하지 않을 것입니다. (구문 상 문제가 아닙니다.)이 프로젝트는 LLVM을 사용하는 변명이므로 LLVM 바이트 코드로 다시 컴파일하려고 시도 할 것입니다. 프로그램의 주소 공간이 NES의 주소 공간처럼 작동하도록 할 수 있다면 걱정할 것이 거의 없을 것이라고 생각합니다. 물론 실제로 필요한 작업을 위치를 매핑하는 함수 사용과 같은 분명한 대안이 있습니다. – zneak

1

이 작업은 C (또는 C++)에서는 수행 할 수 없지만 간단하게하기 위해 C에만 붙어 있습니다.

연산자 오버로딩과 명시적인 주소 지정이있는 펑터를 사용하여이 효과를 "에뮬레이션"할 수 있지만 실제로는 그렇지 않습니다. 이를 정상적으로 수행하기 위해서는 대상 함수에 대해 너무 많은 가정을해야합니다.

1) 항상 동일한 값을 반환한다고 가정합니다.

사실, 그게 전부입니다. 그래도 여전히 큰 가정입니다!

+0

사실, 항상 같은 값을 반환한다고 가정하고 싶지는 않습니다. 그것은 어리석은 짓입니다. 메모리 위치에 액세스 할 때마다 함수의 결과를 계산할 필요가 없습니다. 그냥 그 위치에 놓고 대신 사용하면됩니다. 이 예의 평등은 그것이하는 일의 예일뿐입니다. 그 외에도 분명히 간결함을 위해 모든 종류의 것을 가정하지만 더 유연한 디자인을 상상할 수 있습니다. – zneak

0

메모리 중단 점 (시스템에서 사용 가능한 경우 디버깅 용)을 사용하지 않으면 메모리 액세스에서 실행할 함수를 트리거 할 수 없습니다.

이것은 프로그래밍 언어와도 독립적이며 귀하의 질문은 현대 컴퓨터 플랫폼을 겨냥합니다.

+0

솔루션 언어가 있으면 사람들이 사용할 언어를 알고 있기 때문에 프로그래밍 언어를 지정했습니다. – zneak

관련 문제