【发布时间】:2011-10-31 02:54:27
【问题描述】:
我正在我正在处理的自定义操作系统项目中实现 puts(在屏幕上打印字符串)系统调用。字符串的绝对内存地址由代表esi 寄存器的unsigned int 变量提供给我,我需要初始化一个指向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 的地址确实指向了正确的字符串。我的问题是初始化一个指向这个地址的指针。
谢谢!
更新:我将关闭此问题并将讨论转移到一个新问题,因为原始答案已得到回答。谢谢大家!
【问题讨论】:
-
您确定您的打印模块工作正常吗?
-
是的。当我将程序图像加载到内存时,我使用相同的代码正确打印了字符串。所以我确定字符串在那里并且打印效果很好。
-
Erm,因此当程序映像未加载到内存时,此操作会失败。这究竟意味着什么?通常,您必须在内存中有一些东西才能使指针工作。
-
@The Tuvias :“......我使用相同的代码正确打印了字符串”呃......但你刚刚说这个代码不能正常工作。那么它是否有效?如果代码功能取决于其他一些因素(有时有效,有时无效),那么也许您应该先看看这些其他因素?
标签: c memory operating-system system-calls