Нам осталось рассмотреть последний случай — загрузчик в микроконтроллерах.Во всяком случае, это последний случай в запланированном цикле статей. И сегодняшняя статья будет проще, чем статья о связывающем перемещающем загрузчике. Но при этом и более специфична, так как с микроконтроллерами работает меньше читателей, чем с обычными ЭВМ (пусть и ПК).
Микроконтроллер это микросхема, специализированная однокристальная ЭВМ (они так раньше и назывались) с дополнительными внешними устройствами в одном корпусе. Из всех особенностей микроконтроллеров для себя будет важной только организация памяти. Как и в универсальных ЭВМ память микроконтроллера разделена на ПЗУ и ОЗУ. При этом ОЗУ используется как память данных (переменных), а программный код хранится и выполняется в ПЗУ.
Загрузка программ в ПЗУ микроконтроллера выполняется редко, иногда всего один раз, при изготовлении устройства. Этот процесс часто называется просто — «прошивка». При разработке и отладке устройств на микроконтроллерах прошивку, программу в ПЗУ, необходимо заменять — «перепрошивать» микроконтроллер. Для отладочных целей иногда выпускаются специальные отладочные микросхемы в которых вместо ПЗУ устанавливается ОЗУ. Но такие микросхемы значительно дороже, при выключении питания программа уничтожается, и доступны они не для всех микроконтроллеров.
Считывание прошивки PIC микроконтроллера через PICkit 3
При эксплуатации устройства тоже иногда может возникать необходимость обновления программы в микроконтроллере. Причем не силами сервисного инженера, а силами самого пользователя. И у пользователя может отсутствовать и специализированное оборудование (программатор) и необходимые знания.
Кроме того, в микроконтроллерах могут быть и специализированные области памяти. Например, информация о конфигурации, настраиваемая программистом, служебные идентификаторы, EEPROM, и так далее.
Для облегчения загрузки программ в микроконтроллер, причем без использования специальных программаторов, и предназначен загрузчик — специализированная программа в памяти микроконтроллера. Давайте попробуем заглянуть внутрь микроконтроллера и посмотреть, как такой загрузчик устроен.
Классические способы загрузки программ в микроконтроллеры — программаторы
Сам термин «прошивка» появился очень давно и относился к ПЗУ на ферритовых сердечниках (трансформаторах)
Принцип работы ферритового ПЗУ. Иллюстрация моя
Каждый бит такого ПЗУ представлял из себя трансформатор. Выходная обмотка (на иллюстрации показана сверху) подключалась к усилителям формирователям. Входная обмотка была токовой, один проводник, который пропускался через сердечник если бит должен быть единичным, или обходил сердечник, если бит должен быть нулевым. На иллюстрации показано, как входная обмотка проходит через сердечники для формирования тетрады 1011.
Количество проводников, входных обмоток, определяется объемом ПЗУ. Например, если ПЗУ хранит 512 байт, то будет иметь 8 сердечников и 8 выходных обмоток с усилителями, 512 проводников (входных обмоток). Разумеется, на входе будет адресный дешифратор, но нам это не важно сегодня.
Считывание защищенной прошивки из флеш-памяти STM32F1xx с использованием ChipWhisperer
Проводники входных обмоток протаскивали через сердечники. Это было похоже на шитье, только вместо нити проводник, а вместо иглы специальный челнок. Отсюда и термин.
С развитием технологий появились более компактные ПЗУ. Сначала с расплавляемыми (разрушаемыми) перемычками. Например, 556РТ4 или 556РТ5. Такие ПЗУ программировались только один раз, изменить информацию было невозможно. Немного позже появились ПЗУ, информацию в которых можно было изменять.
Например, 573РФ1 с УФ стиранием.
Появились и ПЗУ с возможностью электрического стирания информации. Например, 573РР2. Дальнейшее развитие этого направления привело к появлению привычных сегодня EEPROM/Flash. Отдельным направлением стали ПЗУ FRAM, которые используются, например, в MSP430.
Давайте абстрагируемся от технологии ПЗУ и посмотрим, как можно загрузить программу в микроконтроллер, прошить его. При том, что микроконтроллер, в отличии от микропроцессора, часто не имеет внешних шин адреса/данных. А для прошивки часто требовалось и повышенное напряжение.
Можно, например, предусмотреть для микроконтроллера специальный режим работы, режим программирования. В этот режим микроконтроллер можно переводить специальной последовательностью сигналов при включении питания. В режиме программирования порты-ввода вывода отключаются от внешних выводов микросхемы и используются специальным образом дополнительными схемами внутри микроконтроллера.
Пример подключения программатора к микроконтроллеру в режиме параллельного программирования. Иллюстрация моя
В данном случае, порт 0 микроконтроллера используется программатором для задания адреса ПЗУ, а порт 1 для как шина данных. Логика перевода микроконтроллера в режим программирования не показана. Вход сброса микроконтроллера одновременно является входом высокого напряжения (например, 12 В) программирования.
Кроме адреса и данных нужны и дополнительные сигналы управления, которые я не стал показывать. Данные и адрес передаются в параллельном виде, что требует большого количества выводов. А сама микросхема микроконтроллера устанавливалась в программатор и прошивалась до установки на печатную плату устройства.
Если прошивку нужно изменить, микроконтроллер требуется снять с платы. Это не очень сложно, если он установлен в панельку. И значительно сложнее, если впаян. Разумеется, речь идет только о микроконтроллерах, которые могут программироваться более одного раза.
Большое количество выводов для параллельного программирования является проблемой для микроконтроллеров с малым количеством выводов. Поэтому естественным шагом был переход к передаче адреса и данных в последовательном виде. Причем можно и адрес, и данные, передавать через один и тот же вывод микросхемы, последовательно друг за другом.
Пример подключения программатора к микроконтроллеру в режиме последовательного программирования. Иллюстрация моя
Теперь для загрузки программы в микроконтроллер нужно всего 3 вывода, если по прежнему требуется источник высокого напряжения. Если высокое напряжение для программирования не требуется, или формируется внутри самого микроконтроллера, то достаточно всего пары выводов. Первый вывод для передачи информации в последовательном коде, второй для тактовых импульсов.
И это не просто небольшое эволюционное изменение. Это дает возможность загружать программу в микроконтроллер уже установленный в устройство, и возможность изменять прошивку.
Это называется внутрисхемным программированием, но аббревиатуры могут быть разными. Для Microchip это называется ICSP, для STM8 — SWI, для MSP430 — SBW. Конкретная реализация нам сегодня не интересна. Важно, что по прежнему требуется специальный программатор.
Да, теперь сервисный инженер может обновить прошивку устройства непосредственно в месте его установки. Или можно сделать универсальное устройство, конкретный функционал которого определяется прошивкой в момент продажи/поставки. Но обновление прошивки самим пользователем все еще является проблемой. Прежде всего тем, что требуется приобретение программатора, часто довольно дорогого.
Есть и еще одна проблема, не видимая на первый взгляд. Пользователь сможет не только обновить прошивку, но и дизассемблировать ее. Ведь стандартные программаторы просто загружают программу в микроконтроллер в том виде, как есть. Сама возможность прочитать программу из микроконтроллера может быть заблокирована, но она ведь уже и так есть у пользователя.
На сцене появляется загрузчик
Нам нужно как то отказаться от жестких протоколов обмена, которые задаются схемотехникой микроконтроллера. Это позволит обойтись и без специализированного программатора. Причем программаторы для разных семейств тоже разные.
Отказ от заданных аппаратно протоколов обмена обозначает переход от аппаратных решений к программным. То есть, нам нужно в памяти микроконтроллера, в ПЗУ, выделить место под размещение специализированной программы, которая сможет обмениваться с внешним миром и осуществлять запись/изменение другой части ПЗУ — собственно основной программы.
Вот эта специализированная программа и называется загрузчиком. Как и ранее рассмотренные начальный загрузчик и связывающий загрузчик, загрузчик в микроконтроллере предназначен для получения программы «извне» и помещения ее в память машины для последующего выполнения. Только теперь сама процедура записи в память будет сложнее, так как вместо ОЗУ установлено ПЗУ.
При этом нам сегодня не важно, какой именно канал связи с внешним миром используется. Это может быть UART, например, в виде RS-232 или RS-485. Это может быть SPI или 1-Wire. Это может быть карта памяти, на которую записывается обновление прошивки. Важно только то, что загрузчик может получить/найти нужную информацию.
Например, несколько устройств, расположенных на значительном удалении, может быть подключена по RS-485 к ЭВМ, которая ими управляет. И обновление прошивки может быть выполнено программой на этой ЭВМ, которая будет взаимодействовать с загрузчиком в микроконтроллерах. Или автономное устройство может быть временно подключено по USB к ПК, на котором запущена программа обновления прошивки. Использование карты памяти ничего не меняет. Просто загрузчику потребуется разобраться с файловой системой и найти файл прошивки.
Кроме решения основной проблемы, обновлении прошивки силами самого пользователя, использование загрузчика позволяет добавить и шифрование самой прошивки. То есть, пользователь будет получать зашифрованный файл с прошивкой, который не сможет дизассемблировать. А загрузчик будет расшифровывать поступающую информацию и записывать ее в память микроконтроллера.
Возникает вопрос, почему нельзя всегда использовать загрузчик, раз он дает такие преимущества? Есть две основные причины. Во первых, загрузчик занимает место в памяти микроконтроллера. И чем он сложнее, тем больше памяти требует для своего размещения. Во вторых, микроконтроллер должен обеспечивать возможность записи в память программ средствами собственно программы.
Как это работает
Давайте сначала рассмотрим абстрактный микроконтроллер с аппаратной поддержкой работы загрузчика
Источник: dzen.ru
Как прочитать программу с микроконтроллера
Ответы на часто задаваемые вопросы:
1. Для кого предназначен этот FAQ?
Большинство специалистов разрабатывающие устройства на микроконтроллерах уже знакомы с темой защиты программ микроконтроллеров, поэтому можно считать, что данный раздел им ни о чем новом не расскажет. Однако имеется огромная армия инженеров и простых потребителей электронных устройств не знакомых с детальной организацией подобной защиты, но желающих либо разобраться в деталях работы имеющегося устройства, либо создать подобное устройство, для них то и предназначен этот сборник ответов на вопросы.
2. Для чего и от кого делается защита микроконтроллеров?
Многие производители электронных устройств стараются защитить свое устройство от возможности простого копирования его другим производителем. Им навстречу пошли производители микроконтроллеров, введя в функционал своих изделий защиту от копирования программы (микропрограммы) содержащийся в памяти микроконтроллера. Используя эту защиту от чтения микропрограммы (прошивки) производители электронных устройств могут защитить свой продукт от простого копирования другим производителем.
3. Что представляет собой защита от копирования в микроконтроллере, и почему я сам не могу считать защищенную микропрограмму (прошивку)?
Обычно защита от копирования устанавливается во время программирования микроконтроллера путем установки специального бита защиты или нескольких бит в слове конфигурации микроконтроллера. Физически эти биты располагаются в специальных ячейках памяти на кристалле микроконтроллера.
Иногда используются другие методы защиты, например защита паролем, но принцип сохраняется. Чтобы снять защиту обычно необходимо изменить значение этого бита или нескольких битов, хотя часто могут использоваться и другие методы считывания содержимого памяти программы микроконтроллера. Обычными методами, например программатором, это сделать не удастся, необходимо сложное дорогостоящее оборудования, которого обычный разработчик электронных устройств не имеет. Поэтому мы, имея необходимое оборудование, знания и опыт, специализируемся на предоставлении подобного рода услуг.
4. Что дает мне снятие защиты от чтения микропрограммы (прошивки)?
Допустим, у Вас есть устройство, которое Вы приобрели у одного из производителей электронных устройств и Вы хотите производить такое же, но модифицированное устройство. Но исходников микропрограммы или готовой прошивки у Вас естественно нет, и Вам будет необходимо полностью с нуля разрабатывать и отлаживать микропрограмму. На это, по сравнению с копированием электронной составляющей устройства (схемы), придется потратить много денег и времени. Пользуясь нашими профессиональными услугами, Вы сэкономите и деньги и время на разработку устройства. При наличии устройства или его электрической схемы мы можем восстановить полностью алгоритм его работы и текст микропрограммы на языке программирования Си или Ассемблер.
5. Какова законность таких действий с точки зрения законодательства?
Все микропрограммы (прошивки) мы считываем по заказу клиента с целью ремонта его устройства, либо для ознакомления с алгоритмом работы микропрограммы. Вся дальнейшая ответственность за незаконное распространение микропрограммы или иные действия с ней или с её помощью ложится полностью на заказчика.
Наша компания работает на территории РФ, поэтому ниже приведем цитату из закона. Законодательство других стран декларирует аналогичную позицию. Статья 1280 ГК РФ. «Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ». .
2. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения изучать, исследовать или испытывать функционирование такой программы в целях определения идей и принципов, лежащих в основе любого элемента программы для ЭВМ, путем осуществления действий, предусмотренных подпунктом 1 пункта 1 настоящей статьи. 3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой.
6. Что представляет собой дополнительная защита от чтения и почему она лучше обычной?
Дополнительная трёхуровневая защита предназначена для создания условий невозможности чтения микропрограммы (прошивки) известными методами. Она может включать в себя от одного до трёх уровней защиты: защита от вскрытия корпуса, скрытый внутрикорпусной обрыв ножки используемой программатором для чтения, скрытое внутрикристальное удаление логики управления ножкой используемой для чтения.
Первый уровень представляет собой стойкий к кислотам и растворителям тугоплавкий полимер, что не позволяет добраться до кристалла. Второй уровень делает невозможной процедуру считывания программатором без специальных дорогостоящих инструментов. Третий уровень выполняет аналогичную второму функцию, но при этом внутрикристальное восстановление логики управления на внутренних слоях практически не возможно, либо требует очень дорогостоящего оборудования. Учитывая, что в подавляющем большинстве случаев обычная заводская защита легко обходится, дополнительная защита для многих дорогостоящих и сложных устройств является крайне необходимой мерой для предотвращения материальных потерь связанных с попаданием плодов интеллектуальной деятельности в руки третьих лиц.
7. Я хочу установить дополнительную защиту, но я боюсь, что вы считаете мою суперсекретную программу перед установкой защиты. Есть ли какой-то способ установить дополнительную защиту на микросхему, перед тем как я ее окончательно запрограммирую?
В данном случае перед установкой нашей дополнительной защиты можно прошить только бутлоадер без основной программы. После того, как мы установим дополнительную защиту, вы уже сможете запрограммировать основную память. Причем бутлоадер для загрузки основной программы должен использовать любой другой интерфейс отличный от основного, использующегося для стандартного программирования, так как основной интерфейс будет отключен после установки нашей дополнительной защиты. Обычно сам бутлоадер не представляет никакого интереса для копирования. В качестве бутлоадера можно использовать свой, либо модифицированный из примеров от производителя микроконтроллера.
8. Я боюсь, что после считывания моя программа может быть передана или использована третьими лицами.
Это исключено, мы никогда никому не передаем считанные микропрограммы и восстановленные исходники, не храним и не используем их сами в своих целях.
9. Работаете ли вы с юридическими лицами?
Да, мы работаем с юридическими лицами в качестве самозанятого (НПД). Выдаем чек от самозанятого после оплаты. Другие документы нам не нужны. Если нужно, есть пример договора и акта: договор, акт
Источник: russiansemiresearch.com
Смотрим результаты работы
Давайте добавим в него какой-нибудь элемент. Для этого нажмём на кнопку «P» в левой панели и из списка выберем элемент. Сверху в строке поиска можно вводить наименование или часть наименования элемента. Попробуем добавить наш микроконтроллер Atmega8. Здесь контроллеры без букв. Выберем именно Atmega8 и нажмем «ОК» либо приеним двойной щелчок по строке с элементом (нажмите на картинку для увеличения размера)
Элемент появится в левой панели
Если мы только что добавили элемент, то, чтобы его установить в рабочем пространстве, выбирать его не нужно, достаточно щёлкнуть по тому месту рабочего пространства, куда мы хотели бы установить данный элемент. По первому щелчку элемент установится, но ещё не «прилипнет» к пространству, то есть мы ещё можем его позиционировать. После второго щелчка наш контроллер жёстко установится.