Теоретический вопрос про доступ к железу из юзермода

Тема в разделе "WASM.OS.DEVEL", создана пользователем ormoulu, 14 авг 2022.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.084
    Сразу извиняюсь что в теме полный ноль.
    Вопрос такой: возможно ли технически спроецировать шину/порты/whatever железки, допустим видеокарту/видеопамять в пространство пользовательского процесса, полностью убрав обработку (к примеру) видео из ядра.
    Какие потенциальные недостатки у такого решения?
    Может быть, есть и ос, построенные на таком принципе?
    Или существуют какие-либо непреодолимые препятствия типа тайминга, синхронизации, дедлоков? Или современные процессоры позволяют доступ к железу исключительно из нулевого кольца?
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.011
    Адрес:
    Россия, Нижний Новгород
    Можно, конечно, только зачем?
    Процессору не принципиально, откуда ты стучишься к железу. Куда отобразишь память девайса - с такими правами и сможешь с ней общаться.
    С портами аналогично: выстави потоку EFLAGS.IOPL == 3, и сможешь стучать к портам из Ring3. В линуксе есть специальный сисколл iopl() для этого. На винде чуть посложнее, понадобится драйвер, который пропатчит IOPL.
    Просто непонятно, какой смысл. Чтобы что?
    В ядре работать с железками просто удобней: память ядра общая для всех процессов, а юзермод у каждого свой (если мы говорим о винде, линуксе и маке).
    А так, just 4 fun, конечно можно - отмапливай память железяки в свой процесс через условную MmMapIoSpaceEx + ремап в юзермод через IoAllocateMdl/MmProbeAndLockPages/MmMapLockedPagesSpecifyCache.
    Или даже проще: через ZwMapViewOfSection, отобразив \Device\PhysicalMemory с нужного адреса.
     
    Последнее редактирование: 14 авг 2022
    ormoulu и Mikl___ нравится это.
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.084
    Секурити, стабильность, масштабируемость.
    Проблема с одним драйвером не уронит всю систему.
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.011
    Адрес:
    Россия, Нижний Новгород
    …которых не будет в юзермоде.
    Например, тебе нужен юзермодный видеодрайвер. Как процесс сможет им воспользоваться?
    Сейчас потоку надо уйти в ядро, где он попадёт в код видеодрайвера, и драйвер в контексте вызвавшего его потока будет общаться с девайсом.
    Отлично, убираем ядерную прослойку и уносим код драйвера в юзермодную дллку, а также мапим память девайса в наш графический процесс.
    Теперь процесс может напрямую читать и писать что-то в память видеокарты. Он может это сделать даже в обход драйвера, даже сделать это случайно.
    Кто-то ошибся в указателе и случайно записал в память видеокарты команду увеличить напряжение на двадцать вольт.
    Или, будь это юзермодный драйвер диска, баг в программе легко устроит тебе format C:. Оно тебе надо? Оно тебе не надо. Поэтому драйвера уносят в ядро, чтобы никто случайно или намеренно не мог свалить всю систему.
    А ещё юзермодный софт имеет свойство падать, а общение с аппаратурой зачастую неатомарно: чтобы сделать что-то, чаще всего нужно послать несколько команд. Что будет, если твоё приложение пошлёт три команды из пяти и упадёт? Девайс останется в неконсистентном состоянии, и лучше нам не проверять, чем это закончится.
     
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.084
    Если формат с: или команду увеличить напряжение подаст ядерный драйвер, что меняется?
    Лишь то, что крашится вся система.
    Юзермодный софт не имеет свойства падать лишь по причине того что он юзермодный. Юзермодный софт падает по причине того что он хреново написан.
    Уже несколько лет как гугл и майкрософт много что из ядра перенесли в юзермод. Отказов стало сильно больше?
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.011
    Адрес:
    Россия, Нижний Новгород
    Но он не подаст, если в нём нет уязвимостей, через которые это смогут сделать. Других способов послать что-то девайсу у пользовательского софта нет.
    Открыв память девайсов и порты юзермоду, ты даёшь злоумышленнику карт-бланш: отныне никто не стоит между ним и железом. Отказ всей системы или даже повреждение железа в этом случае можно будет сделать в пару строчек, не имея никаких привилегий.
    Железо не знает ни про какие права доступа, кто угодно сможет прочитать или записать любой сектор на диске, утащив чувствительные данные, и никто не сможет этому помешать.
    К сожалению, я не знаю ни одного примера. Все драйвера, вся графика, абсолютно всё, что работает с железом во всех операционках, живёт в ядре и никогда не смотрит в юзермод.
     
    Последнее редактирование: 14 авг 2022
  7. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.084
    Впрочем, какая разница )
    Мой вопрос был про теоретическую возможность, спасибо за ответ.
     
  8. algent

    algent Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    55
    Вообще-то, это вопрос из серии - зачем нужна ОС.
    Просто подумайте над смыслом слов:
    "разделяемый ресурс"