Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: флаги доступа для страниц памяти  (Прочитано 1175 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
флаги доступа для страниц памяти
« : 12 Ноября 2009, 16:00:43 »
Вопрос у меня будет слабо формализованный по причине того что только ответ мне может помочь правильно сформулировать вопрос.

На каком этапе при загрузке или вообще оперативная память разбивается на страницы и на них вешаются флаги доступа типа GFP_KERNEL, GFP_HIGHMEM, GFP_EXEC и т.д. тобишь у них определается переменная flags структуры page. Рано или поздно "мы" это найдем, но вдруг кто этим занимался или сможет подсказать куда лезть чтоб быстрей решить проблему.

Очень вероятно что я вообще неправильно задал вопрос. Если так то есть более общий вопрос: как различаются страницы на которых выполняющиеся процессы выполняются с правами ядра от страницы ... с правами пользователя ?
« Последнее редактирование: 12 Ноября 2009, 16:10:02 от cupper »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: флаги доступа для страниц памяти
« Ответ #1 : 13 Ноября 2009, 05:55:13 »
Страничная адресация на разных процессорах инициализирует (если вообще инициализируется) по разному.
Если для i386 то страничная адресация включается ядром почти сразу после перехода в защищенный режим.

Права выполнения кода зависят не от страниц а от самого процессса. Смена привелегий происходит в специальных шлюзах (особый вид программных прерываний процессора).

Все написаное выше очень грубое представление. Современные системы кое где кое что делают по другому и быстрее. Больше тебе даст чтение документации на разные процессоры.

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: флаги доступа для страниц памяти
« Ответ #2 : 13 Ноября 2009, 11:40:27 »
да забыл указать что для i386.

Цитировать
Права выполнения кода зависят не от страниц а от самого процессса. Смена привелегий происходит в специальных шлюзах (особый вид программных прерываний процессора).

а можно вот это поподробней. Процес хранит информацию о том что он с правами ядра или нет ?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: флаги доступа для страниц памяти
« Ответ #3 : 13 Ноября 2009, 20:39:37 »
нет =) я тут про другие права. права к доступу в адресное пространство и на выполнение кода в данной странице висят на самой странице. страницы хранятся в структуре процессора LDT (подробнее о ней в главе "Управление памятью" смотри ссылку внизу).

переключение user space / ядро / user space происходят в trap'ах (это особый вид прерываний процессора)

i386 имеет довольно сложную систему прерываний. я сейчас буду говорит о прерываниях защищеного режима (protected mode)
информация о них заполняется в особой структуре IDT (это структура не ядра а процессора, но расположена она в адресном пространстве ядра)
сколько то там первых прерываний отдано аппаратным прерываниям (таймер, DMA, прочая аппаратура). на них вешаются соответствующие обработчики
сколько то прерываний программные но генерируются они самим процессором (нарушение защиты процессора, отсутствие страниц в памяти, трассировка и прочее) на них тоже вешеются соответствующие обработчики
остальные номера прерываний свободны. в Linuxе на прерывание 0x80 повешан обработчик системных вызовов.
любой обработчик прерывания выполняется с привелегиями ядра. обработчики прерывания естественно представляют собой "ядерный код".

приложения запущеные на 3м кольце защиты вообще ничего не могут сделать кроме как вариться с выделеном адресном пространстве и то если ядро позволит
многие инструкции процессора требуют приоритета ядра. так что скажем in/out инструкции не выполнятся на третьем кольце возникнет исключение и процессор автоматически выполнит код обработчика программного преоывания "нарушение защиты". а вот инструкцию int 0x80 процесс на 3м кольце имеет право выполнить.
возникнет программное прерывание которое будет обрабатываться на уровне ядра. ура! процесс получил нужные привелегии. фишка в том что процесс не может изменить код который будет выполняться на 0м кольце. тоесть может выполнять только доверенный код ядра в своём контексте.
вот так в грубом приближении построена защита ОС на i386

читай http://sasm.narod.ru/docs/pm/pm_main.htm
« Последнее редактирование: 13 Ноября 2009, 20:43:47 от Yurror »

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: флаги доступа для страниц памяти
« Ответ #4 : 15 Ноября 2009, 11:27:36 »
спасибо, но это то с чего начиналось изучение  :D Я спрашивал про другое, я понимаю что как спросил так и ответили. Еще раз спс, до познания придется ковылять самому.

PS. хотя, может вы могли бы мне пояснить как связаны
Дескриптор (который хранит значение поля DPL), и void *ptr который указывает на выделенную область памяти для "сполняемого кода" ?
Я разобрался в том что для "кода" выделяеться память со специальными флагами одним из который является user/supervisor которая отвечает за некий "уровень привилегий", но как это связанно с неким дескриптором котрый непосредственной уже процессору говорит на каком кольце выполняется "код". Немогу уловить взаимосвязь.
« Последнее редактирование: 15 Ноября 2009, 12:29:32 от cupper »

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: флаги доступа для страниц памяти
« Ответ #5 : 20 Ноября 2009, 13:53:31 »
UP

а может кто нить подкинуть инфы о том как получить дескриптор описывающий сегмент, имея адрес начала  GDT и адрес этого сегмента ?

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.