TockOS,一种新安全软件架构的RTOS介绍
文章目录
- 1. TockOS介绍
- 详细总结
- 2. TockOS开源项目的目录结构
- 3. 胶囊(Capsules)
- 胶囊的本质
- 胶囊的特点
- 胶囊的应用场景
- 4. 胶囊的实现
- 模块化设计
- 安全隔离
- 事件驱动
- 可复用性
1. TockOS介绍
Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系统,依赖硬件内存保护单元(MPU)保障安全。其内核与扩展(胶囊)用 Rust 编写,能运行多种语言的多个独立不可信进程,进程数量受微控制器闪存和内存限制,默认采用抢占式循环调度算法。Tock 采用微内核架构,内核提供 command、subscribe、allow、yield 四个主要系统调用,通过 MPU 保护自身和其他进程免受恶意进程代码侵害,同时借助 Rust 的类型安全特性确保内核和胶囊代码的安全性。
详细总结
- Tock概述:Tock是用于Cortex-M和RISC-V微控制器的安全嵌入式操作系统,要求硬件配备内存保护单元(MPU),内核和胶囊使用Rust编写。
- 进程相关
- 编写语言与数量限制:支持用任意语言编写多个独立的不可信进程,进程数量受微控制器闪存和随机存取存储器(RAM)的限制。
- 调度算法:默认采用抢占式循环调度算法,也可配置使用其他调度算法。
- 系统架构
- 代码分类:代码分为核心内核、胶囊和进程三类。核心内核因需操作特定内存地址外设等功能,可使用“unsafe” Rust代码;胶囊不能使用unsafe特性,以保证代码安全。进程可由任意语言编写。
- 系统调用:内核提供四个主要系统调用,具体如下:
系统调用 | 功能 | 特点 | 参数 |
---|---|---|---|
command | 进程向内核发起调用 | 非阻塞,长时间操作会立即返回并在完成时发出回调 | 驱动ID |
subscribe | 在进程中注册用于接收内核上调用的回调 | 非阻塞 | 驱动ID |
allow | 允许内核访问进程内存 | 非阻塞 | 驱动ID |
yield | 暂停进程直到回调被调用 | 阻塞 | 无 |
- 安全机制:借助硬件MPU,若进程试图访问非法内存,会触发异常,内核捕获异常并终止该进程,以此保护内核和其他进程。同时,Rust的类型安全特性防止内存错误使用,保障内核和胶囊代码安全。
2. TockOS开源项目的目录结构
TockOS的开源项目的目录结构如下图:
3. 胶囊(Capsules)
Tock 是一个为物联网(IoT)设备设计的开源、多任务、安全的嵌入式操作系统。在 Tock OS 里,“胶囊(Capsules)”是其核心抽象概念之一,下面为你介绍其本质。
胶囊的本质
胶囊本质上是一种模块化的软件组件,是Tock OS用于实现设备驱动和系统服务的关键机制。它以面向对象的方式来封装设备的功能和状态,能把不同的硬件设备和系统服务进行抽象,从而让它们能在 Tock 内核中以独立、安全且可复用的形式存在。
胶囊的特点
- 模块化设计:胶囊具备模块化特性,每个胶囊都负责特定的功能,像传感器驱动、通信协议栈或者文件系统服务等。如此一来,开发者可以按需添加或者移除胶囊,以此实现系统功能的定制。
- 安全隔离:Tock OS 借助内存保护和能力机制保证各个胶囊间的安全隔离。每个胶囊只能访问其被授权的资源,这样就能防止恶意或者有缺陷的胶囊对系统其他部分造成影响。
- 事件驱动:胶囊采用事件驱动的编程模型。胶囊会对来自硬件或者其他胶囊的事件做出响应,然后执行相应的操作。这种模型有助于降低系统的复杂性,提高系统的响应能力。
- 可复用性:胶囊是可复用的软件组件。开发者可以在不同的项目中复用已有的胶囊,或者基于现有的胶囊开发新的功能。
胶囊的应用场景
- 设备驱动:为各类硬件设备(如传感器、执行器等)实现驱动程序。
- 系统服务:实现诸如网络协议栈、文件系统、电源管理等系统服务。
- 应用程序支持:为应用程序提供必要的接口和服务,确保应用程序能够安全、高效地运行。
4. 胶囊的实现
以下将结合 Tock OS 源代码来解释胶囊的实现,聊聊胶囊的各个特点以及对应的源代码。在 Tock OS 里,胶囊通常是 Rust 语言编写的结构体和相关的特征(trait)实现。
模块化设计
模块化设计体现为每个胶囊负责特定功能,且独立于其他胶囊。以 virtual_alarm
胶囊为例,它实现了一个虚拟闹钟服务。
// 定义一个虚拟闹钟的结构体
pub struct VirtualMuxAlarm<'a, A: Alarm> {alarm: &'a A,// 其他状态字段next_alarm: Option<Ticks>,callbacks: VecDeque<(Ticks, Callback)>,
}// 为 VirtualMuxAlarm 实现相关的方法和特征
impl<'a, A: Alarm> VirtualMuxAlarm<'a, A> {// 初始化虚拟闹钟pub fn new(alarm: &'a A) -> VirtualMuxAlarm<'a, A> {VirtualMuxAlarm {alarm: alarm,next_alarm: None,callbacks: VecDeque::new(),}}// 设置闹钟pub fn set_alarm(&mut self, when: Ticks, callback: Callback) {// 实现设置闹钟的逻辑// ...}
}
在上述代码中,VirtualMuxAlarm
结构体封装了虚拟闹钟的功能和状态。它依赖于一个实现了 Alarm
特征的底层闹钟设备,但本身是一个独立的模块,可被其他模块复用。
安全隔离
Tock OS 通过内存保护和能力机制确保胶囊间的安全隔离。在 Rust 中,这主要通过所有权和借用规则来实现。例如,在 virtual_alarm
胶囊中,VirtualMuxAlarm
结构体持有对底层闹钟设备的不可变引用:
pub struct VirtualMuxAlarm<'a, A: Alarm> {alarm: &'a A,// ...
}
这里的生命周期参数 'a
确保了 VirtualMuxAlarm
不会持有底层闹钟设备的引用超过其生命周期,避免了悬空引用和内存安全问题。同时,胶囊只能访问其被授权的资源,通过 Rust 的私有性规则(pub
和非 pub
成员)来限制对内部状态的访问。
事件驱动
胶囊采用事件驱动的编程模型。以 button
胶囊为例,它会对按钮按下和释放事件做出响应:
// 定义按钮事件的回调特征
pub trait ButtonClient {fn pressed(&self, btn_num: usize);fn released(&self, btn_num: usize);
}// 定义按钮胶囊结构体
pub struct Button<'a, C: ButtonClient> {client: &'a C,// 其他状态字段btn_state: [bool; NUM_BUTTONS],
}// 实现按钮胶囊的方法
impl<'a, C: ButtonClient> Button<'a, C> {// 处理按钮事件pub fn handle_interrupt(&mut self) {for i in 0..NUM_BUTTONS {let new_state = self.read_button_state(i);if new_state != self.btn_state[i] {if new_state {self.client.pressed(i);} else {self.client.released(i);}self.btn_state[i] = new_state;}}}// 读取按钮状态fn read_button_state(&self, btn_num: usize) -> bool {// 实现读取按钮状态的逻辑// ...}
}
在这个例子中,Button
胶囊会在检测到按钮状态变化时调用 ButtonClient
特征的 pressed
或 released
方法,从而实现事件驱动的编程模型。
可复用性
胶囊的可复用性体现在多个方面。例如,virtual_alarm
胶囊可以在不同的项目中复用,只要提供一个实现了 Alarm
特征的底层闹钟设备即可:
// 在某个项目中使用 VirtualMuxAlarm
let hardware_alarm = get_hardware_alarm();
let virtual_alarm = VirtualMuxAlarm::new(&hardware_alarm);// 设置闹钟
virtual_alarm.set_alarm(Ticks::from_ms(1000), Callback::new(...));
通过这种方式,开发者可以在不同的项目中复用 VirtualMuxAlarm
胶囊,而无需重新实现闹钟功能。
相关文章:
TockOS,一种新安全软件架构的RTOS介绍
文章目录 1. TockOS介绍详细总结 2. TockOS开源项目的目录结构3. 胶囊(Capsules)胶囊的本质胶囊的特点胶囊的应用场景 4. 胶囊的实现模块化设计安全隔离事件驱动可复用性 1. TockOS介绍 Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系…...
AGI大模型(12):向量检索之关键字搜索
1 检索的方式有那些 列举两种: 关键字搜索:通过用户输入的关键字来查找文本数据。语义搜索:不仅考虑关键词的匹配,还考虑词汇之间的语义关系,以提供更准确的搜索结果。2 关键字搜索 先看一个最基础的实现 安装模块 pip install redis 不会redis的去看我的redis专题 首…...
数据库MySQL学习——day1(创建表与数据类型)
文章目录 1. 创建表(CREATE TABLE)1.1. 创建表的基本语法:1.2. 示例:创建学生信息表 2. 数据类型2.1. 常用的数据类型: 3. 表约束3.1. 常见约束类型:3.2. 示例:添加约束条件3.3. 修改表添加约束…...
基于Transformer与随机森林的多变量时间序列预测
哈喽,我不是小upper,今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。 不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂!Transformer !!https://blog.csdn.net/qq_70350287/article/detail…...
【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
🌟 嗨,你好,我是 青松 ! 🌈 希望用我的经验,让“程序猿”的AI学习之路走的更容易些,若我的经验能为你前行的道路增添一丝轻松,我将倍感荣幸!共勉~ 【程序员 NLP 入门】词…...
MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决
注:本文为 “ MATLAB 代码至 C/C 应用” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 MATLAB 代码转换为 C/C 代码的详细指南 随心 390 zhihu 发布于 2020-07-12 12:39 在实际项目中,我们常常遇到需要将 MATLAB 代码转换为 C/C …...
BLE 6.0 六大核心特性全解析
写在前面: 2025年1月15日,Bluetooth SIG发布了备受期待的 Bluetooth Core Specification 6.0。相比5.x系列,6.0在测距精度、能耗优化、扫描过滤、音频体验和协议灵活性等方面实现了重大突破。本文将以浅显易懂的语言、丰富的图示和真实案例,带你全面深入了解BLE 6.0的六大核…...
网络应用程序体系结构
本文来源 : 《计算机网络 自顶向下方法》 应用程序体系结构(application architecture)由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。 现代网络应用程序中使用的两种主流体系结构: (1)客户-服务器…...
Filename too long 错误
Filename too long 错误表明文件名超出了文件系统或版本控制系统允许的最大长度。 可能的原因 文件系统限制 不同的文件系统对文件名长度有不同的限制。例如,FAT32 文件名最长为 255 个字符,而 NTFS 虽然支持较长的文件名,但在某些情况下也…...
Linux学习——UDP
编程的整体框架 bind:绑定服务器:TCP地址和端口号 receivefrom():阻塞等待客户端数据 sendto():指定服务器的IP地址和端口号,要发送的数据 无连接尽力传输,UDP:是不可靠传输 实时的音视频传输&#x…...
C++:继承
目录 一:继承的概念 1.1 继承的定义 1.2 继承方式 1.3 可见性区别 公有方式 私有方式 保护方式 1.4 一般规则 二、继承中的隐藏规则 三、基类和派生类间的转换 四、派生类的默认成员函数 实现一个不能被继承的类 继承与友元 五、继承与静态成员 六、多…...
RSGISLib:一款功能强大的GIS与RS数据处理Python工具包
今天为大家介绍的软件是RSGISLib:一款功能丰富的遥感与GIS数据的python库。下面,我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 RSGISLib官网网址为:http://rsgislib.org/,它提供了一个丰富的工具集&…...
Git管理
1.创建git仓库 git init 2.让文件添加到暂存区 git add. 3.给暂存区文件添加说明,并提交到本地仓库 git commit -m 说明 4.查看历史记录 git log /git log --oneline 查看状态:git status 5. 引用旧版 git reset --hard commitid 6.创建分支 …...
Java中内部类
1.静态类与非静态类是内部类的区分,外部类不可以被static修饰。 2.类的加载过程:类只有被使用才会被类加载器加载,加载后类的信息放在元空间(方法区)中。类的使用包括初始化对象、静态方法的调用。 3.静态内部类与普…...
[U-Net-Dual]DEU-Net
论文题目:DEU-Net: Dual-Encoder U-Net for Automated Skin Lesion Segmentation 中文题目:DEU-Net:用于自动皮肤病变分割的双编码器U-Net 0摘要 皮肤病的计算机辅助诊断(CAD)在很大程度上依赖于皮肤病变的自动分割,尽管由于病变在形状、大小、颜色和纹理上的多样性以及…...
【数据结构】第五弹——Stack 和 Queue
文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…...
LSTM如何解决梯度消失问题
LSTM如何解决梯度消失问题 一、传统RNN的梯度消失困境 在标准RNN中,隐藏状态更新公式为: h t tanh ( W h h h t − 1 W x h x t b h ) h_t \tanh(W_{hh}h_{t-1} W_{xh}x_t b_h) httanh(Whhht−1Wxhxtbh) 梯度计算通过链式法则展…...
什么是管理思维?
管理思维是指在管理活动中形成的系统性、战略性和创造性的思考方式,帮助个人或团队更高效地达成目标。它不仅适用于企业管理,也适用于个人成长、项目执行和复杂问题解决。以下是关于管理思维的核心内容: 一、管理思维的核心特征 1. 系统性思…...
缓存与内存;缺页中断;缓存映射:组相联
文章目录 内存(RAM)与缓存(Cache)Memory Management Unit缺页中断 多级缓存缓存替换策略缓存的映射方式 内存(RAM)与缓存(Cache) 缓存: CPU 内部或非常靠近的高速存储&a…...
12.5/Q1,GBD高分文章解读
文章题目:Global, regional, and national burdens of early onset pancreatic cancer in adolescents and adults aged 15-49 years from 1990 to 2019 based on the Global Burden of Disease Study 2019: a cross-sectional stud DOI:10.1097/JS9.000…...
路由交换网络专题 | 第六章 | OSPF | BGP | BGP属性 | 防环机制
目录 拓扑图 (1)AS 400 内部使用 OSPF 路由协议,使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 (2)AS 400 内部使用 RIP 路由协议,使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 (3&#…...
ubuntu 安装 redis server
ubuntu 安装 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…...
基于 Spring Boot实现的图书管理系统
Spring Boot图书管理系统详细分析文档 1. 项目概述 本文档对基于Spring Boot实现的图书管理系统进行详细分析。该项目是一个典型的Web应用程序,采用了Spring Boot框架,结合MyBatis作为ORM工具,实现了图书信息的管理功能,包括图书…...
gradle可用的下载地址(免费)
这几天接手一个老项目,想找gradle老版本的,但一搜,虽然在CSDN上搜索出来一堆,但都是收费,有些甚至要几十积分(吃相有点难看了)。 我找了一个能访问的地址,特地分享出来,有需要的自取!…...
发送百度地图的定位
在vuephp写的聊天软件项目中,增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能,需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤: 一、前端实现(Vue/Uni-app…...
滑动窗口学习
2090. 半径为 k 的子数组平均值 题目 问题分析 给定一个数组 nums 和一个整数 k,需要构建一个新的数组 avgs,其中 avgs[i] 表示以 nums[i] 为中心且半径为 k 的子数组的平均值。如果在 i 前或后不足 k 个元素,则 avgs[i] 的值为 -1。 思路…...
python数据分析(二):Python Pandas索引技术详解
Python Pandas索引技术详解:从基础到多层索引 1. 引言 Pandas是Python数据分析的核心库,而索引技术是Pandas高效数据操作的关键。良好的索引使用可以显著提高数据查询和操作的效率。本文将系统介绍Pandas中的各种索引技术,包括基础索引、位…...
(15)VTK C++开发示例 --- 生成随机数的首选方法
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 vtkMinimalStandardRandomSequence 是 VTK(Visualization Toolkit)库中的一个类,…...
华为S系列交换机CPU占用率高问题排查与解决方案
问题概述 在华为S系列交换机(V100&V200版本)运行过程中,CPU占用率过高是一个常见问题,可能导致设备性能下降甚至业务中断。根据华为官方维护宝典,导致CPU占用率高的主要原因可分为四大类:网络攻击、网络震荡、网络环路和硬件…...
为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号
低速MCU(如8位或16位单片机)单板在辐射测试中出现 200MHz~1GHz的高频辐射信号,看似不合理,但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案: 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…...
docker本地虚拟机配置
docker 下载安装 yum install -y docker 如果报错 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache 修改docker 仓…...
【随机过程】柯尔莫哥洛夫微分方程总结
柯尔莫哥洛夫微分方程:用“水流扩散”理解概率演化 1. 核心思想 柯尔莫哥洛夫微分方程(Kolmogorov Equations)是描述**连续时间马尔可夫过程(CTMC)**中概率分布随时间演化的工具。 前向方程(Fokker-Planc…...
AI领域:MCP 与 A2A 协议的关系
一、为何会出现MCP和A2A 协议是非常重要的东西,只有大家都遵循统一的协议,整体生态才好发展,正如有了HTML,互联网才快速发展,有了OpenAPI, API才会快速发展。 Agent目前是发展最快的领域,从最初…...
重学React(一):描述UI
背景:React现在已经更新到19了,文档地址也做了全面的更新,上一次系统性的学习还是在16-17的大版本更新。所以,现在就开始重新学习吧~ 学习内容: React官网教程:https://zh-hans.react.dev/lea…...
代理模式(Proxy Pattern)详解:以延迟加载图片为例
在日常开发中,是否遇到过以下问题: “程序启动时图片太多,加载太慢!” “用户还没看到图片就已经开始加载了,性能浪费!” 此时,代理模式(Proxy Pattern)便派上了用场。本…...
Power BI企业运营分析——数据大屏搭建思路
Power BI企业运营分析——数据大屏搭建思路 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 整合多源数据,实时监控关键指标,精准分析业务,快速识别问题机遇。其可视化看…...
HCIP-H12-821 核心知识梳理 (5)
Portal 认证场景中 AC 与 Portal 服务器通信使用的 Portal 协议基于 TCP;HTTP/HTTPS 可作为接入与认证协议;缺省情况下,接入设备处理 Portal 协议报文及向 Portal 服务器主动发送报文的目的端口号均为 50100 VRRP 协议心跳报文缺省发送间隔为…...
从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?
我们有一个长度为 M 的数组,现在我们想从中找出 最小的 N 个元素。例如: int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法:使用大小为 N 的「大顶堆」 原因分析: 我们想保留最小的 4 个元素…...
【AI工具】2025年主流自动化技术(供参考)
背景 前面完成了AutoIT的自动化操作的尝试,有惊喜有惊吓,就是能进行自动化控制,但是有点“笨”,于是就想找找同类好用的技术,有了这篇自动化技术比较分析的文档,资料参考了AI总结的内容。 autoit的使用&am…...
1.微服务拆分与通信模式
目录 一、微服务拆分原则与策略 业务驱动拆分方法论 • DDD(领域驱动设计)中的限界上下文划分 • 业务功能正交性评估(高内聚、低耦合) 技术架构拆分策略 • 数据层拆分(垂直分库 vs 水平分表) • 服务粒…...
【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?
1. 引用类型及其特点 强引用(Strong Reference): 定义:最常见的引用类型,通过new关键字直接创建。回收条件:只要强引用存在,对象不会被GC回收。示例:Object obj = new Object(); // 强引用特点: 强引用是导致内存泄漏的常见原因(如未及时置为null)。手动断开引用:…...
使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片
使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) vide…...
基于STM32的室内环境监测系统
目录 一、前言 二、项目功能说明 三、主要元器件 四、接线说明 五、原理图与PCB 六、手机APP 七、完整资料 一、前言 项目成品图片: 哔哩哔哩视频链接: 咸鱼商品链接: 基于STM32的室内环境监测系统商品链接 二、项目功能说明 基础功…...
乐迪电玩发卡查分与控制面板模块逻辑解析
本篇为《美乐迪电玩全套系统搭建》系列的第四篇,聚焦后台功能模块中的发卡与查分系统。针对运营侧常见需求(如玩家状态查验、补卡操作、积分调整等),本篇将完整剖析其 PHP 端实现逻辑、数据结构及权限管理机制。 一、模块结构与入…...
Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?
Spring 事务实现原理 Spring 的事务管理基于 AOP(面向切面编程) 和 代理模式,通过以下核心组件实现: 事务管理器(PlatformTransactionManager) Spring 提供了统一的事务抽象接口(如 DataSource…...
网络原理 - 4(TCP - 1)
目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完! TCP 协议 TCP 全称为 “传输控制协议”(Transmission Control Protocol),要对数据的传输进行一个详细的控制。 TCP 协议段格…...
SVT-AV1编码器中的模块
一 模块列表 1 svt_input_cmd_creator 2 svt_input_buffer_header_creator 3 svt_input_y8b_creator 4 svt_output_buffer_header_creator 5 svt_output_recon_buffer_header_creator 6 svt_aom_resource_coordination_result_creator 7 svt_aom_picture_analysis_result_creat…...
金融数据分析(Python)个人学习笔记(12):网络爬虫
一、导入模块和函数 from bs4 import BeautifulSoup from urllib.request import urlopen import re from urllib.error import HTTPError from time import timebs4:用于解析HTML和XML文档的Python库。 BeautifulSoup:方便地从网页内容中提取和处理数据…...
子网划分的学习
定长子网划分(Fixed-length Subnetting) 也叫做固定长度子网划分,是指在一个IP网络中,把网络划分成若干个大小相等的子网,每个子网的子网掩码长度是一样的。 一、定长子网划分的背景 在早期的IP地址分配中࿰…...
Spark2 之 memorypool
cpp/core/memory/ArrowMemoryPool.cc cpp/core/memory/MemoryAllocator.cc VeloxMemoryManager cpp/velox/memory/VeloxMemoryManager.cc VeloxMemoryManager::VeloxMemoryManager(const std::string& kind, std::unique_ptr<AllocationListe...