Перейти к содержанию
    

Ошибка в gdb при запуске asm проги "Program received signal SIGSEGV, Segmentation fault. main () at big_end.S:5 5 STR R1, [R0]" на Raspberri Pi 2

Вот кое-что...
 

Из руководства BCM2835 ARM Peripherals видно, что:
1.2.3 ARM physical addresses
Physical addresses start at 0x00000000 for RAM.

1.2.4 Bus addresses
Software accessing RAM directly must use physical addresses (based at 0x00000000).
Вроде попадаем...
Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals.

Virtual addresses in kernel mode will range between 0xC0000000 and 0xEFFFFFFF.
Virtual addresses in user mode (i.e. seen by processes running in ARM Linux) will range
between 0x00000000 and 0xBFFFFFFF.
Peripherals (at physical address 0x20000000 on) are mapped into the kernel virtual address
space starting at address 0xF2000000.

Осталось понять, почему нельзя писать в 100, те в 64(16-ричн.). По архитектуре я совсем мало что...есть идеи парни?
image.thumb.png.6001dfe0b07b0384266ab18fb7c74f2a.png

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, dio4 сказал:

Вот кое-что...
 

Из руководства BCM2835 ARM Peripherals видно, что:
1.2.3 ARM physical addresses
Physical addresses start at 0x00000000 for RAM.

Это всё не то, т.к. относится к логике работы железа (процессора), а вам нужно читать как ядро ОС (Linux) управляет памятью процесса. Это описано, например, здесь - https://habr.com/ru/companies/smart_soft/articles/185226/ и https://habr.com/ru/companies/smart_soft/articles/226315/. Пока вы не разберётесь с этими базовыми вещами, продолжать разговаривать бесполезно, т.к. мы с вами имеем совершенно разные контексты, в рамках которых обсуждаем озвученный в первом посте вопрос.

Если вкратце, то чтобы программа могла обращаться по какому-либо адресу в адресном пространстве процесса (без SIGSEGV) этот адрес должен быть отображён на физическую страницу оперативной памяти. Если этого отображения нет (адресу из виртуального адресного пространства не сопоставлен адрес оперативной памяти системы), как в вашем случае, то происходит исключение и процесс аварийно завершается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя если верить этому https://gist.github.com/leiradel/67059c4aceea8fa564a5bc33b505f887 , то в user split 1 MB unmapped for illegal access exceptions. Поэтому и не дает туда писать, что используется для других целей. Если нет исправлений и добавлений, тогда считаю тему закрытой и всем спасибо. Если есть - буду рад обсудить конкретику.

4 минуты назад, makc сказал:

Если вкратце, то чтобы программа могла обращаться по какому-либо адресу в адресном пространстве процесса (без SIGSEGV) этот адрес должен быть отображён на физическую страницу оперативной памяти.

А это как понять тогда? "Software accessing RAM directly must use physical addresses (based at 0x00000000)."

Потом, даже если все так, то обращение по адресу 64(с учетом memmap) куда конкретно нас адресует? Как это посмотреть, можете подсказать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, dio4 сказал:

Хотя если верить этому https://gist.github.com/leiradel/67059c4aceea8fa564a5bc33b505f887 , то в user split 1 MB unmapped for illegal access exceptions. Поэтому и не дает туда писать, что используется для других целей. Если нет исправлений и добавлений, тогда считаю тему закрытой и всем спасибо. Если есть - буду рад обсудить конкретику.

Здесь написано,  что младший мегабайт не имеет отображения на физическую память (unmapped) и используется для обнаружения некорректных обращений (illegal access exceptions), например, по нулевому адресу в программе. Что в принципе логично. Это прекрасно согласуется с написанным мною выше. Причём на картинках в упомянутых мною статьях эта область также обозначена, как неимеющая отображения на физическую память.

9 минут назад, dio4 сказал:

А это как понять тогда? "Software accessing RAM directly must use physical addresses (based at 0x00000000)."

Вы из-под ОС не можете напрямую обращаться к физическим адресам оперативной памяти (без специальных усилий). Поэтому эта фраза не имеет совершенно никакого отношения к вашему случаю. В общем случае оперативная память (физически выполненная в виде микросхем на плате) располагается с нулевого адреса:

