почему 0xfffffffc является недействительным адресом для доступа? - PullRequest
0 голосов
/ 11 октября 2018

Здравствуйте, я читал учебник, он говорит, что программам не разрешен доступ к адресам больше 0xc0000000 (как в случае с 32-битными версиями Linux), поэтому нижеприведенный код сборки недопустим:

1. irmovl $1,%eax
2. xorl %esp,%esp // Set stack pointer to 0 and CC to 100
3. pushl %eax    // Attempt to write to 0xfffffffc, will fail

Я в замешательстве.и у меня есть два вопроса:

  1. почему программам не разрешен доступ к адресам, превышающим 0xc0000000, разве этот адрес не похож на 0xc0000008 действительный адрес?

  2. если программам действительно не разрешен доступ к адресам больше 0xc0000000, 0xfffffffc меньше (меньше), чем 0xc0000000, так почему это не удастся?

1 Ответ

0 голосов
/ 11 октября 2018
  1. почему программам не разрешен доступ к адресам, превышающим 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.

...