文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
背景:操作系统执行代码的组成
ucore 通过 gcc 编译和 ld 链接,形成了 ELF 格式执行文件 kernel(位于 bin 目录下),这样 kernel 的内部组成与一般的应用程序差别不大。一般而言,一个执行程序的内容是至少由 bss 段、data 段、text 段三大部分组成。
- BSS 段:BSS(Block Started by Symbol)段通常是指用来存放执行程序中未初始化的全局变量的一块存储区域。BSS 段属于静态内存分配的存储空间。
- 数据段:数据段(Data Segment)通常是指用来存放执行程序中已初始化的全局变量的一块存储区域。数据段属于静态内存分配的存储空间。
- 代码段:代码段(Code Segment/Text Segment)通常是指用来存放程序执行代码的一块存储区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些 CPU 架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
ucore 和一般应用程序一样,首先是保存在像硬盘这样的非易失性存储介质上,当需要运行时,被加载到内存中。这时,需要把代码段、数据段的内容拷贝到内存中。对于位于 BSS 段中的未初始化的全局变量,执行程序一般认为其值为零。所以需要把 BSS 段对应的内存空间清零,确保执行代码的正确运行。可查看 init 文件中的 kern_init 函数的第一个执行语句“memset(edata, 0, end - edata);”。
随着 ucore 的执行,可能需要进行函数调用,这就需要用到栈(stack);如果需要动态申请内存,这就需要用到堆(heap)。堆和栈是在操作系统执行过程中动态产生和变化的,并不存在于表示内核的执行文件中。栈又称堆栈, 是用户存放程序临时创建的局部变量,即函数中定义的变量(但不包括 static 声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用函数的栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。可以把栈看成一个寄存、交换临时数据的内存区。堆是用于存放运行中被动态分配的内存空间,它的大小并不固定,可动态扩张或缩减,这需要操作系统自己进行有效的管理。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论