当前位置: 技术问答>linux和unix
$$$高分求解,关于带_start函数的原程序的问题
来源: 互联网 发布时间:2015-01-08
本文导语: extern "C" void _start(); void main(); #include "bloader.h" //Global Variables BAD BAD:) unsigned int oldEBP; struct boot_dir *viewableDirectory; int totalMem; char * passedParams; //end global vars void _start(int memSize, char *parms, struct boot_dir *load...
extern "C" void _start();
void main();
#include "bloader.h"
//Global Variables BAD BAD:)
unsigned int oldEBP;
struct boot_dir *viewableDirectory;
int totalMem;
char * passedParams;
//end global vars
void _start(int memSize, char *parms, struct boot_dir *loadedfiles)
{
asm("mov %%ebp, %0":"=m"(oldEBP));
viewableDirectory = loadedfiles; /*make file mem locations global*/
totalMem = memSize; /*make mem of system global*/
passedParams = parms; /*make paramaters passed to system global*/
main();
}
void main()
{
char *vidmem = (char *) 0xb8000;
vidmem[0] = 'H';
vidmem[1] = 0x7;
vidmem[2] = 'e';
vidmem[3] = 0x7;
vidmem[4] = 'l';
vidmem[5] = 0x7;
vidmem[6] = 'l';
vidmem[7] = 0x7;
vidmem[8] = 'o';
vidmem[9] = 0x7;
vidmem[10] = ' ';
vidmem[11] = 0x7;
vidmem[12] = 'W';
vidmem[13] = 0x7;
vidmem[14] = 'o';
vidmem[15] = 0x7;
vidmem[16] = 'r';
vidmem[17] = 0x7;
vidmem[18] = 'l';
vidmem[19] = 0x7;
vidmem[20] = 'd';
vidmem[21] = 0x7;
vidmem[22] = ' ';
vidmem[23] = 0x7;
vidmem[24] = 'O';
vidmem[25] = 0x7;
vidmem[26] = 'S';
vidmem[27] = 0x7;
}
以上程序是为了在裸机上(我想把这个程序编译成一个简单内核,然后用自己的BOOT.COM来启动)显示“HELLO WORLD”
我用G++ main.cc编译,出错如下
main.cc: In function 'int main(...)':
main.cc:23: declaration of C function 'int main(...)' conflicts with
main.cc:3: previous declaration 'void main ()' here
可是明明我在第3行和第23行都是声明的void main()啊,为什么呢?
void main();
#include "bloader.h"
//Global Variables BAD BAD:)
unsigned int oldEBP;
struct boot_dir *viewableDirectory;
int totalMem;
char * passedParams;
//end global vars
void _start(int memSize, char *parms, struct boot_dir *loadedfiles)
{
asm("mov %%ebp, %0":"=m"(oldEBP));
viewableDirectory = loadedfiles; /*make file mem locations global*/
totalMem = memSize; /*make mem of system global*/
passedParams = parms; /*make paramaters passed to system global*/
main();
}
void main()
{
char *vidmem = (char *) 0xb8000;
vidmem[0] = 'H';
vidmem[1] = 0x7;
vidmem[2] = 'e';
vidmem[3] = 0x7;
vidmem[4] = 'l';
vidmem[5] = 0x7;
vidmem[6] = 'l';
vidmem[7] = 0x7;
vidmem[8] = 'o';
vidmem[9] = 0x7;
vidmem[10] = ' ';
vidmem[11] = 0x7;
vidmem[12] = 'W';
vidmem[13] = 0x7;
vidmem[14] = 'o';
vidmem[15] = 0x7;
vidmem[16] = 'r';
vidmem[17] = 0x7;
vidmem[18] = 'l';
vidmem[19] = 0x7;
vidmem[20] = 'd';
vidmem[21] = 0x7;
vidmem[22] = ' ';
vidmem[23] = 0x7;
vidmem[24] = 'O';
vidmem[25] = 0x7;
vidmem[26] = 'S';
vidmem[27] = 0x7;
}
以上程序是为了在裸机上(我想把这个程序编译成一个简单内核,然后用自己的BOOT.COM来启动)显示“HELLO WORLD”
我用G++ main.cc编译,出错如下
main.cc: In function 'int main(...)':
main.cc:23: declaration of C function 'int main(...)' conflicts with
main.cc:3: previous declaration 'void main ()' here
可是明明我在第3行和第23行都是声明的void main()啊,为什么呢?
|
main 是个特殊函数,他由crt0调用。并且根据其返回值确定程序的返回值。所以,估计编译器尤其是C++编译器使用了其内定的声明,可能他认为,你不会去用C++写OS的Loader。呵呵呵呵,在C编译器里,这个问题最多只是一个警告。因为用C写OS Loader得很多。:-)))))
至于用带WARNING编译的内核启动马上死机,这跟你的程序有关。估计你的程序哪里写的不对。还有,如果要自己写Loader,你最好换掉crt0。
至于用带WARNING编译的内核启动马上死机,这跟你的程序有关。估计你的程序哪里写的不对。还有,如果要自己写Loader,你最好换掉crt0。
|
把void main();删掉
把_start函数写到main函数后
把_start函数写到main函数后
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。