Почему любую программу перед выполнением нужно загрузить в оперативную память

Обновлено: 04.07.2024

В статье Тестируем Bootloader в режиме UART были протестированы команды управления UART-загрузчиком,а также запущена программа, записанная в Flash. Команды загрузчика позволяют записать массив байт в ОЗУ и запустить программу с заданного адреса. Этого достаточно, чтобы записать в ОЗУ программу и её запустить. Этому будет посвящена данная статья.

Для запуска в ОЗУ потребуется программа, которая использует только адреса ОЗУ. Такой пример рассматривался в статье - Запуск программы из ОЗУ в среде Keil, программа называется HelloWorld_RAM. В проект нужно внести изменение (см. раздел "Получение bin-файла").

Получение bin-файла

Для начала необходимо получить бинарный файл программы из проекта HelloWorld_RAM. В этом файле нет ничего лишнего - только байты кода программы. Есть различные конвертеры, которые позволяют из hex файла получить bin файл. Можно было бы использовать их. Но можно использовать штатную возможность Keil, описанную здесь - Keil: GENERATING BINARY OUTPUT DURING A BUILD

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L


Рисунок 1 - Настройки во вкладке Otions for Target -> User для создания bin-файла программы

Теперь необходимо пересобрать проект (Rebuild) HelloWorld_RAM, и в папке проекта появится файл "HelloWorld_RAM.bin". Keil и проект можно закрыть, они больше не потребуются.

Загрузка bin файла в ОЗУ

Далее необходимо узнать размер файла, поскольку для команды LOAD потребуется указать количество байт, записываемых в ОЗУ. Для этого нужно кликнуть правой кнопкой мыши на "HelloWorld_RAM.bin", выбирать свойства и посмотреть точный размер файла в байтах (рисунок 2).


Размер HelloWorld_RAM.bin равен 3116 байт, что в шестнадцатеричной системе равно 0х0С2С. Теперь есть все данные для загрузки программы.

Запустите программу Terminal v1.9b и повторите все действия, описанные в статье Тестируем Bootloader в режиме UART до получения приглашения от микроконтроллера. При желании можно также увеличить скорость обмена по UART, чтобы загрузка прошла быстрее. Например, выставить 19200 бод.

Теперь нужно написать макрос M10. Код команды = 'L', адрес = 0x2000_0000, количество байт = 0x0000_0C2C. Записать программу необходимо с адреса, который был указан в поле IROM1 закладки Options - Target при сборке проекта "HelloWorld_RAM". Там был указан стартовый адрес ОЗУ, поэтому и параметр адрес = 0x2000_0000.

Код макроса М10: L$00$00$00$20$2C$0C$00$00

(2) - После этого придет подтверждение команды загрузки - 'L'.

Теперь можно нажать ОК и файл будет передан в UART (последовательность действий изображена на рисунке 3).


Рисунок 3 - Последовательность действий для загрузки файла HelloWorld_RAM.bin по UART

Спустя несколько секунд, приходит символ 'K' - подтверждение от микроконтроллера об успешном получении 3116 байт. Теперь программа находится в ОЗУ. В терминале это выглядит так:

Запуск

Для запуска программы нужно написать макрос М11, код команды = 'R', стартовый адрес = 0x2000_0000.

Код макроса М11: R$00$00$00$20 >R 00 00 00 20 < 52 = 'R' - подтверждение команды запуска

ОСОБЕННОСТЬ: В некоторых микроконтроллерах требуется указать не стартовый адрес программы, а сразу адрес обработчика Reset_Handle. Этот адрес необходимо взять из загружаемого образа программы, с адреса 4. Первые 4 байта используются для указателя стека, а вторые 4 байта - это и есть необходимый адрес обработчика. Код внутри загрузчика проверяет этот адрес.

Запустите М11. При этом придет приходит подтверждение команды запуска, символ 'R'. Светодиод на плате начинает мигать, значит, записанная программа успешно стартовала из ОЗУ.

Таким не сложным образом можно загружать программу в ОЗУ и запускать ее на исполнение. На основе данного примера можно реализовать прошивку и Flash памяти процессора. Только потребуется загрузить две программы:

пользовательскую программу, которую необходимо зашить в Flash.

После загрузки обеих программ запускается программа-"прошиватель". Эта программа-"прошиватель" будет брать код пользовательской программы и писать ее в Flash. Как это сделать рассмотрено в статье - Прошивка программы в FLASH и запуск через UART.

Оперативна пам’ять призначена для тимчасового зберігання вхідних даних, проміжних і кінцевих результатів обчислень, програм опрацювання даних. Це своєрідний робочий простір для комп’ютера. ОЗП може використовуватися як для читання даних, так і для записування

