Инициализация указателя с абсолютным адресом памяти - PullRequest
0 голосов
/ 20 августа 2011

Я внедряю системный вызов put (вывод строки на экран) в пользовательский проект ОС, над которым я работаю. Абсолютный адрес памяти строки дается мне переменной unsigned int, представляющей регистр esi, и мне нужно инициализировать указатель на массив unsigned char для чтения строки из.

Содержимое регистров представлено:

struct regs
{
    unsigned int gs, fs, es, ds;
    unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
    unsigned int int_no, err_code;
    unsigned int eip, cs, eflags, useresp, ss;
};

Я пытался инициализировать указатель на адрес в esi:

void fault_handler(struct regs *r) {
   void *p = (void*)r->esi;
   unsigned char* s = (unsigned char*)p;
   // take s and print it to the screen
}

Но я не получаю "Hello \ n", который я должен получить, вместо этого я получаю мусор. Я проверил, что адрес esi действительно указывает на правильную строку. У меня проблема с инициализацией указателя на этот адрес.

Спасибо!

Обновление: я закрою этот вопрос и перенесу обсуждение на новый вопрос, поскольку на исходный ответ дан ответ. Спасибо всем!

Ответы [ 3 ]

0 голосов
/ 20 августа 2011

Кусок кода в порядке, и, как говорит @David Heffernan, p бесполезен.Вы можете просто напрямую назначить esi на s.Вы проверили адреса, но, пожалуйста, проверьте значение регистра сегмента (реальный режим) / селектор сегмента (защищенный режим), убедитесь, что значения регистра сегмента верны, и адрес в esi используется с тем же сегментом, когдаобработчик, и где вы описываете строку.Возможно, это поможет.

0 голосов
/ 20 августа 2011

Как уже отмечали другие, вы можете немедленно инициализировать s с помощью r->esi без промежуточной переменной p.Однако приведение необходимо, поэтому инициализация должна выглядеть как unsigned char* s = (unsigned char *) r->esi;.

Однако некоторые вещи в вашем коде вызывают слабые подозрения.Имена регистров выглядят как имена 32-битных регистров на платформе x86.Ваши указатели тоже 32-битные?Т.е. вы компилируете свой код как 32-битный код?

0 голосов
/ 20 августа 2011

Ваш код правильно назначает esi для p, а затем s.Таким образом, я могу только предположить, что ваша проблема на самом деле не связана с этим шагом.

В качестве отступления, я не понимаю, зачем вам нужен p, просто присвойте esi непосредственно s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...