关于Lab5用户进程管理内存布局解析

news2024/11/27 14:48:22

目录

一、解读Lab5的kernel.ld文件

1.获取bin/kernel的symbols table

​2.excel表格数据整理

3.将kernel_symbol_table_1按照B列排序

4.kernel.ld文件内容

5.SECTIONS->. = 0xC0100000;解读

6.ENTRY(kern_entry)解读

7.SECTIONS->.text解读

8.SECTIONS->PROVIDE(etext = .);解读

9.SECTIONS->.rodata解读

10.SECTIONS->.stab解读

11.SECTIONS->.data解读

12.SECTIONS->.data.pgdir解读

13.SECTIONS->.bss解读

二、总结


对于用户进程的内存布局,是由编译和连接过程决定。我认为编译和链接会确定可执行文件的虚拟内存布局,这种结论可以通过解读可执行文件的符号表证实。

一、解读Lab5的kernel.ld文件

为了解读kernel.ld文件,需要通过这个文件编译出可执行文件bin/kernel,然后需要获得kernel symbols table,最后解读kernel symbols table中的地址字段,就能够理解清楚bin/kernel的内存布局。

1.获取bin/kernel的symbols table

通过命令readelf -s bin/kernel获取kernel的symbols table


2.excel表格数据整理

将步骤1的kernel的symbols table拷贝到excell表格中,获得原始的数据kernel_symbol_table_1。

3.将kernel_symbol_table_1按照B列排序

排序后的kernel_symbol_table_2,他的虚拟内存地址从小到大排列。

4.kernel.ld文件内容

/* Simple linker script for the ucore kernel.
   See the GNU ld 'info' manual ("info ld") to learn the syntax. */

OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(kern_entry)

SECTIONS {
    /* Load the kernel at this address: "." means the current address */
    . = 0xC0100000;

    .text : {
        *(.text .stub .text.* .gnu.linkonce.t.*)
    }

    PROVIDE(etext = .); /* Define the 'etext' symbol to this value */

    .rodata : {
        *(.rodata .rodata.* .gnu.linkonce.r.*)
    }

    /* Include debugging information in kernel memory */
    .stab : {
        PROVIDE(__STAB_BEGIN__ = .);
        *(.stab);
        PROVIDE(__STAB_END__ = .);
        BYTE(0)     /* Force the linker to allocate space
                   for this section */
    }

    .stabstr : {
        PROVIDE(__STABSTR_BEGIN__ = .);
        *(.stabstr);
        PROVIDE(__STABSTR_END__ = .);
        BYTE(0)     /* Force the linker to allocate space
                   for this section */
    }

    /* Adjust the address for the data segment to the next page */
    . = ALIGN(0x1000);

    /* The data segment */
    .data : {
        *(.data)
    }

    . = ALIGN(0x1000);
    .data.pgdir : {
        *(.data.pgdir)
    }

    PROVIDE(edata = .);

    .bss : {
        *(.bss)
    }

    PROVIDE(end = .);

    /DISCARD/ : {
        *(.eh_frame .note.GNU-stack)
    }
}

5.SECTIONS->. = 0xC0100000;解读

1)在Lab5的实验环境中,编译获取编译过程输出

2)链接器将bin/kernel和obj/__user_XXX.out应用程序链接在一起

+ ld bin/kernel

ld -m    elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel  obj/kern/init/entry.o obj/kern/init/init.o obj/kern/libs/stdio.o obj/kern/libs/readline.o obj/kern/debug/panic.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/driver/ide.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/picirq.o obj/kern/driver/intr.o obj/kern/trap/trap.o obj/kern/trap/vectors.o obj/kern/trap/trapentry.o obj/kern/mm/pmm.o obj/kern/mm/swap_fifo.o obj/kern/mm/vmm.o obj/kern/mm/kmalloc.o obj/kern/mm/swap.o obj/kern/mm/default_pmm.o obj/kern/fs/swapfs.o obj/kern/process/switch.o obj/kern/process/entry.o obj/kern/process/proc.o obj/kern/schedule/sched.o obj/kern/syscall/syscall.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o -b binary  obj/__user_hello.out obj/__user_badarg.out obj/__user_forktree.out obj/__user_badsegment.out obj/__user_faultread.out obj/__user_pgdir.out obj/__user_exit.out obj/__user_softint.out obj/__user_waitkill.out obj/__user_spin.out obj/__user_yield.out obj/__user_divzero.out obj/__user_testbss.out obj/__user_faultreadkernel.out obj/__user_forktest.out

