【操作系统】第五章:虚拟内存(Part2:虚拟内存管理技术)

虚拟内存管理技术-简称虚存技术
在这里插入图片描述
解决覆盖技术和交换技术弊端的技术
在这里插入图片描述
区别:过程由OS完成,减轻程序猿负担。
在这里插入图片描述
根据当前执行情况可以动态的导出导入,但是粒度更小,不只是程序间,还可以以页或者段为粒度来进行导入导出。
在这里插入图片描述
如图所示,OS和MMU支持下,以P3为例,P3只在内存中放了2个内存页,其他的全放入了硬盘中。因为此时只用到了这一小部分数据,这样就使得一个本来比较大的程序在有效时间段内仅使用一小部分内存资源。虚存技术,除了需要硬件支持外,还需要程序具有局部性。

程序的局部性原理

在这里插入图片描述
局部性原理分为了时间局部性和空间局部性。
时间局部性:一条指令和下次执行,一个数据的访问和下一次访问都集中在一个较短时期内。
空间局部性:当前指令和邻近几条指令、当前访问和邻近的几个数据都集中在一个较小区域内。
分支局部性:一条跳转指令的两次执行,很可能跳到相同的内存位置
访问速度快、空间大、使用方便(不需要程序猿过多构思数据结构)
例子:
在这里插入图片描述
这个整数数组的空间大小是1024x1024,int型每一个是4byte,也就说这一个数组整体会占4M的内存空间。但是物理内存只有4K。此时,
程序1:A【0】【0】~ A【1023】【0】==>A【1023】【1023】

程序2:A【0】【0】~ A【0】【1023】==>A【1023】【1023】

区别:实际上A【1】【0】和A【0】【0】从空间上来看,中间差了1024个数据也就说是4K的数据大小,但是A【1】【0】和A【1】【1】之间的距离只有一个数据也就说4byte。
那么对于程序2而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问A【0】【1】时,因为已经有了对应的页,就不会发生页异常。内循环执行完后,进入下一个内循环,此时访问A【1】【0】发生一次中断,然后接下来的1023次访问不会再发生中断。具备很好的空间局部性和时间局部性。也就意味着一共发生了1024次缺页中断
对于程序1而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问时,会访问A【1】【0】,此时会再次产生缺页异常,因为对应A【1】【x】的页仍然不在内存,在硬盘中,需要再次把4K的物理内存用到A【1】【x】数组上,此后导入A【1】【x】的页。同理,在一个内循环中,每一次都会跳4K空间去访问一个数据,每一次访问都会发生缺页异常。也就意味着一共发生了1024x1024次缺页中断
可以看出程序的不同写法对开销的影响是相当大的。
缺页/段异常
上面讲到的,因为内存中只有部分数据,所以可能会发生程序进行到一定阶段后,接下来的数据访问不到的情况。因为另一部分数据不在内存中而在硬盘中,此时会发生一个缺页或者缺段异常。 此时OS会进行处理,如果内存还有空间,就会把数据或者指令从硬盘导入内存,这样程序就可以继续执行。如果内存空间不足,则OS需要考虑当前阶段不会立刻用到的数据导出到硬盘,然后把需要的数据换入内存。这个选择哪个程序导出也很重要。选择的好,访问读写的次数就会少,整体系统性能也会提高。

虚存技术的基本特征

1.空间大: 通过内存和外存结合,提供给用户的虚拟内存空间通常大于实际物理空间。 32位机器理论上可以访问4GB而且物理内存只有256M,但是硬盘容量很大。通过硬盘的补充,可以实现内存中跑多个程序,而且每个程序会认为自己占用了4GB的空间。kernel是常驻内存不能被换出。
2.部分交换:与交换技术相比,虚拟存储的调入和调出是对部分虚拟空间进行的
3.不连续性:物理内存分配不连续,虚拟空间使用也不连续。(因为换入换出会导致原本连续的地址空间很可能再换回后不再在换出位置)

虚存技术的实现

虚拟页式内存管理

在这里插入图片描述
如图所示, 逻辑地址空间和物理地址空间是靠页表来维持映射关系的。页表项的索引是页号,页表项的内容是页帧号。页表项除了页帧号之外,其实还有几个单位的bit作为标志位,比如存在位。那么这里的内存访问查找页表发现对应页表项的存在位是0,则说明这个虚拟地址空间没有对应的物理空间,产生访问异常。
大部分虚拟存储系统都采用虚拟页式内存管理。为了实现,除了页式内存管理的基本功能之外,在增加两个新的功能(请求调页和页面置换)【需要访问这个页时,才把这个页调入到内存中】

请求调页:当一个用户进程需要调入内存运行时,不会把所有程序都放入内存中,只是装入一部分程序。放到个别的页里,运行的时候就有可能出现访问的数据和代码不在内存中,此时就会由CPU发出缺页异常的信号,然后OS根据产生异常的地址来找到对应到外存中需要被调入的数据,然后将其放入相应的物理页去,使该页可以继续执行。

