电子科技大学卓中卓二轮——分析笔记

1. 子系统的关键工作原理

在Linux子系统(Subsystem for Linux, 简称WSL)中,API(应用程序编程接口)的转换和映射是一个关键过程,目的是让Windows应用程序能够与Linux环境中的系统调用无缝交互。WSL使用了名为User-Mode Linux (UML)的技术,以及 Wine(一个开源兼容Windows API的运行库)来实现在Windows上运行Linux应用程序。

1.1 API映射与转换

由于所有用户进程总的虚拟地址空间比可用的物理内存大很多,因此只有最常用的部分才与物理页帧关联。

1.1.1 API映射

首先用户进程在调用mmap系统调用之后,系统会为其在当前进程的虚拟地址空间中寻址一段连续的空闲地址(遍历vm_area_struct链表),并为其创建一个vm_area_struct结构,完成之后,进程就有了一个专门用于mmap映射的虚拟内存区。

由于这个区域的线性地址没有对应的物理页框,所以系统会调用内核空间的系统调用函数mmap,运用它对vm_area_struct结构中的虚拟地址建立其相应的页表项(将虚拟地址转换成物理地址)。

(mmap实现的源码,来自“映射-程序驱动源码.txt”)

在驱动程序中,mmap函数中会包含一系列的检查,以便对异常情况进行判断。

检查1:映射大小是否在预定义的MAPLEN(之前就定义的宏,用来表示在内核中申请的物理页框的大小)之内,如果超过,那就自然而然返回错误(毕竟太大了)

检查2:检查是否为共享映射(因为mmap只支持共享映射,如果是写权限,那么返回错误)。

检查3:如果区域是可写入的,设置VM_LOCKONFAULT标志,这样映射的区域在发生缺页异常时会锁定在物理内存中,防止被交换到磁盘。

检查4:检查偏移量是否为0,表明映射请求从文件或者设备的起始位置开始,有一套特定的函数用于处理对该映射区域的特殊操作。但是当偏移量不是0的时候,就会返回错误。也就是说,这个mmap映射方法仅允许从文件或设备的起始位置映射,不允许偏移映射。

1.2 二进制翻译与仿真

对于那些不能直接通过API映射运行的应用,模拟器或兼容层可能需要执行二进制代码的翻译,将源操作系统的机器指令转换为目标操作系统可理解的形式。

QEMU 软件虚拟化采用的思路是二进制指令翻译技术,这里 Target 表示我们要运行目标架构代码,而 Host 表示我们拥有的真实 CPU 架构,通常是 x86。QEMU 通过 TCG,提取 Target,将其翻译成 TCG 中间代码,最后再将中间代码翻译成 Host(搭载 QEMU 的真实物理机平台)架构指令。( Target指令 ----> TCG ----> Host指令)

1.2.1 QEMU Tcg 工作原理

整体流程

target instruction -> micro-op -> tcg-> host instruction

1.执行主函数(cpu_exec):主要负责中断异常处理、找到代码翻译块。

2.TCG在翻译过程中,会将翻译好的代码缓存起来。因此在翻译TB(翻译块)的过程中,首先会判断pc对应的TB是否存在缓存中。如果存在,则直接取出。如果不存在,则调用tb_find_slow()函数,进行翻译工作。

3.在调用tb_find_slow()函数的时候,如果发现没有可供翻译的代码,就使用tb_gen_code()完成代码的翻译工作。

使用 tb_alloc() 分配一个新的翻译块 tb,用于记录将要翻译的 pc 等信息。如果翻译块太多或者生成的代码太多,则清空翻译缓存 TBs。

使用 cpu_gen_code() 翻译 tb,并将翻译好的代码存在一个缓冲区中(gen_code_buf)。

在对一个翻译块进行二进制翻译时,TCG 需要维护一些信息完成动态翻译,即 TCGContext,TCG 上下文包含三类信息:内存池、标号和变量。

内存池:用于二进制转换期间的内存管理。TCG变量:临时、局部和全局变量。

将目标指令翻译成TCG中间码

gen_intermediate_code() 函数定义在不同架构的 target-xxx/translate.c 文件中。该函数将 target 指令翻译成中间码。操作码和操作数分开存储。操作码存放在 gen_opc_buf变量,操作数存放在 gen_opparam_buf变量。翻译过程就是不断向上述两个缓冲区填充操作码和操作数。

首先翻译步骤都在函数gen_intermediate_code_internal()中,将基本块(basic block, tb) 翻译成 TCG 中间代码。

然后就可以开始翻译

TCG中间码翻译成宿主机指令

tcg_gen_code() 函数定义在 tcg.c 文件中。该函数将中间代码翻译成 host code