image.thumb.png.fd80b0900f45cec7ea46c28795ac68eb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, вполне конкретно. Осталось только (если это возможно) подсказать, "обращение по адресу 64(с учетом memmap) куда конкретно нас адресует? Как это увидеть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, dio4 сказал:

Спасибо, вполне конкретно. Осталось только (если это возможно) подсказать, "обращение по адресу 64(с учетом memmap) куда конкретно нас адресует? Как это увидеть?

Про это знает только ядро, пользователю про это знать не нужно. Поэтому простого пути нет, но есть интерфейсы ядра, позволяющие получить эту информацию: https://stackoverflow.com/questions/5748492/is-there-any-api-for-determining-the-physical-address-from-virtual-address-in-li

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, что сказать, спасибо за конкретное и подробное разъяснение и за ваше время. Теперь буду знать, к кому обращаться. Еще раз спасибо.

Как здесь поставить лайк или поблагодарить?

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, dio4 сказал:

Как здесь поставить лайк или поблагодарить?

Пока никак. Такая возможность откроется после перехода в группу "Участники" после 30 постов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, makc сказал:

Пока никак. Такая возможность откроется после перехода в группу "Участники" после 30 постов.

Ок, ну - спасибо человеческое еще раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Obam сказал:

Вот ТСу на почитать: Ibanez_RF_Pervin_WJ_RaspberryPI_Assembler.pdf (а может уже читал)...

СПС брат, закину в мозк на досуге, если войдет ))
 а что думаешь по поводу "ARM System Developer’s Guide Designing and Optimizing System Software" Andrew N. Sloss, - я ее грызу вроде как.

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Трудно что-либо думать про книжицу с отметкой "The content that you requested has been blocked because of legal, abuse, malware or security reasons." на либгене - "...удивительное рядом, но нам оно - запрещено..."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работать с локальными переменными на ассемблере - та ещё морока. А в среде операционной системы  - так вообще.
Самое простое объяснение - память, которую видит программа (адресное пространство) никак не связана с реальным адресным пространством, потому что MMU в уже запущеной ОС работает с таблицами адресов (в простейшем случае) и при обращении к памяти по адресу 0xDEADBEEF (допустим), в начале идёт поиск по таблицам адресов, затем выбирается блок памяти, на который диапазон ссылается, после чего идёт попытка обращения к этой памяти (например получилась страница в 4к по адресам 0xFOODC000 ~ 0xFOODCFFF).

Вам... действительно нужен ассемблер? Проще же написать программу на Си под малинку. Компилятор сделает большую часть работы за вас.
Лично я ассемблером наигрался на AVR'ках. Больше не хочется писать ВЕСЬ код на нём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Obam сказал:

Трудно что-либо думать про книжицу с отметкой "The content that you requested has been blocked because of legal, abuse, malware or security reasons." на либгене - "...удивительное рядом, но нам оно - запрещено..."

Скажи куда - я тебе ее скину. Мне кажется, хорошая книжка. Вот  ее описание https://www.amazon.com/ARM-System-Developers-Guide-Architecture/dp/1558608745(саму книгу я скину, скажи куда)

2 часа назад, AlanDrakes сказал:

Вам... действительно нужен ассемблер?

Добрый день. Очень нужен. Наш "отряд " пишет эмулятор RTOS для Qemu. Взяли за основу простые суперциклы и событийно-управляемые программы(если кратко). Я в отстающих, надо догонять отряд, - не все знаю, не все понимаю..раньше я был в проетах, где писали для STM32MP. Я занимался потсроением и поддержкрй

2 часа назад, AlanDrakes сказал:

Вам... действительно нужен ассемблер?

Добрый день. Очень нужен. Наш "отряд " пишет эмулятор RTOS для Qemu. Взяли за основу простые суперциклы и событийно-управляемые программы(если кратко). Я в отстающих, надо догонять отряд, - не все знаю, не все понимаю..раньше я был в проетах, где писали для STM32MP. Я занимался построением и поддержкой дистрибутива, некоторыми драйверами(gps модем и по мелочи). Очень нужен, именно в разрезе архитектуры и взаимодействия компонентов системы. Как-то так. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, AlanDrakes сказал:

Вам... действительно нужен ассемблер?

затроилось что-то аж...прошу прощения. Не пойму, как удалить лишнее...

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...