LinuxTracingSystem浅析和eBPF开发经验分享

原创 Linux阅码场 2022-05-27 08:00

Ftrace公开课火热报名中:Ftrace公开课:站在设计者的角度来理解ftrace(限50人)。课程第一期报名已截止且已开课,第二期报名请咨询客服(小月微信:linuxer2016)。



个人介绍:

许庆伟,云安全公司内核技术专家,主要关注Linux Kernel & 容器的SecurityPerformance 


说明背景:

本文为主题分享《Linux Tracing System浅析 & eBPF框架开发分享》的会议整理和补充。主讲人杨润青,博士毕业于浙江大学,目前从事网络安全研究,研究方向包括高级威胁检测,攻击溯源与响应。


视频回放地址:

https://oxz.h5.xeknow.com/sl/JV1XI


PPT地址:

https://gitee.com/linuxkerneltravel/LearningLinuxKernel/tree/master/files/Linux%20Tracing%20System%20&&%20eBPF


一、讲座内容简要描述


本次讲座内容分为两部分


1) Linux Tracing System浅析 

当初学者接触到Linux平台的tracing系统时,常常被各种词语弄得晕头转向:比如 Kprobe,Tracepoint,Linux Auditing subsystem(auditd),systemtap,LTTng,perf,trace-cmd,eBPF,bpftrace,BCC等等。初学者往往会有以下疑问:这些专业词语是什么意思?它们之间有什么关系?每种tracing技术的优缺点是什么?应该选择哪种技术?为什么eBPF从中脱颖而出,近年来得到广泛关注?

 

本次讲座尝试从统一的视角来梳理和对比这些技术的异同点,并尝试回答这些问题。

 

2) eBPF开发经验分享

eBPF目前正在高速发展,很多坑和解决办法缺乏官方文档。本次讲座主要介绍主讲人在eBPF开发实践中经常遇到的问题,包括开发框架的选择,多内核版本兼容性问题,如何为低版本内核生成BTF文件,eBPF验证机制与编译器优化机制的不一致问题,eBPF在ARM架构遇到的问题等等。


二、Linux Tracing System浅析

 

对于Linux Tracing System尤其是目前最火的eBPF技术来说,主要是通过探针技术,实现特定事件的追踪和采样,达到增强内核行为可观测性、优化系统性能、动态监测网络和加固系统安全的目的。如下图所示,我将Linux Tracing System细分为三个维度,包括1)数据源(内核态),负责提供数据地来源;2)Tracing框架(内核态),负责对接数据源,采集解析发送数据,并对用户态提供接口;3)以及前端工具/库(用户态)对接Tracing内核框架,直接与用户交互,负责采集配置和数据分析

下面将从这三个维度自下而上地对Linux Tracing System进行梳理和分析。

 

 

  • 1.1. 数据源(内核态)介绍

 

如下图所示,从数据提供方的角度来看,数据源可以分成硬件探针、软件探针(又分为动态探针以及静态探针),也就是获取底层数据源的方式和手段。顾名思义,硬件探针技术就是通过在硬件设备上(比如芯片)插入探针,捕获硬件层次行为;而软件探针技术则是通过软件的方式插入探针,捕获软件层次的行为。这些探针技术负责提供数据,上层的Tracing工具和框架则基于这些探针技术来采集数据,并对数据进一步整理、分析、和展现给用户。

 


  • 硬件探针

  • HPC: Hardware Performance Counter 是CPU硬件提供的一种常见的数据源,如下图所示,它能够监控CPU级别的事件,比如执行的 指令数,跳转指令数,Cache Miss等等,被广泛应用于性能调试(Vtune, Perf)、攻击检测等等


       1) HPC事件列表

 


        2)HPC数据案例

        对于此类硬件数据,我们通常使用用户态工具perf来进行采集,下图展示了一个具体的案例。



  • LBR: Last Branch Record CPU硬件提供的另一种特性,它能够记录每条分支(跳转)指令的源地址和目的地址。基于LBR硬件特性,可实现调用栈信息的记录


在系统性能优化领域以及调试程序时经常使用的性能分析利器:火焰图(Flame Graph)也可以基于LBR的数据生成,使用命令perf record -F 99 -a --call-graph lbr即可得到完整直观的火焰图数据。

 

 

