GeekOS源代码学习(3)Main函数中Init_BSS() 与Init_Screen()

本文深入探讨了GeekOS中Main函数的两个关键部分:Init_BSS和Init_Screen。Init_BSS负责清除BSS段内存,其在./src/geekos/mem.c中实现,而Init_Screen初始化屏幕相关功能,位于./src/geekos/screen.c。文章还详细解释了与BSS段相关的memset函数,以及如何在不同编译环境下处理BSS段。
摘要由CSDN通过智能技术生成

Main函数的第一个函数Init_BSS()

位于./src/geekos/mem.c中

/*
 * Initialize the .bss section of the kernel executable image.
 */
void Init_BSS(void)
{
    extern char BSS_START, BSS_END;

    /* Fill .bss with zeroes */
    memset(&BSS_START, '\0', &BSS_END - &BSS_START);
}

 
 

可以看到Init_BSS函数清空了从BSS_START到BSS_END的内存。

先来看memset的实现

位于./src/common/string.c中

void* memset(void* s, int c, size_t n)
{
    unsigned char* p = (unsigned char*) s;

    while (n > 0) {
        *p++ = (unsigned char) c;
        --n;
    }   

    return s;
}

和C语言的memset功能一样,实现也很简单。

再来看一下外部声明BSS_START,BSS_END

位于/include/geekos/defs.h

/*
 * The windows versions of gcc use slightly different
 * names for the bss begin and end symbols than the Linux version.
 */
#if defined(GNU_WIN32)	
#  define BSS_START _bss_start__
#  define BSS_END _bss_end__
#else
#  define BSS_START __bss_start
#  define BSS_END end
#endif



在project0下使用命令
$find ./ | xargs grep GNU_WIN32 

可以看到,GNU_WIN32标志在./build/Makefile中定义,

用于区别windows下的cygwin编译环境和linux下的gcc,两者生成的elf文件的符号有细微的差别。

明显在Linux中定义的是后者。

再次搜索
$find ./ | xargs grep __bss_start
可以看到__bss_start符号出现在内核符号表kernel.syms中
我把这一段贴出来

0001a5dc A __bss_start
00018b58 r __func__.1314
000185fb r __func__.1319
00018fcd r __func__.1319
00019289 r __func__.1319
00018ad2 r __func__.1331
000188f1 r __func__.1333
0001860c r __func__.1335
00018fde r __func__.1335
0001
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值