Skip to content

Планировщик ОС: инструкция по выполнению

Счетчик программ (PC), который иногда называют указателем инструкций (IP), — это то, что позволяет потоку отслеживать следующую инструкцию для выполнения. В большинстве процессоров ПК указывает на следующую инструкцию, а не на текущую.

The Instruction Pointer (IP) или Указатель инструкций работает следующим образом:

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

  • Регистр относится к CS как к сегментному регистру и указывает на следующую выполняемую команду.

  • Содержимое регистра обновляется при каждой выполненной инструкции.

  • Таким образом программа выполняется последовательно строка за строкой.

Если ты когда-нибудь видел трассировку стека программы Go, ты мог заметить эти маленькие шестнадцатеричные числа в конце каждой строки. Найди +0x39 и +0x72 в листинге 
№1.

Эти числа представляют собой смещение значения PC относительно верхней части соответствующей функции. Значение +0x39 смещения PC представляет собой следующую инструкцию, которую поток выполнил бы внутри функции example, если бы программа не запаниковала. Значение 0+x72 смещения ПК является следующей инструкцией внутри main функции, если управление вернулось к этой функции. Что еще более важно, инструкция перед этим указателем сообщает нам, какая инструкция выполнялась.  Посмотри на программу ниже в листинге №2, которая вызвала трассировку стека из листинга №1.

Шестнадцатеричный номер +0x39 представляет собой смещение PC для инструкции внутри example функции, которая находится на 57 (базовая 10) байтов ниже начальной инструкции для функции. В листинге №3 ниже ты можешь увидеть функцию objdump из example двоичного файла.

Попробуй найти двенадцатую инструкцию, которая указана внизу. Обрати внимание, что строка кода над этой инструкцией является вызовом panic.

Помни: PC — это следующая инструкция, а не текущая. Листинг №3 — хороший пример инструкций на основе amd64, за последовательное выполнение которых отвечает поток для этой программы Go.