- 1
- 2
- 3
- 4
- 5
global _start
_start:
mov ebx,0
mov eax,1
int 0x80
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
global _start
_start:
mov ebx,0
mov eax,1
int 0x80
https://habr.com/company/flant/blog/413959/
Объясните для тупых, как программа в 3 команды может занимать аж 352 байта?
Помню были приколы, когда в блокноте или пейнте писали бинарники.
Археологи говорят, что COM пришли в DOS из CP/M. Хотя можно напейсать свой загрузчик и юзать нешто подобное в других осях.
На винде раньше можно было одну секцию для кода и для всего остального.
ЗЫ. придумал упоротую хуйню – форт-система с прямым шитым кодом, но без адресного интерпретатора, счетчик инструкций – esp, next – ret, но тогда нельзя будет юзать push и оба стека придётся реализовывать программно.
Это ж не микроконтроллер с фиксированными адресами.
Лучше уж тогда вообще глобалки не юзать, имхо. И не пытаться их сэмулировать.
То ли дело ассамблей, там есть встроенные глобальные переменные (регистры):
Лить константы прямо в секцию кода, неподалёку от места их применения, добавляя прямо над ней прыжок на размер константы ( аля jmp short какой-нибудь ).
Помнится, какие-то асм-компиляторы прямо так и делали( в этом случае, адреса констант проставлялись фиксированные ), либо же, чутка хитрее( шортопитухи и вычисление адреса константы относительно запрашивающей константу инструкции ).
В последнем случае, при норм компоновке, получаемый код можно норм внедрять и в другие проги
А знаешь ли ты, что во многих виндах был баг, благодаря которому становилось возможным выполнение произвольного кода? Баг заключался в функции LoadLibraryEx. При подгрузке библиотеки *.dll с точкой входа, управление сразу же передавалось на нее, не спасал даже флаг LOAD_LIBRARY_AS_DATAFILE.
З.Ы. Если скомпилить в a.out, как советует guest, и стрипнуть символы, то получится всего 44 байта (из которых 12 -- твой код, а 32 -- заголовки).
Мало того что это напрямую нарушает принцип обратной совместимости, так еще и некоторые firmware врут, сообщая в BDA (или каких-то таких структурах) что он есть
А меня жутко бесит что в современные PC встраивают какую-то малопонятную вредную дичь под названием UEFI.
Действительно уж лучше бы встроили какой-нибудь бейсик и примитивную ОСь.
З.Ы. Обидно, что этот шелл почти никогда не встраивают в прошивку.
Что там вредного то?
64-битный код с маппингом адресного пространства 1:1. Интерфейсики с разными уровнями абстракции вместо изъёбств с гейтами через риалмод. USB работает из коробки. Драйвера достаточно легко писать. Юникод во все поля. Чем не примитивная ось?
Ограничение на установку неподписанных вендором ОСей.
А UEFI remote mangement — потенциальная гипердыра, похуже мелтдаун и спектрум.
Технология, с помощью которой ПО СЕТИ можно выключать/перезагружать/ломать комп, менять настройки биоса. И я практически уверен что вендорами там оставлен бэкдор.
а с другой стороны кому-то это может помочь не ехать в три часа ночи в датацентр:)
Ну специально обученный дежурный.
Это как раз специально делают какую-то хуйню, а потом "объясняют" почему эта хуйня вам ну очень нужна.
Наше устройство не следит за вами, просто удобно хранить на нашем сервере историю ваших местоположений.
Айфон не собирает базу отпечатков пальцев, это для вашей же безопасности, итд.
А еще иногда бывают бедные конторки где яумамыадмин держит сервера прямо под столом на рабочем месте или в импровизированной серверной в углу.
И там любой out of band management может спасти ситуацию. Хотя в наше облачное время такие решения, наверное, большая редкость
> безопасности
Вход по отпечаткам, имхо, на стороне удобства, но никак не безопасности...
Поставь свои ключи и эта фишка станет плюсом.
> remote management
Ну блин, такого говна и на bios могли напихать (но там написать это было бы на порядок сложнее, да).
Конктрено в ehci и usb-hubs?
Я уже научился selective suspendить у ehci (если порт включен и не делегирован компаньённому ohci/uhci) : надо в PORTSC записать спец битик, и он физически выключает порт. Но на порту сидит его root hub, так что отключаются все устройства (мышка гаснет!).
Я хочу теперь отключить конкретный порт хаба.
В usb2.0 hub spec сказано что надо послать message SetFeature c PORT_SUSPEND (пакет типа setup)
Но я не понял пока надо-ли его слать хабу или конкретному устройству, и что если хаб у меня не 2.0, по-другому-ли там быть?
В идеале хочется сэмулировать поведение Windows PnP manager который умеет отключить всю иерархию: порты через setFeature, потом рутхаб через PORTSC потом сам контроллер через какой-то его протокол, потом само устройство через PCI Power management, затем чуть-ли не рут комплекс через AHCI итд.
То-есть у тебя такое дерево и все оно управляется одном клиентом (линуксовый sysfs примерно такой же, но не такой красивый, а например в freebsd для usb вообще отдельная тулза usbconfig)
Но начать бы с порта.
Дай угадаю: OpenBSD?
Root hub же встроен в контроллер, его портами ты и рулил через PORTSC. А это скорее rate-matching hub (или как там его называют?), без которого тебе бы пришлось бы ебаться с OHCI/UHCI и перебросом медленных девайсов на них.
> надо-ли его слать хабу или конкретному устройству
Хабу. Судя по доке, в 1.х всё было точно так же. Вроде бы в 2.0 хабам только сплит-транзакции добавили.
Это вместо companion ohci/uhci?
А где он спепцифицирован, в ehci?
зы: вижу
компаньены зло, их выкинули на мороз
Так, получается что топология такова:
верно?
>>Вроде бы в 2.0 хабам только сплит-транзакции добавили.
А в тройке?
Я доку по usb3 и xhci боюсь даже открывать.
Если в тройке так же то получается что отключать хабы я могу одинаково в независимости от версии USB, да?
Вот порты рутхаба мне надо отключать в специфичной для *HCI манере.
Бля, там сотня метров и качается как по модему. Но я думаю, что приостановка портов и там будет работать. Зачем базовые фичи ломать без причины? Воткнёшь новый хаб в старый комп со старой осью и он не заработает...
> ehci --> root_hub
[*HCI & root_hub] --> rate_matching --> мышка
Но учти, что на других машинах там могут болтаться компаньоны.
> отключать хабы
Отключать даунстрим порты на всех хабах кроме корневого. На корневом -- да, в специфичной для *HCI манере.
> где он спепцифицирован
Да обычный хаб. Точно такой же, как и все остальные. Отдельной спеки на него не будет.
Так когда я шлю SetFeature(SUSPEND,port) я целюсь в rate matching (ну или в даунстрим), а не в root, правильно?
Root на такие вопросы не отвечает, его надо через *HCI-spefic метод крутить.
>>Но учти, что на других машинах там могут болтаться компаньоны.
ну я уже понял что надо проверить port owner и enabled. Если порт отдали компаньону то он port owner == 1, и тогда его нельзя суспенд через PORTSC.
Меня больше пугает разнообразие топологий: где-то там будет мышка прямо в руте торчать (где нет rate matching), где-то будет rate matching, где-то будет нехуевое такое дерево.. В общем мне надо как-то попросить пользователя указать адрес устройства (или путь к нему) и у близжайшего апстримхаба попросить суспенд.
>>Да обычный хаб.
Короче, у нас бывает 2 вида хабов:
1) рут хаб
2) просто хаб
Первый управаляется через контроллер, второй через setup messages, так стало понятнее.
По ходу вопрос: я верно понимаю как работают мессаджи: их пишут в спец. лист в памяти в виде структурки, и их контроллер оттуда накачивает (его программируют на знание адреса структуры этой) и выполняет и перекладывает типа в лист исполненых. так?
Дык он и не USB девайс, чтобы на них отвечать.
> разнообразие топологий
Enjoy your USB. Ну тут или полный путь по дереву хабов указывать придётся или адрес девайса (он уникальный в пределах HCI).
> работают месседжи
Если HCI с DMA (а на ПК других и нет) -- примерно так, да. Добавляешь ему в очередь структуры с задачками (физический адрес буфера, адрес девайса на шине, эндпоинт на девайсе, что делать) и дальше он сам.
Судя по твоей фразе "адрес девайса на шине" в пакете указан адрес девайса, и хабы сами понимают как его туда доставить, да?
То-есть если ОС выдала номер 42 мышке на вооооон том хабе , но контроллер поймет как это ему доставить через все хабы?
>>Если HCI с DMA (а на ПК других и нет)
Ну, начиная с PCI все шины на ПК умеют DMA, а все HCI вроде и описаны как PCI(express) девайсы. Так что если где-то и есть USB контроллер без DMA то он точно не на PCI) А что, бывают такие?
В общем спасибо тебе, стало как-то понятнее.
Микроконтроллеры. Хотя там тоже DMA, просто не такое навороченное...
> как это доставить через все хабы
Да ему похуй в общем-то. Хабы же не просто так хабами называются. Собственно почему им в 2.0 и пришлось прикручивать сплит-транзакции для портов, куда воткнуты медленные девайсы.
Да нихуя, тупо бродкастят если верить спеке. Ловить SET_ADDRESS и вести табличку им, конечно, никто не мешает, но зачем?
In the downstream direction, hubs operate in a broadcast mode. When a hub detects the start of a packet on its upstream facing port, it establishes connectivity to all enabled downstream facing ports.
З.Ы. В 3.0 может быть и поумнее что-то.
ну да, они же хабы а не свитчи
1) OS видит что девайс ничо не делает
2) ОС его Suspend в соответствии со своим power policy
3) девайс просыпается (ну там мышку дернули например)
Но я это не осилю с ходу, я хочу пока вручную хотяб отключать
А как правильно отключить порт если не через суспенд?
З.Ы. А ты не боишься вот так нагло в обход оси кидать запросы контроллеру? Всё-таки у оригинальных драйверов тоже свой стейт есть.
Я читал про это, но там потом надо reset вроде делать после пробуждения, нет?
Так ты советуешь отрубать порты на хабе через PORT_ENABLE?
>>А ты не боишься вот так нагло в обход оси кидать запросы контроллеру
Ось открытая, так что я прямо в драйверах ковыряюсь)
Но может оказаться что мне придется как-то явно делать reset куче устройств.
А не будет пробуждения. Порт отключится до тех пор, пока ось сама не кинет PORT_RESET или ты устройство не переткнёшь. Т.е. это если тебе надо совсем отрубить порт. Хотя девайс всё ещё может сделать вид, что его переткнули, ось пойдёт делать ему PORT_RESET и порт включится обратно. Но от этого только PORT_POWER отключать, что не везде работает (хаб может не уметь управлять питанием на портах по-отдельности).
А если просто в спячку загнать надо -- то PORT_SUSPEND, как ты и писал.
падажи, а SetPortFeature(PORT_ENABLE) разве не бывает?
>>. Но от этого только PORT_POWER отключать
А если это self-powered device?
>>А если просто в спячку загнать н
Смотри: бизнес-заадача такая: "хочу отключить камеру на ноутубке которой я все равно не польщуюсь".
Мне этот порт лучше suspend или disable? или попробовать убрать power?
> Кто же знает о своем адресе?
Да, устройство.
> SetPortFeature(PORT_ENABLE)
Не бывает. Когда ты втыкаешь девайс, хаб просто уведомляет твою ось об этом, порт остаётся disabled (как и после ClearPortFeature(PORT_ENABLE)). Ось выводит устройства из disabled в enabled по-одному через reset (с помощью PORT_RESET). После reset'а устройство всегда имеет адрес 0 и ось кидает ему SET_ADDRESS, чтобы оно знало, как к нему будут обращаться в будущем. Как-то так.
>> После reset'а устройство всегда имеет адрес 0 и ось кидает ему SET_ADDRESS,
Ну так это тожесамое, что переподключить, верно?
Оно сначала выдаст ему адрес, затем считает всяккие class и vendor, на основе их запустит драйвер который сконфигурирует устройство уже под себя итд.
понятно
А после ручного перетыкания -- пойдёт (т.к. хаб увидел, что в порт что-то воткнули и рассказал об этом оси).
Там еще были нужны какие-то таймауты по спеке: наверное нельзя дизейбл и сразу же ресет, надо сколько-то там подождать
Всё-таки в простое ось ждёт события "девайс выдран" и "девайс воткнут" а не "девайс прошёл резет и готов к установке адреса".
Как ос узнает о втыкании? MSI приходит от *HCI?
Тогда мене надо найти то место в драйверах *hci которое его обрабатывает и как-то его дернуть после ресета
З.Ы. А ведь изначальная идея с suspend вообще работать не будет -- устройство разбудят по первому же запросу от его драйвера. А если драйвера нет -- то никто к нему лезть не будет и оно само уснёт.
Может проще драйвер камеры заблеклистить? :)
Или запросы отшибать с timeout или access denied.
Не очень понял: кто его разбудит? Разве хаб в спящий порт что-то передаст?
Дык в том и фишка suspend'а. Он же для экономии энергии сделан. Хост всегда может разбудить девайс по своему желанию (выведет порт из suspend и девайс тоже проснётся). Полусонный девайс тоже может разбудить хост если какое-нибудь интересное событие произошло (даже если хост и десять хабов по дороге до него тоже спят).
Ты считаешь что драйвер условного mass storage попробует считать данные с устройства, драйвер usb увидит что устройство спит и явно разбудит его порт?
То-есть получится что уложив камеру спать я могу разбудить ее тупо почитав или ioctlнув /dev/[моя_камера]?
Это не так плохо, кстати: если юзер осознано засуспендил порт с флешкой например (чтобы не мигала) то пусть и umount сделает.
Хотя дизеблить ТОЖЕ надо. Получается что надо и то и се.
Похоже что умные ОС (винда, ляних) следят за суспеном/резюмом сами, а вот задизеблить явно дают пользователю
suspend отрубил мышку, а вот планшету не отключил питание, а сброс enabled сделал и то и другое.
Правда обратно его включать я пока не пробовал.
Я еще не понял имею-ли я право делать это напрямую, потому что там есть возможность поставить задачу на пул (типа execute_task(указатель_на_функцию). Возможно что там синхронизация структур может сдохнуть если без таски.
Ну в общем я напилю красивый UI, и если патч примут буду у мамы системным програмистом, без тебя бы я долго пытался слать сообщения рут хабу и тупил бы, так что спасибо.
Кстати, на virtualbox это нихуя не работает: эмулируемый ими контроллер имеет только рутхаб и не отключает устройства, а на живом компе работает
А как это сделать? Они же вшиты в девайс, не?
Зайти в setup, снести виндовые вендорские ключи. SecureBoot перейдёт в режим установки. Когда ты запишешь свой ключ в NVRAM, SecureBoot включится обратно и будет доверять только тому, что подписано этим ключом.
Во многих ноутах в сетапе нет опций для их удоления.
Может тулзами какими-то специальными перепрошивать. Но это явный геммор.
Я вот как-то видел Asus который после обновления фирмваре стал насильно ставить сервис, который позволял его удаленно заблочить (типа защита от воровства).
Фирмварь была страшно умная: Она умела NTFS, находила там autochk (это проверка диска, которую винда (session manager точнее0 запускает еще до загрузки чтобы прокрутить лог если выключили некорректно) и патчила autochk чтобы он устанавливал этот сервис.
Ну поскольку autochk в реестре прописан то я скорпировал в "autochk_clean" и прописал его, и теперь фирмваря патчит autochk который не запускается.
Смешно конечно, но это безопаснее чем считывать rom, вырезать оттуда эту дрянь и лить его обратно: можно сделать кирпич (программатора у меня не)
харам же
собери ноут из исходников!
Они должны
1) использовать CoreBoot (ну или фирмварю с исходниками)
2) иметь только то железо, которое официально документировано (например нельзя иметь карту от nvidia)
Некоторые считают что только так можно гарантировать безопастность и стабилность: никаких БЛОБов, никакой проприетарщины
Х.з., это что-то совсем анально огороженное. Что за ноут?
> тулзами
Маловероятно, это ж ёбаная дыра если обычный софт может менять состояние секьюрбута. Только программатор, только хардкор...
Ну нихуя себе. Помню, иду я по улице, смотрю -- бабушку ветром сдуло, а оказывается это ты свой нубук включил...
Что до твоего вопроса, то может быть два случая:
Из относительно неглубокого сна (типа S3) винда сама может себя выводить, это включается/выключается в powercfg:
Perf.plan/ Sleep / Allow wakeup
См.
https://s8.postimg.cc/iozrpzrjp/power.png
Управляют этим System Wake-up Events
Почитай в MSDN про функцию CreateWaitableTimer
https://docs.microsoft.com/ru-ru/windows/desktop/Power/system-wake-up-events
Если же ты уверен что просыпается именно EFI (я на 60% уверен что это не так, что винда такую странную вещь не стала бы делать)
то в некоторые прошивки (даже когда они были биосами) имели такую опцию: почти всегда она настраивалась через из setup, но ОС могла записать в nvram напрямую.
Например: http://manpages.ubuntu.com/manpages/bionic/man8/nvram-wakeup.8.html
Я не уверен что это умеет винда (грузанись с живого флеша с линуксом и проверь) и совсем не факт что твой фирмварь так умеет.
Так же ACPI 5.0 имеет описние такого устройства:
9.18 Time and Alarm Device.
...
The wake timers allow the system to transition from the S3 (or
optionally S4/S5) state to S0 state after a time period elapses.
Умеет-ли им пользоваться драйвер acpi.sys в винде и есть-ли для того API я не знаю, и не факт что твой EFI это умеет. Можешь считать эту таблицу, конвертнуть в ASL и посмотреть есть-ли она там: если есть то можно наверное написать драйвер который будет ее дергать. Для начала проверь что есть устройство ACPI000E.
Считать список таблиц програмно можно через структуру _DXGK_FIRMWARE_TABLE_INTERFACE (пишет MSDN), но я не пробовал.
Ждем борманда, но начни все таки с отключения просыпа по таймеру
посидим вместе выпем кофе покодим
З.Ы. В виндовом планировщике задач есть галочка "будить комп для выполнения этой задачи". Возможно, что обновление через такую задачу и запускается. Я бы в эту сторону покопал.
http://board.kolibrios.org/viewtopic.php?f=25&t=3446
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
> This forty-five-byte file is less than one-eighth the size of the smallest ELF executable we could create using the standard tools, and is less than one-fiftieth the size of the smallest file we could create using pure C code. We have stripped everything out of the file that we could, and put to dual purpose most of what we couldn't.
Читается на одном дыхании. Зожатие, имперации, оптимизирование до предела.
Постгря вон тоже научилась недавно в индексах прямо данные хранить, в этом индексе не участвовавшие
сейчас приходится засовывать в индекс эти поля, помнить про порядок, и всё равно часто сосать хуйцы, т.к. неупотребление запросом *всех* перечисленных в индексе полей, а, например, только первых (ну что логично), вместо index-only scan приводит к bitmap scan + recheck condition + обращению в исходную таблицу
оракл, например, не ебет так мозги - ему не страшно, если в индексе больше дополнительных данных, чем хочет конкретный запрос, главное с порядком полей угадать - будет всего-то range scan индекса и в исходную таблицу никто не полезет лишний раз
И кто быстрее!!!
Сколько грантов было выделено на эти исследования?
Кстати, это уже не правда: Linux давно перешел на sysenter же, а int 0x80 не используеца
п и з д е ц
http://www.wikireality.ru/wiki/Bugoga
А исключения бывают Trap, Fault и Abort
Я думаю что бОльшую часть этого говна кто-то из местных скриптом насрал
а ГБ это 2001 год. Странное решение конечно
Одно из тех мест которые надо avoid as plague
А чего добился ты?:)
Удивляет конечно только год. Мне кажется это все таки никак не м0жет быть 2007
http://te-44.denisoft.ru/
Этот человек мой кумир
Вот он
http://te-44.denisoft.ru/fa/IMG_0127.jpg
http://te-44.denisoft.ru/index.php?c=teachers
>>Там ничего не было написано про PCI express или Hipertrading.
Никаких стековерфлоу
Все логично же.
После техникума поступил в ОГТУ.
Косил от армии в аспирантуре Гипрониисельпома и работаел монтером/монтажером/монтажником/монтажистом на ОГТРК. Занимался изготовлением рекламы. Сейчас программный директор Первого канала. Первого городского))
После техникума закончил ОГУ, по специальности психолог-преподаватель. Сейчас возглавляет Орловскую Федерацию Ушу, также работает тренером-преподавателем по ушу с
Учился в аспирантуре, но все в нашей жизни временно. Занимался строительством. Сейчас ремонтирует компы в фирме Альфа Мастер.
После технаря отслужил в армии, в ВИПСе, потом перевелся на контрактную службу, в общей сложности прослужил 5 лет, дослужился до сержанта.
После технаря закончил ОГУ. Занимается пассажирскими перевозками.
--------------
Люди идут в техникум, а иногда и в ВУЗ чтобы потом ремонтировать компы, преподавать ушу детям и дослуживаться до сержанта.
ой-ой, какбы тогда релокейшен работал, а?
> файл нулевого размера?
Зогорловок-то должен быть. Я имел ввиду, что будет, если будет лишь один заголовок, а кода -- 0.
Кто вспомнит инструкцию MASMа которая говорила ему что сей файл будет загружен по адресу 100h, и все адреса нужно к нему прибавлять -- тому ничего не будет
Остальным тоже ничего не будет, но спасибо что напомнил что-то такое далекое из моего дества
ЗЫ. Я ещё до твоего вопроса это писал:
http://govnokod.ru/24386#comment417713
программисты не спят