Обратите внимание, что я не знаком ни с ARM, ни со встроенным Linux, так что все мои комментарии будут с общей точки зрения.
Во-первых, о кеше: очень рано во время загрузки операционная система выполнит некоторое количество инициализации кеша. То, что это влечет за собой, будет зависеть от процессора к процессору, но общий эффект заключается в том, чтобы обеспечить правильную инициализацию кэша, а затем разрешить его использование процессором. После этого кэш управляется исключительно процессором, и операционная система или ваши программы больше не взаимодействуют с ним.
Теперь, для внешней (вне чипа) и внутренней (внутри чипа) памяти:
Операционная система владеет всем оборудованием в системе, включая внутреннюю и внешнюю память, и в конечном итоге несет ответственность за обнаружение, настройку и распределение этих ресурсов в ядре и пользовательских процессах. В типичной системе (например, на вашем настольном компьютере или сервере 1u) обычно не будет никакого специального внутреннего (встроенного) чипа, и поэтому операционная система может обрабатывать все драмы одинаково. Он перейдет в общий пул страниц (обычно 4 Кб) для выделения процессам, буферам файловой системы и т. Д. В системе со специальной памятью различного рода (nvram, высокоскоростная встроенная память и некоторые другие), общие политики операционной системы обычно не верны.
То, как это будет представлено пользователю, будет зависеть от выбора, сделанного при портировании ОС на эту систему.
Можно изменить операционную систему, чтобы явно знать об этой специальной памяти, и предоставлять специальные системные вызовы для ее выделения пользовательским наземным процессам. Тем не менее, это может быть довольно трудоемким делом, если используемый встроенный Linux не имеет хоть какой-то поддержки для такого рода вещей.
Подход, который я, вероятно, выбрал бы, состоял бы в том, чтобы не изменять само ядро, а вместо этого написать драйвер устройства для внутренней памяти. Драйвер такого типа обычно обеспечивает своего рода интерфейс mmap
, чтобы пользовательские процессы могли получать простой адресный доступ к внутренней памяти.
Вот ответы на некоторые ваши конкретные вопросы.
Какую роль ОС играет в различении этих разных воспоминаний?
Если ваша система использует подход с драйвером устройства, описанный выше, то ОС, вероятно, знает только о внешней памяти или, возможно, достаточно о внутренней памяти, чтобы правильно их инициализировать, хотя это, вероятно, также будет в драйвере устройства, если при все возможно. Если операционная система более четко знает о встроенной памяти, то она обязательно будет содержать любой необходимый код инициализации, а также какую-то схему для обеспечения доступа к пользовательским процессам.
Как определяется, какие буферы будут во внешней памяти, какие будут выделены во внутренней SRAM и т. Д.
Мне кажется маловероятным, что операционная система попытается автоматизировать такой выбор. Вместо этого я подозреваю, что либо ОС, либо драйвер устройства предоставят общий интерфейс для обеспечения доступа к памяти на кристалле и оставят на ваше усмотрение свой код пользователя, чтобы решить, что с ним делать.
Когда в такой системе / коде вызывается calloc / malloc, возвращается указатель, из какой памяти: внутренняя или внешняя?
Почти наверняка, malloc
и друзья вернут указатели в общую память вне чипа. В предложенном выше подходе на основе драйверов вы использовали бы mmap
, чтобы получить доступ к встроенной памяти. Если вам нужно было сделать более детальное распределение, вам нужно написать свой собственный распределитель или найти тот, для которого может быть задан определенный участок памяти для работы.
Может ли пользователь создавать буферы для распределения в памяти по своему выбору (внутренний / внешний)?
Если буферизует , вы имеете в виду регионы, возвращаемые стандартными malloc
вызовами, вероятно, нет. Но если вы имеете в виду «может ли пользовательская программа каким-либо образом получить указатель на встроенную память», то ответ почти наверняка да, но механизм будет зависеть от выбора, сделанного при переносе linux на эту систему.
В архитектурах ARM есть еще одна память, называемая «тесно связанной памятью» (TCM). Что это такое и как пользователь может включить и использовать его? Могу ли я объявить буферы в этой памяти?
Я не знаю, что это. Если бы мне пришлось угадывать, я бы предположил, что это просто еще одна форма оперативной памяти на чипе, но, поскольку у него другое имя, возможно, я ошибаюсь.
Нужно ли мне видеть карту памяти (если есть) аппаратной платы, чтобы понять все эти различные физические запоминающие устройства, присутствующие на типовой аппаратной плате?
Если ОС и / или драйверы устройств предоставили какой-то абстрактный доступ к этим областям памяти, вам не нужно будет явно знать о карте адресов. Однако эти знания необходимы для реализации этого доступа либо в ядре, либо в драйвере устройства.
Надеюсь, это поможет.