Что означает объявление «extern struct cpu * cpu asm («% gs: 0 »)?» Означает?

Когда я читаю исходный код xv6, я смущен синтаксисом объявления ниже. Может ли кто-нибудь объяснить это мне?

extern struct cpu *cpu asm("%gs:0"); 

Я предполагаю, что вы понимаете, что означает extern struct cpu *cpu . У вас есть вопрос: что означает часть asm("%gs:0") ?

Этот код использует расширение gcc, называемое метками asm, чтобы сказать, что переменная cpu определяется строкой ассемблера %gs:0 .

Это НЕ означает, что это расширение предназначено для использования и считается взломом .

Здесь есть прекрасное обсуждение gs (и fs), но вкратце gs указывает на локальное хранилище текущего streamа. Формат данных в gs зависит от вашей ОС (Windows сильно отличается от Linux). Этот конкретный код говорит, что при смещении 0 от gs есть указатель на struct cpu .

Это особый случай метки asm . Он инструктирует компилятор испустить %gs:0 вместо обычного имени символа, если вы ссылаетесь на переменную cpu . Предположительно, %gs ранее был настроен как область хранения для каждого процессора, с указателем struct cpu со смещением нуль. objective состоит в том, чтобы каждый процессор мог получить доступ к своим собственным данным.