Проект небольшой, всего 80 Мб кода, на анализ ушло ~5 минут работы анализатора (VmWare 10, 4 ядра, 8 гб памяти) плюс около часа я потратил на разгребание предупреждений и поиск ошибок.
На работе анализировал проекты на 400 — 600 Мб кода, на анализ тратится 10-15 минут, 4 ядра, 8 гб памяти в реальной ОС.
Ну нужно нам такого счастья, извините.
PCIe — это возможность иметь по несколько OptionROMов в каждом устройстве на шине, которые выполняются в контексте BIOSа и могут быть использованы для атаки на него. А т.к. SecureBoot пользователи почему-то дико не любят, то внешние интерфейсы с PCIe — «входные ворота инфекции». А если вдруг от OROMов вредоносных защитились — ну даже и без них PCIe-устройство может инициировать DMA со всей физической памятью, кроме SMRAM, и утащить у вас все пароли и ключи шифрования, которые неосмотрительно хранятся в RAM. Эту проблему решает IOMMU, который включен у двух с половиной параноиков, остальные надеются на то, что им ничего вредоносного в PCIe не попадет, а тут его в каждый USB-порт предлагают добавить…
libcore is built on the assumption of a few existing symbols:
memcpy, memcmp, memset — These are core memory routines which are often generated by LLVM. Additionally, this library can make explicit calls to these functions. Their signatures are the same as found in C. These functions are often provided by the system libc, but can also be provided by the rlibc crate.
rust_begin_unwind — This function takes three arguments, a fmt::Arguments, a &str, and a u32. These three arguments dictate the panic message, the file at which panic was invoked, and the line. It is up to consumers of this core library to define this panic function; it is only required to never return.
Поведение такое же, как в C, и тоже придется либо реализовывать самому, либо использовать библиотеку rlibc, либо обернуть уже доступные gRS->CopyMem и gRS->SetMem.
Вот именно что в UTF8. А в UEFI — в UCS2, в итоге строковые литералы придется делать через макросы, и простого L«String» уже недостаточно.
По поводу memset и memcpu — в С бывают случаи, когда их вызовы могут быть вставлены компилятором автоматически (к примеру, при передаче по значению структуры, размер которой не кратен никакому доступному регистру), а потом при линковке вдруг оказывается, что таких функций нет. Когда я столкнулся с таким поведением впервые — был немало удивлен, поэтому и спрашиваю.
Очень хочу попробовать написать несколько DXE-драйверов на Rust, но пока совершенно не хватает времени на то, чтобы сделать нормальный интерфейс хотя бы к UEFI BootServices и RuntimeServices. Плюс язык новый и малознакомый, плюс хитрое calling convention, плюс строки в UCS2 вместо UTF8, и в итоге получается какой-то хлам, а не драйвер, и проще дальше на С писать.
Вопрос к тем, кто уже пробовал писать на Rust действительно системные вещи (bare-metal, к примеру): сильно сложно жить без стандартной библиотеки? Компилятор не вставляет memset и memcpu самостоятельно?
Стоит еще добавить, что устройства с Thunderbolt (и с любым другим интерфейсом типа «PCI наружу», вроде Firewire или PCMCIA), могут содержать код (т.н. Option ROM), исполняемый с привилегиями BIOSа, через который может быть осуществлена атака на этот самый BIOS, внедрен буткит и получен полный доступ к ПК в обход всех защитных средств ОС.
В качестве превентивной меры помогает SecureBoot, но его пока мало кто включает, ибо «это зло!!!111».
Это действительно i3-4015U D0, и он ищется на ARK-CARE (внутреннем сайте Intel для разработчиков систем) по кодовому имени QAES. Почему его нет в рознице и публичном доступе — я не знаю.
Работаю сейчас над БИОСом для похожей платы, вот такой.
«EDP1» — это Embedded DisplayPort, относительно новый стандарт подключения LCD-панелей, наследник LVDS.
BIOS — AMI'шный Aptio4 референс без изменений, денег на обработку напильником никто тратить не стал.
Теперь к вопросу «зачем платить больше»: за качество железа и ПО, возможности замены при поломке и восстановления при сбое прошивки. Китайский noname хорош там, где его поломка не останавливает работу, так что купить себе такую плату домой — самое то, но для всего остального лучше купить изделие Apple, Intel, Gigabyte или любого известного производителя embedded-решений (Kontron, congatec, advantech, и.т.п.), у которых работает тех. поддержка и прошивки обновляются.
Такие устройства уже пошли, это любые современные видеокарты, SSD с интерфейсом NVMe, разного рода ускорители на FPGA и т.д. На данный момент производители предоставляют и OptionROM для совместимости с legacy BIOS, и DXE driver для UEFI, но втечение пары лет от поставки OROM'ов откажутся окончательно, вместе с отказом от CSM на большинстве десктопов. А на ноутбуках от CSM некоторые производители отказались уже сейчас.
Да мне и AMIBIOS8 хватило, доктор сказал «в морг» — значит в морг.
Люди, которые выше в коментариях пишут про «теплый ламповый простой и отлаженный BIOS» просто не видели, в какую вавилонскую башню из костылей и велосипедов он превратился в конце двухтысячных. Из UEFI я сейчас могу практически безболезненно выкинуть все, к чему у меня не лежит душа. Bosch не устраивает наличие SMM (он мешает работе hard-RTOS) — отключаем. Нам не нравится миллион способов прошивки, а нужно оставить один, но провереный — просто отключаем остальные. Понадобилось заменить чип SuperIO на другой — сменили пару DXE-драйверов и готово.
UEFI — это конструктор LEGO в мире прошивок, и каждый собирает из него то, что считает нужным.
Можно, если очень стараться и все остальное уже и так работает. Многие пользователи Хакинтоша отлаживают свои DSDT и SSDT самостоятельно до состояния Errors 0, Warnings 0, Remarks 0, Info 0, не имея при этом документации, но это все отнимает кучу времени и будет сломано следующим апдейтом БИОСа, а потому разработчикам просто некогда разбираться с ошибками ACPI. Работает — и ладно.
Не просто 16-разрядным, а написанным на ассемблере по большей части. И он больше 20 лет нес с собой груз тогдашних «временных решений» вроде API через прерывания, управления адрессной линией A20, ресетов через порт клавиатуры и работы с таймером 8256. И производители CPU не могли выбросить никому уже не нужный полоработающий 16-разрядный режим потому, что загрузиться станет невозможно.
Да, за эти годы компьютер стал включаться несколько иначе, а с повсеместным внедрением Management Engine — принципиально иначе, только конечному пользователю это не видно и не интересно. И систему, на самом деле, удалось упростить, а не усложнить, вы просто не видели, что творилось внутри какого-нибудь AMIBIOS8 во времена чипсета P55.
По поводу незовможности загрузки альтернативных ОС из коментария ниже — управление ключами доступно, добавляй свои ключи, удаляй стандартные и будь уверен, что на твоей системе не запустится ничего, кроме того, что ты подписал своими руками. А у тех, кто управление ключами пользователю не дает, просто ничего покупать не нужно.
Стоит добавить, что спеку писали законченые наркоманы, а людей, которые могут правильно писать на AML без ошибок, можно по пальцам пересчитать. Более того, примерно 80% AML-кода пишется производителем CPU (которому плевать на warning'и), еще по 10% — IVB и конечным вендором (и будь они хоть кем, их код — капля в море). Да и если большая часть современных ОС на недоработки ACPI все равно плевать хотела (а серьезно пользуется им только OSX), то и отношение к технологии — соответствующее. Пока оно работает хоть как-то — никто ничего трогать не будет, работы хватает и без этого.
Несмотря на вот это все — надежда есть и дело понемногу двигается с мертвой точки. Технологию обязательно обкатают, и лет через 5 у нас будут хорошие и защищенные UEFI-совместимые прошивки, а пока мы имеем то, что имеем, и пытаемся если не совсем избежать удара граблями, то хотя бы надеть каску и приготовить бинты.
Хорошая идея, нажал кнопку — через 30 секунд получил работающую прошивку. Попробую реализовать в одном из следующих проектов, разводка которого еще не закончена.
На работе анализировал проекты на 400 — 600 Мб кода, на анализ тратится 10-15 минут, 4 ядра, 8 гб памяти в реальной ОС.
PCIe — это возможность иметь по несколько OptionROMов в каждом устройстве на шине, которые выполняются в контексте BIOSа и могут быть использованы для атаки на него. А т.к. SecureBoot пользователи почему-то дико не любят, то внешние интерфейсы с PCIe — «входные ворота инфекции». А если вдруг от OROMов вредоносных защитились — ну даже и без них PCIe-устройство может инициировать DMA со всей физической памятью, кроме SMRAM, и утащить у вас все пароли и ключи шифрования, которые неосмотрительно хранятся в RAM. Эту проблему решает IOMMU, который включен у двух с половиной параноиков, остальные надеются на то, что им ничего вредоносного в PCIe не попадет, а тут его в каждый USB-порт предлагают добавить…
Поведение такое же, как в C, и тоже придется либо реализовывать самому, либо использовать библиотеку rlibc, либо обернуть уже доступные gRS->CopyMem и gRS->SetMem.
По поводу memset и memcpu — в С бывают случаи, когда их вызовы могут быть вставлены компилятором автоматически (к примеру, при передаче по значению структуры, размер которой не кратен никакому доступному регистру), а потом при линковке вдруг оказывается, что таких функций нет. Когда я столкнулся с таким поведением впервые — был немало удивлен, поэтому и спрашиваю.
Вопрос к тем, кто уже пробовал писать на Rust действительно системные вещи (bare-metal, к примеру): сильно сложно жить без стандартной библиотеки? Компилятор не вставляет memset и memcpu самостоятельно?
В качестве превентивной меры помогает SecureBoot, но его пока мало кто включает, ибо «это зло!!!111».
«EDP1» — это Embedded DisplayPort, относительно новый стандарт подключения LCD-панелей, наследник LVDS.
BIOS — AMI'шный Aptio4 референс без изменений, денег на обработку напильником никто тратить не стал.
Теперь к вопросу «зачем платить больше»: за качество железа и ПО, возможности замены при поломке и восстановления при сбое прошивки. Китайский noname хорош там, где его поломка не останавливает работу, так что купить себе такую плату домой — самое то, но для всего остального лучше купить изделие Apple, Intel, Gigabyte или любого известного производителя embedded-решений (Kontron, congatec, advantech, и.т.п.), у которых работает тех. поддержка и прошивки обновляются.
Люди, которые выше в коментариях пишут про «теплый ламповый простой и отлаженный BIOS» просто не видели, в какую вавилонскую башню из костылей и велосипедов он превратился в конце двухтысячных. Из UEFI я сейчас могу практически безболезненно выкинуть все, к чему у меня не лежит душа. Bosch не устраивает наличие SMM (он мешает работе hard-RTOS) — отключаем. Нам не нравится миллион способов прошивки, а нужно оставить один, но провереный — просто отключаем остальные. Понадобилось заменить чип SuperIO на другой — сменили пару DXE-драйверов и готово.
UEFI — это конструктор LEGO в мире прошивок, и каждый собирает из него то, что считает нужным.
Да, за эти годы компьютер стал включаться несколько иначе, а с повсеместным внедрением Management Engine — принципиально иначе, только конечному пользователю это не видно и не интересно. И систему, на самом деле, удалось упростить, а не усложнить, вы просто не видели, что творилось внутри какого-нибудь AMIBIOS8 во времена чипсета P55.
По поводу незовможности загрузки альтернативных ОС из коментария ниже — управление ключами доступно, добавляй свои ключи, удаляй стандартные и будь уверен, что на твоей системе не запустится ничего, кроме того, что ты подписал своими руками. А у тех, кто управление ключами пользователю не дает, просто ничего покупать не нужно.