用户空间与内核空间:小内存访问背后的完整真相

printf背后的系统调用与缓冲机制:从用户态到内核态的完整旅程 系统调用是操作系统为用户程序提供服务的标准接口,通过特定的软中断机制实现用户态到内核态的权限切换。其核心原理在于建立安全隔离边界,防止用户程序直接访问内核资源。在Linux系统中,write系统调用负责处理标准输出操作,而glibc库的缓冲机制通过全缓冲、行缓冲和无缓冲三种策略,在I/O性能与实时性之间取得平衡。当应用程序调用printf函数时,数据首先进入用户空间缓冲区,根据缓冲策略决定何时触发实际的write系统调用。这种设计在终端交互、文件写入和错误输出等场景中体现其技术价值,最终通过虚拟文件系统(V 阅读详情

支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》


B站配套学习视频


用户空间与内核空间:小内存访问背后的完整真相


在这里插入图片描述

❓几个常见但容易误解的问题

在日常开发中,我们经常写下这样朴素的一行代码:

int *p = malloc(8);
*p = 42;

这一行简单的内存分配与写操作,在用户空间是再普通不过的行为。但你是否真正理解了背后发生了什么?

  • 这 8 字节来自哪里?物理内存是怎么分配的?
  • 是什么时候分配的?访问它需要系统调用吗?
  • glibc malloc() 能直接操作内存吗?
  • 为什么我们说“只有 Page Fault 才会进入内核”?
  • 内核空间的 kmalloc(8) 跟 malloc(8) 一样吗?
  • MMU/TLB/页表在这个过程中到底扮演了什么角色?

本文将带你全面梳理用户空间与内核空间中小内存访问的完整流程,结合代码路径、硬件机制、内核细节,为你打通表象与本质的屏障。


🧭 目录导航

  1. 用户空间内存访问流程(以 malloc(8) 为例)
  2. 内核空间小内存分配(以 kmalloc(8) 为例)
  3. glibc 分配器策略解析
  4. Page Fault、系统调用、页表建立全过程
  5. MMU 与 TLB 的硬件行为详解
  6. 对比总结与流程图展示

1️⃣ 用户空间:malloc(8) 到访问的完整路径

我们以最常见的场景为例:

int *p = malloc(8);
*p = 42;

你以为它只是用户空间的简单调用,实际背后流程如下:


✅ 分配阶段

  1. 调用 malloc(8) → glibc 实现的分配器(默认是 ptmalloc2)处理
  2. 分配器会尝试从现有小块内存池中找一块合适区域
  3. 如果没有,就通过 brk() 或 mmap() 向内核申请更多虚拟地址空间
// 示例调用栈(glibc)
__libc_malloc()
├── _int_malloc()
│   ├── sysmalloc()
│   │   ├── __mmap()
│   │   └── __sbrk()

✅ 虚拟地址空间建立

glibc 使用 syscall(SYS_brk) 或 syscall(SYS_mmap) 进入内核:

  • 调用路径:
sys_brk() → do_brk()
sys_mmap() → do_mmap()
  • 内核创建对应 struct vm_area_struct(VMA)
  • 注意:此时页表尚未建立,物理页帧尚未分配!

✅ 首次访问:触发缺页异常

当你执行 *p = 42; 时:

  1. CPU 执行 store 指令
  2. MMU 查找该虚拟地址的页表项
  3. 如果页表不存在 → Page Fault 异常(缺页中断)
  4. 内核陷入 → do_page_fault() → handle_mm_fault() → __handle_mm_fault() → do_anonymous_page()
  5. 分配物理页帧(通过 alloc_page() → buddy 分配器),更新页表
  6. 返回用户空间 → 重新执行 store

✅ 后续访问

  • 页表已经存在
  • TLB 命中 → 虚拟地址直接转为物理地址 → 不再陷入内核

2️⃣ 内核空间:kmalloc(8) 背后的流程

void *p = kmalloc(8, GFP_KERNEL);

调用路径:

kmalloc() →
  kmalloc_slab()
    → slab_alloc()
      → new_slab_objects() if needed
        → alloc_pages() → __alloc_pages() → buddy system
  • 内核使用 slab 分配器管理小对象(如 task_struct)
  • 内部按对象大小(如 kmalloc-8、kmalloc-32)维护缓存池
  • 每类对象使用多个页帧作为缓存池
  • slab 拆页 → 构建对象链表 → 分配对象
  • 使用的是内核虚拟地址(直接映射区)

3️⃣ glibc 分配器策略解析(用户空间)

glibc 的 malloc() 实现并不直接与物理内存交互,它依赖内核提供的虚拟内存机制:

  • 小块内存(<128KB):使用 brk() 扩展堆顶
  • 大块内存(≥128KB):使用 mmap() 申请匿名页
  • 内部维护多个 free list,支持 bin 机制、小块复用、延迟释放等

✅ glibc 分配器不关心页表/物理内存/页帧,它只管理用户空间的分配策略。


4️⃣ Page Fault 与页表建立全过程

当访问未映射地址时:

  1. CPU 捕获异常 → trap handler → do_page_fault()

  2. 根据地址所在 VMA,确认可访问性

  3. 如果是匿名页:

    • 创建 PTE
    • 调用 alloc_page() 分配物理页帧
    • 设置 PTE 权限位(RW/U)
    • 刷新 TLB(如 flush_tlb_page())
  4. 用户态恢复 → 重新执行失败的指令

页表结构示意(以 x86_64 为例):

PGD → P4D → PUD → PMD → PTE → PFN

每一级页表的索引宽度:9 bits,PTE 最终映射 4KB 页帧。


5️⃣ MMU 与 TLB 的硬件行为

🔹 MMU(Memory Management Unit)

  • 位于 CPU 内部,接管所有虚拟地址访问
  • 自动根据页表翻译虚拟地址为物理地址
  • 不执行任何代码,只是“硬件查表 + 组合地址”

🔹 TLB(Translation Lookaside Buffer)

  • 页表缓存,提升地址翻译性能
  • CPU 自动维护(替换/失效/刷新)
  • 如果 TLB 命中,虚拟地址翻译只需 1 cycle
  • TLB miss 时,硬件自动翻页表 → Page Walker

🔹 是否需要进入内核?

场景是否内核代码?是否系统调用?
TLB 命中❌ 否❌ 否
页表命中(TLB miss)❌ 否❌ 否
页表缺失(Page Fault)✅ 是✅ 是(陷入)

6️⃣ 图示总结:用户空间 malloc 与访问的完整路径

┌──────────────┐
│ malloc(8)    │
└──────┬───────┘
       ↓
┌──────────────────────┐
│ glibc: 找空闲小块或扩展 │
└──────┬────────────────┘
       ↓
┌────────────────────────────────────────┐
│ syscall: brk() 或 mmap()               │
│  → 内核建立 VMA(尚无页表/PTE)       │
└──────┬─────────────────────────────────┘
       ↓
┌────────────────────────────┐
│ 首次访问 p → MMU 查 TLB    │
└──────┬────────────┬────────┘
       │            │
       ↓            ↓
   TLB miss      TLB hit
       │            │
       ↓            ↓
  查页表(无)   完成访问(无需内核)
       ↓
Page Fault → handle_mm_fault() → 建页表 + 分配页帧
       ↓
  返回用户态 → 重新执行 → 访问成功

✅ 最终总结:核心差异对比

项目用户空间 malloc(8)内核空间 kmalloc(8)
使用 APImalloc() (glibc)kmalloc() (内核)
是否进入内核?首次访问时可能会 Page Faultkmalloc 直接在内核
分配策略glibc 分配器 + brk/mmapslab 分配器 + buddy
是否直接访问页表?❌ 否(硬件 MMU 自动查)✅ 内核直接操作页表
物理页帧由谁分配handle_mm_fault() → alloc_page()slab 向 alloc_pages() 请求页
是否使用 TLB✅ 是✅ 是

📌 建议延伸阅读



支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》


B站配套学习视频

Linux三层真相:内核、发行版与工具链的实战认知框架 Linux不是单一概念,而是由内核、发行版和生态工具链构成的协同系统。内核提供进程、内存与设备驱动等底层能力;发行版(如Ubuntu、Rocky、Kali)基于同一内核,通过包管理(APT/ DNF/Pacman)和预置策略适配不同场景;工具链(如df、systemctl、docker)则是调用内核能力的接口,每条命令背后都映射特定子系统。这种分层结构决定了Linux的技术价值:高度可定制、强场景匹配、云原生就绪。它广泛应用于服务器运维、嵌入式开发、渗透测试及AI基础设施等领域。理解这三层关系,才能摆脱‘背 阅读详情

相关推荐

DMA不是搬运工:内核内存管理的协同执行体

DMA(直接内存访问)是嵌入式与操作系统底层开发中的核心机制,其本质远超简单数据搬运——它是CPU、MMU、缓存子系统与I/O设备之间协同工作的关键枢纽。理解DMA需从内存一致性(Cache Coherency)、内存序(Memory Ordering)和地址翻译(Address Translation)三大原理切入,技术价值在于释放CPU、保障实时性、支撑高吞吐I/O。典型应用场景包括ADC多通道采集、Linux内核虚拟化IOMMU映射、串口DMA接收防丢包及零拷贝网络协议栈优化。尤其在STM32F407

weixin_34226706的博客 1037

linux 内核remap_pfn_range()函数(转)

remap_pfn_range()函数的原型:int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);    该函数的功能是创建页表。其中参数vma是内核根据用户的请求自己填写的,而参数addr表示内存

