Мне нужно прочитать интерфейс асинхронной внешней памяти (AEMIF), используя TMS320DM368 во встроенной среде Linux на пользовательском HW. У меня пока нет аппаратного обеспечения, поэтому я тестирую код vala (ниже) на Leopardboard 368. Первый AEMIF используется загрузчиком для чтения nand flash. Мой код пытается использовать второй AEMIF для чтения SRAM, который не находится на Leopardboard, но будет находиться на пользовательском HW. Я подозреваю, что ошибка сегментации вызвана тем, что я пытаюсь получить доступ к защищенной памяти. Фактический пользовательский HW будет иметь несколько M SRAM, которые необходимо прочитать, но я пытаюсь получить этот тестовый код для чтения прочитанных 256 байтов. Как устранить ошибку сегментации, вызванную тестовым кодом ниже? Нужно ли добавить драйвер в ядро? Я бы предпочел не путаться с ядром, если это возможно. Есть ли встроенный метод linux для настройки или объявления определенных диапазонов адресов как незащищенных?Как устранить неисправность сегментации?
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 не может быть нарушением защиты, а просто доступ к пользовательской памяти, которая не отображается в физическую память. Кратковременным решением является 'mmap()' файл вместо SRAM. Обратите внимание, что 'mmap()' может быть снабжен виртуальным адресом для использования или будет возвращать виртуальный адрес. Кстати, если у вас есть «пользовательский HW», тогда вам придется «возиться с ядром». Также см. Http://stackoverflow.com/questions/11500291/access-nor-memory-from-userspace/12138057#12138057 – sawdust
@sawdust Пользовательский HW почти идентичен Leopboardboard, этот SRAM IF может быть единственным и единственным отправлением , Если мне придется менять ядро, я это сделаю. – jacknad
Всего несколько небольших заметок со стороны Валы: вам не нужна memset (Vala будет инициализировать новые буферы до 0 для вас). Кроме того, было бы проще просто сделать что-то вроде 'unowned uint8 [] source = (uint8 []) 0x04000000;', тогда вы могли бы просто использовать нарезку массива для получения требуемых данных (например, 'var dest = source [ 0: 256]; '). Вам действительно почти не нужно использовать raw-указатели в Vala, хотя некоторые привязки (особенно libxml2 и posix) соблазнят вас сделать это. – nemequ