火焰图示例

 

  • 软件探针(静态探针):

    静态内核探针指的内核运行之前,在内核源代码或者二进制中插入预先设置好的钩子函数,内核运行时触发生效的探针方案。

  • Tracepoint: Tracepoint是一种典型的静态探针。它通过在内核源代码中插入预先定义的静态钩子函数来实现内核行为的监控。简单地来看,大家可以把Tracepoint的原理等同于调试程序时加入的printf函数。

下图展示了2012年,内核引入sched_process_exec Tracepoint时的commit,可以看到,首先用TRACE_EVENT宏定义了新增Tracepoint的名字和参数等信息,然后在内核函数exec_binprm的源代码中加入了钩子函数trace_sched_process_exec。每当程序执行二进制时,都会触发exec_binprm函数,继而触发trace_sched_process_exec钩子函数。Tracing工具和框架将自定义的函数挂载到该钩子函数上,来采集程序执行行为日志。



  • 静态探针的优点:

        稳定(内核开发者会负责维护该函数的稳定性)

        性能好

  • 静态探针的缺点

        需要修改内核代码来添加新的静态探针

        内核支持的静态探针数量有限

  • 软件探针(动态探针):

有了静态探针,为什么还需要动态探针呢?主要原因是静态探针都是人工添加的,支持的数量有限,而动态探针就是为了解决这个问题,它能够支持Hook几乎所有的内核函数。

  • KprobesKprobe是一个典型的动态探针,如下图所示,在内核运行时,Kprobe技术将需要监控的内核函数的指令动态替换,使得该函数的控制流跳转到用户自定义的处理函数上。当内核执行到该监控函数时,相应的用户自定义处理函数被执行,然后继续执行正常的代码路径。

 


  • 动态探针的优点:

 可以Hook几乎所有的内核函数 

  • 动态探针的缺点

 不稳定(函数的变更、编译器的优化等都可能导致采集程序的失效)

 性能相对较差

 

  • 软件探针(动/静态探针):

静态探针性能好,但支持的数量有限,动态探针支持的数量多,但不稳定、性能相对较差,那么是否存在一种技术,能同时兼顾静态和动态的优势呢?答案是动静态结合的探针方案。

  • Function Hooks(Ftrace): Function HooksFtrace引入一种动静态结合的探针方案 如下图所示,静态指的是它通过gcc编译器,在内核编译阶段,在内核函数的入口处插入了预留的特定指令,当内核运行时,它会将预留的特定指令替换为跳转指令(call ftrace_caller),使得内核函数的控制流跳转到用户自定义函数上,达到数据监控的目的。

 


 FtraceFunction Tracer

 

  • Function Hooks(Ftrace)的优点

相比于Tracepoint和Kprobe,Function Hooks最显著的功能性特点是它能够方便地监控内核函数的调用关系,如下图所示,监控了内核函数exec_binprm的所有子函数调用关系。



上面分析完各种动态和静态探针的方案和优缺点后,从开发者代码多功能可控的角度出发,建议优先使用静态探针方案。

 

  • 1.2. Linux Tracing System 发展历程

 

2004年4月,Linux Auditing subsystem(auditd)被引入内核2.6.6-rc1

2005年4月,Kprobe被引入内核2.6.11.7

2006年,LTTng发布(至今没有合入内核)

2008年10月 ,Kernel Tracepoint 被引入内核(v2.6.28)。

2008年,Ftrace被引入内核(包括compile time function hooks)。

2009年,perf被引入内核

2009年,SystemTap发布(至今没有合入内核)

2014年Alexei Starovoitov将eBPF引入内核


  • 1.3. Linux Tracing 框架方案对比

 


eBPF的优势对比:

稳定:通过验证器,防止用户编写的程序导致内核崩溃

免安装:eBPF内置于linux内核,无需安装额外以来

内核编程:支持开发者插入自定义的代码逻辑(包括数据采集、分析和过滤)到内核中运行

 

2. eBPF框架开发分析

 

  • 2.1 eBPF基础架构


eBPF程序分为两部分: 用户态和内核态代码。


