使用绝对内存地址初始化指针

时间:2011-08-20 07:30:50

标签: c memory operating-system system-calls

我正在我正在处理的自定义OS项目中实现put(在屏幕上打印字符串)系统调用。字符串的绝对内存地址由表示unsigned int寄存器的esi变量提供给我,我需要初始化指向unsigned char数组的指针以从中读取字符串。< / p>

寄存器内容由:

表示
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
}

但我没有得到“你好\ n”我应该得到,而是我得到了垃圾。我确认esi的地址确实指向了正确的字符串。我遇到的问题是初始化一个指向这个地址的指针。

谢谢!

更新:我将关闭此问题并将讨论移至新问题,因为原始答案已得到解答。谢谢大家!

3 个答案:

答案 0 :(得分:0)

您的代码正确地将esi分配给p然后s。因此,我只能假设您的问题实际上与此步骤无关。

顺便说一句,我不明白为什么你需要p,只需将esi直接分配给s。

答案 1 :(得分:0)

这段代码没问题,正如@David Heffernan所说,没有使用p。您只需直接将esi分配给s即可。您已检查过地址,但请检查段寄存器值(实模式)/段选择器(保护模式),确保段寄存器值正确且esi中的地址与同一段使用时在处理程序中,以及您描述字符串的位置。可能这会有所帮助。

答案 2 :(得分:0)

正如其他人所说,您可以立即使用s初始化r->esi,而无需中间变量p。但是需要强制转换,因此初始化应该看起来像unsigned char* s = (unsigned char *) r->esi;

然而,关于你的代码的一些事情引起了微弱的怀疑。寄存器名称看起来像x86平台上的32位寄存器的名称。你的指针也是32位吗?即你在编译代码是32位代码吗?