Linux重新学:x86 处理器怎样进行-层层的内存保护?

一滴春口服药说明书

一滴春口服药说明书

  • 首页
  • 迷奸三人组用的是什么设备
  • 迷奸 三人组用的是什么药
  • 迷药APP
  • 你的位置:一滴春口服药说明书 > 迷奸 三人组用的是什么药 > Linux重新学:x86 处理器怎样进行-层层的内存保护?

    Linux重新学:x86 处理器怎样进行-层层的内存保护?

    发布日期:2025-05-10 16:25    点击次数:201
    [[420226]] 实神情:bootloader 为裂缝策画段的基地址 保护伞情:bootloader 为我方创建段姿首符 细目 GDT 的地址 创建代码段的姿首符 创建数据段的姿首符 创建栈段的姿首符 段姿首符是怎样确保段的安全的? 段寄存器高速缓存 对段寄存器本人的保护 对段界限的查验

    在上一篇著作中,咱们仍是凯旋的从实神情,过渡到了保护伞情。

    保护伞情与实神情最践诺的分手即是:保护伞情使用了全局姿首符表,用来保存每一个裂缝(bootloader,操作系统,应用裂缝)使用到的每个段信息:运转地址,长度,以偏激他一些保护参数。

    这篇著作,咱们来看一下 bootloader 是怎样来进行自我进化到保护伞情的,然后深刻看一下保护伞情是怎样对内存进行安全保护的。

    作为布景常识,咱们先来看一下 x86 中的地址变换经过:

    x86 处理器中的分页机制是不错被关闭的,此时线性地址就等于物理地址,这亦然咱们一直磋议的情况。

    下一篇著作,咱们就把 x86 中的分页机制大开,并与 Linux 中的分段和分页机制进行对比。

    实神情:bootloader 为裂缝策画段的基地址

    在之前的著作:Linux重新学06:16张结构图,透顶贯通【代码重定位】的底层旨趣中,咱们磋议了 bootloader 是怎样把应用裂缝读取到内存中,终末跳入到裂缝的进口地址的。

    这里所说的裂缝,不错是操作系统,也不错是应用裂缝。

    底下这张图,是裂缝被加载到内存中之后,header 中的信息:

    因为裂缝是被 bootloader 动态读取到内存中的,它是不知说念我方被放在内存中的什么位置,因此它也不知说念我方代码段、数据段、栈的运转地址。

    关联词,裂缝要思概况闲居实施,就必须要知说念这些信息,那何如办?

    独一 bootloader 才能处罚问题,因为是它来把裂缝从硬盘加载到内存中的。

    因此,bootloader 在跳入裂缝的进口地址之前,必须把其中的代码段、数据段、栈段的基地址策画出来,然后写入到裂缝的 header 中,如下图所示:

    这么的话,裂缝运转实施时,就不错从我方的 header 中赢得到这 3 个段基地址,何况赋值给相应的寄存器,从而凯旋的实施裂缝。

    也即是说:裂缝的 header 空间,充任了 bootloader 与它进行信推辞互的前言,用来传递 3 个段寄存器的基地址。

    以上的这个经过,一直使命在实神情,因此就莫得段姿首符什么事情。

    迷水商城

    在以后著作中,咱们还会看到在保护伞情下,bootloader 仍然会愚弄 OS 的 header 空间,来传递段的索引号。然后 OS 愚弄这个段索引号,去查找 GDT 表,从而找到每一个段的基地址以偏激他一些保护信息。

    保护伞情:bootloader 为我方创建段姿首符

    bootloader 从 BIOS 接管系统之后,刚运转是运行在实神情下的。

    当它完成一些准备使命之后,就不错干涉保护伞情了,也即是把 CR0 寄存器的 bit0 竖立为 1。

    这个准备使命中,最进攻的即是:确立 GDT 这个表,何况把 GDT 的运转地址,存储到寄存器 GDTR 中。

    底下这张图,是 bootloader 被加载到内存中的布局图:

    迷水商城

    bootloader 被加载到 0x0000_7C00 地址处。

    它最少需要创建 3 个段姿首符:代码段、数据段和栈段。

    迷水商城迷水商城 细目 GDT 的地址

    在创建段姿首符之前,需要先细目: 把 GDT 表放在内存中的什么位置?

    暂且就把它放在 0x0001_0000 这个地址吧,距离零地址 64K 的位置。

    按照处理器的条件,在第 1 个表项(称之为 item 或者 entry,每本书上都不相通)必须为空姿首符(index = 0)。

    创建代码段姿首符

    bootloader 的代码放在 0x0000_7C00 运转的地址,长度是 512B。

    笔据这些信息,就不错构造出代码段的姿首符了:

    创建数据段姿首符

    bootloader 待会需要把操作系统或其他应用裂缝,从硬盘读取到内存中,举例:读取到 0x0002_0000 的位置。

    迷水商城

    那么 bootloader 就必须概况打听到这个位置,何况是以数据段的读写神气。

    为了愚弄一王人的 4G 内存空间,bootloader 不错把这 4G 空间,作为一个数据段来界说它的姿首符,迷奸 三人组用的是什么药如下:

    创建栈段姿首符

    表面上,bootloader 不错使用内存中的任性一块优游空间,来作为我方的栈。

    催迷睡安眠药官方网店迷水商城

    因为栈在 push 操作的时辰,是向低地址处所增长的。

    因此许多册本都会把栈顶基地址竖立为 bootloader 的运转地址,也即是 0x0000_7C00 地址处,何况把栈的空间大小罢休在 4K 的畛域。

    笔据以上这些信息,就不错创建出栈的段姿首符,如下:

    当以上这几个段的姿首符都创建好之后,就不错把 GDT 的地址(0x0001_0000),竖立到 GDTR 寄存器中了。

    终末,再把 CR0 寄存器的 bit0 竖立为 1,就负责的干涉保护伞情来实施 bootloader 中背面的代码了。

    段姿首符是怎样确保段的安全打听的? 段寄存器高速缓存

    干涉保护伞情之后,天然对段寄存器中内容的讲授调动了,关联词实施每一条辅导,照旧需要使用到这些段寄存器的: cs, ds, ss等等。

    迷水商城

    思象一下:每实施一条辅导,都会从逻辑地址中,赢得到段索引号,然后去查找 GDT 表,从而定位到段的基地址。

    宇宙都知说念裂缝有个“局部性”旨趣,也即是相接实施的代码,都是鸠集在一段相接的裂缝空间中的。

    这个相接的裂缝空间,它们都是在消灭个代码段中,因此段的基地址都是计议的,那么它们都属于 GDT 中消灭个代码段姿首符所代表的段空间。

    迷水商城迷水商城

    若是每一条辅导都去查表,就会影响到裂缝的实施成果。

    是以,处理器里面就为每一个段寄存器,安排了一个高速缓存。

    拿代码段寄存器 cs 来说:当实施一条辅导的时辰,若是它与上一条辅导中的段索引号不同,才会笔据新的段索引号到 GDT 中查找相应的段姿首符表项。

    查找到之后,就把这个表项的内容复制到 cs 寄存器的高速缓存中。

    当无间实施背面的辅导时,若是逻辑地址中的段索引号莫得变化,处理器就顺利从高速缓存中读取段姿首,从而幸免了查表操作,升迁了系统成果。

    对段寄存器本人的保护

    当逻辑地址中段寄存器的索引号调动时,就会笔据新的索引号,到 GDT 中去查表。

    天然了,这个索引号不成逾越 GDT 的界限。

    当定位到某一个姿首符表项之后,就运转进行一系列查验。

    再来看一下每一个段姿首符中 8 个字节的内容:

    迷水商城迷水商城

    bit8 ~ bit11 界说了面前这个段的类型。

    假如: 咱们在切换代码段空间的时辰,不防御犯错,定位到了 GDT 中的一个数据段姿首符表项,那么处理器就概况实时发现:

    迷水商城

    “面前这个段姿首符的类型是数据段,你却把它作为念代码段来使用,不容,杀无赦!”

    因此,处理器就会推辞把这个段姿首符复制到代码段的高速缓存中,从而对代码段寄存器进行了保护。

    对段界限的查验

    在通过了第一层的段类型保护之后,还会无间对段的界限进行查验,这就要使用到逻辑地址中的偏移地址( EIP )了。

    若是偏移地址逾越了姿首符中轨则的界限,那么就线路发生作假了。

    举例:在 bootloader 的代码段姿首符中,最大的界限是 512B,若是把 EIP 竖立为 0x0000_1000,那就确信作假了。

    365站群VIP

    因为这个地址根柢就不属于代码段的空间畛域。

    关于数据段来说相比有兴趣兴趣,因为咱们把数据段姿首符的基地址竖立为 0x0000_0000,段的界限是扫数 4G 的空间,是以它不错对扫数内存进行操作。

    多思一步:

    代码段亦然属于这 4G 空间,因此不错通过数据段,来改写代码段空间中的辅导内容。

    也即是说:若是你思修改代码段的辅导,顺利通过代码段来操作是不不错的。

    因为代码段姿首符中轨则了:代码段的内容只可被读取、实施,关联词不成被写入。

    此时,就不错独辟门道:代码段也放在 4G 的空间,那么就不错通过数据段的可写特质,来改写代码段中的辅导。

    迷水商城

     

    迷水商城

    思一思 gdb 的调试经过,是不是就愚弄了这个兴趣兴趣?

     



    一滴春口服药说明书