Как разветвление влияет на расположение памяти процесса?

Во-первых, проверьте если net.inet.ip.fw.one_pass установлен.

Во-вторых, я не думаю, что Вам нужен тот параметр маски на Вас конфигурация канала. Вы не можете всегда быть уверены, что пакеты прибывают из порта 80, например, если пользователь связывается из-за NAT и т.д.

В-третьих, я попробовал бы его без правил 200 и 300. Я не совсем уверен, как это обрабатывает передачу по каналу внутренне, но Раздел Формирования трафика ipfw(8) включили в список эти подсказки:

КОНТРОЛЬНЫЙ СПИСОК Здесь является некоторыми важными моментами для рассмотрения при разработке правил:

+o     Remember that you filter both packets going in and out.  Most connec-

tions нужны пакеты, входящие в оба направления.

+o     Remember to test very carefully.  It is a good idea to be near the

консоль при выполнении этого. Если Вы не можете быть около консоли, используйте сценарий автовосстановления, такой как тот в/usr/share/examples/ipfw/change_rules.sh.

+o     **Do not forget the loopback interface.**

И в-четвертых, я изменил бы правило по умолчанию (= последнее правило 65000) для отклонения всех. Это - хороший дизайн брандмауэра и без него, все, что они другой позволять правила просто потрачены впустую ;)

5
10.02.2012, 20:50
4 ответа

После ветвления у Вас есть две копии той же программы. Ядро может или скопировать все адресное пространство или копию на записи. В последнем случае текст и разделы данных будут, вероятно, всегда совместно использоваться обоими процессами, и стек будет скопирован, ЕСЛИ ребенок должен изменить его, таким образом, на и так далее.

3
27.01.2020, 20:39
  • 1
    что относительно того, если Вы выполняете другой процесс? Что происходит затем? –  Dervin Thunk 10.02.2012, 20:51
  • 2
    я не уверен, что понимаю Ваш вопрос. Другой из того же процесса, не посредством ветвления? Через должностное лицо? В целом? –  Splinter of Chaos 10.02.2012, 21:09
  • 3
    , что-то, что запустило бы другой процесс в целом. –  Dervin Thunk 10.02.2012, 23:01

Поскольку каждому процессу присваивают его собственное адресное пространство ("виртуальная память"), адреса будут, вероятно, оставаться тем же, но относиться к различным адресам памяти в таблице преобразования (при изменении). С точки зрения процесса ничего не происходит с адресами, которые она использует и видит.

1
27.01.2020, 20:39

Когда процесс разветвлен, Linux делает очень минимальный объем копирования и использует копию на методе записи. Эта копия на записи означает, что, если оба процесса (родитель и ребенок) делают чтения, они будут читать из тех же самых блоков памяти. После того как один из них пишет в ту память, он копируется и больше не совместно используется.

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

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

2
27.01.2020, 20:39

Целое адресное пространство клонировано. Другими словами, то изображение описывает оба процесса после ветвления. После этого процессы отличаются друг от друга, поскольку каждый из них изменяет вещи по-разному.

0
27.01.2020, 20:39
  • 1
    , я являюсь медленным сегодня. Так, Вы означаете говорить, что это расположение памяти для всех процессов, означая, что, когда Вы разветвляетесь, каждый новый процесс укажет на некоторую часть каждого сегмента. Например, program1 будет иметь адрес 0x1 в сегменте текста, в то время как program2 будет иметь адрес 0xA и так далее для различных сегментов. Одно "расположение памяти", но несколько процессов внутри? Это - это? –  Dervin Thunk 10.02.2012, 20:46
  • 2
    @DervinThunk, каждый процесс имеет свое собственное адресное пространство, которое является отдельным от других, за исключением пространства ядра. Каждый примерно походит на то изображение. Все процессы совместно используют то же пространство ядра. –  psusi 11.02.2012, 00:11
  • 3
    хорошо, таким образом, в рис. это - всего один огромный процесс (~3 Концерта).Спасибо. –  Dervin Thunk 11.02.2012, 01:03
  • 4
    @DervinThunk, на ЦП на 32 бита, адресное пространство составляет 4 ГБ. Обычно ядро резервирует верхнего 1 ГБ как шоу карты. Остальное характерно для процесса. –  psusi 11.02.2012, 04:09
  • 5
    Это не совсем корректно. Целое адресное пространство не клонировано. Linux использует механизм копии на записи так, чтобы абсолютный минимум данных был дублирован на ветвлении. Посмотрите раздел примечаний man 2 fork –  Patrick 11.02.2012, 04:32

Теги

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