在磁盘分区时,前面两个esp和msr是什么东西?

在磁盘分区时,前面两个esp和msr是什么东西?,第1张

一、esp即EFI系统分区

1、全称EFI system partition,简写为ESP。msr分区本身没有做任何工作,是名副其实的保留分区。ESP虽然是一个FAT16或FAT32格式的物理分区,但是其分区标识是EF(十六进制) 而非常规的0E或0C。

因此,该分区在 Windows *** 作系统下一般是不可见的。支持EFI模式的电脑需要从ESP启动系统,EFI固件可从ESP加载EFI启动程序和应用程序。

2、ESP是一个独立于 *** 作系统之外的分区, *** 作系统被引导之后,就不再依赖它。这使得ESP非常适合用来存储那些系统级的维护性的工具和数据,比如:引导管理程序、驱动程序、系统维护工具、系统备份等,甚至可以在ESP里安装一个特殊的 *** 作系统。

3、ESP也可以看做是一个安全的隐藏的分区,可以把引导管理程序、系统维护工具、系统恢复工具及镜像等放到ESP,可以自己打造“一键恢复系统”。而且,不仅可以自己进行DIY,还要更方便、更通用。

二、msr分区是保留分区

1、windows不会向msr分区建立文件系统或者写数据,而是为了调整分区结构而保留的分区。在Win8以上系统更新时,会检测msr分区。msr分区本质上就是写在分区表上面的“未分配空间”,目的是微软不想让别人乱动。

2、msr分区的用途是防止将一块GPT磁盘接到老系统中,被当作未格式化的空硬盘而继续 *** 作(例如重新格式化)导致数据丢失。GPT磁盘上有了这个分区,当把它接入XP等老系统中,会提示无法识别的磁盘,也无法进一步 *** 作。

扩展资料:

磁盘分区:

计算机中存放信息的主要的存储设备就是硬盘,但是硬盘不能直接使用,必须对硬盘进行分割,分割成的一块一块的硬盘区域就是磁盘分区。在传统的磁盘管理中,将一个硬盘分为两大类分区:主分区和扩展分区。

主分区是能够安装 *** 作系统,能够进行计算机启动的分区,这样的分区可以直接格式化,然后安装系统,直接存放文件。

目的:

分区允许在一个磁盘上有多个文件系统。有许多理由需要这么做:

1、有利于管理,系统一般单独放一个区,这样由于系统区只放系统,其他区不会受到系统盘出现磁盘碎片的性能影响。

2、碍于技术限制(例如旧版的微软FAT文件系统不能访问超过一定的磁盘空间;旧的PC BIOS不允许从超过硬盘1024个柱面的位置启动 *** 作系统)

3、如果一个分区出现逻辑损坏,仅损坏的分区而不是整个硬盘受影响。

4、在一些 *** 作系统(如Linux)交换文件通常自己就是一个分区。在这种情况下,双重启动配置的系统就可以让几个 *** 作系统使用同一个交换分区以节省磁盘空间。

5、避免过大的日志或者其他文件占满导致整个计算机故障,将它们放在独立的分区,这样可能只有那一个分区出现空间耗尽。

6、两个 *** 作系统经常不能存在同一个分区上或者使用不同的“本地”磁盘格式。为了不同的 *** 作系统,将磁盘分成不同的逻辑磁盘。

7、许多文件系统使用固定大小的簇将文件写到磁盘上,这些簇的大小与所在分区文件系统大小直接成比例。如果一个文件大小不是簇大小的整数倍,文件簇组中的最后一个将会有不能被其它文件使用的空闲空间。

这样,使用簇的文件系统使得文件在磁盘上所占空间超出它们在内存中所占空间,并且越大的分区意味着越大的簇大小和越大的浪费空间。所以,使用几个较小的分区而不是大分区可以节省空间。

8、每个分区可以根据不同的需求定制。例如,如果一个分区很少往里写数据,就可以将它加载为只读。如果想要许多小文件,就需要使用有许多节点的文件系统分区。

