我正在做自己的操作系统项目PS64,并且设法启动了64位内核。
我为此做了控制台输出,它似乎起作用了。但是,打印出错误的文字。
GDB说,传递的指针是0x28
,距离指针应该具有的地址很远。
// KernelStart.cpp
void KernelStart() {
KernelConsolePrint("Hello!");
}
// Console.hpp
void KernelConsolePrint(const char* str, const BYTE attribute = 0x07) {
// str points far wrong address at this function
}
这是什么原因? 将64位内核从32位内核映像的后面复制到0x200000
,并从0x200000
开始,当然我在此处传递了用于文本会话的链接器参数。
我尝试使用它的char
数组,它也指向错误的地址,但指向比普通地址靠前1〜4个字节的地址更近。
// KernelStart.cpp
void KernelStart() {
const char[] str = { 'H', 'e', 'l', 'l', 'o', '!', '\0' };
KernelConsolePrint(str);
}
// Console.hpp
void KernelConsolePrint(const char* str, const BYTE attribute = 0x07) {
// ...
for (unsigned i = 0; i < 8; ++i) { // changed loop cond because str points NULL character
*( ( WORD * ) graphic ) = _CONSOLE_CHAR(str[i], attribute);
}
}
// output
[ ]Hello!
^ two characters are appended