eBPF内核代码:

  • 这个代码首先需要经过编译器(比如LLVM)编译成eBPF字节码,然后字节码会被加载到内核执行。所以 这部分代码理论上用什么语言编写都可以,只要编译器支持将该语言编译为eBPF字节码即可。

  • 目前绝大多数工具都是用的C语言来编写eBPF内核代码,包括BCC。

  • bpftrace提供了一种易用的脚本语言来帮助用户快速高效的使用eBPF功能,其背后的原理还是利用LLVM 将脚本转为eBPF字节码。

eBPF用户态代码: 

  • 这部分代码负责将eBPF内核程序加载到内核,与eBPF MAP交互,以及接收eBPF内核程序发送出来的数据。这个功能的本质上是通过Linux OS提供的syscall(bpf syscall + perf_event_open syscall)完成的,因此这 部分代码你可以用任何语言实现。比如BCC使用python,libbpf使用c或者c++,TRACEE使用Go等等。

 


  • 2.2 eBPF数据源

 

性能分析大师Brendan Gregg(Intel Fellow)总结的Linux BPF Tracing Tools上展示了丰富多彩的eBPF钩子类型,这些钩子类型提供了可以加载BPF程序的范围。

fentry/fexit

Tracepoints

network devices (tc/xdp)

network routes

TCP congestion algorithms

sockets (data level)

kernel functions (kprobes)

userspace functions (uprobes)

system calls 



  • 2.3 eBPF框架的发展历程

 

2014年9月 引入了bpf() syscall,将eBPF引入用户态空间。

自带迷你libbpf库,简单对bpf()进行了封装,功能是将eBPF字节码加载到内核。

2015年2月份 Kernel 3.19 引入bpf_load.c/h文件,对上述迷你libbpf库再进行封装,功能是将eBPF elf二进制文件加载到内核(目前已过时,不建议使用)。

2015年4月 BCC项目创建,提供了eBPF一站式编程。

1. 创建之初,基于上述迷你libbpf库来加载eBPF字节码。

2. 提供了Python接口。

2015年11月 Kernel 4.3 引入标准库 libbpf

1. 该标准库由Huawei 2012 OS内核实验室的王楠提交。

2018年 为解决BCC的缺陷,CO-RE(Compile Once, Run Everywhere)的想法被提出并实现,最后达成共识:libbpf + BTF + CO-RE代表了eBPF的未来,BCC底层实现逐步转向libbpf。


  • 2.4 eBPF可移植性痛点和解决方案


  • 技术痛点

在内核版本A上编译的eBPF程序,无法直接在另外一个内核版本B上运行。造成可以执行差的根本原因在于eBPF程序访问的内核数据结构(内存空间)是不稳定的,经常随内核版本更迭而变化。

目前使用BCC的方案通过在部署机器上动态编译eBPF源代码可以来解决移植性问题。每一次eBPF程序运行都需要进行一次编译,而且需要在部署机器上按照上百兆大小的依赖,如编译器和头文件Clang/LLVM + Linux headers等。同时在Clang/LLVM编译过程中需要消耗大量的资源(CPU/内存),对业务性能也会造成很大影响。


  • 解决方案(CO-RE Compile OnceRun Everywhere):


1) BTF:将内核数据结构信息高效压缩和存储(相比于DWARF,可达到超过100倍的 压缩比)

2) LLVM/Clang编译器:编译eBPF代码的时候记录下relocation相关的信息

3) Libbpf:基于BTF和编译器提供的信息,动态relocate数据结构

 

其中BTF为重要组成部分,Linux Kernel 5.2及以上版本自带BTF文件,低版本需要手动移植。

 

通过分析内核源码,可以发现BTF文件的生成并不需要改动内核,只依赖:

  • 带有debug info的vmlinux image

  • pahole

  • LLVM

这意味着,我们可以自己为低版本内核生产BTF文件,以此让低内核版本支持CORE。


  • 低版本内核BTF文件


准备工作

 ·安装pahole软件(1.16+)

 ·https://git.kernel.org/pub/scm/devel/pahole/pahole.git

 ·安装LLVM(11+)

 ·获取目标低版本内核的vmlinux文件(带有debug info),文件保存在{vmlinux_file_path}

 ·通过源下载

·比如对于CentOS,通过yum install kernel-debuginfo可以下载vmlinux

 ·源码编译内核,获取vmlinux

 

