커스텀 HW의 임베디드 리눅스 환경에서 TMS320DM368을 사용하여 비동기 외부 메모리 인터페이스 (AEMIF)를 읽어야합니다. 레오파드 보드 368에서 vala 코드 (아래)를 테스트하기 위해 실제로 하드웨어가 아직 없습니다. 첫 번째 AEMIF는 부트 로더가 nand 플래시를 읽는 데 사용됩니다. 코드에서 두 번째 AEMIF를 사용하여 표범 게시판에 있지 않지만 사용자 지정 HW에있는 SRAM을 읽으려고합니다. 분할 된 오류가 보호 된 메모리에 액세스하려고한다는 사실 때문에 발생했다고 생각됩니다. 실제 사용자 정의 HW에는 읽어야하는 SRAM이 여러 개 있지만이 테스트 코드에서 256 바이트 읽기를 읽으려고합니다. 아래 테스트 코드로 인한 세그먼테이션 오류를 어떻게 해결할 수 있습니까? 커널에 드라이버를 추가해야합니까? 가능한 경우 커널을 사용하지 마십시오. 특정 주소 범위를 보호하지 않는 것으로 구성하거나 선언 할 수있는 임베디드 리눅스 방법이 있습니까?세그먼테이션 오류를 복구하는 방법은 무엇입니까?
uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1)
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space)
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1
*pA2CR = (READ_SETUP << 13);
const size_t size = 256;
var dest = new uint8[size];
memset(dest, 0, size);
memcpy(dest, source, size);
segfault는 보호 위반이 아니지만 단순히 실제 메모리에 매핑되지 않은 사용자 메모리에 액세스 할 수 있습니다. 단기적인 해결책은 SRAM 대신에 파일을'mmap()'하는 것입니다. 'mmap()'은 사용할 가상 주소를 제공 받거나 가상 주소를 반환합니다. BTW "custom HW"가 있다면, "커널을 망쳐야 만합니다". 또한 http://stackoverflow.com/questions/11500291/access-nor-memory-from-userspace/12138057#12138057 – sawdust
@ 톱밥을 참조하십시오. 사용자 정의 HW는 Leopoardboard와 거의 동일합니다.이 SRAM IF는 유일한 출발 일 수 있습니다 . 커널을 변경해야한다면 그렇게 할 것입니다. – jacknad
Vala 측에서 약간의 메모 만 남았습니다. memset이 필요하지 않습니다 (Vala는 새 버퍼를 0으로 초기화합니다). 또한, 'unowned uint8 [] source = (uint8 []) 0x04000000;'과 같은 일을하는 것이 더 쉬울 것입니다. 그러면 배열 슬라이싱을 사용하여 원하는 데이터를 얻을 수 있습니다 (예 :'var dest = source [ 0 : 256];). Vala에서 원시 포인터를 사용할 필요는 거의 없습니다. 일부 바인딩 (특히 libxml2 및 posix)이 그렇게하도록 유혹 할지라도 말입니다. – nemequ