由于obj/kern/init/entry.o是第一个链接的文件,所以他的地址使用起始地址0xC0100000,不难发现symbol table中的地址顺序是依靠实际链接目标文件顺序

6.ENTRY(kern_entry)解读

bin/kernel的入口地址是kern_entry,加载器从该地址开始加载并执行程序。

7.SECTIONS->.text解读

该段存放的是代码段,代码段表示执行程序集合,具体在符号表中的体现就是函数地址。

8.SECTIONS->PROVIDE(etext = .);解读

该部分表示在symbols table中生成一个etext字段。

9.SECTIONS->.rodata解读

.rodata表示read only data segment,下图可以看出在bin/kernel中存在若干个只读数据在rodata数据段中。

其中default_pmm_manager是rodata,主要是用const修饰的全局变量

10.SECTIONS->.stab解读

bin/kernel的调试信息存在在stab段中

该段内存虚拟地址如下:

11.SECTIONS->.data解读

.data是数据段,bin/kernel的数据段如下

其中,bootstack是数据段,在汇编语言中进行定义

其中,shiftmap是数据段,在c语言中进行定义,shiftmap变量是全局变量,并且已经初始化了。

其中,idt_pd是数据段,在c语言中进行定义,idt_pd变量是全局变量,并且已经初始化了。

总结来看,.data表示已经初始化,非零值的数据段

12.SECTIONS->.data.pgdir解读

.data.pgdir代表数据段中的页表段,该段单独存在,表示页表的存在范围。在entry.S汇编代码中,对页表段进行了创建赋值。

在symbol table中,表示有两个函数处理页表

13.SECTIONS->.bss解读

.bss是数据段,bin/kernel的数据段如下

其中buf是bss中的成员,它位于readline.c函数中。

其中is_panic是bss中的成员,位于panic.c函数中

其中swap_out_num是bss中的成员,位于swap.c函数中

.bss段存放的是未初始化的全局变量,但是当全局数据初始化为0的时候,也将该变量放在.bss中处理。

二、总结

关于用户进行内存布局,最重要的是代码段、数据段、调试段的符号地址。这些地址在链接器的控制下,给定symbols table。其中ENTRY(kern_entry)规定加载器的加载地址,其中. = 0xC0100000;规定bin/kernel的内存布局起始地址,其中symbol table中的地址顺序是依靠实际链接目标文件顺序。

在bin/kernel中有三类数据段,分别是.rodata、.data、.bss。最让人分不清的是.data和.bss的区别。在这里,.data表示已经初始化的全局变量区域(非0初始化),而.bss表示未初始化化的全局变量区域(包括初始化为0)。对于大多数的操作系统,在程序加载的时候会把bss全局变量清零,无需动手清零,但是动手清零是个好的编程习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络编程01

网络层级 协议 协议:两个对等实体对通话内容的约定,一个协议是对应收发双方相同层级的 常见的协议 应用层(公开协议): http协议(浏览网页);客户端(浏览器)发…

2024年最新水果音乐制作软件FL Studio21需要多少钱呢?

水果,全称Fruity Loop Studio,简称FL Studio。是一款全能的音乐制作软件,经过二十多年的演化更迭,其各项功能非常的先进。其开创性的Pat\song模式,也为初学者的学习提供了便利。那么水果音乐制作软件FL Studio21需要多…

Proteus仿真--8位数码管滚动显示单个数字(仿真文件+程序)

