- Адресное пространство Linux/Unix
- Русские Блоги
- Процесс Linux (2) адресное пространство процесса
- Адресное пространство процесса
- Зачем создавать такой адрес виртуальной памяти?
- Почему бы не позволить процессу напрямую обращаться к физической памяти?
- Таблица страниц
- Интеллектуальная рекомендация
- Используйте Maven для создания собственного архетипа скелета проекта (4)
- Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
- Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
- Учебный дневник — перелистывание страниц
- Нулевое основание для отдыха-клиента
- Вам также может понравиться
- Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
- Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
- Шаблон алгоритма конной повозки
- 35 Line Code, чтобы получить метод исследования событий (ON)
- Образ докера: gitlab
Адресное пространство Linux/Unix
В качестве рабочего определения мы приняли, что процесс является запушенной программой. Это означает, что операционная система загрузила исполняемый файл для этой программы в память, сделала доступными аргументы командной строки и переменные окружения и запустила ее. Процесс имеет пять выделенных для него концептуально различных областей памяти:
Часто называемая сегментом текста область, в которой находятся исполняемые инструкции. Linux и Unix организуют вещи таким образом, что несколько запушенных экземпляров одной программы по возможности разделяют свой код; в любое время в памяти находится лишь одна копия инструкций одной и той же программы (Это прозрачно для работающих программ.) Часть исполняемого файла, содержащая сегмент текста, называется секцией текста.
Статически выделенные и глобальные данные, которые инициализированы ненулевыми значениями, находятся в сегменте данных . У каждого процесса с одной и той же запущенной программой свой собственный сегмент данных. Часть исполняемого файла, содержащая сегмент данных, является секцией данных .
Инициализированные нулями данные [38]
Глобальные и статически выделенные данные, которые по умолчанию инициализированы нулями, хранятся в области процесса, который называют областью BSS [39]. У каждого процесса, в котором запущена одна и та же программа, своя область BSS. При запуске данные BSS помещаются в сегмент данных. В исполняемом файле они хранятся в секции BSS .
Формат исполняемого файла Linux/Unix таков, что пространство исполняемого файла на диске занимают лишь переменные, инициализированные ненулевыми значениями. Поэтому большой массив, объявленный как », который автоматически заполняется нулями, не занимает 2 Кб пространства на диске. (Некоторые компиляторы имеют опции, позволяющие вам помещать инициализированные нулями данные в сегмент данных.)
Куча является местом, откуда выделяется динамическая память (получаемая с помощью функции и подобными ей). Когда из кучи выделяется память, адресное пространство процесса растет, что вы можете заметить, отслеживая запущенный процесс с помощью команды .
Хотя память можно вернуть обратно системе и сократить адресное пространство процесса, этого почти никогда не происходит. (Мы различаем освобождение больше не использующейся динамической памяти и сокращение адресного пространства; подробнее это обсуждается далее в этой главе.)
Для кучи характерен «рост вверх». Это означает, что последовательные элементы, добавляемые к куче, добавляются по адресам, численно превосходящим предыдущие. Куча обычно начинается сразу после области BSS сегмента данных.
Сегмент стека – это область, в которой выделяются локальные переменные. Локальными являются все переменные, объявленные внутри левой открывающей фигурной скобки тела функции (или другой левой фигурной скобки) и не имеющие ключевого слова .
В большинстве архитектур параметры функций также помещаются в стек наряду с «невидимой» учетной информацией, генерируемой компилятором, такой, как возвращаемое функцией значение и адрес возврата для перехода из функции к месту, откуда произошел вызов. (В некоторых архитектурах для этого используются регистры.) Именно использование стека для параметров функций и возвращаемых ими значений делает удобным написание рекурсивных функций (тех, которые вызывают сами себя) Переменные, хранящиеся в стеке, «исчезают», когда функция, их содержащая, возвращается, пространство стека используется повторно для последующих вызовов функций. В большинстве современных архитектур стек «растет вниз», это означает, что элементы, находящиеся глубже в цепи вызова, находятся по численно меньшим адресам. В работающей программе области инициализированных данных, BSS и кучи обычно размещаются в единой протяженной области: сегменте данных. Сегменты стека и кода отделены от сегмента данных и друг от друга. Это показано на рис. 3.1.
Рис. 3.1 . Адресное пространство Linux/Unix
Хотя перекрывание стека и кучи теоретически возможно, операционная система предотвращает этот случай, и любая программа, пытающаяся это сделать, напрашивается на неприятности. Это особенно верно для современных систем, в которых адресные пространства большие и интервал между верхушкой стека и концом кучи значителен. Различные области памяти могут иметь различную установленную на память аппаратную защиту. Например, сегмент текста может быть помечен «только для исполнения», тогда как у сегментов данных и стека разрешение на исполнение может отсутствовать. Такая практика может предотвратить различные виды атак на безопасность. Подробности, конечно, специфичны для оборудования и операционной системы, и они могут со временем меняться. Стоит заметить, что стандартные как С, так и C++ позволяют размещать элементы с атрибутом в памяти только для чтения. Сводка взаимоотношений различных сегментов приведена в табл. 3.1.
Таблица 3.1 . Сегменты исполняемой программы и их размещение
Память программы | Сегмент адресного пространства | Секция исполняемого файла |
Код | Text | Text |
Инициализированные данные | Data | Data |
BSS | Data | BSS |
Куча | Data | |
Стек | Stack |
Программа распечатывает размеры в байтах каждой из секций text, data и BSS вместе с общим размером в десятичном и шестнадцатеричном виде. (Программа показана далее в этой главе; см. раздел 3.2.5 «Исследование адресного пространства».)
cc ‑o ch03‑memaddr.с ‑о ch03‑memaddr
ls ‑l ch03‑memaddr
size ch03‑memaddr
strip ch03‑memaddr
ls ‑l ch03‑memaddr
size ch03‑memaddr
Общий размер загруженного в память из файла в 12 320 байтов всего лишь 1742 байта. Большую часть этого места занимают символы (symbols) , список имен переменных и функций программы. (Символы не загружаются в память при запуске программы.) Программа удаляет символы из объектного файла. Для большой программы это может сохранить значительное дисковое пространство ценой невозможности отладки дампа ядра[40], если таковой появится (На современных системах об этом не стоит беспокоиться, не используйте .) Даже после удаления символов файл все еще больше, чем загруженный в память образ, поскольку формат объектного файла содержат дополнительные данные о программе, такие, как использованные разделяемые библиотеки, если они есть.[41]
Наконец, упомянем потоки (threads) , которые представляют несколько цепочек исполнения в рамках единственного адресного пространства. Обычно у каждого потока имеется свой собственный стек, а также способ получения локальных данных потока , т.е. динамически выделяемых данных для персонального использования этим потоком. Мы больше не будем рассматривать в данной книге потоки, поскольку это является продвинутой темой.
Выделение памяти
Четыре библиотечные функции образуют основу управления динамической памятью С Мы опишем сначала их, затем последуют описания двух системных вызовов, поверх которых построены эти библиотечные функции. Библиотечные функции С, в свою очередь, обычно используются для реализации других выделяющих память библиотечных функций и операторов C++ и .
Наконец, мы обсудим функцию, которую часто используют, но которую мы не рекомендуем использовать.
Библиотечные вызовы: , , ,
Динамическую память выделяют с помощью функций или . Эти функции возвращают указатели на выделенную память. Когда у вас есть блок памяти определенного первоначального размера, вы можете изменить его размер с помощью функции . Динамическая память освобождается функцией .
Отладка использования динамической памяти сама по себе является важной темой. Инструменты для этой цели мы обсудим в разделе 15.5.2 «Отладчики выделения памяти».
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.
Источник
Русские Блоги
Процесс Linux (2) адресное пространство процесса
В предыдущем разделе мы упоминали концепцию родительско-дочернего процесса:Родительский и дочерний процессы имеют общий код, и данные открывают место для каждого.
Поскольку дочерний процесс копирует данные с платы родительского процесса, его код, данные и место выполнения точно такие же, как у родительского процесса.Но почему этот код нельзя изменить? Зачем нужно открывать пространство отдельно? Как Linux реализует контроль разрешений и отображение пространства?
Давайте поэкспериментируем с этим кодом
Мы используем глобальную переменную val, чтобы увидеть, изменим ли мы переменную val в дочернем процессе, изменится ли родительский процесс и совпадают ли их адреса.
Поскольку дочерний процесс выполняется в том же месте, что и родительский процесс, позвольте родительскому процессу некоторое время спать и позволить дочернему процессу сначала его изменить.
Произошла странная вещь. Очевидно, дочерний процесс изменил значение val, но родительский процесс не изменился. В то же время размер глобальной переменной val в родительском и дочернем процессах различается и изменяется. Но их адреса действительно совпадают, что несколько нелогично, потому что в одном адресе могут быть две переменные с одинаковым именем.
Здесь давайте определимся с одним: адрес, который мы видим в коде, не является настоящим адресом.
Это вводит понятие адресного пространства программы.
Адресное пространство процесса
Программа не занимает память, это просто неодушевленный объект, в память будет загружена только запущенная программа (процесс), которая будет занимать память.
Адрес: адрес — это номер блока памяти, через который можно получить доступ к данным.
Из приведенного выше примера мы обнаруживаем, что адрес, указанный в коде, не является реальным адресом памяти, аАдрес виртуальной памяти。
Зачем создавать такой адрес виртуальной памяти?
Операционная система дляЗапретить процессу прямой доступ к физической памяти,отструктура mm_structЧтобы описать процессВиртуальное, непрерывное, полное адресное пространство (только числа, а не хранилище), Что мы называемВиртуальное адресное пространство。
Почему бы не позволить процессу напрямую обращаться к физической памяти?
Предположим, у нас есть 6 м пространства в нашей памяти, 3 м из которых уже сохранены, затем мы хотим сохранить еще 3 м, но проблема в том, что оставшиеся 3 м физического пространства Прерывистый, поэтому мы найдем непрерывное пространство для хранения этих 3 м.Это привело к большой трате памяти。
Есть еще одна ситуация.
Когда несколько процессов обращаются к физической памяти одновременно, операции каждого процесса могут конфликтовать, что может привести к непредсказуемым последствиям. Память, в которой отсутствует контроль доступа, очень небезопасна.
Таблица страниц
Когда операционная система вводит виртуальное адресное пространство, она также вводит нечто, называемоеТаблица страниц。
Связь между виртуальным адресом и физическим адресом отображается в таблице страниц.
Данные постоянно хранятся по виртуальному адресу, а затем отображаются в физическую память через таблицу страниц для получения дискретного хранилища, что улучшает использование памяти.
В то же время таблица страниц может устанавливать права доступа для определенного адреса и устанавливать определенный адрес как доступный только для чтения.Таким образом, осуществляется контроль доступа к памяти.
Чтобы сделать процессы независимыми и не мешать друг другу, у каждого процесса будет своя собственная таблица страниц и виртуальное адресное пространство.
Вернемся к первому вопросу.
Почему коды родительского и дочернего процессов одинаковы и не могут быть изменены?
: поскольку для сегмента кода задано разрешение только на чтение через таблицу страниц, его нельзя изменить.
Почему отец и сын обрабатывают данные, каждый из которых открывает пространство?
: на самом деле физический адрес и виртуальный адрес родительского и дочернего процессов одинаковы в начале, но когда данные в любом процессе изменяются, операционная система в это время найдет другое физическое пространство и изменится Все данные копируются в измененный процесс в прошлом, а разрешения исходного физического пространства изменяются таким образом, что исходное физическое пространство используется другим процессом.
Интеллектуальная рекомендация
Используйте Maven для создания собственного архетипа скелета проекта (4)
Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .
Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию B. Содержание письма юриста показало, что «на станции B имеется большое кол.
Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.
Учебный дневник — перелистывание страниц
Используйте плагин Layui.
Нулевое основание для отдыха-клиента
Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.
Вам также может понравиться
Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.
Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.
Шаблон алгоритма конной повозки
Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.
35 Line Code, чтобы получить метод исследования событий (ON)
Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.
Образ докера: gitlab
GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .
Источник