Как инициализируется указатель стека в vector_swi () в системном вызове arm linux? - PullRequest
0 голосов
/ 02 октября 2018

Читая подпрограмму vector_swi() для системного вызова arm linux, я обнаружил, что регистры r0-r12 копируются в стек ядра (ниже приведен код)

ENTRY(vector_swi)
#ifdef CONFIG_CPU_V7M
    v7m_exception_entry
#else
    sub sp, sp, #S_FRAME_SIZE
    stmia   sp, {r0 - r12}          @ Calling r0 - r12 

Согласно моему пониманию, во времясистемный вызов arm входит в режим svc, переходит к процедуре vector_swi() и начинает выполнение.Регистр sp режима svc (sp_svc) указывает на стек ядра.Регистры r0-r12 копируются в стек ядра.

Мой вопрос: как настраивается регистр sp (sp_svc)?

Как узнать адрес стека ядра?Этот стек ядра совпадает со стеком ядра процесса (процесса, который вызвал системный вызов)?

1 Ответ

0 голосов
/ 07 октября 2018

В архитектуре arm32, sp (r13) объединен, что означает, что существуют физически отдельные регистры для режимов USR и SVC.

Для каждого потока пользовательского пространства всегда существует соответствующий поток ядра, имеющий свой стекВыделил и SVC mode r13 очков там.При вводе системного вызова программно-видимый r13 переключается на режим для режима SVC, и инструкции, на которые вы указываете, выполняются после этого.

...