Lab1实验分享

article/2025/8/28 20:39:14

文章目录

        • 一.内核的物理位置
        • 二.Bootloader
        • 三.编译和链接
        • 四.va_list、va_start和va_end三个宏的用法。
        • 五.ELF文件的结构
        • 六.lp_Print()函数流程图

一.内核的物理位置

操作系统最重要的部分是操作系统内核,因为内核需要直接与硬件交互管理各个硬件,从而利用硬件的功能为用户进程提供服务。

启动操作系统,我们就需要将内核代码在计算机结构上运行起来,一个程序要能够运行,其代码必须能够被 CPU 直接访问,所以不能在磁盘上,因为 CPU 无法直接访问磁盘。

CPU可以直接从硬盘里调用数据,然而这样太慢了,而内存则比硬盘快得多,把用有的东西先放入内存里面,CPU调用起来就快得。

所以不可能将内核代码保存在内存中。所以直观上可以认识到:

(1) 磁盘不能直接访问

(2) 内存掉电易失,内核文件有可能放置的位置只能是 CPU 能够直接访问的非易失性存储器——ROM 或 FLASH 中。

将硬件初始化的相关工作从操作系统中抽出放在bootloader中实现,意味着通过这种方式实现了硬件启动和软件启动的分离。 因此需要存储在非易失性存储器中的硬件启动相关指令不需要很多,能够很容易地保存在ROM或FLASH中。

bootloader在硬件初始化完后,需要为软件启动(即操作系统内核的功能)做相应的准备, 比如需要将内核镜像文件从存放它的存储器(比如磁盘)中读到RAM中。既然bootloader需要将内核镜像文件加载到内存中, 那么它就能选择使用哪一个内核镜像进行加载,即实现多重开机的功能。使用bootloader后,我们就能够在一个硬件上运行多个操作系统了

二.Bootloader

而当内存被初始化,bootloader将后续代码载入到内存中后,位于内存中的代码便能完整地使用C语言的各类功能了。 所以说,内存中的代码拥有了一个正常的C环境。

在 stage 1 时,需要初始化硬件设备,包括watchdog timer、中断、时钟、内存等。需要注意的一个细节是,此时内存 RAM 尚未初始化完成, 因而 stage 1 直接运行在存放 bootloader 的存储设备上(比如FLASH)。由于当前阶段不能在内存 RAM 中运行,其自身运行会受诸多限制, 比如有些 flash 程序不可写,即使程序可写的 flash 也有存储空间限制。这就是为什么需要stage 2的原因。 stage 1除了初始化基本的硬件设备以外,会为加载stage 2准备RAM空间,然后将stage 2的代码复制到RAM空间,并且设置堆栈,最后跳转到stage 2的入口函数。

stage 2运行在RAM中,此时有足够的运行环境,所以可以用C语言来实现较为复杂的功能。 这一阶段的工作包括,初始化这一阶段需要使用的硬件设备以及其他功能,然后将内核镜像文件从存储器读到RAM中,并为内核设置启动参数, 最后将CPU指令寄存器的内容设置为内核入口函数的地址,即可将控制权从bootloader转交给操作系统内核。

gxemul支持加载elf格式内核,所以启动流程被简化为加载内核到内存,之后跳转到内核的入口。启动完毕

三.编译和链接

printf的实现是在链接(Link)这一步骤中被插入到最终的可执行文件中的。那么,了解这个细节究竟有什么用呢? 作为一个库函数,printf被大量的程序所使用。因此,每次都将其编译一遍实在太浪费时间了。printf的实现其实早就被编译成了二进制形式。

但此时,printf并未链接到程序中,它的状态与我们利用-c选项产生的hello.o相仿,都还处于未链接的状态。而在编译的最后,链接器(Linker)会将所有的目标文件链接在一起,将之前未填写的地址等信息填上,形成最终的可执行文件,这就是链接的过程。

对于拥有多个c文件的工程来说,编译器会首先将所有的c文件以文件为单位,编译成.o文件。最后再将所有的.o文件以及函数库链接在一起, 形成最终的可执行文件。

链接器通过哪些信息来链接多个目标文件呢?答案就在于在目标文件(也就是我们通过-c选项生成的.o文件)。 在目标文件中,记录了代码各个段的具体信息。链接器通过这些信息来将目标文件链接到一起。而ELF(Executable and Linkable Format)正是Unix上常用的一种目标文件格式。 其实,不仅仅是目标文件,可执行文件也是使用ELF格式记录的。

四.va_list、va_start和va_end三个宏的用法。

1.c语言提供了函数的不定长参数使用,比如 void func(int a, …)。三个省略号,表示了不定长参数。

注意:c标准规定了,函数必须至少有一个明确定义的参数,因此,省略号前面必须有至少一个参数。

2.va_list宏定义了一个指针类型,这个指针类型指向参数列表中的参数。

3.void va_start(va_list ap, last_arg),修改了用va_list申明的指针,比如ap,使这个指针指向了不定长参数列表省略号前的参数。