9、在运行Unix的多用户系统上,有可能需要防止用户的硬连结攻击。为了达到这个目的,/home和/tmp路径必须与如/var和/etc下的系统文件分开。

分区类型:

硬盘分区之后,会形成3种形式的分区状态;即主分区、扩展分区和非DOS分区。

非DOS分区:

在硬盘中非DOS分区(Non-DOS Partition)是一种特殊的分区形式,它是将硬盘中的一块区域单独划分出来供另一个 *** 作系统使用,对主分区的 *** 作系统来讲,是一块被划分出去的存储空间。只有非DOS分区的 *** 作系统才能管理和使用这块存储区域。

主分区:

主分区则是一个比较单纯的分区,通常位于硬盘的最前面一块区域中,构成逻辑C磁盘。其中的主引导程序是它的一部分,此段程序主要用于检测硬盘分区的正确性,并确定活动分区,负责把引导权移交给活动分区的DOS或其他 *** 作系统。

此段程序损坏将无法从硬盘引导,但从软驱或光驱引导之后可对硬盘进行读写。

扩展分区:

而扩展分区的概念是比较复杂的,极容易造成硬盘分区与逻辑磁盘混淆;分区表的第四个字节为分区类型值,正常的可引导的大于32mb的基本DOS分区值为06,扩展的DOS分区值是05。如果把基本DOS分区类型改为05则无法启动系统 ,并且不能读写其中的数据。

如果把06改为DOS不识别的类型如efh,则DOS认为该分区不是DOS分区,当然无法读写。很多人利用此类型值实现单个分区的加密技术,恢复原来的正确类型值即可使该分区恢复正常。

磁盘分区管理方式:

磁盘分区的管理方法已经不能完全满足系统的需要了,所以 *** 作系统分都有了各种新的磁盘管理方法了。比如windows已经出现了一种动态磁盘的管理方法,linux的LVM管理方法等等。

参考资料:百度百科—磁盘分区

我们知道,进程运行需要各种各样的系统资源,如内存、文件、打印机和最

宝贵的 CPU 等,所以说,调度的实质就是资源的分配。系统通过不同的调度算法(Scheduling Algorithm)来实现这种资源的分配。通常来说,选择什么样的调度算法取决于资源分配的策略(Scheduling Policy)。

有关调度相关的结构保存在 task_struct 中,如下:

active_mm 是为内核线程而引入的,因为内核线程没有自己的地址空间,为了让内核线程与普通进程具有统一的上下文切换方式,当内核线程进行上下文切换时,让切换进来的线程的 active_mm 指向刚被调度出去的进程的 active_mm(如果进程的mm 域不为空,则其 active_mm 域与 mm 域相同)。

在 linux 2.6 中 sched_class 表示该进程所属的调度器类有3种:

进程的调度策略有5种,用户可以调用调度器里不同的调度策略:

在每个 CPU 中都有一个自身的运行队列 rq,每个活动进程只出现在一个运行队列中,在多个 CPU 上同时运行一个进程是不可能的。

运行队列是使用如下结构实现的:

tast 作为调度实体加入到 CPU 中的调度队列中。

系统中所有的运行队列都在 runqueues 数组中,该数组的每个元素分别对应于系统中的一个 CPU。在单处理器系统中,由于只需要一个就绪队列,因此数组只有一个元素。

内核也定义了一下便利的宏,其含义很明显。

Linux、c/c++服务器开发篇-------我们来聊聊进程的那些事

Linux内核 进程间通信组件的实现

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享

在分析调度流程之前,我们先来看在什么情况下要执行调度程序,我们把这种情况叫做调度时机。

Linux 调度时机主要有。

时机1,进程要调用 sleep() 或 exit() 等函数进行状态转换,这些函数会主动调用调度程序进行进程调度。

时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4 是一样的。

时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查 need_resched 的值,如果必要,则调用调度程序 schedule() 主动放弃 CPU。

时机4 , 如前所述, 不管是从中断、异常还是系统调用返回, 最终都调用 ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完。

Linux 的调度程序是一个叫 Schedule() 的函数,这个函数来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等。