生成BTF: 

 ·利用pahole在vmlinux文件中生成BTF信息,执行以下命令:

·pahole -J {vmlinux_file_path}

 ·将BTF信息单独输出到新文件{BTF_file_path},执行以下命令:

 ·llvm-objcopy --only-section=.BTF --set-section-flags .BTF=alloc,readonly --strip- all {vmlinux_file_path} {BTF_file_path}

 ·去除非必要的符号信息,降低BTF文件的大小,得到最终的BTF文件(大小约2~3MB):

 ·strip -x {BTF_file_path}

 

  • 2.5 eBPF程序实例分析(一个Print引发的惨案)

 

eBPF程序会被LLVM编译为eBPF字节码,eBPF字节码需要通过eBPF Verifier的(静态)验证后,才能真正运行。边界检查是eBPF Verifier的重点工作,目的是为了防止eBPF程序内存越界访问。接下来通过在eBPF程序中简单的增加、删减print打印信息触发不同原因的几种边界检查异常导致验证失败的例子,进一步讲解深层的原理。

 

  • 程序实验环境:

1) LLVM 11

2) Linux Kernel 5.8

3) Libbpf commit @9c44c8a

 

  • 边界检查案例:

1) 内存越界:


SEC("kprobe/do_unlinkat")int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name){  // 获取一个数组指针array(数组MAX_SIZE为16个字节)  u32 key = 0;  char *array = bpf_map_lookup_elem(&array_map, &key);  if (array == NULL)    return 0;  // 获取当前运行程序的CPU编号(当前机器的CPU有16个核)  unsigned int pos = bpf_get_smp_processor_id();       // 根据下表修改数组的值      array[pos] = 1;      return 0;}


上述代码编译运行后,提示Verifier失败,然后使用objdump命令来看一下具体的字节码,通过以下字节码程序,可以看到Verifier失败的原因在于第14行R6寄存器(变量pos)没有进行边界检查导致。

  • Root Cause:

  • 当eBPF Verifier走到第14行的时候尝试去访问array数组,但是此时数组的下标pos是来自bpf_get_smp_processor_id获取到的unsigned int 类型的动态变量,此时Verifier无法判断变量的具体数值,所以会保守认为可能会达到最大值,这样的话就会超出array数组的范围,造成内存越界。

 

0000000000000000 :;int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) 0:r1 = 0;  u32 key = 0;1:  *(u32 *)(r10 - 4) = r12:  r2 = r103:  r2 += -4;      char *array = bpf_map_lookup_elem(&array_map, &key); 4:r1 = 0 ll6:  call 17:  r6 = r0;  if (array == NULL)8:  if r6 == 0 goto +6 ;      unsigned int pos = bpf_get_smp_processor_id();; 9:call 8;      array[pos] = 1; 10:r0 <<= 3211:  r0 >>= 3212:  r6 += r013:  r1 = 1;    array[pos] = 1;14:  *(u8 *)(r6 + 0) = r1

 

  • 解决方案:

 添加边界检查代码

if (pos < MAX_SIZE)   if r0 > 15 goto +3 


2) Verifier验证机制和编译器优化机制不一致导致边界检查不通过

 

① 使用错误寄存器做边界检查:


SEC("kprobe/do_unlinkat")
int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name){ // 获取一个数组指针array(数组MAX_SIZE为16个字节) u32 key = 0; char *array = bpf_map_lookup_elem(&array_map, &key); if (array == NULL) return 0; // 获取当前运行程序的CPU编号(当前机器的CPU有16个核) unsigned int pos = bpf_get_smp_processor_id();; // 修改数值 if (pos < MAX_SIZE){ array[pos] = 1; pos += 1; } // debug代码,输出一些上下文信息 bpf_printk("debug %d %d %d\n", bpf_get_current_pid_tgid() >> 32, bpf_get_current_pid_tgid(), array[1]); // 修改数值 if (pos < MAX_SIZE) array[pos] = 1; return 0;}

 

编译这个代码后Verifier验证通过,可以正常运行。但是此时如果把bpf_printk打印信息删掉,竟然提示Verifier验证失败,原因是R0寄存器(变量pos)没有通过边界检查,但是明明已经加了边界检查代码,怎么还会出现问题,这么神奇!

  • Root Cause:



由于编译器的优化策略,导致删减bpf_printk后编译生成的eBPF字节码使用寄存器r1(表示pos变量)来进行边界检查,但是却用r0+1(同样表示pos变量)来访问数组array。

相比之下,从eBPF verifier的角度来看,由于在编译过程中,r1和r0+1的关联性丢失了,导致eBPF verifier无法知道pos变量已经通过了检查,因此错误的认为pos变量没有进行边界检查,不允许程序运行。


②寄存器溢出或重新加载后,状态丢失:


SEC("kprobe/do_unlinkat")
int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name){  // 获取一个数组指针array(数组MAX_SIZE为16个字节) u32 key = 0; char *array = bpf_map_lookup_elem(&array_map, &key); if (array == NULL) return 0; // 获取当前运行程序的CPU编号(当前机器的CPU有16个核) unsigned long pos = bpf_get_smp_processor_id();; // 修改数值 if (pos < MAX_SIZE){ for (unsigned long i = 0; i < MAX_SIZE; i++) bpf_printk("debug %d %d %d\n", bpf_get_current_pid_tgid() >> 32, \ bpf_get_current_pid_tgid(), array[i]); array[pos] = 1; } return 0;}

 

在上述边界检查代码中添加一段print调试打印信息后编译验证又会出现Verifier失败,通过排查发现不是已知的两类问题,依然使用objdump查看添加后的字节码信息。


  • Root Cause:



加入bpf_printk后通过字节码可以看到,代码先使用R0(表示pos变量)进行边界检查。由于当前寄存器数量不足,编译器决定将将R0临时保存到栈上的空间(R10-16,在eBPF字节码中,R10存储存放着 eBPF 栈空间的栈帧指针的地址),这样R0就可以空闲出来,留给其他代码使用,我们称这种行为为寄存器溢出(register spill)。当真正需要使用pos变量的时候,编译器会从栈上(R10-16)将之前保存的内容取出来赋给R1(也表示pos变量),然后使用R1对数组array进行访问。但神奇的是,当寄存器溢出发生时,pos变量的状态丢失了,eBPF忘记了该变量曾经进行了边界检查,导致程序无法通过验证。

 

  • 解决方案:

在源码中加入 &= 操作符,引导编译器生成理想的eBPF字节码

array[pos &= MAX_SIZE - 1] = 1;

如果上述方法失效,无法引导编译器,那么针对出错的部分源代码人工编写eBPF字节码,替代编译器生成的字节码

#define STR(s) #s #define XSTR(s) STR(s)#define asm_variable_bound_check(variable)\({\  asm volatile (\    "%[tmp] &= " XSTR(MAX_SIZE - 1) " \n"  \    :[tmp]"+&r"(variable)\  );\})asm_check(pos);array[pos] = 1;

 

3. 总结

 

  本文总结了从动静态探针的角度梳理分析Linux Tracing System以及实例解决eBPF程序中遇到的问题。eBPF目前正在高速发展,很多坑和解决办法缺乏官方文档。本文在以下几点上做了自己的分析和分享,希望对大家更清晰的认识Linux Tracing System和eBPF有所帮助。

 

1. 自下而上的方式分析动静态探针

2. 各种场景下动静态探针的选择

3. BPF开发框架的选择

4. 多内核版本兼容性问题

5. 如何为低版本内核生成BTF文件

6. eBPF边界检查问题分析

7. eBPF Verifier验证机制与编译器优化机制不一致问题



往期精华文章:【精华】Linux阅码场原创精华文章汇总



阅码场付费会员专业交流群

会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)


专业群介绍:

彭伟林-阅码场内核性能与稳定性
本群定位内核性能与稳定性技术交流,覆盖云/网/车/机/芯领域资深内核专家,由阅码场资深讲师彭伟林主持。


甄建勇-性能优化与体系结构

本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。


李春良-Xenomai与实时优化

本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师李春良和彭伟林共同主持。


周贺贺-Tee和ARM架构

本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。


谢欢-Linux tracers

本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。



Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 182浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 101浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 221浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 41浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 437浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 198浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 73浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 186浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 164浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 112浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 399浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 150浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 53浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 122浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