页面置换:访问过程中,随着程序的执行他占用内存越来越多,此时需要把不常用页换出,把当前需要的页换入,这就是页面置换。该功能实现的好坏就决定了整体效率,所以后面会专门设计一个有效的页面置换算法,后续会详细讲解。
在这里插入图片描述
为了实现这两个功能,我们需要在页表项里增加一些特殊的,来辅助完成这些功能。有4个位比较重要。
1.存在位/驻留位:这个位表示该页是否存在内存中。0表示不在内存中,1表示在内存中。为1也就说逻辑页号一定对应一个物理页帧号。如果为0则说明内存中没有对应物理页支持,很有可能对应数据在外存中,此时访问会出现访问异常
2.保护位:表示允许该页做何种类型的访问,比如只读、只写,可读写、只执行等。 如果只读标识下执行写操作就会出现异常。
3.修改位:表明这个页是否被修改(写操作)过。如果这个页被写过,为1,;没被写过,就为0。如果内存中数据被写过,也就说当前数据与硬盘中数据不一致了,这时候最新的数据放入内存时,进行换出操作,需要把这个数据保存到硬盘中,使得硬盘中数据与内存中数据一致。如果修改位为0,则内外数据一致,此时如果进行换入换出操作,只需要释放就可以。所以修改位的使用可以有效提高修改位的效率。
4.访问位:这个也是否被访问过,访问过为1,没有访问为0。置换算法中,我们会把页换出去,那么换哪些?应该换当前没有访问的页,这位可以表明这个页是否经常使用,近期是否会使用等信息,我们可以根据这个特点决定换出对象。
在这里插入图片描述
驻留位为0,没有对应的虚拟地址映射到物理地址上。
这里执行了两个指令。
1. M O V   R E G , 08192 MOV\space REG ,0 8192 MOV REG,08192
访问,把虚拟0地址的内容赋给一个寄存器。0地址对应页表里的映射关系,是物理地址中的页帧号2位置,所以他的实际物理地址应该是2*4K=8K(8192Byte)
2. M O V   R E G , 32780 MOV\space REG ,32780 MOV REG,32780 ==> M O V   R E G , 缺 页 中 断 MOV\space REG,缺页中断 MOV REG,
把虚拟地址32780读到寄存器中,32780其实对应到逻辑地址中的页号为8的项中,因为驻留位为0,没有对应到物理地址的映射,则会触发缺页异常。

缺页中断处理

在这里插入图片描述
①:CPU执行指令,如果一个内存地址没有对应的映射关系,发生缺页异常。
④:需要访问的地址对应的硬盘中的数据以页的单位从硬盘读入内存中,然后修改页表,驻留位改为存在并把页帧号改成该页帧号。
如果没有空闲空间时,需要使用页面替换算法。

后备存储(二级存储)

在这里插入图片描述
硬盘存储数据的特征:
1.数据:数据文件放在硬盘上,当需要时,如果内存中没有,则从数据文件中读出。这是一种后备存储。
2.代码:操作系统会在令程序执行很多指令,指令其实也是一种数据,放在执行程序里/硬盘里。同理,读入内存并让CPU执行,当指令不存在,会进一步从程序中读入这条指令。
3.动态链接库:库的代码数据也是放在硬盘的。同理也是需要时读入
4.交换文件(swap file):程序运行过程中有可能产生许多数据,但是这些数据没有对应到具体的文件,就是动态产生的数据,这些数据也有可能占用了不小的空间且需要换出到硬盘中,则此时OS会在硬盘中开辟一个专门的区域——swap file。这个文件内的数据没有与文件直接对应的内存内容
这四类形成了后备存储(二级存储),有了二级存储的支持,保证了空间的有效性。

虚拟内存性能

在这里插入图片描述
分析执行开销:
E A T = 内 存 访 问 时 间 ∗ 页 表 命 中 率 + 缺 页 处 理 时 间 ∗ 缺 页 概 率 EAT=内存访问时间*页表命中率+缺页处理时间*缺页概率 EAT=访+
分析这个例子中的参数,10代表一次内存的访问时间,页表命中率也就说没有缺页的概率,就是1-p;如果产生缺页,自然就需要访问磁盘,那么处理时间就是5ms( 5 ∗ 1 0 6 n s 5*10^6ns 5106ns)。产生缺页后至少要做一个读操作,为 5 m s ∗ p 5ms*p 5msp
q是页修改概率。代表对某一个内存页的写操作后,且该数据需要换出时,前面讲过这个换出操作导致当前数据与硬盘中数据不一致,需要个更新硬盘数据,也就说要对硬盘进行一个写操作。写硬盘操作的开销也是5ms,缺页且需要页修改的情况下的开销为 5 m s ∗ p ∗ q 5ms*p*q 5mspq
脏页简单来说就是根据一个高速缓存表来不断更新数据的常用标识,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存。页作为高速缓存的单位,当某一个页被访问后,对其标识并且对上一个访问的页标识,旧的级别分为不同级别,当旧的级别达到一定程度时,修改高速缓存里,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到硬盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。

p足够小,那么平均访问时间就会接近10ns,p如果比较大,则会导致整个循环的效率比较差。但是因为程序的局部性特点,意味着缺页次数不会过多,此时效率可以得到保障。

