2015-10-09 2 views
-1

У меня есть следующая ситуация: ОС Linux (ARM) работает на виртуальной платформе, а простая программа запускается в ОС с точкой останова на определенном символе. Когда эта точка останова попадает, мы находимся в пользовательском пространстве.Где находится ARM Linux для хранения текущего ядра SP в режиме пользователя?

Мой вопрос: имея полный обзор всей виртуальной памяти процесса (в настоящее время работает) (то есть, ядро ​​+ пользовательское пространство), могу ли я каким-то образом узнать адрес из task_struct или thread_info структур, расположенных на (внизу) стека ядра? Я знаю, что в режиме ядра можно использовать маску на SP для получения нижней части стека ядра, но это не будет работать, если SP указывает на что-то в пользовательском пространстве. По сути, я пытаюсь сделать что-то похожее на макросы current/current_thread_info() в ядре.

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

Вещи мне нужно избегать:

  1. системных вызовов: ОС, ядро ​​и процесс являются «замороженным» и у нас есть статический вид памяти
  2. вызова любых функций, которые требуют бегущего OS
+2

Да, обратно в старые дни DOS, где каждый процесс может разрушить систему. Боже мой, я надеюсь, что это невозможно! – Olaf

+1

Теперь спросите о реальной проблеме. –

+1

Возможно, что-то с '/ proc/self/task /' * 'threadid' *'/maps' Это не будет быстро, как макросы ядра. –

ответ

2

Чтобы определить режим супервизора SP, когда цель находится в пользовательском пространстве, вам необходимо изучить регистр R13_svc.

Если вы берете это значение и устанавливаете 13 младших значащих бит в ноль, вы должны иметь виртуальный адрес для struct thread_info текущего потока.

+0

Отлично, вот что я искал. Просто чтобы убедиться: сохраненный SP в этом регистре указывает на адрес в стеке ядра текущего процесса, правильно? Я проверю его в понедельник и пометьте его как принятый. – zbarni

+0

@zbarni: Насколько я могу судить, но на самом деле никогда не делал то, что вы просите, мне интересно услышать, как это происходит. – caf

+0

Адрес режима супервизора SP действительно находится в 'r13_svc' (что мне нужно), но пространство ядра недоступно с ядром в режиме пользователя даже на этой виртуальной платформе.Однако изменение ядра на «системный режим» (установка битов режима) решило это. – zbarni

Смежные вопросы