6 个解决方案
#1
没问题啊,编译的时候只对一个文件进行语法检查。只有在链接的时候,要是找不到这个几个符号的地址,才报错。
就像
int main(void)
{
f();
return;
}
你gcc -S 生成汇编也不会报错啊。
就像
int main(void)
{
f();
return;
}
你gcc -S 生成汇编也不会报错啊。
#2
没学过,帮你up
#3
还有个小问题不太明白,请各位大虾指教,进入32为保护模式运行后,寻址是如何进行的?如在linux/init/main.c中,L71引用宏inb_p(0x71);该宏在io.h中是这样定义的:
#define inb(port)({\
unsigned char _v;\
__asm__ volatile("inb %%dx,%%al":"=a"(_v):"d"(port));\
_v;\
})
那么程序在运行的时候是怎样寻址变量_v的?我如下理解不知道对不对:
首先根据内核数据段描述符形成32位线性地址,如果_v的数据段偏移地址为0x6800,则形成的32位线性地址为0x00006800.
然后根据分页管理,将上述形成的32位线形地址映射到相应的物理地址。
我不知道32位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!
#define inb(port)({\
unsigned char _v;\
__asm__ volatile("inb %%dx,%%al":"=a"(_v):"d"(port));\
_v;\
})
那么程序在运行的时候是怎样寻址变量_v的?我如下理解不知道对不对:
首先根据内核数据段描述符形成32位线性地址,如果_v的数据段偏移地址为0x6800,则形成的32位线性地址为0x00006800.
然后根据分页管理,将上述形成的32位线形地址映射到相应的物理地址。
我不知道32位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!
#4
.s文件是汇编代码的文件,这个文件还是要进行一次编译才能到真正的二进制文件,然后还要进行一次链接才能产生真正完全的执行文件,所以一个符号没办法找到在编译阶段根本不没有影响。
线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……
线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……
#5
不懂
,帮你up
,帮你up
#6
lss SYMBOL_NAME(stack_start),%esp通过符号表找到的
#1
没问题啊,编译的时候只对一个文件进行语法检查。只有在链接的时候,要是找不到这个几个符号的地址,才报错。
就像
int main(void)
{
f();
return;
}
你gcc -S 生成汇编也不会报错啊。
就像
int main(void)
{
f();
return;
}
你gcc -S 生成汇编也不会报错啊。
#2
没学过,帮你up
#3
还有个小问题不太明白,请各位大虾指教,进入32为保护模式运行后,寻址是如何进行的?如在linux/init/main.c中,L71引用宏inb_p(0x71);该宏在io.h中是这样定义的:
#define inb(port)({\
unsigned char _v;\
__asm__ volatile("inb %%dx,%%al":"=a"(_v):"d"(port));\
_v;\
})
那么程序在运行的时候是怎样寻址变量_v的?我如下理解不知道对不对:
首先根据内核数据段描述符形成32位线性地址,如果_v的数据段偏移地址为0x6800,则形成的32位线性地址为0x00006800.
然后根据分页管理,将上述形成的32位线形地址映射到相应的物理地址。
我不知道32位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!
#define inb(port)({\
unsigned char _v;\
__asm__ volatile("inb %%dx,%%al":"=a"(_v):"d"(port));\
_v;\
})
那么程序在运行的时候是怎样寻址变量_v的?我如下理解不知道对不对:
首先根据内核数据段描述符形成32位线性地址,如果_v的数据段偏移地址为0x6800,则形成的32位线性地址为0x00006800.
然后根据分页管理,将上述形成的32位线形地址映射到相应的物理地址。
我不知道32位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!
#4
.s文件是汇编代码的文件,这个文件还是要进行一次编译才能到真正的二进制文件,然后还要进行一次链接才能产生真正完全的执行文件,所以一个符号没办法找到在编译阶段根本不没有影响。
线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……
线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……
#5
不懂
,帮你up
,帮你up
#6
lss SYMBOL_NAME(stack_start),%esp通过符号表找到的