Планировщик ОС: инструкция по выполнению
Счетчик программ (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.