Durante uma interrupção do software x86, quando exatamente é feita uma troca de contexto?
Estou perguntando isso porque estou tentando implementar interrupções no meu kernel de brinquedo. Então, eu sei que quando ocorre uma interrupção, a CPU envia vários bits de informação para a pilha. No entanto, em todos os lugares em que procuro on-line, são exibidas informações diferentes em ordem diferente. Eu também sei que se a interrupção ocorreu no modo de usuário (Anel 3), a CPU deve alternar para o modo kernel (Anel 0) antes de poder executar o ISR. Eu acho que tem algo a ver com oTSS
ess
eesp
, no entanto, não tenho certeza. Li várias explicações diferentes em toda a Internet e ainda não encontrei nenhuma uniformidade em nenhuma delas.
assimminha pergunta é, em quêexato ordem: a CPU (x86) envia os dados para a pilha durante uma interrupção e quando isso ocorre; e em que momento ele faz uma troca de contexto viaTSS
e como isso afeta os dados que são enviados para a pilha, se houver?
O que aprendi com a pesquisa até agora (corrija-me se estiver errado): Tenho certeza que o processador empurraeflags
, cs
eeip
na pilha, bem como umerror code
se necessário durante uma interrupção. No entanto, isso é tudo o que é empurrado? Eu li em outro lugar quess
eesp
são pressionados, mas não sei se isso acontece o tempo todo, ouporque é empurrado.
Além disso, acredito que a CPU procurará noTSS
para o Ring0ss
eesp
eem algum ponto carregá-los, mas não tenho certeza de quando. Talvez faça isso logo após a interrupção? Além disso, como écs
eds
tratado durante tudo isso? Écs
carregado pela CPU a partir da entrada noIDT
? Sobreds
? Preciso carregar isso manualmente?
Desculpe se este é o lugar errado para perguntar, não sei onde mais devo.