qqwangbalu的专栏 6392

macOS源码真相:XNU内核与Darwin开源边界解析

操作系统源码是理解底层行为、开展安全审计与驱动开发的基础技术资产。以macOS为例,其核心并非完整开源系统,而是以XNU内核和Darwin用户态工具为代表的有限开源子集,遵循APSLE协议,在保障硬件绑定与生态闭环前提下释放可审计性与可调试性。这类源码不用于构建可启动系统,而服务于内核扩展迁移、系统行为诊断、安全策略验证等工程实践场景。尤其在Apple Silicon时代,源码价值更集中于对mach微内核、BSD层及I/O Kit框架的深度解读,配合KDP远程调试与符号化分析,成为系统管理员、安全研究员与企

weixin_34331102的博客 352

remap_pfn_range函数

remap_pfn_range函数

aolitianya的博客 1024

别被128TB吓到!深入浅出解读Linux /proc/kcore的ELF内存布局与物理内存映射

本文深入解析Linux系统中`/proc/kcore`文件的ELF内存布局与物理内存映射机制,揭示其128TB虚拟地址空间的真相。通过`readelf`工具分析ELF结构,探讨x86_64架构下的内存管理艺术,帮助开发者理解内核虚拟地址空间与物理内存的实际关系,提升系统调试与性能分析能力。

