![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 14.08.2019
Сообщений: 65
|
![]()
В TSS есть поле "i/o Map Base Adress". Я понимаю, что для каждой задачи (имеющей свой TSS) можно запретить либо разрешить доступ к каждому из устройств.
Но не понимаю следующего. По адресу "i/o Map Base Adress" в памяти, для цели "запрета/разрешения", должны хранится значения битов для каждой из задач. Хотя служебная структура портов ввода вывода одна. Либо для каждой задачи есть своя служебная структура с разрешениями устройств. Либо процессор переключает состояние битов при каждом переключении задачи. Как процессор это реализует? ![]()
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
|
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
"Permission Map" это статическое поле в TSS. Оно не обновляется процем при переключении задач, а биты в нём выставляются при создании задачи ядром. Когда IOPL задачи меньше CPL (обычно под юзером), этой карты вообще нет в TSS, что означает запрет на инструкции in/out. Вот как её отображает ядерный отладчик SYSER, в который я загрузил свою юм прожку:
Код:
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 14.08.2019
Сообщений: 65
|
![]() Цитата:
Так вычитал, что есть два подхода для работы с устройствами в X86. Этот ответ касается "memory-mapped I/O". Второй подход — это "адресное пространство портов ввода-вывода". Чтобы уже не создавать новую тему... 1. Какой механизм защиты предусмотрен для "пространства портов ввода вывода"? 2. Драйверы используют "memory-mapped I/O" или "пространство портов ввода вывода"?
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
|
|
![]() |
![]() |
![]() |
#4 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Предлогаю в данной теме для карткости "адресса портов ввода вывода" сокращать до APIO.
memory-mapped I/O соответсвенно будет MMIO. MMIO или APIO зависит от устройства. Старые устройства такие как PIC, PIT, 8042 используют APIO новые устройства такие как PCI, USB, APIC, HPeT используют MMIO. MMIO закрывают от прикладных программ при помощи страниц. А драйвера отображают нужные адреса в свое адрестное пространство(АП). Или в АП ядра. А APIO всего 65536 и они закрываются битовой картой. Ссылка на которую лежит в TSS(i/o Map Base Adress ссылается на Permission Map). При аппоратной смене задач i/o Map Base Adress не переключается. Вернее с пентиума 4 а может чуть раньше или позже был введён другой новый механизм аппоратного переключения задач, но в Рунете обънём мало кто знает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#5 | ||
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]() Цитата:
CPL - Current Privelege Level - прописан в двух/младших битах селектора сегмента-кода текущей задачи (регистр CS). Для остальных программных секций DS/ES/SS/FS/GS эти биты [1:0] назвали RPL - Request Privelege Level. Соответственно RPL это запрошенный у системы уровень привилегий, а CPL это назначенная текущему коду привилегия - kernel(0) или user(3). Когда система запускает процесс, для каждой из его секций в системной таблице-дескрипторов GDT создаётся свой дескриптор с характеристиками выделяемой секции. В этих дескрипторах в битах [14:13] есть поле DPL - Descriptor Privelege Level, которое определяет Ring дескриптора 0/3. Можно сказать, что по DPL система выставляет RPL/CPL в селекторах сегментных регистров. Кроме того, в регистре флагов EFLAGS имеется 2-битное поле IOPL - уровень привилегий ввода-вывода, с которым выполняется текущая задача. Чтобы программный код мог обратиться к порту в/в, его CPL должен быть меньше/равно IOPL. К этому полю можно подобраться только имея CPL=0, т.е. из ядра. Цитата:
Имеется общее для всех PCI устройств конфигурационное пространство. Каждому устройству в нём выделяется по 256-байт (у некоторых больше), где начиная со-смещения 10h лежат шесть BAR'ов - Base Address Registers. Бит(0) в этих регистрах назвали RTE, и по нему система определяет куда перенаправлять запрос – на пространство портов I/O, или на адресное пространство MMIO. Если этот бит сброшен, то порты девайса лежат в MMIO. Если-же RTE=1, значит это древняя железяка с портами в своей тушке:
Нашедшего выход - затаптывают первым..
|
||
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Зачем нужен драйвер и как написать простейший драйвер Несколько способов как из под Windows XP добраться до портов 42h, 43h, 61h, чтобы сыграть системным динамиком «Марш гладиаторов» Julius'а Fučík'а.
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 14.08.2019
Сообщений: 65
|
![]()
Предполагается, что нужно устанавливать разрешения для программ, работающих в "Ring 0" т.е. с максимальными привилегиями.
Если драйвер из "Ring 0" попытается обратится к другому устройству (не к тому, для которого он написан), — возникнет специфическая для ОС ситуация. ОС должна защищать от драйверов, в коде которых допущена эта ошибка. Запрещает ли ОС драйверам доступ ко всем остальным устройствам (кроме родного для драйвера)?
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
|
![]() |
![]() |
![]() |
#8 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]() Цитата:
А вот драйвера которые сидят в прикладном пространстве к портам доступ не имеют. Они обращаются через API и/или сообщения к ядерным драйверам. К примеру драйвер принтера обращается к драйверу USB через usblib.h. А тот уже пишет в нужные порты. В микроядерных ОС драйвера сидят каждый в своём процессе, т.е. у каждого свое АП. И тут уже можно разграничить доступ к портам. Если не ошибаюсь так сделано ОС Миникс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
![]() |
![]() |
![]() |
#9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Это не так страшно. Есть устоявшийся процесс разработки железа. Который требует иметь пути восстановления после сбоя. А любой автомат не должен зависать в одном состоянии. Так что одиночные сбои нестрашны. И плюс к тому что-бы выполнить хоть какую команду в железе надо сделать несколько записей в регистры, а это уже не так просто(т.е маловероятное событие).
Во-вторых, такие ОС как Линукс и Виндоус имеют механизмы защиты. Они просто добавили виртуализацию и держат по 2 ядра в активном состоянии. Это не столь надёжно чем у микроядерных ОС, но это проще чем согласовать переделку 100 драйверов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 30.08.2019 в 20:38. |
![]() |
![]() |
![]() |
#10 | |
Пользователь
Регистрация: 14.08.2019
Сообщений: 65
|
![]() Цитата:
Если в такой ОС как Windows много чего стандартизировано, то... Отвечают ли "драйверы ядра" какому либо стандарту? Для корпоративных интересов он действительно устоявшийся. А для всяких самоделкиных не очень. К примеру, если исследовать цель создания с нуля своей ОС, — почти неподъемный труд состоит в том чтобы поддерживать на уровне кода все нужные устройства. По процессору можно почитать стандарты в "Software developer manual". А что читать, если нужна документация по железу устройств? Заранее спасибо.
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
Последний раз редактировалось GrimHex; 31.08.2019 в 19:35. |
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В SQL-запросе "UPDATE" в поле "WHERE" неправильно сравнивается переменная. Если заменить переменную в поле «WHERE» на значение, запрос сработает: | Happy_Sweetice | SQL, базы данных | 1 | 24.06.2019 11:55 |
Как связать "поле со списком" с полем "форматированный текста" Word | mcintosh55 | Microsoft Office Word | 0 | 15.12.2018 16:52 |
есть поле выбора select называется "Tip", в базе данных есть поле "idTip", когда эти поля совпадают, нужен вывод таблицы | axeJL | PHP | 4 | 28.06.2016 20:29 |
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") | ZIRASS | PHP | 4 | 15.06.2016 14:23 |
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) | Dorvir | Microsoft Office Excel | 2 | 28.03.2008 10:03 |