Права доступа в линкерных скриптах RISC-V

При программировании микроконтроллеров на базе ARM я привык видеть сегмент MEMORY{..} в скрипте компоновщика следующим образом:

MEMORY
{ 
    FLASH (rx): ORIGIN = 0x08000000, LENGTH = 128K
    RAM (xrw): ORIGIN = 0x20000000, LENGTH = 32K
}

Права доступа понятны:

  • r: читать
  • w: напиши
  • x: выполнить

Я делаю свои первые шаги в мире микроконтроллеров на базе RISC-V. Микроконтроллер GD32VF103CBT6 от GigaDevice имеет следующий сегмент MEMORY{..} в своем скрипте компоновщика:

MEMORY
{ 
    /* Run in FLASH */ 
    flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 64k
    ram   (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 20k 

    /* Run in RAM */ 
    /* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 15k */
    /* ram   (wxa!ri) : ORIGIN = 0x20003C00, LENGTH = 5K  */
}

Как я должен интерпретировать эти права доступа?


person K.Mulier    schedule 17.10.2020    source источник
comment
Эти скрипты компоновщика — это просто люди, которые написали их на основе своих предпочтений и вкусов. Вам не нужно указывать какие-либо права доступа в скрипте компоновщика, или вы можете спамить его или что-то среднее, для ARM, Risc-V или любой другой цели. Одно с другим абсолютно не связано. И как ответили, что они означают, в документации компоновщика. Здесь предполагается, что это gnu, поскольку не указано, скрипты компоновщика не считаются переносимыми.   -  person old_timer    schedule 18.10.2020
comment
Точно так же нет ни одного скрипта компоновщика для arm и одного для risc-v, ни одного для GD32VF103CBT6, у вас есть по одному, который кто-то написал для этих ядер, не универсальный, это должно использоваться для всех вещей Большинство людей ленивы и используют первое, что они находят, они редко тратят время на изучение, как вы здесь, а затем, возможно, адаптируются к своему применению.   -  person old_timer    schedule 18.10.2020
comment
Также помните, что скрипт компоновщика тесно связан с загрузчиком и часто с библиотекой C (и приложением), поэтому вы не можете их разделить, вы разрабатываете их вместе. Еще одна причина, по которой люди придерживаются того, что они находят, а не адаптируются к своему приложению/решению.   -  person old_timer    schedule 18.10.2020
comment
Спасибо @old_timer. К сожалению, большинство линкерных скриптов имеют очень мало комментариев. Я бы хотел, чтобы они были документированы лучше. Это изменило бы мир. Можете ли вы посоветовать хорошую книгу, веб-сайт или другой ресурс, чтобы узнать больше о компоновщиках, загрузочном коде и взаимосвязи с библиотекой C?   -  person K.Mulier    schedule 18.10.2020
comment
В принятом ответе есть ссылка на документацию ld. но также вы должны просто экспериментировать, что является частью этого. 99% работы с «голым железом» — это чтение и эксперименты, относительно ноль времени тратится на реальное приложение. используйте другие инструменты binutils вместе с ld, readelf. objdump и т. д., чтобы увидеть, что делает этот инструмент. Форматы файлов, такие как elf, легко написать собственную программу для анализа, если этих инструментов недостаточно. Плюс binutils с открытым исходным кодом, нет лучшей документации, чем сам исходный код...   -  person old_timer    schedule 19.10.2020
comment
Привет @old_timer, большое спасибо за помощь. Я хотел бы связаться с вами. Можешь написать мне письмо? Это: kristof<dot>mulier<at>telenet<dot>be, где <at> означает @, а <dot> означает '.' (извините за странный способ, которым я написал ей свое электронное письмо, я просто слежу за тем, чтобы его не поймали поисковые роботы). Надеемся услышать от вас скоро :-)   -  person K.Mulier    schedule 19.10.2020


Ответы (1)


На самом деле это не права доступа, а то, какие разделы могут быть здесь размещены.

Из документации GNU LD (с некоторым искажением форматирования в процессе цитата:

Строка атрибута должна состоять только из следующих символов:

  • ‘R’
    Раздел только для чтения
  • ‘W’
    Раздел чтения/записи
  • ‘X’
    Исполняемый раздел
  • ‘A’
    Распределяемый раздел
  • «I»
    Инициализированный раздел
  • "L"
    То же, что "I"
  • ‘!’
    Инвертировать смысл любого из следующих атрибутов

Если несопоставленный раздел соответствует любому из перечисленных атрибутов, кроме «!», он будет помещен в область памяти. Атрибут '!' меняет проверку для следующих за ним символов, так что неотображенный раздел будет помещен в область памяти только в том случае, если он не соответствует ни одному из перечисленных ниже атрибутов. Таким образом, строка атрибута «RW!X» будет соответствовать любому несопоставленному разделу, который имеет один или оба атрибута «R» и «W», но только до тех пор, пока у раздела нет также атрибута «X».

На этом фоне я бы интерпретировал вашу конфигурацию следующим образом:

flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 64k

... означает, что область флэш-памяти может содержать что угодно, кроме разделов, доступных для записи, и

ram   (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 20k 

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

person Snild Dolkow    schedule 17.10.2020