Пояснення:


Если вас не устраивает ответ или его нет, то попробуйте воспользоваться поиском на сайте и найти похожие ответы по предмету школьной программы: информатика.
На сегодняшний день (16.11.2021) наш сайт содержит 109566 вопросов, по теме: информатика. Возможно среди них вы найдете подходящий ответ на свой вопрос.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту

Последние опубликованные вопросы



Индивидуальные работы по различным предметам

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

Как можно организовать данный сабж? Полагаю нужно создать виртуальный диск в оперативке, те чтобы он монтировался в оперативку, так?



Программы и так запускаются в оперативной памяти.




чтение/запись то с дисков идет.


А энергонезависимую оперативку пока не изобрели. Так что купи SSD и не мучай попу.


а как ты узнаешь что ты смог организовать то что хотел?

вот запустил ты программу — как собираешься узнавать — в оперативке она или нет? :-)


по скорости работы

Результаты подобной операции в винде:

Из приведенного результата видно, что средняя скорость чтения с HDD составляет 70 Мб/с, а скорость чтения с виртуального составляет 1527 Мб/с, что почти в 22 раза больше чем с HDD. Я думаю, комментарии лишние.


А энергонезависимую оперативку пока не изобрели. Так что купи SSD и не мучай попу.

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

Я вот, например, не могу придумать, как. Думал о shm_open + exec, только execve закрывает shared memory ещё до загрузки нового образа.

proud_anon ★★★★★ ( 29.10.14 17:14:18 )
Последнее исправление: proud_anon 29.10.14 17:15:55 (всего исправлений: 1)


Программы разные бывают


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


> вот запустил ты программу — как собираешься узнавать — в оперативке она или нет? :-)

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


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

Просто примонтируй tmpfs и перенеси туда все нужные данные. Естественно, при перезагрузке или внезапном отключении питания всё пропадёт.


Тогда уж ramfs.
Жалко, только, что не пришёл какой-нибудь хакер и не ответил на оригинальный вопрос.


Понимаешь вопрос? Зачем? Почитай про prelink, preload, read-ahead демоны.
Кстати, как по-твоему происходит загрузка исполняемых файлов в память? Ты ведь знаешь, что после загрузки бинарника его можно удалить?

X10Dead ★★★★★ ( 29.10.14 17:27:29 )
Последнее исправление: X10Dead 29.10.14 17:27:58 (всего исправлений: 1)


Просто примонтируй tmpfs и перенеси туда все нужные данные. Естественно, при перезагрузке или внезапном отключении питания всё пропадёт.

тыг в реальной системе — уже ведь полно существует уже примонтированных tmpfs

или /tmp/ (но не у всех).

но нам тут гораздо важнее узнать — что именно хочет топикстартер .. зачем ему всё это нужно.. :)

user_id_68054 ★★★★★ ( 29.10.14 17:29:20 )
Последнее исправление: user_id_68054 29.10.14 17:31:21 (всего исправлений: 2)


И что? Чтение/запись кэшируются в памяти. После того как система прочихается - всё будет в памяти.


Чтобы танки не тормозили, это каждый знает


Из приведенного результата видно, что средняя скорость чтения с HDD составляет 70 Мб/с, а скорость чтения с виртуального составляет 1527 Мб/с, что почти в 22 раза больше чем с HDD. Я думаю, комментарии лишние.

неее.. комментарии как раз НЕ излишни. :)

HDD медленный — но зато *имеет* данные.

оперативка быстрая — но зато *не_имеет* нужных данных.

как ты сделаешь так чтобы в оперативке появились данные? будешь копировать данные из HDD в оперативку? но ведь HDD медленный.. выигрыша нет..


чем оно лучше tmpfs?

Ее давно закапали, работы по откапыванию ведутся

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


А как насчет повторных обращений к этим данным?

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


А как насчет повторных обращений к этим данным?

а повторные обращения — они всё равно физически не будут задействовать HDD (ну там по минимум будут, совсем)


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

думаю кой какой выигрыш будет. я бы так рисковать не стал бы.

не стоит оно того

а если базу дрючат 10к хомячков, чьи действия навечно остаются в этой базе и действий этих под пол сотни в секунду? (:


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

думаю узкое горлышко будет в момент этого синка :)


насчет повторных обращений к этим данным?

Смотри, какой фокус:

не, узкое место, это вайп на несколько минут при факапе, но такое бывает редко