从代码分析来看,Schedule 主要完成了2个功能:

进程上下文切换包括进程的地址空间的切换和执行环境的切换。

对于 switch_mm 处理,关键的一步就是它将新进程页面目录的起始物理地址装入到寄存器 CR3 中。CR3 寄存器总是指向当前进程的页面目录。

switch_to 把寄存器中的值比如esp等存放到进程thread结构中,保存现场一边后续恢复,同时调用 __switch_to 完成了堆栈的切换。

在进程的 task_struct 结构中有个重要的成分 thread,它本身是一个数据结构 thread_struct, 里面记录着进程在切换时的(系统空间)堆栈指针,取指令地址(也就是“返回地址”)等关键性的信息。

关于__switch_to 的工作就是处理 TSS (任务状态段)。

TSS 全称task state segment,是指在 *** 作系统进程管理的过程中,任务(进程)切换时的任务现场信息。

linux 为每一个 CPU 提供一个 TSS 段,并且在 TR 寄存器中保存该段。

linux 中之所以为每一个 CPU 提供一个 TSS 段,而不是为每个进程提供一个TSS 段,主要原因是 TR 寄存器永远指向它,在任务切换的适合不必切换 TR 寄存器,从而减小开销。

在从用户态切换到内核态时,可以通过获取 TSS 段中的 esp0 来获取当前进程的内核栈 栈顶指针,从而可以保存用户态的 cs,esp,eip 等上下文。

TSS 在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。

在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到 TR(任务寄存器)所指定的任务的 TSS 中;然后,下一任务的 TSS 被装入 TR;最后,从 TR 所指定的 TSS 中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在 TSS 中保存任务现场各寄存器状态的完整映象,实现任务的切换。

因此,__switch_to 核心内容就是将 TSS 中的内核空间(0级)堆栈指针换成 next->esp0。这是因为 CPU 在穿越中断门或者陷阱门时要根据新的运行级别从TSS中取得进程在系统空间的堆栈指针。

thread_struct.esp0 指向进程的系统空间堆栈的顶端。当一个进程被调度运行时,内核会将这个变量写入 TSS 的 esp0 字段,表示这个进程进入0级运行时其堆栈的位置。换句话说,进程的 thread_struct 结构中的 esp0 保存着其系统空间堆栈指针。当进程穿过中断门、陷阱门或者调用门进入系统空间时,处理器会从这里恢复期系统空间栈。

由于栈中变量的访问依赖的是段、页、和 esp、ebp 等这些寄存器,所以当段、页、寄存器切换完以后,栈中的变量就可以被访问了。

因此 switch_to 完成了进程堆栈的切换,由于被切进的进程各个寄存器的信息已完成切换,因此 next 进程得以执行指令运行。

由于 A 进程在调用 switch_to 完成了与 B 进程堆栈的切换,也即是寄存器中的值都是 B 的,所以 A 进程在 switch_to 执行完后,A停止运行,B开始运行,当过一段时间又把 A 进程切进去后,A 开始从switch_to 后面的代码开始执行。

schedule 的调用流程如下:

流程路径:ip_rcv() -->ip_rcv_finish() -->ip_local_deliver() --> ip_local_deliver_finish()

解封侧一定是ip报文的目的端,ip_rcv_finish中查到的路由肯定是本机路由(RTCF_LOCAL),调用 ip_local_deliver 处理。

下面是贴的网上的一张图片。

ip_local_deliver_finish中 根据上次协议类型,调用对应的处理函数。inet_protos 中挂载了各类协议的 *** 作集,对于AH或者ESP来说,是xfrm4_rcv,对于ipsec nat-t情况下,是udp协议的处理函数udp_rcv,内部才是封装的ipsec报文(AH或者ESP)。

xfrm4_rcv -->xfrm4_rcv_spi -->xfrm4_rcv_encap -->xfrm_input

最终调用 xfrm_input 做收包解封装流程。

1、创建SKB的安全路径;

2、解析报文,获取daddr、spi,加上协议类型(esp、ah等),就可以查询到SA了,这些是SA的key,下面列出了一组linux ipsec的state(sa)和policy,方便一眼就能看到关键信息;

