请教linux 0.11 /head.s中的几个小问题

时间:2022-03-05 17:34:23
在head.s 中L23:lss _stack_start ,%esp  设置系统堆栈,请问各位大虾:_stack_start结构变量并没有在head.s中声明是外部变量,这里怎么这样使用?在L140 pushl $_main,main函数也没有在head.s中声明为何也可以在此直接使用?

6 个解决方案

#1


没问题啊,编译的时候只对一个文件进行语法检查。只有在链接的时候,要是找不到这个几个符号的地址,才报错。
就像
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位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!

#4


.s文件是汇编代码的文件,这个文件还是要进行一次编译才能到真正的二进制文件,然后还要进行一次链接才能产生真正完全的执行文件,所以一个符号没办法找到在编译阶段根本不没有影响。

线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……

#5


不懂
,帮你up

#6


lss SYMBOL_NAME(stack_start),%esp通过符号表找到的

#1


没问题啊,编译的时候只对一个文件进行语法检查。只有在链接的时候,要是找不到这个几个符号的地址,才报错。
就像
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位的现行地址到底是如何形成的,请各位大虾批评指正!万谢!

#4


.s文件是汇编代码的文件,这个文件还是要进行一次编译才能到真正的二进制文件,然后还要进行一次链接才能产生真正完全的执行文件,所以一个符号没办法找到在编译阶段根本不没有影响。

线性地址吧?这个是进程里面的虚拟空间,并非真实的物理内存空间,存贮应该是kernel负责的,而虚拟空间线性就是线性喽……

#5


不懂
,帮你up

#6


lss SYMBOL_NAME(stack_start),%esp通过符号表找到的