将 TCG 中间码翻译成 host 机器码的函数是 tcg_gen_code_common 。

主要过程如下

  • 从缓存中找到 TCG 操作码和相应参数;
  • 为输入参数分配 host 平台的寄存器;
  • 为输出参数分配 host 平台的寄存器;
  • 输出翻译好的二进制指令到翻译缓存中。

1.3 兼容层与沙盒机制

兼容层:是一种软件技术,一个操作系统上能够运行原本为另一个操作系统设计的应用程序或系统调用,而不需要对这些程序进行重大修改。

为了确保应用的安全性,操作系统的兼容层会创建一个沙盒环境。其本质是为了实现不同应用程序之间的相互隔离,使其各自运行在自己的虚拟机进程中。

好处:

  • 进程隔离:沙盒机制会创建独立的进程来运行应用程序,每一个进程都有自己独立的内存空间和资源,这样就不会影响到其他进程。
  • 权限控制:沙盒机制通过权限控制来限制应用程序对系统资源的访问权限,这样可以防止数据破坏。
  • 资源限制:沙盒机制可以对其应用程序的某些资源进行限制,比如CPU利用率、内存使用情况等,这样可以让不同的应用程序都得到类似的资源,防止出现某个应用程序运行缓慢的情况。
  • 数据隔离:这也是保持其安全性最重要的一部分,将不同应用程序的数据存储在独立的文件系统中,与其他应用程序的数据隔离开来。

案例分析:windows内核级虚拟技术沙盒

1.文件重定向:

文件重定向是windows64位系统中存在的一种文件访问机制。在windows64位系统中,C盘下存在system32和syswow64两个文件夹,其中system32文件夹里面存放的是64位文件,而syswow64文件夹下存放的是32位文件。

因此,当32位的程序尝试访问system32文件夹的时候,重定向机制就上线了,将那个程序重定向导stswow64文件夹下。

2.Minifilter:

Minifilter是Windows操作系统中一种轻量级(仅关注关键的文件操作)的文件系统过滤驱动程序,用于监控、拦截和修改文件系统。

3.

2.Linux和Windows(R额actOS项目)在文件系统上的差异

2.1 API接口

  • Linux:Linux系统中,文件操作主要通过标准的POSIX API完成,包括open(), read(), write(), close()等系统调用,遵循UNIX的设计理念,强调简洁、模块化和通用性。POSIX API倾向于使用小而专注的函数,每个函数完成一个特定任务,如open()用于打开文件。这种风格鼓励组合基本操作以实现复杂功能。

上述功能函数就是由一个个小函数组装而成,且看起来很简洁,模块化。

  • Windows API(ReactOS):更侧重于面向对象的设计,单个函数往往提供更多的功能集成。例如,CreatFile()不仅用于创建或打开文件,还能够设置文件的访问模式、共享模式、安全属性等。这种设计便于开发直观、易于理解和维护的高级应用程序。

就比如ReatOS中的加载目录子项函数,源代码中涉及行数将近200行,上述只截取了部分内容。不具有POSIX API的简洁性和模块化。

2.2 目录结构

  • Linux(兼容性广):Linux内核通过VFS抽象层(虚拟文件系统),为上层应用提供统一的接口,使得应用无需关心底层文件系统的具体实现。VFS允许不同的文件系统共存,并通过一个通用的接口进行操作,提高了系统的灵活性和兼容性。

在(include/linux/fs.h)中会定义超级块(super_block)和索引节点(inode)。它们包含了数据的一些基本信息以及权限等。由于每个文件系统都有一个超级块实例,VFS就可以通过超级块来管理和追踪文件系统状态且所有文件操作都间接或直接通过inode进行。

在(include/linux/dcache.h)中定义目录项(dentry),用于加速路径名解析和缓存目录项信息,与inode相关联。

同时Linux也定义了一些列接口函数vfs_open()和vfs_read()等。

所以,当应用程序调用系统调用如open()read()时,VFS会根据调用参数找到相应的inode和dentry,然后调用该文件系统类型的特定操作函数。这样在不同的文件系统中,它们其实看到的都是相同的接口和行为。

  • ReactOS(针对性兼容):ReactOS作为Windows操作系统的开源替代,其重点在于实现与Windows的兼容性,因此它主要支持Windows系统中最常见的文件系统,包括FAT16、FAT32和NTFS。这些文件系统的支持确保了ReactOS能够运行大多数为Windows设计的应用程序和驱动程序,但这也意味着ReactOS在文件系统支持的广度上不及Linux。

2.3 权限管理

  • Linux:Linux使用传统的UNIX权限模型,包括用户ID、组ID以及读、写、执行权限位,同时也支持ACL(访问控制列表)和SELinux等更精细的权限控制机制,为系统安全提供了强大而灵活的基础。