weixin_42531128的博客 153

游戏闪退真相:虚拟内存陷阱揭秘

游戏进程虚拟内存会触发系统杀手吗?通俗技术解析 摘要(150字) 本文用通俗语言解析游戏进程使用虚拟内存是否会触发系统杀手机制。虚拟内存让每个进程都以为自己拥有独立大内存空间,实际由操作系统动态映射到物理内存和硬盘。当游戏进程占用过多物理内存导致系统资源耗尽时,不同平台的"系统杀手"就会介入:Linux的OOM Killer会直接终止最耗内存的进程,Windows会先警告后终止,移动端则会优先杀后台进程。游戏开发者需要通过内存池、资源回收等技术控制内存使用,避免被系统强制终止。合理设置虚

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 644

内存映射函数remap_pfn_range学习——示例分析(1)

作者 彭东林 QQ 405728433   平台 Linux-4.10.17 Qemu-2.8 + vexpress-a9 DDR:1GB   参考 Linux 虚拟内存和物理内存的理解 Linux进程分配内存的两种方式--brk() 和mmap() Linux中的mmap的使用 程序(进程)内存分布 解析   概述 Linux内核提供了remap_pfn_...

weixin_33672400的博客 1030

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

【汽车Bootloader开发】第二章 英飞凌TC3xx芯片中Bootloader的内存划分

