
Полный текст первых минут лекции «Механизм отображения виртуальных адресов в физические» из видеокурса PracticU – субтитры с временной меткой для каждого абзаца. Так можно прочитать и найти нужные темы ещё до начала обучения.
Добро пожаловать на лекцию про память. Давайте начнем с того, что в этой памяти, которая очень-очень быстрая, сидит тайная информация иногда. И проблема в том, что когда мы выключаем электричество, вся информация стирается.
Поэтому у нас есть жесткий диск, который очень медленный. Но вот эта вот память, она очень быстрая. И, кстати, можно всю систему безопасности взломать, например, взломать BitLocker, С помощью того, что мы возьмем и заморозим эту память физическую, заморозим с помощью специального газа в рабочем компьютере.
И во время его работы, когда у него битлокер открыт, когда засчитан весь жесткий диск открытый и ключ тайный только в этой памяти, мы можем взять, заморозить компьютер с помощью газа, вытащить электричество, быстро вытащить эту память, вставить ее в другой компьютер и успеть сфотографировать,
снять снимок всей информации в этой памяти. Именно так взламывается BitLocker. То есть я вам хочу рассказать то, что вы думаете, что когда выключается электричество, вся информация стирается, это правда, но это занимает несколько секунд.
Если взять газ и заморозить эту память с помощью специального газа, то у нас будет еще несколько десятков секунд, и в эти десятки секунд мы успеем все скопировать с этой памяти, то есть переставить ее в мой компьютер, все скопировать, вытащить тайные ключи шифрования,
например, битлокера. Это единственный способ взломать очень такие секьюрные системы, просто вытащить из этой памяти прямо тайные ключи. Но для этого, конечно, надо быть физически рядом с компьютером, и, конечно, надо прийти там с газом и уметь это все делать.
Давайте вернемся к нашим делам. Короче, мы поняли, что эта память очень-очень быстрая, в отличие от жесткого диска, и она работает со скоростью, чтобы вы понимали, 30 гигабайт в секунду.
Когда мы делаем дабл-клик, запускаем какую-то программу, какое-то приложение, операционная система сначала выделяет память для нашего нового процесса и копирует туда весь код в эту память.
То есть операционка сначала копирует код программы в память, а только потом запускает эту программу из памяти. Именно поэтому мы долго ожидаем, когда мы нажимаем на Photoshop, когда мы запускаем Photoshop или какую-то тяжелую программу, мы ждем чего? Того, чтобы он скопировался с жесткого диска в память.
Поэтому игра долго грузится, поэтому программа долго загружается. Это все, потому что с жесткого диска копируется код в память, а только потом начинает исполняться.
Процессор исполняет все только из памяти, потому что он не может сидеть и ждать жесткого диска, а то все было бы очень медленно. Если мы возьмем и выключим электричество с нашего компьютера, то все, что мы работали, сотрется, потому что вся информация тоже сохранена вот в этой памяти.
То есть вот это вот все, что вы видите выше, вот эти все цветные квадратики, это все разные регионы памяти с разными данными, но это все данное.
То есть данные у нас есть разных типов, разных видов, и об этом я поговорю на следующей лекции. Но нам надо сейчас понимать, что код программы находится вот в фиолетовом внизу, там где текст, его обозначают текстом, это такое условное название, которое принято в мире операционных систем.
А все, что выше, это разные данные. Из-за того, что данные сохраняются в памяти, то нам надо обязательно делать сейв на игру, сейв на документ Word.
То есть нам надо сохранять документы. Почему? Потому что они сидят все в памяти. Если выключится электричество, выбьет у нас электричество в квартире, то у нас все полетит, потому что там за несколько секунд вся память сотрется.
А если мы сделаем сейв, мы переложим вот эту информацию на жесткий диск. Теперь я вам покажу что-то более интересное. Заметьте адреса. Какие здесь адреса? Видите, справа есть адреса.
И мы видим, что одна программа думает, что все адреса памяти только ее. Что вся память RAM принадлежит только ей. Видите, от 00000, 48000, это 16-ти речная система исчисления, и FFFFF.
Все-все адреса только ее. И в этом прелесть, что программа не чувствует себя ограниченной. У нее есть сколько хочешь адресов, без всякой связи с реальным физическим миром.
И таких программ в моем компьютере работает параллельно десятки штук. Если вы зайдете в Task Manager, вы увидите в диспетчере задачи, что таких десятки, и каждая думает, что у нее вся память принадлежит ей.
Почему это происходит? Потому что это виртуальные адреса памяти. Программа думает, что это ее, процесс думает, что это ее, Но по факту операционка обманывает и говорит, твои адреса, я тебе скажу по правде, это виртуальные адреса, ты думаешь,
что это все в памяти, но это не в памяти. Иногда я возьму и положу что-то в память физическую, вот эту вот красную, а иногда я это положу на жесткий диск и тебе об этом не буду говорить, ты даже не узнаешь.
Для тебя это все находится в памяти. Почему на жесткий диск, почему на физическую память? Потому что у меня ее недостаточно для всех, у меня много программ параллельно.
Поэтому те программы, которыми пользователи сейчас не пользуются, давайте положим на жесткий диск и ничего ей не скажем.
И когда надо будет подойти к какой-то памяти, мы ее с жесткого диска обратно вернем в физическую память. Мы это сейчас прямо увидим, как это все происходит, весь этот менеджмент за кулисами, как операционная система всем этим руководит и как с этим связана security.
Кстати, заметьте, что таких процессов много в компьютере, то есть это для каждого процесса это происходит. Вот мы можем увидеть на сайте Microsoft, что Notepad работает, и у него, смотрите, сколько адресов, потому что это 64-битная система.
И MyApp тоже, у него столько же адресов. Это вообще какие-то сумасшедшие цифры. Если вы это переведете в 10-ричную систему, вы увидите, что это какие-то сумасшедшие миллиарды.
Поэтому каждая программа думает, что у нас миллиарды гигабайт памяти, и они могут пользоваться любыми адресами. И физически это находится часть здесь, часть там, и часть вообще на жестком диске.
Видите, мы ее как бы не очень ограничиваем, чтобы каждая программа чувствовала, что у нее нет напряга с памятью. Я хочу вам показать, что даже на сайте Microsoft, ну если вы мне не доверяете, прямо написано черным по белым, что в userspace, то есть не в операционной системе, операционка это kernel space, а это userspace, то есть процессы обычного
пользователя. All physical memory pages can be page out. То есть все физические пейджи, страницы памяти могут быть page out, могут быть выгружены на диск.
Вот видите, здесь прямо есть рисунок, что часть пейджов в памяти, а часть пейджов ушло на диск. Кстати, важно понять, что с точки зрения электроники, память это простые адреса, просто адреса, и в каждом адресе есть какое-то значение, то есть адрес, значение, адрес, значение.
Все, что я вам рассказываю, это сложности, которые мы сами себе придумали, чтобы сделать безопасность, чтобы раздавать больше памяти.
Но с точки зрения электроники, это все адрес в памяти и его значение, не более того. А мы хотим управлять этими адресами умно, так, чтобы кто не чувствовал, что у нас не хватает памяти.
Максимум немножечко подождали, пока мы принесли бы что-то жесткого диска. Но все программы могли работать параллельно, быстрее, медленно, но все бы у нас работало.
А теперь я вам показываю таблицу, которая используется операционной системой для управления всей этой памятью. Здесь есть левая колонка, это Virtual Page.
Virtual Page это вот и есть та страница памяти, которая у процесса, у нашей программы. То есть наша программа говорит, дайте мне адрес номер 2, у меня есть адрес номер 2, дайте мой адрес номер 2.
Операционная система с помощью этой таблицы, это называется Page Table или Process Page Table. И она существует в каждом процессе, то есть для каждой программы, запущенной в вашем компьютере, есть такая таблица, с помощью которой операционная система смотрит на то, что у нее попросили, смотрит,
где это находится в этой таблице на физическом уровне, то есть на физической памяти, где это находится, например, в ячейке номер 9, и идет в физическую ячейку номер 9 и дает нам ее значение.
Вот эта вот единичка present bit говорит то, что это действительно находится в памяти. А если у нас попросит наш процесс, наша программа скажет, дай мне страничку номер один, то он увидит, что present bit 0, то есть этой странички в памяти нет, операционка втихаря взяла и выкинула ее на жесткий диск, и тогда сработает такой interrupt
page fold, то есть сработает прерывание события page fold в операционной системе. Вы его, кстати, можете видеть в Task Manager, вы можете увидеть, сколько раз такое происходит.
И это значит, что мы все останавливаем, идем на жесткий диск, приносим вот эту ячейку памяти, которую он попросил, кладем обратно в память и говорим, что все ок.
Но пока это все происходит, мы сидим и ожидаем, чтобы это все произошло, и у нас компьютер как бы висит. Поэтому, когда у нас не хватает памяти, у нас часто происходят такие Page Faults, и мы это можем увидеть в Task Manager.
Рядом с каждым процессом там есть колонки, которые можно добавить, и одна из колонок это PageFolds. И увидеть, сколько таких событий происходит для конкретной программы.
Давайте посмотрим, как это происходит. Вот наша память, наши виртуальные пейджи. Вот таблица, которая говорит, где это находится в физическом мире. Вот эта вот таблица ProcessTable или PageTable.