在上一篇著作中,咱们照旧顺利的从实花样,过渡到了保护花样。
保护花样与实花样最实质的永诀即是:保护花样使用了全局形色符表,用来保存每一个体式(bootloader,操作系统,应用体式)使用到的每个段信息:驱动地址,长度,以过甚他一些保护参数。
这篇著作,咱们来看一下 bootloader 是怎样来进行自我进化到保护花样的,然后深切看一下保护花样是怎样对内存进行安全保护的。
作为配景学问,咱们先来看一下 x86 中的地址变换流程:
皇冠客服飞机:@seo3687
x86 处理器中的分页机制是不错被关闭的,此时线性地址就等于物理地址,这亦然咱们一直酌量的情况。
下一篇著作,咱们就把 x86 中的分页机制掀开,并与 Linux 中的分段和分页机制进行对比。
实花样:bootloader 为体式计算段的基地址在之前的著作:Linux从新学06:16张结构图,透彻清晰【代码重定位】的底层旨趣中,咱们酌量了 bootloader 是怎样把应用体式读取到内存中,终末跳入到体式的进口地址的。
这里所说的体式,不错是操作系统,也不错是应用体式。
底下这张图,是体式被加载到内存中之后,header 中的信息:
58現金網因为体式是被 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 中并吞个代码段形色符所代表的段空间。
如若每一条提醒都去查表,就会影响到体式的膨胀成果。
目前关于Switch后续主机的两种看法,一是“早该发布新机了”,二是“后续机还不着急发布”,究竟哪种看法更妥当呢。
6月6日,福田区在“新战略 新空间 新机遇”产业政策发布会上,重磅推出《支持总部经济高质量发展若干政策》,全力支持总部企业做强做大,从落户到成长,从资金到人才,从空间到服务,力求全方位为总部企业高效匹配最优质的资源。同时,出台《总部经济高质量发展行动方案(2023-2025年)》,围绕提升“湾区总部之都”的影响力、辐射力和凝聚力,提出6大行动、23项重点任务。
是以,处理器里面就为每一个段寄存器,安排了一个高速缓存。
拿代码段寄存器 cs 来说:当膨胀一条提醒的工夫,如若它与上一条提醒中的段索引号不同,才会把柄新的段索引号到 GDT 中查找相应的段形色符表项。
查找到之后,就把这个表项的内容复制到 cs 寄存器的高速缓存中。
当不时膨胀背面的提醒时,如若逻辑地址中的段索引号莫得变化,处理器就径直从高速缓存中读取段形色,从而幸免了查表操作,擢升了系统成果。
对段寄存器本人的保护当逻辑地址中段寄存器的索引号改造时,就会把柄新的索引号,到 GDT 中去查表。
天然了,这个索引号不可跳跃 GDT 的范围。
当定位到某一个形色符表项之后,就驱动进行一系列查验。
再来看一下每一个段形色符中 8 个字节的内容:
皇冠体育apibit8 ~ bit11 界说了现时这个段的类型。
幸运快艇真人百家乐假如: 咱们在切换代码段空间的工夫,不贯注犯错,定位到了 GDT 中的一个数据段形色符表项,那么处理器就约略实时发现:
“现时这个段形色符的类型是数据段,你却把它手脚念代码段来使用,回绝,杀无赦!”
爱情ag亚游是不是倒闭了因此,处理器就会远离把这个段形色符复制到代码段的高速缓存中,从而对代码段寄存器进行了保护。
对段范围的查验在通过了第一层的段类型保护之后,还会不时对段的范围进行查验,这就要使用到逻辑地址中的偏移地址( EIP )了。
如若偏移地址跳跃了形色符中步调的范围,那么就阐述发生无理了。
举例:在 bootloader 的代码段形色符中,最大的范围是 512B,如若把 EIP 诞生为 0x0000_1000,那就敬佩无理了。
因为这个地址根本就不属于代码段的空间限制。
关于数据段来说相比有真义,因为咱们把数据段形色符的基地址诞生为 0x0000_0000,段的范围是悉数 4G 的空间,是以它不错对悉数内存进行操作。
多思一步:
代码段亦然属于这 4G 空间,因此不错通过数据段,来改写代码段空间中的提醒内容。
也即是说:如若你思修改代码段的提醒,径直通过代码段来操作是不不错的。
因为代码段形色符中步调了:代码段的内容只可被读取、膨胀,然则不可被写入。
此时,就不错别具肺肠:代码段也放在 4G 的空间,那么就不错通过数据段的可写特质,来改写代码段中的提醒。
开云体育
思一思 gdb 的调试流程,是不是就应用了这个真义真义?