3、调用SA对应协议类型的input函数,解包,并返回更上层的协议类型,type可为esp,ah,ipcomp等。对应的处理函数esp_input、ah_input等;

4、解码完成后,再根据ipsec的模式做解封处理,常用的有隧道模式和传输模式。对应xfrm4_mode_tunnel_input 和 xfrm4_transport_inout,处理都比较简单,隧道模式去掉外层头,传输模式只是设置一些skb的数据。

5、协议类型可以多层封装,如ESP+AH,所以需要再次解析内存协议,如果还是AH、ESP、COMP,则解析新的spi,返回2,查询新的SA处理报文。

6、经过上面流程处理,漏出了用户数据报文(IP报文),根据ipsec模式:

流程路径如下图,这里以转发流程为例,本机发送的包主要流程类似。

转发流程:

ip_forward 函数中调用xfrm4_route_forward,这个函数:

1、解析用户报文,查找对应的Ipsec policy(__xfrm_policy_lookup);

2、再根据policy的模版tmpl查找对应最优的SA(xfrm_tmpl_resolve),模版的内容以及和SA的对应关系见上面贴出的ip xfrm命令显示;

3、最后根据SA生成安全路由,挂载再skb的dst上; 一条用户流可以声明多个安全策略(policy),所以会对应多个SA,每个SA处理会生成一个安全路由项struct dst_entry结构(xfrm_resolve_and_create_bundle),这些安全路由项通过 child 指针链接为一个链表,其成员 output挂载了不同安全协议的处理函数,这样就可以对数据包进行连续的处理,比如先压缩,再ESP封装,再AH封装。

安全路由链的最后一个路由项一定是普通IP路由项,因为最终报文都得走普通路由转发出去,如果是隧道模式,在tunnel output封装完完成ip头后还会再查一次路由挂载到安全路由链的最后一个。

注: SA安全联盟是IPsec的基础,也是IPsec的本质。 SA是通信对等体间对某些要素的约定,例如使用哪种协议、协议的 *** 作模式、加密算法、特定流中保护数据的共享密钥以及SA的生存周期等。

然后,经过FORWARD点后,调用ip_forward_finish()-->dst_output,最终调用skb_dst(skb)->output(skb),此时挂载的xfrm4_output

本机发送流程简单记录一下,和转发流程殊途同归:

查询安全路由: ip_queue_xmit -->ip_route_output_flow -->__xfrm_lookup

封装发送:ip_queue_xmit -->ip_local_out -->dst_output -->xfrm4_output

注:

1). 无论转发还是本地发送,在查询安全路由之前都会查一次普通路由,如果查不到,报文丢弃,但这条路由不一定需要指向真实的下一跳的出接口,只要能匹配到报文DIP即可,如配置一跳其它接口的defualt。

2). strongswan是一款用的比较多的ipsec开源软件,协商完成后可以看到其创建了220 table,经常有人问里面的路由有啥用、为什么有时有有时无。这里做个测试记录: 1、220中貌似只有在tunnel模式且感兴趣流是本机发起(本机配置感兴趣流IP地址)的时候才会配置感兴趣流相关的路由,路由指定了source;2、不配置也没有关系,如1)中所说,只要存在感兴趣流的路由即可,只不过ping的时候需要指定source,否者可能匹配不到感兴趣流。所以感觉220这个表一是为了保证

ipsec封装发送流程:

xfrm4_output-->xfrm4_output_finish-->xfrm_output-->xfrm_output2-->xfrm_output_resume-->xfrm_output_one

xfrm4_output 函数先过POSTROUTING点,在封装之前可以先做SNAT。后面则调用xfrm_output_resume-->xfrm_output_one 做IPSEC封装最终走普通路由走IP发送。

贴一些网上的几张数据结构图

1、安全路由

2、策略相关协议处理结构

3、状态相关协议处理结构


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/5931654.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-08
下一篇2023-03-08

发表评论

登录后才能评论

评论列表(0条)

    保存