4.type va_arg(va_list, type),获取参数列表的下一个参数,并以type的类型返回。

5.void va_end(va_list ap), 参数列表访问完以后,参数列表指针与其他指针一样,必须收回,否则出现野指针。一般va_start 和va_end配套使用。

5.函数的参数一般从右至左先后入栈,根据栈的特性,也就是,最左边的参数最先出栈。贴一段代码介绍下va_list、va_start和va_end的使用。

感兴趣的,可以把函数的整型换成char或者int,参数列表判断条件为NUL,还可以为每个参数指定类型。

#include <stdio.h>
#include <stdarg.h>
void functestarg(int, ...);
int main ()
{functestarg(1,2,3,4,5,6,7,8,9,10,0);return 0;
}
void functestarg(int a, ...)
{va_list argpointer;va_start(argpointer, a);int argument;int count = 0;while(0 != (argument = va_arg(argpointer, int))){printf("parameter%d:%d\n", ++count, argument);}
}

五.ELF文件的结构

ELF文件的解析

需要输出 ELF ⽂件的所有 section header 的序号和地址信息
在这里插入图片描述

typedef struct {unsigned char   e_ident[EI_NIDENT];     /* Magic number and other info */// 存放魔数以及其他信息Elf32_Half      e_type;                 /* Object file type */// 文件类型 Elf32_Half      e_machine;              /* Architecture */// 机器架构Elf32_Word      e_version;              /* Object file version */// 文件版本Elf32_Addr      e_entry;                /* Entry point virtual address */// 入口点的虚拟地址Elf32_Off       e_phoff;                /* Program header table file offset */// 程序头表所在处与此文件头的偏移Elf32_Off       e_shoff;                /* Section header table file offset */// 段头表所在处与此文件头的偏移Elf32_Word      e_flags;                /* Processor-specific flags */// 针对处理器的标记Elf32_Half      e_ehsize;               /* ELF header size in bytes */// ELF文件头的大小(单位为字节)Elf32_Half      e_phentsize;            /* Program header table entry size */// 程序头表入口大小Elf32_Half      e_phnum;                /* Program header table entry count */// 程序头表入口数Elf32_Half      e_shentsize;            /* Section header table entry size */// 段头表入口大小Elf32_Half      e_shnum;                /* Section header table entry count */// 段头表入口数Elf32_Half      e_shstrndx;             /* Section header string table index */// 段头字符串编号
} Elf32_Ehdr;

六.lp_Print()函数流程图

在这里插入图片描述


http://chatgpt.dhexx.cn/article/JC8JUGLS.shtml

相关文章

CSAPP实验二——bomb lab实验

CSAPP实验二—— bomb lab实验 实验前准备第一部分&#xff08;phase_1&#xff09;第二部分&#xff08;phase_2&#xff09;第三部分&#xff08;phase_3&#xff09;第四部分&#xff08;phase_4)第五部分&#xff08;phase_5&#xff09;第六部分&#xff08;phase_6&#…

Attacklab实验

一、实验目的 1、深入了解缓冲区溢出的隐患&#xff0c;了解如何利用缓冲区溢出这个漏洞对现有程序进行控制流劫持、执行非法程序代码&#xff0c;从而造成对程序进行攻击以及破坏的过程&#xff1b; 2、增强对程序机器级表示、汇编语言、调试器和逆向工程等理解。 二、实验…

计算机系统基础实验-LinkLab实验

这是大三时的实验课&#xff0c;很久以前的东西&#xff0c;应要求放出来&#xff0c;做的不是很好。linux永远都是很重要的&#xff0c;希望我和大家都记得这个。实际上做到第五阶段我就不会了。 实验课程名称&#xff1a;计算机系统基础 实验项目名称&#xff1a;LinkLab实…

Lab5实验分享

文章目录 一.全局变量名词解释二.实验难点图示1.文件系统层次关系梳理2.多级目录与多级索引 三.代码梳理1.磁盘管理2.文件系统3.用户接口4.文件服务 一.全局变量名词解释 #define NBLOCK 1024 //一块磁盘里面的block数目 uint32_t nbitblock; // 用于存储bitmap的block数目 ui…

实验.......

第一步配置ip与环回地址 做hub&spoken的fullmesh结构以r2为例 其他路由同样操作 要求使用rip协议&#xff0c;以r2为例

实验吧——WEB-认真一点!

认真一点&#xff01; 打开链接&#xff0c;看到这个页面&#xff0c;第一反应又是sql注入 翻翻源码没有任何提示 打开burp开始抓包&#xff0c;包头与返回头又没有任何提示&#xff0c;试着开始修改ID 的值&#xff0c;观察页面变化。 提交1或用语句让框内为真&#xff0c;显…

实验....

