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

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

Добрый день. Пробую простенькую программку
 

        .global main
main:
        MOV R0, #100
        LDR R1, =0xABCD876
        STR R1, [R0]
        LDRB R2, [R0, #1]
        MOV R0, #0
        MOV R7, #1
        svc 0

при запуске ее в gdb получаю ошибку, указанную в теме и не пойму, в чем дело. На борту имею :

PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
Помогите разобраться.

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


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

У меня имеется подозрение, что писать в адрес 0x100 не удаётся и именно это вызывает исключение.

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


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

9 hours ago, dio4 said:

если скажете, почему не удается.

 Потому что там нет памяти. Почитайте на досуге что такое Virtual Memory

 

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


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

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

 Потому что там нет памяти. Почитайте на досуге что такое Virtual Memory

 

Я читаю все что нужно. Буду благодарен, если вы свою уверенность мне передадите. Можете конкретно показать (карта памяти, ссылка на datasheet, что-то еще,..), что там нет памяти, разрешенной для записи. А так это голословно выглядит, - "это так, потому что я так сказал"...

Изменено пользователем dio4
ошибка

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


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

Мне что, понизили репутацию за то, что я задаю правильные вопросы а вы не можете или не хотите на них ответить? Здорово...ну так скажите, что не хотите (не можете) и я не буду продолжать. Зачем так поступать? Это как-то не прилично.

Только что, Arlleex сказал:

Нужна конкретика, которой у меня пока нет.  Версия была - запись туда, куда нельзя - я попросил показать и объяснить, ПОЧЕМУ туда нельзя - не показали.  Затем что-то сказали о вирт. памяти - снова конкретики нет...Эта ошибка может возникнуть и при попытке доступа к члену массива, которого нет и при записи, куда нельзя и много еще почему. Я и прошу помочь с конкретикой, если она есть. Если ее нет, зачем что-то писать? Может есть какой пример, исправляющий мой(чтобы заработало) с объяснением почему так , а не иначе? Буду очень признателен...а просто затыкать рот, понижая репутацию...как-то неэтично и не красиво...ИМХО.

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


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

19 minutes ago, dio4 said:

Буду очень признателен

Скажу так. Я не работаю с линукс, но прекрасно понимаю, что в такой системе для каждой запущенной программы выделяется адресное пространство из общей памяти на системе. Это и называется виртуальной памятью. Т.е. программа работает не с физическими адресами вроде 0xFFAB 7708, которые каждый раз при запуске могут быть разными, и с адресным пространством, например 0 - 0x000 FFFF. Очень условно. Но в этом адресном пространстве есть секции только для чтения, или, возможно, что там находится какая-то служебная память. Не знаю. Но предполагаю. Вот именно поэтому Вам туда запрещено писать. В принципе, писать по конкретному адресу памяти - плохой стиль программирования, хотя и незапрещённый. Но даже на системе bare-metal, т.е. без ОС, Вы не можете просто так взять и что-то записать по адресу 0x100, т.к. там вообще ничего может и не быть. Или там находится FLASH-память, которая не пишется напрямую, а только через контроллер памяти. Подробней Вам рассказать не могу, т.к., повторюсь, не работаю с ОС Linux на встраиваемых системах. Да и на ПК тоже. Посмотрите в скрипт линкера (ld), который заведует распределением памяти для Вашей программы. Возможно, там содержится ответ, что находится по адресу 0x100...

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


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

1 час назад, haker_fox сказал:

кажу так. Я не работаю с линукс, но прекрасно понимаю, что в такой системе для каждой запущенной программы выделяется адресное пространство из общей памяти на системе. Это и называется виртуальной памятью. Т.е. программа работает не с физическими адресами вроде 0xFFAB 7708, которые каждый раз при запуске могут быть разными, и с адресным пространством, например 0 - 0x000 FFFF. Очень условно.

Не совсем так. Виртуальная память связывает реальные машинные адреса с логическими, те с теми, которые генерирует процессор, когда обрабатывает сегменты памяти(внутри которых области могут иметь одинаковые адреса), кучу, стек, символические имена для процесса и тд . Логические адреса внутри сегментов обычно формируются  на этапе компиляции. "Служебная" как вы сказали память, - это то, что используется системой(ядром), туда процесс из пользовательского пространстве не имеет доступа(если только ядро не совершает переключение контекста при некоторых системных вызовах). Все это понятно и не мудрствуя лукаво, я просто ожидал, что кто-то знающий покажет через objdump и strace, что мой пример лезет конкретно не туда, куда ему можно. Я просто ожидал помощи специалиста, понимающего архитектуру ARM. В скрипт линкера смотреть видимо не нужно, потому что все делает gcc и заведует линкером тоже. Но спасибо за попытку помочь, я вам искренне признателен. Видимо все и еще раз спасибо вам за потраченное время. 
PS Если интересно, программка должна показывать Endianness в той системе arm, где запущена, но вот пока нет...

Изменено пользователем dio4
Добавление.

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


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

2 hours ago, dio4 said:

Я просто ожидал помощи специалиста, понимающего архитектуру ARM.

ARM тут не при чем. Вам нужен специалист по Linux.

2 hours ago, dio4 said:

что кто-то знающий покажет через objdump

Посмотрите сами (это просто). Запустите objdump -p <file.elf> (на ваш elf файл).

Будет нечто такое:

Program Header:
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12
         filesz 0x000000000000f600 memsz 0x000000000000f600 flags r-x
    LOAD off    0x000000000000f600 vaddr 0x0000000000010600 paddr 0x0000000000010600 align 2**12
         filesz 0x0000000000111150 memsz 0x0000000000111150 flags rw-

При загрузке вашей программы Linux создаст в виртуальной памяти ТОЛЬКО сегменты, которые помеченны тэгом LOAD. Стартовый адрес (виртуальный) печатается в поле vaddr, размер - в поле memsz. В Linux загрузка начинается не с нуля (на мой пример не смотрите - это не Linux и не ARM, это bare metal RISC-V)

2 hours ago, dio4 said:

В скрипт линкера смотреть видимо не нужно, потому что все делает gcc и заведует линкером тоже.

Как раз нужно - ибо карта этих самых LOAD сегментов задаётся именно там.

Если хотите, что бы gcc позвботился и о вашей памяти не занимайтесь ручным распеделением - сделайте в ассемблере секцию .data и пишите в неё.

 

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


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

Все это очень интересно, хотя мне и так было известно, но есть большое НО - все, что вы написали так и не отвечает на мой вопрос. А цитировать другие учебные материалы я и так умею.
PS - Так за что вы мне репутацию понизили? Это вы сделали xvr.
PPS И все таки специалист нужен по ARM(в контексте Raspberry), понимающий куда и что там пишется и почему эта ошибка вылазит, потому что аналогичная прога на других архитектурах работает.

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


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

21 hours ago, dio4 said:

все, что вы написали так и не отвечает на мой вопрос.

Либо вы троль, либо не понимаете элементарных вещей. На ваш вопрос вам дали весьма подробный ответ.

21 hours ago, dio4 said:

А цитировать другие учебные материалы я и так умею.

Только цитировать, или понимать их тоже?

21 hours ago, dio4 said:

PS - Так за что вы мне репутацию понизили? Это вы сделали xvr.

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

21 hours ago, dio4 said:

PPS И все таки специалист нужен по ARM(в контексте Raspberry),

Психиатр вам нужен

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


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

19 часов назад, xvr сказал:

Либо вы троль, либо не понимаете элементарных вещей. На ваш вопрос вам дали весьма подробный ответ.

Только цитировать, или понимать их тоже?

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

Психиатр вам нужен

Слушайте, вы не хамите. Прекратите визгливую истерику и будьте мужчиной. Следите за своим языком и не переходите на личности. У вас что - синдром Даннинга-Крюгера? Так отнеситесь к себе более критично. Так не достойно вести себя в общественных местах..

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

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


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

7 hours ago, dio4 said:

Слушайте, вы не хамите. Прекратите визгливую истерику и будьте мужчиной.

Я видел тут много хамов, но вы это нечто. За 10 дней на форуме не с того не с его наехать на человека, который вам пытался помочь, в потом учить его жизни.

Надеюсь, что мы вас тут больше не увидим.

 

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


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

В 04.08.2023 в 16:26, xvr сказал:

Я видел тут много хамов, но вы это нечто. За 10 дней на форуме не с того не с его наехать на человека, который вам пытался помочь, в потом учить его жизни.

Надеюсь, что мы вас тут больше не увидим.

 

Вы слишком самоуверенны. Не надо говорить "МЫ", вы - это не все обитатели форума и не весь портал. Еще раз прошу вас прекратить истерику и предлагаю  начать заново общение, тем более, что с другими форумчанами все было нормально и меня все сразу понимали. 
1. Если вы пытались помочь, а я вас не понял - прошу извинить.
2. Я вас обидеть не хотел, вы меня не так поняли скорее всего.
3. Я просил реальную(конкретную, по существу) помощь, а не "конспект лекций", НЕ ПРИВОДЯЩИЙ к решению проблемы.
4. Прошу прекратить личные оскорбления в виде" Психиатр вам нужен..", - знаете, за такие вещи в приличных местах морду бьют.
5. Итог: предлагаю спокойные коллегиальные и взаимоуважительные отношения.

 


 


 

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

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


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

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

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

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

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

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

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

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

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

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