OS X 10.8 - пост-системный макет адресного пространства

Я полностью отключил подкачку на моем OS X 10.8.2 (в котором работает ядро ​​x86 LP64) по экспериментальным причинам, я знаю, что это плохая идея.

Когда я выполняю системный вызов из любого приложения, как выглядит макет адресного пространства? Т.е. теперь, когда все адресное пространство подключено (без замены), могу ли я детерминистически получить доступ к любому действительному адресу пользователя из ядра и предположить, что страница, содержащая этот адрес, находится в памяти?

Я понимаю, что да, но я немного запутался после прочтения, что независимо от того, является ли пользовательское пространство 64-битным или 32-битным, ядро ​​OS X всегда работает в 32-битном режиме, и все адресное пространство процесса отключается, а ядро ​​занимает весь 4G. Это применимо к 10.8.2? Если это так, то я не смогу получить доступ к любому действительному адресу пространства пользователя из пространства ядра, верно?

2 ответа

Даже в 64-битном режиме, где пространство ядра зарезервировано в верхней части адресного пространства (т. Е. 0xffffff8000xxxxxx), и даже если нет перестановки, вы не можете получить доступ к памяти пространства пользователя, если только вы не находитесь в режиме ядра, действуя от имени этот процесс пространства пользователя. Причина в том, что все адреса являются виртуальными, и вы полагаетесь на CR3 (управляющий регистр), чтобы сообщить MMU, какие физические страницы принадлежат какому процессу. Поэтому, хотя в принципе у вас есть доступ ко всей памяти в режиме ядра, без CR3 вы не сможете определить, какие страницы принадлежат какому процессу.

Таким образом, внутри системного вызова вы можете перемещать данные в память пользовательского режима и из нее (для этого есть copyin/copyout, аналогично Linux copy_[from/to]_user) - и они также обрабатывают сбои страниц, если страницы действительно поменялся местами, как это обычно бывает. Но это только для активной памяти пользовательского пространства - т.е. активного процесса. Несомненно, есть хаки для доступа к CR3 других процессов, но они весьма обескуражены (если вы не создаете качественное вредоносное ПО).

Во-первых, 32-разрядное ядро ​​/64-разрядное пользовательское пространство имели место до 10,7 (на клиентах) или 10,6 (на серверах). 10.5 и более ранние версии поставлялись только с 32-битными ядрами, 10.6 и 10.7 поставлялись как с 32-битными, так и с 64-битными ядрами (по умолчанию зависит от оборудования), а версии 10.8 и новее имеют только 64-битные ядра.

Во-вторых, в 64-битных ядрах OSX использует разделенную виртуальную адресную структуру ядра / пользователя. Вы правы, что 32-битные заменяют почти все 4 ГБ при переключении между пользовательским пространством и ядром.

Что касается разыменования указателей в пользовательском пространстве напрямую - это плохая идея даже при отключенном свопе, и я бы никогда не отправлял подобный код. Если вы только бездельничаете, все будет в порядке. (одна из причин, по которой это действительно плохо, состоит в том, что отображения памяти могут быть изменены из другого потока)

Другие вопросы по тегам