在(fs/namei.c)和(include/linux/fs.h)等文件中定义了如何根据文件的i_mode字段(包含读、写、执行权限位)以及进程的有效用户ID和组ID来判断访问权限。

而Linux的ACL支持主要在(fs/acl.c)和(include/linux/fs_acl.h)等文件中实现。这些代码处理了如何解析和应用ACL规则,以及与基本权限模型的集成。

核心部分位于内核源码的(security/selinux)目录下的SELinux则通过安全上下文给文件、进程等对象添加额外的安全标签,并根据策略决定访问权限。

  • ReactOS:ReactOS遵循Windows的访问控制模型,使用ACL来管理文件和对象的访问权限,这与Windows的Security Descriptors和用户权限体系相一致,包括用户账户、组和权限分配,但可能缺乏Linux中一些高级安全功能如SELinux。

ReactOS采用Windows式的ACL模型,实现位于(reactos/subsys/win32/security)目录,特别是(acl.c)、(security.c)等文件。这些文件中包含了处理ACL的创建、解析、应用逻辑,以及与文件和对象权限检查相关的代码。ReactOS中的Security Descriptors用于描述对象的安全属性。

所以它们主要使用的模型存在差异:Linux基于经典的UNIX权限和扩展的ACL、SELinux,而ReactOS则采用了Windows的ACL和Security Descriptors模型。Linux更偏向于简洁和模块化的权限管理,而ReactOS更注重与Windows应用的兼容性和权限的细粒度控制。

2.4 生态环境

POSIX API广泛应用于类Unix系统,包括Linux、macOS等,促进了跨平台软件的开发。

Windows API则是Windows平台特有的,拥有庞大的开发者社区和丰富的库支持,特别适合开发与Windows桌面环境深度整合的应用。

3.机制及特点

上述代码用于模拟Window API中的CreatFile函数行为,但在Linux环境下工作。其目的是接收一个看起来像Window路径的字符串,并在Linux系统上以类似的方式打开文件。

1.包括必要的头文件,包括标准输入输出、文件控制、错误号和字符串操作。

2.定义两个常量,INVALID_HANDLE_VALUE 对应于Windows中无效的句柄值,通常为-1;

FILE_ACCESS_FLAGS宏用于根据读写需求设置Linux下的文件打开标志。

3.CreateFileCompt函数接收三个参数:一个是Windows路径的字符串winPath,一个是表示所需访问权限的desiredAccess,一个是未使用,但后续可能有作用的shareMode。

4.在函数内部,首先定义一个与winPath长度相同的字符数组linuxPath,用于存放转换后的Linux路径。

5.使用strcpy函数将输入的windows风格路径复制到新数组中。

6.通过遍历linuxPath中的每个字符,如果发现反斜杠 \ ,就将其替换为正斜杠 / ,这是Linux中的路径分隔符。

7.调用自定义的FILE_ACCESS_FLAGS宏,根据desiredAccess参数决定Linux的文件打开模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/350467.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUnit 5学习笔记

JUnit 5 学习笔记 1.JUnit5的改变2.JUnit5常用注解及测试2.1 DisplayName/Disabled/BeforeEach/AfterEach/BeforeAll/AfterAll2.2 Timeout2.3 RepeatedTest 3.断言3.1 简单断言3.2 数组断言3.3 组合断言3.4 异常断言3.5 超时断言3.6 快速失败 4.前置条件5.嵌套测试6.参数化测试…

C++ string字符串的使用和简单模拟实现

目录 前言 1. string简介 2. string的使用和简单模拟实现 2.1 string类的定义 2.2 string(),~string()和c_str() 2.2 size,重载符号[ ],begin和end函数 2.3 push_back,reserve,append,运算符重载 2.4 insert和…

12306 火车票价格解析 (PHP 解析)