深入解析WINDOWS操作系统(第4版) ISBN:9787121039690 本书是著名的操作系统内核专家Mark Russinovich和David Solomon撰写的Windows操作系统原理的最新版著作,全面和深入地阐述了Windows操作系统的整体结构以及内部工作细节。本书针对Windows Server 2003、Windows XP和Windows 2000做了全面更新,通过许多练习实验让你直接感受到Windows的内部行为。另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发人员还是系统管理员,你都可以在本书中找到一些关键的、有关体系结构方面的知识,通过这些知识你可以更好地做系统设计、调试,以及性能优化。 全书内容丰富、信息全面,主要包括的Windows操作系统深度知识有:理解Windows的关键机制,包括系统服务分发和调度机制、启动和停机,以及注册表;挖掘Windows的安全模型,包括访问控制、特权和审计;利用内核调试器和其他的工具来检查内部系统结构;检查与进程、线程和作业相关的数据结构和算法;观察Windows如何管理虚拟内存和物理内存;理解NTFS的操作和格式,诊断文件系统访问问题;从上往下查看Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断引导问题,执行崩溃分析。 本书适合广大Windows平台开发人员、IT专业从业人员等参考使用。 编辑推荐 ■ 国内知名译者潘爱民先生译作 ■ Windows系统之父Jim Allchin亲自撰文推荐! ■ Windows NT首席设计师David N. Cutler亲自撰文推荐! ■ 深入解析Windows操作系统!彻底揭开Windows技术内幕! ■ Csdn、博客堂、博客园、《程序员》杂志鼎力推荐! 目录第1 概念和工具 1 1.1 Windows操作系统的版本 1 1.2 基础概念和术语 3 Windows API 3 服务、函数和例程 5 进程、线程和作业 6 虚拟内存 14 内核模式和用户模式 16 终端服务及多个会话 21 对象和句柄 22 安全性 23 注册表 24 Unicode 25 1.3 挖掘Windows内部机理 25 性能工具 27 Windows支持工具箱 27 Windows资源工具箱 27 内核调试 28 Platform SDK 33 DDK(设备驱动程序开发工具) 34 Sysinternals工具 34 1.4 本总结 34 第2 系统结构 35 2.1 需求和设计目标 35 2.2 操作系统模型 36 2.3 总体结构 37 可移植性 40 对称多处理 41 可伸缩性 46 客户和服务器版本之间的差异 47 检查版本 49 2.4 关键的系统组件 51 环境子系统和子系统DLL 53 硬件抽象层(HAL) 67 设备驱动程序 69 系统进程 75 2.5 本总结 84 第3 系统机制 85 3.1 陷阱分发 85 中断分发 87 异常分发 109 系统服务分发 119 3.2 对象管理器 124 执行体对象 126 对象结构 128 3.3 同步 149 高IRQL的同步 151 低IRQL的同步 155 3.4 系统辅助线程 166 3.5 Windows全局标志 168 3.6 本地过程调用(LPC) 171 3.7 内核事件追踪 175 3.8 Wow64 178 Wow64进程地址空间布局结构 179 系统调用 179 异常分发 179 用户回调 179 文件系统重定向 180 注册表的重定向和反射 180 I/O控制请求 181 16位安装器应用程序 182 打印 182 一些限制 182 3.9 本总结 182 第4 管理机制 183 4.1 注册表 183 查看和修改注册表 183 注册表用法 184 注册表数据类型 185 注册表逻辑结构 186 注册表问题的诊断 192 注册表的内部机理 197 4.2 服务 211 服务应用 212 服务账户 217 服务控制管理223 服务启动 225 启动错误 229 接受当前引导和“最后已知的好控制集” 230 服务失败 231 服务停机 232 共享的服务进程 233 服务控制程序 236 4.3 Windows管理规范 237 WMI体系结构 237 提供者 239 公共信息模型(CIM)和可管理对象的格式语言 240 WMI名字空间 243 类关联 244 WMI实现 247 WMI安全性 248 4.4 本总结 249 第5 启动和停机 251 5.1 引导过程 251 x86和x64引导准备 251 x86/x64引导扇区和Ntldr 255 IA64引导过程 264 初始化内核和执行体子系统 266 Smss、Csrss和Winlogon 269 自动启动的映像文件 273 5.2 引导和启动问题的故障检查 274 最后已知的好配置 274 安全模式 274 安全模式下的驱动程序加载 275 恢复控制台(Recovery Console) 279 解决常见的引导问题 281 5.3 停机 286 5.4 本总结 288 第6 进程、线程和作业 289 6.1 进程的内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关的函数 298 6.2 CreateProcess的流程 300 阶段1:打开将要被执行的映像 302 阶段2:创建Windows执行体进程对象 304 阶段3:创建初始线程,以及它的栈和执行环境 308 阶段4:将新进程通知Windows子系统 309 阶段5:启动初始线程的执行 310 阶段6:在新进程环境下执行进程初始化 310 6.3 线程的内部机理 313 数据结构 313 内核变量 320 性能计数器 321 有关的函数 322 一个线程的产生 322 6.4 检查线程活动 323 6.5 线程调度 325 Windows调度的概述 326 优先级别 327 Windows调度API 330 有关的工具 331 实时优先级 333 线程状态 334 分发器数据库 338 时限 340 调度情形 345 环境切换 347 空闲(Idle)线程 348 优先级提升 348 多处理器系统 357 多处理器的线程调度算法 366 6.6 作业对象 369 6.7 本总结 374 第7 内存管理 375 7.1 内存管理器简介 375 内存管理器组件 376 内部同步 377 配置内存管理器 378 检查内存的使用情况 378 7.2 内存管理器提供的服务 382 大页面和小页面 382 保留的和提交的页面 384 锁住内存 385 分配粒度 385 共享内存和映射文件 386 保护内存 388 “不可执行”页面保护 390 写时复制 392管理器 394 地址窗口扩展 399 7.3 系统内存池 401 配置内存池的大小 401 监视内存池的使用 404 预读列表(Look-Aside List) 408 驱动程序检验器(Driver Verifier) 409 7.4 虚拟地址空间的布局结构 413 x86用户地址空间的布局结构 415 x86系统地址空间的布局结构 417 x86会话空间 418 系统页表项(PTE,Page Table Entry) 421 64位地址空间布局结构 422 7.5 地址转译 425 x86虚拟地址转译 425 地址转译快查缓冲区 434 物理地址扩展(PAE) 435 IA-64虚拟地址转译 437 x64虚拟地址转译 438 7.6 页面错误处理 439 无效PTE 440 原型PTE 441 页面换入I/O 443 冲突的页面错误 444 页面文件 444 7.7 虚拟地址描述符 448 7.8 内存区对象 450 7.9 工作集 457 按需换页 458 7.10 逻辑预取器 458 放置策略 462 工作集管理 463 平衡集管理器和交换器 466 系统工作集 467 7.11 页面帧编号数据库 469 页面列表的动态变化 472 已修改页面写出器 475 PFN数据结构 476 低内存通知和高内存通知 479 7.12总结 483 第8 安全性 485 8.1 安全系统组件 488 8.2 保护对象 492 访问检查 493 安全描述符和访问控制 506 8.3 账户权限和特权 516 账户权限 517 特权 518 超级特权 523 8.4 安全审计 524 8.5 登录(Logon) 526 Winlogon初始化 528 用户登录步骤 529 8.6 软件限制策略 533 8.7 本总结 535 第9 I/O系统 537 9.1 I/O系统组件 537 I/O管理器 539 典型的I/O处理过程 540 9.2 设备驱动程序 541 设备驱动程序的类型 541 驱动程序的结构 548 驱动程序对象和设备对象 550 打开设备 555 9.3 I/O处理 561 I/O类型 561 映射文件I/O和文件缓存 564 I/O请求包 564 针对单层驱动程序的I/O请求 569 针对分层的驱动程序的I/O请求 577 I/O完成端口 585 驱动程序检验器(Driver Verifier) 589 9.4 即插即用(PnP)管理器 590 即插即用支持的级别 591 驱动程序对于即插即用的支持 592 驱动程序加载、初始化和安装 594 驱动程序安装 603 9.5 电源管理器 607 电源管理器的操作 609 驱动程序的电源操作 610 驱动程序对于设备电源的控制 613 9.6 本总结 613 第10 存储管理 615 10.1 有关存储的术语 615 10.2 磁盘驱动程序 616 Ntldr 616 磁盘类、端口和小端口驱动程序 617 磁盘设备对象 620 分区管理器 622 10.3 卷的管理 622 基本磁盘 624 动态磁盘 626 多分区卷的管理 632 卷名字空间 638 卷的I/O操作 646 虚拟磁盘服务 648 卷影像(shadow)拷贝服务 649 10.4 本总结 654 第11 缓存管理器 655 11.1 缓存管理器的关键特性 655 单个中心化的系统缓存 656 内存管理器 656 缓存一致性 656 虚拟块缓存 658 流式缓存机制 658 对可恢复文件系统的支持 658 11.2 缓存的虚拟内存管理 660 11.3 缓存的大小 662 LargeSystemCache 662 缓存的虚拟大小 663 缓存的工作集大小 665 缓存的物理大小 667 11.4 缓存的数据结构 668 系统范围的缓存数据结构 669 针对每个文件的缓存数据结构 670 11.5 文件系统接口 674 从缓存中来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读(Read Ahead)和滞后写(Write Behind) 682 智能预读 682 回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 683 写节流(Write Throttling) 686 系统线程 687 11.8 本总结 688 第12 文件系统 689 12.1 Windows文件系统格式 690 CDFS 690 UDF 691 FAT12、FAT16和FAT32 691 NTFS 694 12.2 文件系统驱动程序总体结构 694 本地FSD 695 远程FSD 696 文件系统操作 700 文件系统过滤型驱动程序 705 12.3 诊断文件系统的问题 711 Filemon的基本和高级模式 711 Filemon诊断技巧 712 12.4 NTFS设计目标和特性 717 高端(High-End)文件系统的需求 717 NTFS的高级特性 719 12.5 NTFS文件系统驱动程序 729 12.6 NTFS在磁盘上的结构 732 卷(volume) 732 簇(cluster) 732 主文件表(MFT) 733 文件引用号 739 文件纪录 740 文件名 742 驻留的和非驻留的属性 744 数据压缩和稀疏文件 747 变化日志文件 752 索引 753 对象ID 754 配额跟踪 755 统一的安全性 756 重解析点 758 12.7 NTFS的恢复支持 758 文件系统设计的演变 759 日志记录 761 恢复 767 NTFS的坏簇恢复 771 12.8 加密文件系统(EFS)安全性 775 第一次加密一个文件 778 解密过程 783 加密文件的备份 784 12.9 本总结 785 第13 网络 787 13.1 Windows的网络总体结构 787 OSI参考模型 787 Windows网络组件 789 13.2 网络API 791 Windows套接字(Windows Sockets) 791 远过程调用 798 Web访问API 803 命名管道和邮件槽 804 NetBIOS 811 NetBIOS的操作 812 其他的网络API 813 13.3 多重定向器支持 815 多提供者转发器 816 多UNC提供者 818 13.4 名称解析 820 域名系统 820 Windows Internet名称服务 820 13.5 协议驱动程序 821 TCP/IP的扩展 824 13.6 NDIS驱动程序 828 NDIS小端口的变化形式 832 面向连接的NDIS 832 外接NDIS(Remote NDIS) 835 QOS 836 13.7 绑定 838 13.8 分层的网络服务 839 远程访问(Remote Access) 839 活动目录 840 网络负载平衡 841 文件复制服务 843 分布式文件系统 843 13.9 本总结 844 第14 崩溃转储分析 845 14.1 Windows为什么会崩溃 845 14.2 蓝屏 846 14.3 崩溃转储文件 849 崩溃转储的生成 852 14.4 Windows错误报告 853 14.5 在线崩溃分析 854 14.6 基本的崩溃转储分析 855 Notmyfault 855 基本的崩溃转储分析 856 详细的分析 858 14.7 使用崩溃诊断工具 860 缓冲区溢出和特殊内存池 861 代码改写和系统代码写保护 863 14.8 高级的崩溃转储分析 864 栈破坏 865 挂起的系统或无响应的系统 866 当没有崩溃转储时 869 术语表 871 术语对照表 895 索引 901
相关推荐
<p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-size:13.5pt;font-family:'微软雅黑',sans-serif;color:#3598db;">【为什么要学习这门课】</span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-family:'微软雅黑',sans-serif;color:#222226;">Linux</span><span style="font-family:'微软雅黑',sans-serif;color:#222226;">创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap. Show me the code. </span></span><span style="font-family:微软雅黑, sans-serif;color:#e03e2d;background-color:#ffffff;">冗谈不够,放码过来!</span><span style="font-family:'微软雅黑',sans-serif;color:#222226;">代码阅读是从基础到提高的必由之路。 </span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-family:'微软雅黑',sans-serif;color:#222226;">YOLOv5</span><span style="font-family:'微软雅黑',sans-serif;color:#222226;">是最近推出的轻量且高性能的实时目标检测方法。<span>YOLOv5</span>使用<span>PyTorch</span>实现,含有很多业界前沿和常用的技巧,可以作为很好的代码阅读案例,让我们深入探究其实现原理,其中不少知识点的代码可以作为相关项目的借鉴。</span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-size:13.5pt;font-family:'微软雅黑',sans-serif;color:#3598db;">【课程内容与收获】</span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-family:'微软雅黑',sans-serif;color:#222226;">本课程将详细解析<span>YOLOv5</span>的实现原理和源码,对关键代码使用<span>PyCharm</span>的<span>debug</span>模式逐行分析解读。 本课程将提供注释后的<span>YOLOv5</span>的源码程序文件。</span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-family:'微软雅黑',sans-serif;color:#222226;"> <img src="https://img-bss.csdnimg.cn/202012061533559839.jpg" alt="课程内容" /></span> </p> <p class="MsoNormal" style="text-align:left;background:white;" align="left"> <span style="font-size:13.5pt;font-family:'微软雅黑',sans-serif;color:#3598db;">【相关课程】</span> </p> <p style="margin-left:0cm;"> 本人推出了有关YOLOv5目标检测的系列课程。请持续关注该系列的其它视频课程,包括: </p> <p> 《YOLOv5(PyTorch)目标检测实战:训练自己的数据集》 </p> <p> Ubuntu系统 <strong><a href="https://edu.csdn.net/course/detail/30793"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/30793</span></a></strong> </p> <p> Windows系统 <strong><a href="https://edu.csdn.net/course/detail/30923"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/30923</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测:原理与源码解析》<strong><a href="https://edu.csdn.net/course/detail/31428"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/31428</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测实战:Flask Web部署》<strong><a href="https://edu.csdn.net/course/detail/31087"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/31087</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》<strong><a href="https://edu.csdn.net/course/detail/32303"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/32303</span></a></strong> </p>
《深入解析Windows操作系统》中文版 第四版 1/5 第1 概念和工具 1.1 Windows操作系统的版本 1.2 基础概念和术语 1.3 挖掘Windows内部机理 1.4 本总结 第2 系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.4 关键的系统组件 2.5 本总结 第3 系统机制 3.1 陷阱分发 3.2 对象管理器 3.3 同步 3.4 系统辅助线程 3.5 Windows全局标志 3.6 本地过程调用(LPC) 3.7 内核事件追踪 3.8 Wow64 3.9 本总结 第4 管理机制 4.1 注册表 4.2 服务 4.3 Windows管理规范 4.4 本总结 第5 启动和停机 5.1 引导过程 5.2 引导和启动问题的故障检查 5.3 停机 5.4 本总结 第6 进程、线程和作业 6.1 进程的内部机理 6.2 CreateProcess的流程 6.3 线程的内部机理 6.4 检查线程活动 6.5 线程调度 6.6 作业对象 6.7 本总结 第7 内存管理 7.1 内存管理器简介 7.2 内存管理器提供的服务 7.3 系统内存池 7.4 虚拟地址空间的布局结构 7.5 地址转译 7.6 页面错误处理 7.7 虚拟地址描述符 7.8 内存区对象 7.9 工作集 7.10 逻辑预取器 7.11 页面帧编号数据库 7.12总结 第8 安全性 8.1 安全系统组件 8.2 保护对象 8.3 账户权限和特权 8.4 安全审计 8.5 登录(Logon) 8.6 软件限制策略 8.7 本总结 第9 I/O系统 9.1 I/O系统组件 9.2 设备驱动程序 9.3 I/O处理 9.4 即插即用(PnP)管理器 9.5 电源管理器 9.6 本总结 第10 存储管理 10.1 有关存储的术语 10.2 磁盘驱动程序 10.3 卷的管理 10.4 本总结 第11 缓存管理器 11.1 缓存管理器的关键特性 11.2 缓存的虚拟内存管理 11.3 缓存的大小 11.4 缓存的数据结构 11.5 文件系统接口 11.6 快速I/O 11.7 预读(Read Ahead)和滞后写(Write Behind) 11.8 本总结 第12 文件系统 12.1 Windows文件系统格式 12.2 文件系统驱动程序总体结构 12.3 诊断文件系统的问题 12.5 NTFS文件系统驱动程序 12.6 NTFS在磁盘上的结构 12.7 NTFS的恢复支持 12.8 加密文件系统(EFS)安全性 12.9 本总结 第13 网络 13.1 Windows的网络总体结构 13.2 网络API 13.3 多重定向器支持 13.4 名称解析 13.5 协议驱动程序 13.6 NDIS驱动程序 13.7 绑定 13.8 分层的网络服务 13.9 本总结 第14 崩溃转储分析 14.1 Windows为什么会崩溃 14.2 蓝屏 14.3 崩溃转储文件 14.4 Windows错误报告 14.5 在线崩溃分析 14.6 基本的崩溃转储分析 14.7 使用崩溃诊断工具 14.8 高级的崩溃转储分析 术语表 术语对照表 索引
深入解析Windows操作系统 4/5 第1 概念和工具 1.1 Windows操作系统的版本 1.2 基础概念和术语 1.3 挖掘Windows内部机理 1.4 本总结 第2 系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.4 关键的系统组件 2.5 本总结 第3 系统机制 3.1 陷阱分发 3.2 对象管理器 3.3 同步 3.4 系统辅助线程 3.5 Windows全局标志 3.6 本地过程调用(LPC) 3.7 内核事件追踪 3.8 Wow64 3.9 本总结 第4 管理机制 4.1 注册表 4.2 服务 4.3 Windows管理规范 4.4 本总结 第5 启动和停机 5.1 引导过程 5.2 引导和启动问题的故障检查 5.3 停机 5.4 本总结 第6 进程、线程和作业 6.1 进程的内部机理 6.2 CreateProcess的流程 6.3 线程的内部机理 6.4 检查线程活动 6.5 线程调度 6.6 作业对象 6.7 本总结 第7 内存管理 7.1 内存管理器简介 7.2 内存管理器提供的服务 7.3 系统内存池 7.4 虚拟地址空间的布局结构 7.5 地址转译 7.6 页面错误处理 7.7 虚拟地址描述符 7.8 内存区对象 7.9 工作集 7.10 逻辑预取器 7.11 页面帧编号数据库 7.12总结 第8 安全性 8.1 安全系统组件 8.2 保护对象 8.3 账户权限和特权 8.4 安全审计 8.5 登录(Logon) 8.6 软件限制策略 8.7 本总结 第9 I/O系统 9.1 I/O系统组件 9.2 设备驱动程序 9.3 I/O处理 9.4 即插即用(PnP)管理器 9.5 电源管理器 9.6 本总结 第10 存储管理 10.1 有关存储的术语 10.2 磁盘驱动程序 10.3 卷的管理 10.4 本总结 第11 缓存管理器 11.1 缓存管理器的关键特性 11.2 缓存的虚拟内存管理 11.3 缓存的大小 11.4 缓存的数据结构 11.5 文件系统接口 11.6 快速I/O 11.7 预读(Read Ahead)和滞后写(Write Behind) 11.8 本总结 第12 文件系统 12.1 Windows文件系统格式 12.2 文件系统驱动程序总体结构 12.3 诊断文件系统的问题 12.5 NTFS文件系统驱动程序 12.6 NTFS在磁盘上的结构 12.7 NTFS的恢复支持 12.8 加密文件系统(EFS)安全性 12.9 本总结 第13 网络 13.1 Windows的网络总体结构 13.2 网络API 13.3 多重定向器支持 13.4 名称解析 13.5 协议驱动程序 13.6 NDIS驱动程序 13.7 绑定 13.8 分层的网络服务 13.9 本总结 第14 崩溃转储分析 14.1 Windows为什么会崩溃 14.2 蓝屏 14.3 崩溃转储文件 14.4 Windows错误报告 14.5 在线崩溃分析 14.6 基本的崩溃转储分析 14.7 使用崩溃诊断工具 14.8 高级的崩溃转储分析 术语表 术语对照表 索引
深入解析WINDOWS操作系统(第4版) ISBN:9787121039690 本书是著名的操作系统内核专家Mark Russinovich和David Solomon撰写的Windows操作系统原理的最新版著作,全面和深入地阐述了Windows操作系统的整体结构以及内部工作细节。本书针对Windows Server 2003、Windows XP和Windows 2000做了全面更新,通过许多练习实验让你直接感受到Windows的内部行为。另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发人员还是系统管理员,你都可以在本书中找到一些关键的、有关体系结构方面的知识,通过这些知识你可以更好地做系统设计、调试,以及性能优化。 全书内容丰富、信息全面,主要包括的Windows操作系统深度知识有:理解Windows的关键机制,包括系统服务分发和调度机制、启动和停机,以及注册表;挖掘Windows的安全模型,包括访问控制、特权和审计;利用内核调试器和其他的工具来检查内部系统结构;检查与进程、线程和作业相关的数据结构和算法;观察Windows如何管理虚拟内存和物理内存;理解NTFS的操作和格式,诊断文件系统访问问题;从上往下查看Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断引导问题,执行崩溃分析。 本书适合广大Windows平台开发人员、IT专业从业人员等参考使用。 编辑推荐 ■ 国内知名译者潘爱民先生译作 ■ Windows系统之父Jim Allchin亲自撰文推荐! ■ Windows NT首席设计师David N. Cutler亲自撰文推荐! ■ 深入解析Windows操作系统!彻底揭开Windows技术内幕! ■ Csdn、博客堂、博客园、《程序员》杂志鼎力推荐! 目录第1 概念和工具 1 1.1 Windows操作系统的版本 1 1.2 基础概念和术语 3 Windows API 3 服务、函数和例程 5 进程、线程和作业 6 虚拟内存 14 内核模式和用户模式 16 终端服务及多个会话 21 对象和句柄 22 安全性 23 注册表 24 Unicode 25 1.3 挖掘Windows内部机理 25 性能工具 27 Windows支持工具箱 27 Windows资源工具箱 27 内核调试 28 Platform SDK 33 DDK(设备驱动程序开发工具) 34 Sysinternals工具 34 1.4 本总结 34 第2 系统结构 35 2.1 需求和设计目标 35 2.2 操作系统模型 36 2.3 总体结构 37 可移植性 40 对称多处理 41 可伸缩性 46 客户和服务器版本之间的差异 47 检查版本 49 2.4 关键的系统组件 51 环境子系统和子系统DLL 53 硬件抽象层(HAL) 67 设备驱动程序 69 系统进程 75 2.5 本总结 84 第3 系统机制 85 3.1 陷阱分发 85 中断分发 87 异常分发 109 系统服务分发 119 3.2 对象管理器 124 执行体对象 126 对象结构 128 3.3 同步 149 高IRQL的同步 151 低IRQL的同步 155 3.4 系统辅助线程 166 3.5 Windows全局标志 168 3.6 本地过程调用(LPC) 171 3.7 内核事件追踪 175 3.8 Wow64 178 Wow64进程地址空间布局结构 179 系统调用 179 异常分发 179 用户回调 179 文件系统重定向 180 注册表的重定向和反射 180 I/O控制请求 181 16位安装器应用程序 182 打印 182 一些限制 182 3.9 本总结 182 第4 管理机制 183 4.1 注册表 183 查看和修改注册表 183 注册表用法 184 注册表数据类型 185 注册表逻辑结构 186 注册表问题的诊断 192 注册表的内部机理 197 4.2 服务 211 服务应用 212 服务账户 217 服务控制管理223 服务启动 225 启动错误 229 接受当前引导和“最后已知的好控制集” 230 服务失败 231 服务停机 232 共享的服务进程 233 服务控制程序 236 4.3 Windows管理规范 237 WMI体系结构 237 提供者 239 公共信息模型(CIM)和可管理对象的格式语言 240 WMI名字空间 243 类关联 244 WMI实现 247 WMI安全性 248 4.4 本总结 249 第5 启动和停机 251 5.1 引导过程 251 x86和x64引导准备 251 x86/x64引导扇区和Ntldr 255 IA64引导过程 264 初始化内核和执行体子系统 266 Smss、Csrss和Winlogon 269 自动启动的映像文件 273 5.2 引导和启动问题的故障检查 274 最后已知的好配置 274 安全模式 274 安全模式下的驱动程序加载 275 恢复控制台(Recovery Console) 279 解决常见的引导问题 281 5.3 停机 286 5.4 本总结 288 第6 进程、线程和作业 289 6.1 进程的内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关的函数 298 6.2 CreateProcess的流程 300 阶段1:打开将要被执行的映像 302 阶段2:创建Windows执行体进程对象 304 阶段3:创建初始线程,以及它的栈和执行环境 308 阶段4:将新进程通知Windows子系统 309 阶段5:启动初始线程的执行 310 阶段6:在新进程环境下执行进程初始化 310 6.3 线程的内部机理 313 数据结构 313 内核变量 320 性能计数器 321 有关的函数 322 一个线程的产生 322 6.4 检查线程活动 323 6.5 线程调度 325 Windows调度的概述 326 优先级别 327 Windows调度API 330 有关的工具 331 实时优先级 333 线程状态 334 分发器数据库 338 时限 340 调度情形 345 环境切换 347 空闲(Idle)线程 348 优先级提升 348 多处理器系统 357 多处理器的线程调度算法 366 6.6 作业对象 369 6.7 本总结 374 第7 内存管理 375 7.1 内存管理器简介 375 内存管理器组件 376 内部同步 377 配置内存管理器 378 检查内存的使用情况 378 7.2 内存管理器提供的服务 382 大页面和小页面 382 保留的和提交的页面 384 锁住内存 385 分配粒度 385 共享内存和映射文件 386 保护内存 388 “不可执行”页面保护 390 写时复制 392管理器 394 地址窗口扩展 399 7.3 系统内存池 401 配置内存池的大小 401 监视内存池的使用 404 预读列表(Look-Aside List) 408 驱动程序检验器(Driver Verifier) 409 7.4 虚拟地址空间的布局结构 413 x86用户地址空间的布局结构 415 x86系统地址空间的布局结构 417 x86会话空间 418 系统页表项(PTE,Page Table Entry) 421 64位地址空间布局结构 422 7.5 地址转译 425 x86虚拟地址转译 425 地址转译快查缓冲区 434 物理地址扩展(PAE) 435 IA-64虚拟地址转译 437 x64虚拟地址转译 438 7.6 页面错误处理 439 无效PTE 440 原型PTE 441 页面换入I/O 443 冲突的页面错误 444 页面文件 444 7.7 虚拟地址描述符 448 7.8 内存区对象 450 7.9 工作集 457 按需换页 458 7.10 逻辑预取器 458 放置策略 462 工作集管理 463 平衡集管理器和交换器 466 系统工作集 467 7.11 页面帧编号数据库 469 页面列表的动态变化 472 已修改页面写出器 475 PFN数据结构 476 低内存通知和高内存通知 479 7.12总结 483 第8 安全性 485 8.1 安全系统组件 488 8.2 保护对象 492 访问检查 493 安全描述符和访问控制 506 8.3 账户权限和特权 516 账户权限 517 特权 518 超级特权 523 8.4 安全审计 524 8.5 登录(Logon) 526 Winlogon初始化 528 用户登录步骤 529 8.6 软件限制策略 533 8.7 本总结 535 第9 I/O系统 537 9.1 I/O系统组件 537 I/O管理器 539 典型的I/O处理过程 540 9.2 设备驱动程序 541 设备驱动程序的类型 541 驱动程序的结构 548 驱动程序对象和设备对象 550 打开设备 555 9.3 I/O处理 561 I/O类型 561 映射文件I/O和文件缓存 564 I/O请求包 564 针对单层驱动程序的I/O请求 569 针对分层的驱动程序的I/O请求 577 I/O完成端口 585 驱动程序检验器(Driver Verifier) 589 9.4 即插即用(PnP)管理器 590 即插即用支持的级别 591 驱动程序对于即插即用的支持 592 驱动程序加载、初始化和安装 594 驱动程序安装 603 9.5 电源管理器 607 电源管理器的操作 609 驱动程序的电源操作 610 驱动程序对于设备电源的控制 613 9.6 本总结 613 第10 存储管理 615 10.1 有关存储的术语 615 10.2 磁盘驱动程序 616 Ntldr 616 磁盘类、端口和小端口驱动程序 617 磁盘设备对象 620 分区管理器 622 10.3 卷的管理 622 基本磁盘 624 动态磁盘 626 多分区卷的管理 632 卷名字空间 638 卷的I/O操作 646 虚拟磁盘服务 648 卷影像(shadow)拷贝服务 649 10.4 本总结 654 第11 缓存管理器 655 11.1 缓存管理器的关键特性 655 单个中心化的系统缓存 656 内存管理器 656 缓存一致性 656 虚拟块缓存 658 流式缓存机制 658 对可恢复文件系统的支持 658 11.2 缓存的虚拟内存管理 660 11.3 缓存的大小 662 LargeSystemCache 662 缓存的虚拟大小 663 缓存的工作集大小 665 缓存的物理大小 667 11.4 缓存的数据结构 668 系统范围的缓存数据结构 669 针对每个文件的缓存数据结构 670 11.5 文件系统接口 674 从缓存中来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读(Read Ahead)和滞后写(Write Behind) 682 智能预读 682 回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 683 写节流(Write Throttling) 686 系统线程 687 11.8 本总结 688 第12 文件系统 689 12.1 Windows文件系统格式 690 CDFS 690 UDF 691 FAT12、FAT16和FAT32 691 NTFS 694 12.2 文件系统驱动程序总体结构 694 本地FSD 695 远程FSD 696 文件系统操作 700 文件系统过滤型驱动程序 705 12.3 诊断文件系统的问题 711 Filemon的基本和高级模式 711 Filemon诊断技巧 712 12.4 NTFS设计目标和特性 717 高端(High-End)文件系统的需求 717 NTFS的高级特性 719 12.5 NTFS文件系统驱动程序 729 12.6 NTFS在磁盘上的结构 732 卷(volume) 732 簇(cluster) 732 主文件表(MFT) 733 文件引用号 739 文件纪录 740 文件名 742 驻留的和非驻留的属性 744 数据压缩和稀疏文件 747 变化日志文件 752 索引 753 对象ID 754 配额跟踪 755 统一的安全性 756 重解析点 758 12.7 NTFS的恢复支持 758 文件系统设计的演变 759 日志记录 761 恢复 767 NTFS的坏簇恢复 771 12.8 加密文件系统(EFS)安全性 775 第一次加密一个文件 778 解密过程 783 加密文件的备份 784 12.9 本总结 785 第13 网络 787 13.1 Windows的网络总体结构 787 OSI参考模型 787 Windows网络组件 789 13.2 网络API 791 Windows套接字(Windows Sockets) 791 远过程调用 798 Web访问API 803 命名管道和邮件槽 804 NetBIOS 811 NetBIOS的操作 812 其他的网络API 813 13.3 多重定向器支持 815 多提供者转发器 816 多UNC提供者 818 13.4 名称解析 820 域名系统 820 Windows Internet名称服务 820 13.5 协议驱动程序 821 TCP/IP的扩展 824 13.6 NDIS驱动程序 828 NDIS小端口的变化形式 832 面向连接的NDIS 832 外接NDIS(Remote NDIS) 835 QOS 836 13.7 绑定 838 13.8 分层的网络服务 839 远程访问(Remote Access) 839 活动目录 840 网络负载平衡 841 文件复制服务 843 分布式文件系统 843 13.9 本总结 844 第14 崩溃转储分析 845 14.1 Windows为什么会崩溃 845 14.2 蓝屏 846 14.3 崩溃转储文件 849 崩溃转储的生成 852 14.4 Windows错误报告 853 14.5 在线崩溃分析 854 14.6 基本的崩溃转储分析 855 Notmyfault 855 基本的崩溃转储分析 856 详细的分析 858 14.7 使用崩溃诊断工具 860 缓冲区溢出和特殊内存池 861 代码改写和系统代码写保护 863 14.8 高级的崩溃转储分析 864 栈破坏 865 挂起的系统或无响应的系统 866 当没有崩溃转储时 869 术语表 871 术语对照表 895 索引 901
<p>本套课程适用于有一定的<span style="color: #e03e2d;">iOS、Android、Flutter</span>开发基础。</p> <p>学完本次课程,能够让大家对Flutter如何调用移动端原生页面有一个清晰的认识;在纯Flutter开发过程中遇到需要调用原生功能的时候,能够快速定制属于自己或者公司的私有插件- Plugin。</p> <p>课程一共氛围两部分:</p> <p>1、Flutter插件跟iOS的交互部分:包括调用iOS原生页面、如何使用iOS的<span style="color: #e03e2d;">framework二进制</span>、<span style="color: #e03e2d;">bundle资源文件</span>、依赖的cocoapods资源;</p> <p>2、Flutter插件跟安卓的交互部分:包括调用Android原生页面、如何接收原生页面的回调、如何使用aar文件、依赖的其他资源。</p> <p>最终能够帮助大家定制私有插件;提升工作技能。</p> <p><span style="color: #e03e2d;">备注:课程中使用环境</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Flutter (Channel stable, 1.22.5, on macOS 11.0.1 20B29 darwin-arm, locale zh-Hans-CN)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9); min-height: 14px;"><span style="font-variant-ligatures: no-common-ligatures;"> </span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">[!]</span><span style="font-variant-ligatures: no-common-ligatures;"> Android toolchain - develop for Android devices (Android SDK version 30.0.3)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #00ff00; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures;">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">!</span><span style="font-variant-ligatures: no-common-ligatures;"> Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Xcode - develop for iOS and macOS (Xcode 12.2)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">[!]</span><span style="font-variant-ligatures: no-common-ligatures;"> Android Studio (version 4.1)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> IntelliJ IDEA Community Edition (version 2020.3)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Connected device (1 available)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9); min-height: 14px;"> </p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"> </p>
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页