linux内核 Linux-0.11版本 boot/head.s中 _main如何标识main.c文件中的main函数的内存地址并实现跳转?
时间: 2024-02-25 17:53:54 浏览: 145
在Linux-0.11版本的boot/head.s文件中,可以看到如下代码段:
```
/* Switch to PM (Protected Mode) */
mov ax,#INITSEG /* set up kernel DS */
mov ds,ax
mov es,ax
mov ax,#0x0000 /* set up kernel ES (not used anyway) */
mov ss,ax /* set up stack segment */
mov sp,#0x9000 /* set up stack pointer (just beyond bss) */
call _main /* call the main bootup routine */
jmp . /* just in case _main returns */
```
这段代码中,通过 `call _main` 调用 C 语言代码中的 `main` 函数。由于 `main` 函数的地址在链接时是不确定的,因此在编译链接时会生成一个符号表,该符号表中会记录 `main` 函数的内存地址。
在这段代码中,通过 `_main` 符号来调用 C 语言代码中的 `main` 函数。实际上,这个 `_main` 符号是由链接器在链接时生成的,它对应的就是 `main` 函数的内存地址。由于 `call` 指令是按照相对地址进行调用的,因此这个相对地址就是 `_main` 符号和 `main` 函数之间的偏移量,这个偏移量会在链接时被计算出来并嵌入到可执行文件中。
因此,在运行时,执行 `call _main` 会跳转到 `main` 函数所在的内存地址,并开始执行 C 语言代码。
阅读全文