а если базу дрючат 10к хомячков, чьи действия навечно остаются в этой базе и действий этих под пол сотни в секунду? (:

сложный вопрос. нужно все нюансы учитывать.

быть может как-то оттюнинговать базу данных — поособому



Ну будет 1902 MB/c, чем это плохо то?


понятие ОЗУ — не совсем конкретное.


А мемристоры по-твоему что? И оперативку с батарейкой куда отнести? Они успешно существуют уже лет 10 по меньшей мере.


Ну будет 1902 MB/c, чем это плохо то?

Как видишь, результат получается хуже. Можно конечно тут попробовать что-нибудь настроить. Но существенно лучше чем кэш всё равно не будет.

Кстати, а почему ты сравниваешь свою скорость с моей? У меня как бы очень не быстрая память и процессор в этом отношении.


а повторные обращения — они всё равно физически не будут задействовать HDD (ну там по минимум будут, совсем)


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

расскажи это орацле.


читая эти единожды запрашиваемые данные так же постоянно забивает ими кеш

А куда она должна их прочитать? ЕМНИП там файлы ммапятся на страницы памяти, которые потом расшариваются и в кэш и в читающую программу. Т.е. дополнительно под кэш ничего не расходуется.


Окей, здесь ты может и прав, а что по поводу новых данных, генерируемых ежесекундно 1кк хомячками?


не работает так ядро Linux ?


у zfs примерно так и работает кэш.


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


а что по поводу новых данных, генерируемых ежесекундно 1кк хомячками?

Они тоже кэшируются, причём параметры настраиваются. Тут есть такая проблема, что если много держать в пямяти, то во время очередного sync этот самый синк будет долгим и подтормозит другие операции с диском. Так что идея держать всё в ОЗУ (хоть на диске, хоть в кэше) не всегда хороша. Поэтому и есть настройки.


Нагуглил тут такую штуку, как проект RapidDisk и его приложение RapidCache. Кажется, оно умеет делать именно то, что нужно. Буду экспериментировать. А не поможет — подумаю на счёт tmpfs, загрузки при старте, выгрузки при выключении и синхронизации через lsyncd :) Велосипед, конечно, и не так эффективно, как при кешировании, но задача решаемая.


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

Само по себе это не проблема. Есть же всякие lsyncd, которые синхронизируются при изменениях в файлах.

Тут фигово другое — открытые и дописываемые большие файлы. Например, гигабайтный лог веб-сервера. При каждой синхронизации эти гигабайты будут писаться целиком. Так что тут такой подход не подойдёт. Но вот когда файлы меняются мало и они мелкие — может быть эффективно.

ОЗУ, или оперативная память, используется для более быстрой загрузки программ и выполнения задач за долю времени, которое потребовалось бы, если бы программа загружалась с вашего жесткого диска. RAM жизненно важна для производительности в любой программе, которой требуется доступ к огромному объему данных.

Например, программа обработки текста не будет сильно полагаться на оперативную память из-за низких требований к производительности. Однако для подробной электронной таблицы Excel или Photoshop требуется столько оперативной памяти, сколько вы можете сэкономить. И игры тоже. Во многих случаях вам необходимо выделить дополнительную оперативную память для игр, особенно если вы используете много модов.


Это верно в таких играх, как Minecraft, а также в таких играх, как Shadow of Mordor, которым нужны колоссальные 8,3 ГБ видеопамяти. Хорошей новостью является то, что вы можете выделить больше оперативной памяти для определенных приложений, чтобы улучшить их производительность.

Что такое оперативная память?

Думайте об оперативной памяти как об оперативной памяти вашего компьютера. Это позволяет вашей системе получать доступ к данным намного быстрее, чем даже через SSD. Если у вас одновременно работает несколько приложений, вам понадобится больше оперативной памяти, чем если бы вы использовали только несколько одновременно.

Разрешить Windows 10 выделить больше оперативной памяти


После этого нажмите Применить. Изменения вступят в силу после перезагрузки компьютера. Этот параметр позволяет Windows выделять оперативную память по мере необходимости, чтобы программы работали как можно более плавно.

Приоритет использования ОЗУ


Откроется вкладка «Сведения» в диспетчере задач. Щелкните процесс правой кнопкой мыши и выберите Установить приоритет. Отсюда вы можете указать, какой приоритет будет отдаваться программе: в реальном времени, высокий, выше нормального, нормальный, ниже нормального или низкий.

Назначьте использование ОЗУ в определенных программах


Если вы ищете более подробное объяснение, вот еще одна статья, которая может помочь.

У каждой игры и программы будет свой метод выделения дополнительной оперативной памяти, если это вообще возможно. Многие приложения запрограммированы на использование определенного количества ОЗУ в зависимости от вашей операционной системы, независимо от того, сколько у вас доступно. Например, Microsoft Excel в 32-разрядных операционных системах ограничен 2 ГБ ОЗУ.

Риски использования слишком большого количества оперативной памяти

Читайте также: