Так, давненько я не калякал, учеба в меде она такая.
В последний раз мы остановились на том, что же делает ядро с процессами. Так вот, в этом подспорье у ядра есть помощник – модуль управления памятью (MMU), который реализует такую интересную фичу как виртуальная память. В стандартной ситуации, когда у нас нету виртуальной памяти, программа, пытаясь считать/записать те или иные данные, обращается к физическому адресу ОЗУ, т.е. обращается к ячейке, которая располагается непосредственно в микросхеме памяти планки. Но может наступить момент, когда для записи не станет хватать места. Решить данную проблему может Memory Management Unit, который вместо физических адресов станет выдавать процессору виртуальные, уже ведущие не в планку ОЗУ, а в жёсткий диск. В жёстком диске данные могут записываться постранично (данные занимают фиксированный и относительно небольшой кусок памяти, т.е. если данных много, то они разбиваются и записываются в несколько страниц), сегментарно (в этом случае выделяется целостный кусок памяти, который соответствует объему загружаемых данных, т.е. разбиения не происходит), сегментарно-странично (в памяти выделяется сегмент, который затем делится на страницы). Таким образом программа даже не замечает нехватки пространства.
Идём дальше. В одной из статей мы говорили, что пользовательские процессы, в отличие от процессов в режиме ядра, обладают ограничениями. Иногда, если можно так сказать, процессу в режиме пользователя надо сделать то, что он может сделать некорректно или вообще не умеет делать (открытие, чтение, запись файлов). Для этого в ОС ввели системные вызовы fork() и exec(). В общем эти штуки являются некими палками, которыми процессы могут тыкать в ядро, чтобы оно сделало то или иное действие. Когда вызывается fork() ядро создает копию данного процесса, а exec(программа) – ядро запускает программу, которая замещает текущий процесс и выполняет функционал. Допустим, в терминале вы вызвали программу vzlom_pentagona. Оболочка, в которой вы вызвали программу, создает свою копию при помощи fork(), а затем в этой копии вызывает exec(vzlom_pentagona), который убирает копию оболочки и запускает vzlom_pentagona.
На этом 3-х минутная статья подходит к концу, надеюсь хоть интересно/понятно объясняю. Если есть пожелания, пиши в комменты, а там глянем куда двигаться.