Bootloader编程第一步要先划分内存空间,要思考两个问题:1、芯片的内存范围有多大?2、我们的Bootloader代码段需要多大?此篇文章主要是提供内存划分思路,无论什么芯片什么项目,初期都需要合理分配好空间再做,否则后期很容易发生混乱。

weixin_41942517的博客 5681

Element-UI全面入门与实战技巧

Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确

全世界的博客 2863

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2340

TC3xx分析--如何提高系统运行效率(1)

总共32个通用寄存器,其中16个作为数据寄存器D[0]-D[15],16个作为地址寄存器A[0]-A[15], 特别的,A[0]、A[1]、A[8]、A[9]还可以作为系统Global寄存器进行使用,我们再回过头来看看Tasking文件里给的memory限定符,似乎有某种联系,因此接下来我们了解Tricore的寻址模式。再看其他的限定符,分别出现了__a0,__a1等等,很明显讲的是Tricore内核的寻址模式,那么顺着这个思路来捋捋线索,为代码能力和系统优化打基础。那这个__far到底指的是什么呢?

认真搞搞汽车MCU 2428

交叉验证选型指南:k折、留一法、时序与分层CV实战决策

交叉验证是评估机器学习模型泛化能力的基础技术,其核心在于通过系统性数据重划分,缓解有限样本对真实分布估计的偏差。原理上,它通过控制训练-验证数据的独立性与代表性,诊断过拟合风险并提升性能指标的稳定性。技术价值体现在避免单次切分导致的结果偶然性、数据利用低效及验证集污染等问题。典型应用场景涵盖分类任务中的类别不平衡处理、时间序列预测的因果约束、用户行为建模中的数据泄露防控等。本文聚焦k折交叉验证、留一法、时间序列交叉验证与分层抽样等主流方法的适用边界与工程落地要点,结合过拟合诊断和泛化能力评估两大热词,提供可

dienangpiao2051的博客 476

Arm32 Memory Model:内核空间与用户空间的真相解析

本文解析了ARM32架构下内核空间与用户空间的内存管理机制。关键点包括:1)用户态/内核态与用户空间/内核空间的本质区别;2)ARM32采用3GB/1GB的虚拟地址空间划分;3)进程独立用户页表与共享内核页表的设计原理;4)页表初始化与切换流程。文章揭示了Linux通过"共享+隔离"策略实现内存保护与资源优化的平衡机制,为理解嵌入式系统内存管理提供了清晰框架。最终解释了为何每个进程需要独立页表却能共享内核页表的本质原因。

Interview_TC的博客 1255

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2122

Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境

本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来!

超级大洋葱的博客 2584

从一次鼠标点击窥探操作系统内核:中断、驱动、IPC与内存安全的奇幻之旅

一次看似简单的鼠标点击,其背后是硬件中断、驱动开发、内存管理、进程间通信和系统安全这诸多计算机核心知识的完美融合。理解这个过程,不仅有助于我们更深入地理解操作系统的工作原理,也能让开发者在遇到底层问题时,能有更清晰的排查思路。无论是驱动开发、性能调优还是安全研究,这些基础知识都是不可或缺的基石。希望这篇博客能为你打开一扇窥探系统内核的窗。欢迎在评论区留言交流!

hour_go的博客 1940

波浪补偿控制(AHC)之波浪发生器(CODESYS完整源代码)

波浪发生器平台详细算法和结构介绍请参看下面博客文章:CODESYS平台如何建立FC和FB,请参看下面博客文章:

RXXW_Dor的博客 401

Linux下C语言的底层真相:GCC、GDB与内存管理实战

C语言不仅是语法规范,更是与Linux内核深度耦合的系统编程语言。其核心原理体现在编译(GCC预处理/汇编/链接)、调试(GDB基于ptrace的内存透视)和运行时(虚拟内存映射、malloc/brk/mmap机制)三大层面。技术价值在于规避段错误、内存泄漏、符号未定义等生产级故障;典型应用场景包括嵌入式开发、服务端高性能模块、驱动编写及安全敏感系统。深入理解GCC多阶段流水线与GDB对/proc/[pid]/maps的实时解析,是掌握Linux C工程实践的关键入口。

weixin_33811539的博客 348

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5701

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