实验要求 r1代表运营商 r1远程登录r2实际登陆r9 r3访问r7的换回地址走r5 全网可达 1.全网可达 配置ip 2配置rip协议&#xff0c;r8r9用v1其余用v2 3让r8r9接入内网&#xff0c;在r8对端接口写入v2 r3访问r7的换回地址走r5 r1代表运营商 r1远程登录r2实际登陆r9 先打开r…

实验吧 认真一点!

真的很久很久没碰过这个玩意了&#xff0c;真是不会了&#xff0c;而且这个题目本身就不是很容易&#xff0c;搞得我也是满肚子邪火&#xff0c;很气。这个题目主要难在它吧过滤和ban结合到了一起了。我们还是先看题目,首先拿到题目看到输入id0和输入id1结果不一样&#xff0c;…

让我进去-实验吧

这题做的真的是久&#xff0c;莓办法&#xff0c;太菜了 进去看见cookie有个source值很奇怪&#xff0c;把他改成1试一下就收到这段代码 $flag "XXXXXXXXXXXXXXXXXXXXXXX"; $secret "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for secu…

实验吧

1.变异凯撒 把flag转化为ascii码&#xff0c;加密密文转化为ascii码&#xff0c; 因为是凯撒加密&#xff0c;所以思考移动的位数&#xff0c;分别是加了5&#xff0c;6&#xff0c;7&#xff0c;8.。。。 所以移动的位次是从5递加 得到结果 ascii码值转化&#xff0c;得到flag…

[大学物理实验-5]波尔共振实验

[大学物理实验-5]波尔共振实验 前言实验预习&#xff08;Preview&#xff09;实验报告&#xff08;Report&#xff09;实验报告&#xff08;Report&#xff09;总结&#xff08;Sum up&#xff09; 前言 最近在整理一些学过的课程的资料&#xff0c;有一些课虽然和我的专业毫无…

实验一-Bomblab(炸弹实验)

实验概述&#xff1a;该实验就是通过分析汇编代码&#xff0c;并使用GDB调试&#xff0c;找到每一题的通关钥匙 第一关&#xff1a;&#xff08;key“He is evil and fits easily into most overhead storage bins.”&#xff09; 简单解析&#xff1a;比…

实验.........

首先配置ip地址和环回地址 以r1为例 先用ospf联通r2r3r4r5r6r7 以r2为例 r1启bgp与r2建邻 r2r3r4r5r6r7同理建邻居 这里以r2为例 r7r8建邻方法同r1r2 优化在r2上

实验........

实验....... 先配置ip地址以r2为例 然后配置rip同样以r2为例 启用bgp建立对等体&#xff0c;需要书写as号 以r1与r3为例 建立ebgp 以r3r4为例 r3 r4 建立换回&#xff0c;以环回为对等提

shlab实验

计算机系统原理实验报告 一、实验目的及内容 1. 实验目的&#xff1a;通过编写完善一个支持作业控制的简单 Unix 外壳 Shell 程序&#xff08;tsh&#xff09;, 掌握 shell 的基本功能原理和实现方法;掌握 Unix 进程控制、特别是信号的应用&#xff0c; 包括信号产生和信号…

Lab2实验分享

文章目录 一.TLB访存机制二.二级页表三.Page存储结构四.自映射机制图示五.页面与地址的转化六.部分实验代码详解 一.TLB访存机制 当一个虚拟地址被送到MMU中进行翻译的时候&#xff0c;硬件首先在TLB中寻找包含这个地址的页面&#xff0c;如果它的虚页号在TLB中&#xff0c;并…

实验吧(1)

实验吧真是一个神奇的地方&#xff0c;里面的东西表示全部都看不懂&#xff0c;emmmmm &#xff0c;加油&#xff01;好好学习&#xff01; 案例&#xff1a;忘记密码了&#xff01; 在实验吧里面打开解题链接&#xff0c;然后就会跳转到一个输入密码的页面&#xff0c;当然你…

实验吧 认真一点

本实验是输入id获取结果&#xff0c;查看页面源码&#xff0c;没有什么注释信息。随便输入个1&#xff0c;结果为You are in ...............&#xff0c;其他的id显示为You are not in ............... 使用Burp suite进行模糊测试&#xff0c;结果为or部分sql命令都可以使用。…

实验吧_网站综合渗透_Discuz!

前言 这个一个实验吧中的环境&#xff0c;分值为50分&#xff0c;下面是题目说明。诶&#xff0c;发现自己很菜。 实验吧_网站综合渗透_dedecms解析地址 需要的学会或者已经掌握的知识 已知cms版本在线搜索通用漏洞掌握菜刀或者类似的工具的使用其他 题目说明 你是国内一流安…

实验吧-简单的登录题——WriteUp再研究

前言 这个题目的难点就是在于对于CBC加密方式尤其是解密这部分要琢磨一番&#xff0c;让我想起当年大学的时候信安三勇中的两勇的课&#xff0c;一门密码学&#xff0c;一门数学基础&#xff0c;可怕之极。这个题网上writeup一大堆&#xff0c;但是在一些方面解释的不是很详细…