Где находятся файлы, связанные со стеком в ОС Unix?

gdb может делать именно то, что вы описываете. Вы можете подключиться к запущенному процессу 123 с помощью такой команды, как:

$ gdb -p 123

Или передать путь к исполняемому файлу:

$ gdb /path/to/program 123

Вы можете использовать команду attach из командной строки gdb для того же эффекта.

Это, кажется, делает все, что вы описываете, поскольку gdb уже может приостанавливать, шагать и проверять память присоединенного процесса (и делать даже больше, например изменять содержимое памяти.)

Основной функцией ядра, используемой gdb, является ptrace (2)(берегитесь, там могут быть драконы! ), поэтому, если вы хотите что-то похожее на gdb, но в чем-то отличающееся, вы можете использовать для этой цели ptrace.

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

Короче говоря, gdb и ptrace делают то, что вы описываете. Конечно, вы можете разработать альтернативы этому инструменту и системному вызову, просто неясно, в чем смысл этого.

0
04.02.2021, 16:02
2 ответа

Термин «стек» перегружен. Некоторые возможные интерпретации включают:

  1. «Стек» — это абстракция над набором структур данных, которая обеспечивает последний -вход -первый -выход (LIFO )доступ к элементам, которые он содержит. содержит.
  2. Существуют реализации "стековой" абстракции. Стек на основе связанных списков -, который вы разработали в своем классе, является одной из таких реализаций. Это не единственное осознание. Например, также возможно построить стек, используя массив.
  3. Стек активации во время выполнения ---, стек, используемый для управления вызовами функций и возвратами во время выполнения потока в программе ---, является другой реализацией абстракции «стека». Его поведение похоже на стек на основе массива -.

В терминах (3 )"кусок" памяти выделяется каждому запущенному потоку в программе. Когда функции вызываются и возвращаются из этого потока, они выталкивают и извлекают «фреймы стека» («элементы» в стеке активации времени выполнения )из стека, связанного с потоком. Особенности того, что содержится в кадре стека, различаются в зависимости от аппаратной архитектуры. Как правило, кадры стека содержат:

  • Обратный адрес вызывающего абонента
  • Некоторые или все параметры функции (зависят от аппаратной архитектуры, количества параметров и их размера)
  • Локальные переменные, определенные внутри функции.
  • Состояние регистров, которые используются функцией, но значения которых необходимо восстановить перед возвратом из функции.

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

Нет stack.cпроверки, потому что код, который управляет стеком записей активации, генерируется компиляторами, которые строят программы на основе функции -за -функцией. Компиляторы генерируют инструкции для запуска вызовов функций. Поскольку компилятор производит инструкции программы, он знает:

  • Какая аппаратная инструкция используется для запуска вызова функции и какое влияние эта инструкция оказывает на стек (например, автоматически ли она сохраняет адрес возврата, настраивает ли она регистр, который отслеживает «верхнюю часть» стека ).
  • Если какие-либо параметры в вызове хранятся в стеке, где эти параметры будут с точки зрения «верхней части» стека.
  • Размер локальных переменных внутри функции и расположение этих переменных по отношению к «верху» стека (, и компилятор использует это для настройки регистра, который отслеживает «вершину» стека. стек ).
  • Регистры, используемые функцией, и когда их необходимо сохранить/восстановить
  • Какая аппаратная инструкция используется для запуска возврата из вызова функции и какое влияние эта инструкция оказывает на стек.

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

Обратите внимание, что хотя стек активации во время выполнения (3 )является реализацией абстракции «стека» (1 ), помимо концепции выталкивания/извлечения записей, он мало похож на связанная реализация на основе -.

6
18.03.2021, 22:32

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

В OpenSSL есть stack.h, библиотека реализует стековую структуру данных. Возможно, это тот, который вы нашли. C++ также имеет стандартный контейнер std::stack. (Файл может называться просто stack, что в моем Linux означает stl_stack.h. )Обычно файлы исходного кода для библиотек не устанавливаются, поскольку они бесполезны для тех, кто не занимается модификацией этой библиотеки. Даже заголовки нужны только для компиляции того, что использует библиотеку.

0
18.03.2021, 22:32

Теги

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