第13篇:直接内存与零拷贝——NIO性能优化的底层真相

本文深入解析JVM直接内存与零拷贝技术,揭示高性能IO的底层原理。首先对比堆内存与本地内存的区别:堆内存由JVM管理,分配快但GC频繁;本地内存由OS管理,地址固定适合零拷贝。传统IO需要两次拷贝(硬盘→内核→堆内存),而NIO通过直接内存实现零拷贝,省去内核到用户空间的复制。直接内存通过ByteBuffer.allocateDirect()分配,虽不受GC直接控制,但可通过Cleaner机制回收。理解直接内存是掌握现代Java高性能编程的关键,尤其在Netty等框架中发挥核心作用。

2503_90542405的博客 462

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从RHEL8移除告警说起:深入理解nf_conntrack与内核内存分配的‘爱恨情仇’

本文深入探讨了Linux内核中nf_conntrack模块与内存分配的复杂关系,从RHEL8移除告警事件出发,分析了slab分配器与vmalloc的抉择及其对系统性能的影响。文章揭示了内核设计中的权衡艺术,并探讨了现代内核在内存管理方面的改进方向,为运维工程师和内核开发者提供了宝贵的实践指导。

weixin_30682415的博客 539

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lspci原理揭秘:从用户命令到内核PCI枚举全链路解析

PCI设备识别是Linux系统硬件管理的基础能力,其核心在于内核对PCI/PCIe总线的标准化枚举机制与sysfs虚拟文件系统的协同设计。该机制基于ACPI MCFG表或BIOS遗留配置,通过内存映射方式访问设备配置空间,构建struct pci_dev数据结构,并经由sysfs暴露为可读文件。这种‘内核建模+用户态只读访问’架构,既保障了安全性,又支撑了lspci、ethtool等工具的轻量高效运行。在服务器运维、驱动开发及硬件兼容性调试中,理解PCI枚举流程与lspci背后的数据来源,是定位资源冲突、中

weixin_30846347的博客 300

Linux命令背后的系统逻辑:从终端操作到内核机制

Linux命令不是孤立的工具,而是操作系统资源管理的接口层。理解其底层原理,需从进程调度、内存管理、文件系统和网络协议栈四大核心出发——例如ps反映/proc虚拟文件系统与task_struct状态,ss替代netstat源于对内核socket哈希表的直接访问优化,iostat与vmstat的差异本质是块设备驱动层与虚拟内存子系统的观测维度之分。掌握这些命令的内核映射关系,能显著提升故障定位效率、规避权限与管道陷阱,并支撑容器、云原生等现代基础设施的深度运维。本文聚焦20个高价值命令,揭示其在真实系统诊断链

weixin_30599769的博客 455

wget下载99%突然崩溃?揭秘段错误背后的真相与3种修复方案

本文深入剖析了wget下载大文件时在99%进度出现‘段错误’的根本原因,包括系统资源限制、内存管理及网络中断恢复机制。提供了三种实战修复方案:调整系统资源与运行环境、优化下载策略与命令参数,以及高级诊断与替代工具使用,帮助用户彻底解决下载崩溃问题,确保数据获取的稳定性。

p8q9r0的博客 509

驱动开发工程师为什么要熟悉Linux内核:从内核态到子系统的深度解析

Linux内核是操作系统的核心,负责进程调度、内存管理、设备驱动和并发控制等基础机制。驱动代码运行在内核态,与内核子系统紧密耦合,理解内核机制是确保驱动稳定性和性能的关键。熟悉内核不仅能帮助开发者避免常见陷阱,如栈溢出和并发问题,还能提升调试效率和系统级问题解决能力。在嵌入式、物联网和服务器等领域,驱动开发工程师需要深入掌握内核知识,以应对复杂应用场景。本文从实际案例出发,探讨驱动与内核的咬合点,帮助开发者从API调用进阶到内核机制理解。

weixin_33985679的博客 490
上一篇: 嵌入式底层开发中的核心问题与实践经验总结
下一篇: Yocto vs Buildroot:SDK(软件开发套件)创建能力全面对比
嵌入式孙老师
博客等级 码龄7年 5686粉丝 899原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值