1. 从接口拿数据 日期 出发站 终点站 都填上 xxx/otn/leftTicketPrice/queryAllPublicPrice?leftTicketDTO.train_date2024-06-15&leftTicketDTO.from_stationBJP&leftTicketDTO.to_stationSJP&purpose_codesADULT 返回的数据是这样的 {"validateMess…

2786. 访问数组中的位置使分数最大

这并不是一个难题,但是我确实在做题中得到了一些启发,所以记录一下 先讲一讲这个题目的做法: 首先不难想到这是一个dp问题,(由 i 可以跳到 j ) 而且应该不难, 要不然就不是medium了,doge 那么,暴力的dp就是: dp[j] max (dp[i] nums OR dp[j] dp[i] nums - x) , i<j, 前…

JVM 垃圾回收器

一、垃圾回收器类型 如果说垃圾收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体 实现。下图展示了7种作用于不同分代的收集器&#xff0c;其中用于回收新生代的收集器 包括Serial、PraNew、Parallel Scavenge&#xff0c;回收老年代的收集器包括Seri…

采煤vr事故灾害应急模拟救援训练降低生命财产损失

在化工工地&#xff0c;设备繁多、环境复杂&#xff0c;潜藏着众多安全隐患&#xff0c;稍有不慎便可能引发安全事故。为了保障工地的安全&#xff0c;我们急需一套全面、高效的安全管理解决方案。web3d开发公司深圳华锐视点研发的工地安全3D模拟仿真隐患排查系统&#xff0c;正…

sql优化之利用聚簇索引减少回表次数:limit 100000,10

1. 问题描述 产品&#xff1a;我要对订单列表页做一个分页功能&#xff0c;每页10条数据&#xff0c;商家可以根据金额过滤订单 技术&#xff1a;好的&#xff0c;我写一个sql实现分页&#xff0c;x表示偏移页数&#xff0c;自测limit 10,10耗时200ms&#xff1a; SELECT * …

【2024最新精简版】MyBatis面试篇

文章目录 mybatis内部实现过程mybatis延迟加载请说说MyBatis的工作原理mybatis接口里的方法,参数不同时能重载吗mybatis分页插件的原理是什么&#xff1f;mybatis的一级、二级缓存&#x1f44d;mybatis如何实现多表查询mybatis如何实现批量插入&#x1f44d;mybatis动态SQL标签…

Spring Boot 自定义Starter

自定义starter 创建pom项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

可视化剪辑,账号矩阵管理,视频分发,聚合私信多功能一体化营销工具 源代码开发部署方案

可视化剪辑&#xff0c;账号矩阵管理&#xff0c;视频分发&#xff0c;聚合私信多功能一体化营销工具 源代码开发部署方案 可视化剪辑&#xff1a; 可视化剪辑开发是一种通过图形化界面和拖放操作&#xff0c;以可视化的方式进行影片剪辑和编辑的开发方法。它可以让非专业用户…

【NLP练习】Transformer中的位置编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是位置编码 1. 位置编码定义 Transformer 模型中的位置编码是为了在处理序列数据时引入位置信息&#xff0c;以便模型能够分辨输入序列中不同位置的词…

180.二叉树:二叉搜索树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

实时交通 | 城市交通态势采集及可视化操作(定时运行)

一、前言 交通态势数据是关于交通状况的一种量化描述&#xff0c;它提供了关于道路网络运行状态的详细信息。交通态势数据指的是根据车流入量和车流出量的定义&#xff0c;衡量整个全局交通区域交通态势的数据。这些数据通常从车辆GPS轨迹数据中提取&#xff0c;包括车辆行驶速…

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

时代巨兽!深度神经网络如何改变我们的世界?

深度神经网络 1、 简介1.1 定义深度神经网络1.2 深度学习的发展历程1.3 深度神经网络的应用领域 2、深度神经网络的基本原理2.1 神经元层2.1.1 神经元2.1.2 神经元层 2.2 前向传播2.3 反向传播2.4 激活函数2.4.1、作用2.4.2、常见激活函数2.4.3、选择激活函数的考虑 2.5 损失函…

Selenium+Pytest自动化测试框架能碰撞出什么样的火花

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 一、测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高…

网信办部署开展清朗专项行动,严打色情等违法信息外链

据网信中国官方公众号&#xff0c;近日&#xff0c;中央网信办专门印发通知&#xff0c;在全国范围内部署开展为期2个月的“清朗打击违法信息外链”专项行动。 据介绍&#xff0c;本次专项行动聚焦违法信息外链问题易发多发的8个重点环节开展整治。 一是账号环节。在账号头像…

零基础直接上手java跨平台桌面程序,使用javafx(五)TableView显示excel表

我们在窗口的中间加上TableVie&#xff1a; 在hello-view.fxml的文本中&#xff0c;要增加一些代码。在TableView定义中加上fx:id"TableView1"&#xff0c;这样java代码才方便访问&#xff0c;在java代码中要加上FXML private TableView TableView1;表示定义TableVie…

【ArcGISProSDK】OpenItemDialog打开文件对话框

打开单个文件 效果 代码 public async void OpenFunction() {// 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;OpenItemDialog openItemDialog new OpenItemDialog() { Title "打开要素文件",InitialLocation gdbPath,Filter ItemFilte…

vue 使用 ztree 超大量数据,前端树形结构展示

ztree 是一个很经典的基于jquey开发的树结构编辑展示UI组件库。 创建一个文件 ztree.vue&#xff0c;代码如下&#xff1a; <template><div><div class"ztree vue-giant-tree" :id"ztreeId"></div><div class"treeBox&q…