本文主要介绍基于51单片机的8位数码管滚动显示单个数字(完整仿真源文件及代码见文末链接) 仿真运行视频 Proteus仿真--8位数码管滚动显示单个数字(仿真文件程序) 附完整Proteus仿真资料代码资料 百度网盘链接: https://pan.baidu…

基于Matlab违章车辆车牌识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、基于Matlab违章车辆车牌识别系统四. 总结 一项目简介 首先,车牌识别技术在提高高速公路收费站效率方面起着至关重要的作用。由于高…

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思

【206.反转链表】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:ListNode* reverseList(ListNode* head) {if(headnullptr) return nullptr;if(head->nextnullptr) return head;ListNode* newheadreverseList(head->next)…

[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)

🌈键盘敲烂,年薪30万🌈 目录 HTTP概述 📕概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 📕特点: 📕插播…

故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 模型描述 长短记忆神经网络——通常称作LSTM,是一种特殊的RNN,能够学习长的依赖关系。 他们由Hochreiter&Schmidhuber引入,并被许多人进行了…

【k8s】资源管理命令-陈述式

一、资源管理介绍 1、资源管理概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 //kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,起始就是在kubernetes集群中运行一个个…

查询计算机GUID码

如何查询计算机GUID码(全局唯一标识符) 1.快键键WINR进入注册表 2.找到\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography路径 3.双击MachineGuid项即可显示计算机GUID码

Latex报错 “Paragraph ended before \Gin@iii was complete“

大家看看自己的模版的前面 加载的包 里面是不是有个 \usepackage{graphics} 问题就在这里,我们需要把它改成\usepackage{graphicx}

XHSELL连接虚拟机的常见问题(持续更新)

问题一:找不到匹配的host key算法。 检查XSHELL的版本,如果是旧版本,就有可能不支持新的算法,解决方法就是安装最新版本的XSHELL。 注:本人使用xshell5连接ubuntu22.04.3,出现了上述问题,将xsh…

故障诊断入门书籍资料免费领取

前言 本期分享免费提供9本故障诊断领域相关的书籍资料,可自行下载 一、主要内容 二、书籍获取

H5游戏源码分享-手机捉鬼游戏

H5游戏源码分享-手机捉鬼游戏 一款考验手速的游戏 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>手机捉鬼 微信HTML5在线朋友圈游戏</title><meta name&…

openWRT SFTP 实现远程文件安全传输

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f516;系列专栏&#xff1a; C语言、Linux、 Cpolar ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我…

“体检报告健康解读技术传承人”授牌仪式圆满结束

2023年10月&#xff0c;全国卫生健康技术推广传承项目办公室将体检报告健康解读技术传承人证书授予中山大学麻醉学硕士、副主任医师、医说友道创始人许才燕医生。 10月13日&#xff0c;许才燕医生团队在广东佛山举行“解读体检报告 重构健康生态”体检报告健康解读技术传承人授…

launch4j jar转exe使用笔记

一、下载 网盘下载&#xff1a;https://pan.baidu.com/s/1b8g8qwePmufgm4rKao4icw?pwdxf28 官网下载&#xff1a;https://sourceforge.net/projects/launch4j/files/latest/download &#xff08;注&#xff1a;点击链接会自动下载&#xff09; jre下载&#xff1a;https://p…

C++ priority_queue 的使用

1. priority_queue 的介绍 下面是 priority_queue 的介绍&#xff0c;来自于&#xff1a;&#x1f3f9;priority_queue - C Reference (cplusplus.com) 的中文翻译&#xff0c;您可以尝试看看。 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一…

H5游戏分享-烟花效果

<!DOCTYPE html> <html dir"ltr" lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width" /> <title>点击夜空欣赏烟花</title> <sc…

WIN11新版画图问题解决

1 白色背景被连同删除的问题 解决方法&#xff1a;加层 将层调整为新建的层&#xff0c;在这个层下画图就行。 2 QQ截图无法直接放在画图上的问题 使用QQ截图的时候&#xff1a; 解决方法&#xff1a;使用windows自带的截图工具 步骤&#xff1a; 1. 使用快捷键winshifts 2.…