- почему программам не разрешен доступ к адресам, превышающим 0xc0000000, не является ли этот адрес, например, 0xc0000008 действительным адресом?
Современные операционные системы используют функцииаппаратное обеспечение для предотвращения взаимодействия приложений друг с другом.Основными компонентами этой изоляции являются разделение привилегий и виртуальная память .
Виртуальная память (в отличие от физическая память ) означает, что адресадоступ к коду (например, инструкция mov
) не является реальным адресом ОЗУ.Вместо этого блок управления памятью (MMU) использует таблицы страниц в , преобразовывая виртуальные адреса (VA) в физические адреса (PA) перед отправкой их в RAM.
Разделение привилегий обеспечивается процессором (и MMU) и позволяет единой операционной системе kernel иметь полный контроль над оборудованием, одновременно обеспечивая безопасное выполнение нескольких .пользователь приложения.
Соединяя эти две концепции, ядро обычно работает в одной области виртуальной памяти (недоступной для пользовательского пространства), а процессы пользовательского пространства выполняются в другой части.
Вx86 32-битный арочный порт ядра Linux, часто используется разделение 1-3, чтобы предоставить ядру 1 ГБ пространства виртуальной машины, оставляя 3 ГБ пространства виртуальной машины для каждого пользовательского приложения.Таким образом:
- 0x00000000 - 0xBFFFFFFF: Userspace
- 0xC0000000 - 0xFFFFFFFF: Ядро
если программам действительно не разрешен доступ к адресам больше 0xc0000000, 0xfffffffc меньше (меньше) 0xc0000000, так почему же это не получится?
Существует большая разница между тем, как данные представлено (например, в аппаратном регистре или в памяти) и как оно интерпретируется (например, целое число со знаком / без знака, число с плавающей запятой, текстовая строка, изображение и т. д.)
Обратите внимание: если вы интерпретируете 0xFFFFFFFF как 32-разрядное целое число со знаком (со знаком), вы получите -1.Если вы интерпретируете его как целое число без знака, вы получите (2 ^ 32 - 1) = 4294967295.
Адреса всегда без знака;Вообще говоря, нет никаких отрицательных чисел, когда дело доходит до аппаратного обеспечения.
0xFFFFFFFC больше, чем 0xC0000000.Таким образом, здесь это адрес ядра, и любое пользовательское приложение, которое пытается получить к нему доступ, выйдет из строя и получит сигнал SIGSEGV.