Как мы можем создать изолированное адресное пространство для каждого процесса без highmem в 64-битной версии?

0.0.0.0:*обычно появляется на удаленной стороне слушающих сокетов и указывает, что поля удаленного адреса и порта еще не заполнены... что логично для сокета, который прослушивает входящие соединения. У него есть одно значение, хотя :он указывает, что этот сокет будет принимать только соединения IPv4 .

[::]:mysqlотображается на локальной стороне соединений и указывает, что сокет принимает входящие соединения IPv6 (и, возможно, также IPv4 )по любым адресам, которые может иметь эта система, и номер порта присвоено имя mysqlв /etc/services... т.е. номер порта 3306. Обратите внимание, что в самом левом столбце -также есть tcp6вместо просто tcp, чтобы указать, что программа использует IPv6. Сокеты с поддержкой -.

[::]:*является эквивалентом 0.0.0.0:*с поддержкой IPv6 -, т. е. обычно появляется на удаленной стороне слушающих сокетов и указывает, что сокет имеет дело с соединениями IPv6, но адрес удаленной конечной точки & информация о порте еще не заполнена.Однако этот может также включать IPv4.

Все адресное пространство IPv4 может быть отображено как подмножество адресного пространства IPv6 :, например, адрес IPv4 1.2.3.4может быть отображен ядром в адрес IPv6 ::ffff:102:304, если приложение использует API сокетов IPv6. Вот почему программа, поддерживающая IPv6 -, может просто использовать структуры адресов в стиле IPv6 -во всем на уровне TCP/UDP и не иметь необходимости рассматривать IPv4 как отдельную группу, если только это не требуется специально. (Я думаю, что существуют параметры сокета или какой-то другой механизм, который программа может использовать для включения/отключения этого сопоставления. :Некоторые программы открывают отдельные прослушивающие сокеты для IPv4 и IPv6.)

Тем не менее, многие утилиты с поддержкой IPv6 -будут отображать такие IPv6 -сопоставленные IPv4-адреса в более -удобной для пользователя форме ::ffff:1.2.3.4, чтобы упростить чтение встроенного IPv4-адреса.

1
22.01.2021, 15:02
1 ответ

How can we create a separate and isolated address space for each process without changing mapping between physical memory and virtual memory?

Это именно то, что позволяет виртуальная память, и то, что делает ядро ​​:каждый процесс получает свое собственное, отдельное отображение виртуальной памяти. Это то, что позволяет странице 1000 в одном процессе указывать на физическую страницу X в памяти, в то время как страница 1000 в другом процессе указывает на физическую страницу Y в памяти, а страница 1000 в еще одном процессе выгружается. Каждый раз, когда контекст переключается с одного процесса на другой, отображение виртуальной памяти изменяется в соответствии с новым процессом.

Highmem необходим, поскольку ядро ​​сохраняет собственное отображение физической памяти в своем виртуальном адресном пространстве (на 32 -бит x86, верхнем гигабайте адресного пространства в типичном разделении 3G/1G ). Ядро должно иметь доступ к любой странице физической памяти, независимо от того, отображается ли она в виртуальной памяти текущего процесса; вот почему полезно прямое отображение физической памяти. В 32 -битных системах это прямое сопоставление ограничено по размеру по сравнению с потенциальными размерами физической памяти :, не превышающими примерно 896 МБ на 32 -бит x86. Чтобы получить доступ к физической памяти за пределами этой области, ядру необходимо отображать страницы на лету. В 64-разрядных --битных системах на стороне ядра адресного пространства достаточно места для прямого отображения до 64 ТиБ физической памяти , чего достаточно для большинства систем еще некоторое время (. ] и в системах, где это не так, пять таблиц страниц уровня -позволяют отображать до 32ПиБ физической памяти ).

См. также эту недавнюю -подобную статью LWN , которая включает обновление памяти.

1
18.03.2021, 22:35

Теги

Похожие вопросы