《Linux内核深度解析》选载之内存地址空间

原创 Linux阅码场 2022-07-15 12:39

Ftrace训练营火热报名中:Ftrace训练营:站在设计者的角度来理解ftrace(限50人)。训练营第一期报名已圆满成功,好评如潮。第二期报名正在火爆进行中(咨询小月微信:linuxer2016)。


ARM安全架构训练营2期火热报名中:阅码场训练营:ARM安全架构之Trustzone/TEE实战--【介绍视频】。报名咨询客服(小月微信:linuxer2016)。


ARM架构与调优调试训练营火热报名中:阅码场训练营:ARM架构与调试调优。报名咨询客服(小月微信:linuxer2016)。




阅码场用户程磊对《Linux内核深度解析》推荐如下:

1.语言浅显易懂,内容深入浅出。

2.逻辑清晰,条理分明,逐步深入,层层递进。

3.基于较新的4.12内核版本,很多经典内核书籍虽然写的都非常好,但是都是基于2.6内核,很多在2.6之后引入的新技术并没有讲到,而本书对这些新技术都有非常详细的讲解。




作者简介

余华兵,2005年毕业于华中科技大学计算机学院,取得硕士学位。毕业后的十余年一直在网络通信行业从事软件设计和开发工作,研究方向包括IPv4协议栈、IPv6协议栈和Linux内核。


目录

3.1 概述 

3.1.1 用户空间

3.1.2 内核空间

3.1.3 硬件层面

3.2 虚拟地址空间布局 

3.2.1 虚拟地址空间划分 
3.2.2 用户虚拟地址空间布局 
3.2.3 内核地址空间布局

3.3 物理地址空间



3.1 内存管理概述


内存管理子系统的架构如图 3.1 所示,分为用户空间、内核空间和硬件 3 个层面。



图3.1 内存管理架构

3.1.1.用户空间


应用程序使用 malloc()申请内存,使用 free()释放内存。

malloc()free()glibc 库的内存分配器 ptmalloc 提供的接口,ptmalloc 使用系统调用brk mmap 向内核以页为单位申请内存,然后划分成小内存块分配给应用程序。


用户空间的内存分配器,除了 glibc 库的 ptmalloc,还有谷歌公司的 tcmalloc FreeBSDjemalloc


3.1.2.内核空间


1)内核空间的基本功能。


虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk 用来扩大或收缩堆,sys_mmap 用来在内存映射区域分配虚拟页,sys_munmap 用来释放虚拟页。


内核使用延迟分配物理内存的策略,进程第一次访问虚拟页的时候,触发页错误异常,页错误异常处理程序从页分配器申请物理页,在进程的页表中把虚拟页映射到物理页。


页分配器负责分配物理页,当前使用的页分配器是伙伴分配器。


内核空间提供了把页划分成小内存块分配的块分配器,提供分配内存的接口 kmalloc()和释放内存的接口 kfree(),支持 3 种块分配器:SLAB 分配器、SLUB 分配器和 SLOB分配器。


在内核初始化的过程中,页分配器还没准备好,需要使用临时的引导内存分配器分配内存。


2)内核空间的扩展功能。


不连续页分配器提供了分配内存的接口 vmalloc 和释放内存的接口 vfree,在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续而物理地址不连续。


每处理器内存分配器用来为每处理器变量分配内存。


连续内存分配器(Contiguous Memory AllocatorCMA)用来给驱动程序预留一段连续的内存,当驱动程序不用的时候,可以给进程使用;当驱动程序需要使用的时候,把进程占用的内存通过回收或迁移的方式让出来,给驱动程序使用。


内存控制组用来控制进程占用的内存资源。


当内存碎片化的时候,找不到连续的物理页,内存碎片整理(“memory compaction的意译,直译为“内存紧缩”)通过迁移的方式得到连续的物理页。


在内存不足的时候,页回收负责回收物理页,对于没有后备存储设备支持的匿名页,把数据换出到交换区,然后释放物理页;对于有后备存储设备支持的文件页,把数据写回存储设备,然后释放物理页。如果页回收失败,使用最后一招:内存耗尽杀手(OOM killerOut-of-Memory killer),选择进程杀掉。


3.1.3.硬件层面


处理器包含一个称为内存管理单元(Memory Management UnitMMU)的部件,负责把虚拟地址转换成物理地址。


内存管理单元包含一个称为页表缓存(Translation Lookaside BufferTLB)的部件,保存最近使用过的页表映射,避免每次把虚拟地址转换成物理地址都需要查询内存中的页表。


为了解决处理器的执行速度和内存的访问速度不匹配的问题,在处理器和内存之间增加了缓存。缓存通常分为一级缓存和二级缓存,为了支持并行地取指令和取数据,一级缓存分为数据缓存和指令缓存。



3.2 虚拟地址空间布局


3.2.1 虚拟地址空间划分


因为目前应用程序没有那么大的内存需求,所以 ARM64 处理器不支持完全的 64 位虚拟地址,实际支持情况如下。

图3.2 ARM64内核/用户虚拟地址空间划分


1)虚拟地址的最大宽度是 48 位,如图 3.2 所示。内核虚拟地址在 64 位地址空间的顶部,高 16 位是全 1,范围是[0xFFFF 0000 000000000xFFFF FFFF FFFF FFFF];用户虚拟地址在 64 位地址空间的底部,高 16 位是全 0,范围是[0x0000 0000 0000 00000x0000 FFFF FFFF FFFF];高 16 位是全 1 或全 0 的地址称为规范的地址,两者之间是不规范的地址,不允许使用。


2)如果处理器实现了 ARMv8.2 标准的大虚拟地址(Large Virtual AddressLVA)支持,并且页长度是 64KB,那么虚拟地址的最大宽度是 52 位。


3)可以为虚拟地址配置比最大宽度小的宽度,并且可以为内核虚拟地址和用户虚拟地址配置不同的宽度。转换控制寄存器(Translation Control RegisterTCR_EL1 的字段 T0SZ 定义了必须是全 0 的最高位的数量,字段 T1SZ 定义了必须是全 1 的最高位的数量,用户虚拟地址的宽度是(64-TCR_EL1.T0SZ),内核虚拟地址的宽度是(64-TCR_EL1.T1SZ)。


在编译 ARM64 架构的 Linux 内核时,可以选择虚拟地址宽度。

1)如果选择页长度 4KB,默认的虚拟地址宽度是 39 位。

2)如果选择页长度 16KB,默认的虚拟地址宽度是 47 位。

3)如果选择页长度 64KB,默认的虚拟地址宽度是 42 位。

4)可以选择 48 位虚拟地址。


ARM64 架构的 Linux 内核中,内核虚拟地址和用户虚拟地址的宽度相同。


所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。


3.2.2 用户虚拟地址空间布局


进程的用户虚拟地址空间的起始地址是 0,长度是 TASK_SIZE,由每种处理器架构定义自己的宏 TASK_SIZEARM64 架构定义的宏 TASK_SIZE 如下所示。


132 位用户空间程序:TASK_SIZE 的值是TASK_SIZE_32,即0x100000000,等于4GB

264 位用户空间程序:TASK_SIZE 的值是 TASK_SIZE_64,即 2VA_BITS字节,VA_BITS是编译内核时选择的虚拟地址位数。


arch/arm64/include/asm/memory.h #define VA_BITS (CONFIG_ARM64_VA_BITS) #define TASK_SIZE_64 (UL(1) << VA_BITS) #ifdef CONFIG_COMPAT /* 支持执行32位用户空间程序 */ #define TASK_SIZE_32 UL(0x100000000) /* test_thread_flag(TIF_32BIT)判断用户空间程序是不是32位 */ #define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \  TASK_SIZE_32 : TASK_SIZE_64) #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \  TASK_SIZE_32 : TASK_SIZE_64) #else #define TASK_SIZE TASK_SIZE_64 #endif /* CONFIG_COMPAT */



进程的用户虚拟地址空间包含以下区域。

1)代码段、数据段和未初始化数据段。

2)动态库的代码段、数据段和未初始化数据段。

3)存放动态生成的数据的堆。

4)存放局部变量和实现函数调用的栈。

5)存放在栈底部的环境变量和参数字符串。

6)把文件区间映射到虚拟地址空间的内存映射区域。


内核使用内存描述符 mm_struct 描述进程的用户虚拟地址空间,内存描述符的主要成员如表 3.1 所示。




进程描述符(task_struct)中和内存描述符相关的成员如表 3.2 所示。




如果进程不属于线程组,那么进程描述符和内存描述符的关系如图 3.3 所示,进程描述符的成员 mm active_mm 都指向同一个内存描述符,内存描述符的成员 mm_users 1、成员 mm_count 1


如果两个进程属于同一个线程组,那么进程描述符和内存描述符的关系如图 3.4 所示,每个进程的进程描述符的成员 mm active_mm 都指向同一个内存描述符,内存描述符的成员 mm_users 2、成员 mm_count 1




内核线程的进程描述符和内存描述符的关系如图 3.5 所示,内核线程没有用户虚拟地址空间,当内核线程没有运行的时候,进程描述符的成员 mm active_mm 都是空指针;当内核线程运行的时候,借用上一个进程的内存描述符,在被借用进程的用户虚拟地址空间的上方运行,进程描述符的成员 active_mm 指向借用的内存描述符,假设被借用的内存描述符所属的进程不属于线程组,那么内存描述符的成员 mm_users 不变,仍然是 1,成员mm_count 1 变成 2




为了使缓冲区溢出攻击更加困难,内核支持为内存映射区域、栈和堆选择随机的起始地址。进程是否使用虚拟地址空间随机化的功能,由以下两个因素共同决定。

1)进程描述符的成员 personality(个性化)是否设置 ADDR_NO_RANDOMIZE

2)全局变量 randomize_va_space0 表示关闭虚拟地址空间随机化,1 表示使内存映射区域和栈的起始地址随机化,2 表示使内存映射区域、栈和堆的起始地址随机化。可以通过文件“/proc/sys/kernel/randomize_va_space”修改。


mm/memory.c int randomize_va_space __read_mostly = #ifdef CONFIG_COMPAT_BRK  1; #else  2; #endif


为了使旧的应用程序(基于 libc5)正常运行,默认打开配置宏 CONFIG_COMPAT_BRK禁止堆随机化。所以默认配置是使内存映射区域和栈的起始地址随机化。


栈通常自顶向下增长,当前只有惠普公司的 PA-RISC 处理器的栈是自底向上增长。栈的起始地址是 STACK_TOP,默认启用栈随机化,需要把起始地址减去一个随机值。STACK_TOP是每种处理器架构自定义的宏,ARM64 架构定义的 STACK_TOP 如下所示:如果是 64 位用户空间程序,STACK_TOP 的值是 TASK_SIZE_64;如果是 32 位用户空间程序,STACK_TOP的值是异常向量的基准地址 0xFFFF0000


arch/arm64/include/asm/processor.h #define STACK_TOP_MAX TASK_SIZE_64 #ifdef CONFIG_COMPAT /* 支持执行32位用户空间程序 */ #define AARCH32_VECTORS_BASE 0xffff0000 #define STACK_TOP (test_thread_flag(TIF_32BIT) ? \  AARCH32_VECTORS_BASE : STACK_TOP_MAX) #else #define STACK_TOP STACK_TOP_MAX #endif /* CONFIG_COMPAT */


内存映射区域的起始地址是内存描述符的成员 mmap_base。如图 3.6 所示,用户虚拟

地址空间有两种布局,区别是内存映射区域的起始位置和增长方向不同。

1)传统布局:内存映射区域自底向上增长,起始地址是 TASK_UNMAPPED_BASE每种处理器架构都要定义这个宏,ARM64 架构定义为 TASK_SIZE/4。默认启用内存映射区域随机化,需要把起始地址加上一个随机值。传统布局的缺点是堆的最大长度受到限制,32 位系统中影响比较大,但是在 64 位系统中这不是问题。


2)新布局:内存映射区域自顶向下增长,起始地址是(STACK_TOP − 栈的最大长度隙)。默认启用内存映射区域随机化,需要把起始地址减去一个随机值。当进程调用 execve 以装载 ELF 文件的时候,函数 load_elf_binary 将会创建进程的用户虚拟地址空间。函数 load_elf_binary 创建用户虚拟地址空间的过程如图 3.7 所示。


如果没有给进程描述符的成员 personality 设置标志位ADDR_NO_RANDOMIZE(该标志位表示禁止虚拟地址空间随机化),并且全局变量 randomize_va_space 是非零值,那么给进程设置标志 PF_RANDOMIZE,允许虚拟地址空间随机化。





各种处理器架构自定义的函数 arch_pick_mmap_layout 负责选择内存映射区域的布局。ARM64 架构定义的函数 arch_pick_mmap_layout 如下:


arch/arm64/mm/mmap.c1 void arch_pick_mmap_layout(struct mm_struct *mm) 2 { 3 unsigned long random_factor = 0UL; 4 5 if (current->flags & PF_RANDOMIZE) 6 random_factor = arch_mmap_rnd(); 7 8 if (mmap_is_legacy()) { 9 mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; 10 mm->get_unmapped_area = arch_get_unmapped_area; 11 } else { 12 mm->mmap_base = mmap_base(random_factor); 13 mm->get_unmapped_area = arch_get_unmapped_area_topdown; 14 } 15 } 16 17 static int mmap_is_legacy(void) 18 { 19 if (current->personality & ADDR_COMPAT_LAYOUT) 20 return 1; 21 22 if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) 23 return 1; 24 25 return sysctl_legacy_va_layout; 26 }


810 行代码,如果给进程描述符的成员 personality 设置标志位 ADDR_COMPAT_LAYOUT 表示使用传统的虚拟地址空间布局,或者用户栈可以无限增长,或者通过文件“/proc/sys/vm/legacy_va_layout”指定,那么使用传统的自底向上增长的布局,内存映射区域的起始地址是 TASK_UNMAPPED_BASE 加上随机值,分配未映射区域的函数是arch_get_unmapped_area


1113 行代码,如果使用自顶向下增长的布局,那么分配未映射区域的函数是 arch_get_unmapped_area_topdown,内存映射区域的起始地址的计算方法如下:


arch/arm64/include/asm/elf.h #ifdef CONFIG_COMPAT #define STACK_RND_MASK (test_thread_flag(TIF_32BIT) ? \  0x7ff >> (PAGE_SHIFT - 12) : \  0x3ffff >> (PAGE_SHIFT - 12)) #else #define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) #endif arch/arm64/mm/mmap.c #define MIN_GAP (SZ_128M + ((STACK_RND_MASK << PAGE_SHIFT) + 1)) #define MAX_GAP (STACK_TOP/6*5) static unsigned long mmap_base(unsigned long rnd) {  unsigned long gap = rlimit(RLIMIT_STACK);  if (gap < MIN_GAP)  gap = MIN_GAP;  else if (gap > MAX_GAP)  gap = MAX_GAP;  return PAGE_ALIGN(STACK_TOP - gap - rnd); }



先计算内存映射区域的起始地址和栈顶的间隙:初始值取用户栈的最大长度,限定不能小于“128MB + 栈的最大随机偏移值 + 1”,确保用户栈最大可以达到 128MB;限定不能超过 STACK_TOP 5/6。内存映射区域的起始地址等于“STACK_TOP−间隙随机值”,然后向下对齐到页长度。


回到函数load_elf_binary:函数 setup_arg_pages 把栈顶设置为 STACK_TOP 减去随机120 3.2 虚拟地址空间布局值,然后把环境变量和参数从临时栈移到最终的用户栈;函数 set_brk 设置堆的起始地址,如果启用堆随机化,把堆的起始地址加上随机值。


fs/binfmt_elf.c static int load_elf_binary(struct linux_binprm *bprm) {  retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),  executable_stack);  retval = set_brk(elf_bss, elf_brk, bss_prot);  if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {  current->mm->brk = current->mm->start_brk = arch_randomize_brk(current->mm);  } }


3.2.3 内核地址空间布局


ARM64 处理器架构的内核地址空间布局如图 3.8 所示。




1)线性映射区域的范围是[PAGE_OFFSET,],起始位置是 PAGE_OFFSET =(0xFFFF FFFF FFFF FFFF << (VA_BITS-1)),长度是内核虚拟地址空间的一半。称为线性映射区域的原因是虚拟地址和物理地址是线性关系:

虚拟地址 =((物理地址 − PHYS_OFFSET+ PAGE_OFFSET),其中 PHYS_OFFSET是内存的起始物理地址。


2vmemmap 区域的范围是 [VMEMMAP_START, PAGE_OFFSET),长度是

VMEMMAP_SIZE =(线性映射区域的长度 / 页长度 * page 结构体的长度上限)。

内核使用 page 结构体描述一个物理页,内存的所有物理页对应一个 page 结构体数组。如果内存的物理地址空间不连续,存在很多空洞,称为稀疏内存。vmemmap 区域是稀疏内存的 page 结构体数组的虚拟地址空间。


3PCI I/O 区域的范围是[PCI_IO_START, PCI_IO_END),长度是 16MB,结束地址是PCI_IO_END = (VMEMMAP_START − 2MB)


外围组件互联(Peripheral Component InterconnectPCI)是一种总线标准,PCI I/O 域是 PCI 设备的 I/O 地址空间。


4)固定映射区域的范围是[FIXADDR_START, FIXADDR_TOP),长度是FIXADDR_SIZE结束地址是 FIXADDR_TOP = (PCI_IO_START − 2MB)


固定地址是编译时的特殊虚拟地址,编译的时候是一个常量,在内核初始化的时候映射到物理地址。


5vmalloc 区域的范围是[VMALLOC_START, VMALLOC_END),起始地址是VMALLOC_START,等于内核模块区域的结束地址,结束地址是 VMALLOC_END = (PAGE_OFFSET −PUD_SIZE − VMEMMAP_SIZE − 64KB),其中 PUD_SIZE 是页上级目录表项映射的地址空间的长度。


vmalloc 区域是函数 vmalloc 使用的虚拟地址空间,内核使用 vmalloc 分配虚拟地址连续但物理地址不连续的内存。内核镜像在 vmalloc 区域,起始虚拟地址是(KIMAGE_VADDR + TEXT_OFFSET) ,其中 KIMAGE_VADDR 是内核镜像的虚拟地址的基准值,等于内核模块区域的结束地址MODULES_ENDTEXT_OFFSET 是内存中的内核镜像相对内存起始位置的偏移。


6)内核模块区域的范围是[MODULES_VADDR, MODULES_END),长度是 128MB,起始地址是 MODULES_VADDR =(内核虚拟地址空间的起始地址 + KASAN 影子区域的长度)。


内核模块区域是内核模块使用的虚拟地址空间。


7KASAN 影子区域的起始地址是内核虚拟地址空间的起始地址,长度是内核虚拟地址空间长度的 1/8


内核地址消毒剂(Kernel Address SANitizerKASAN)是一个动态的内存错误检查工具。它为发现释放后使用和越界访问这两类缺陷提供了快速和综合的解决方案。


3.3 物理地址空间


物理地址是处理器在系统总线上看到的地址。使用精简指令集(Reduced Instruction SetComputerRISC)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围设备的物理地址区域称为设备内存。


处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器、状态寄存器和数据寄存器三大类,外围设备的寄存器通常被连续地编址。处理器对外围设备寄存器的编址方式有两种。


1I/O 映射方式(I/O-mapped):英特尔的 x86 处理器为外围设备专门实现了一个单独的地址空间,称为“I/O 地址空间”或“I/O 端口空间”,处理器通过专门的 I/O 指令(如x86 in out 指令)来访问这一空间中的地址单元。


2)内存映射方式(memory-mapped):使用精简指令集的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间,处理器可以像访问一个内存单元那样访问外围设备,不需要提供专门的 I/O 指令。


程序只能通过虚拟地址访问外设寄存器,内核提供了以下函数来把外设寄存器的物理地址映射到虚拟地址空间。

1)函数 ioremap()把外设寄存器的物理地址映射到内核虚拟地址空间。

void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);


2)函数 io_remap_pfn_range()把外设寄存器的物理地址映射到进程的用户虚拟地址空间。

int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,unsigned long pfn, unsigned long size, pgprot_t prot);


除了 SPARC 处理器以外,在其他处理器架构中函数 io_remap_pfn_range()和函数 remap_pfn_range()等价。函数 remap_pfn_range()用于把内存的物理页映射到进程的用户虚拟地址空间。


内核提供了函数 iounmap(),它用来删除函数 ioremap()创建的映射。

void iounmap(void *addr);


ARM64 架构的实现


ARM64 架构定义了两种内存类型。

1)正常内存(Normal Memory):包括物理内存和只读存储器(ROM)。

2)设备内存(Device Memory):指分配给外围设备寄存器的物理地址区域。

对于正常内存,可以设置共享属性和缓存属性。共享属性用来定义一个位置是否可以被多个核共享,分为不可共享、内部共享和外部共享。不可共享是指只被处理器的一个核使用,内部共享是指一个处理器的所有核共享或者多个处理器共享,外部共享是指处理器和其他观察者(比如图形处理单元或 DMA 控制器)共享。缓存属性用来定义访问时是否通过处理器的缓存。


设备内存的共享属性总是外部共享,缓存属性总是不可缓存(即必须绕过处理器的缓存)。


ARM64 架构根据 3 种属性把设备内存分为 4 种类型。

1Device-nGnRnE,这种类型限制最严格。

2Device-nGnRE

3Device-nGRE

4Device-GRE,这种类型限制最少。


3 种属性分别如下。

1)聚集属性:G 表示聚集(Gathering),nG 表示不聚集(non Gathering)。聚集属性决定对内存区域的多个访问是否可以被合并为一个总线事务。如果地址被标记为“不聚集”,那么必须按照程序里面的地址和长度访问。如果地址被标记为“聚集”,处理器可以把两个“写一个字节”的访问合并成一个“写两个字节”的访问,可以把对相同内存位置的多个访问合并,例如读相同位置两次,处理器只需要读一次,为两条指令返回相同的结果。


2)重排序属性:R 表示重排序(Re-ordering),nR 表示不重排序(non Re-ordering)。这个属性决定对相同设备的多个访问是否可以重新排序。如果地址被标记为“不重排序”,那么对同一个块的访问总是按照程序顺序执行。


3)早期写确认属性:E 表示早期写确认(Early Write Acknowledgement),nE 表示不执行早期写确认(non Early Write Acknowledgement)。


这个属性决定是否允许处理器和从属设备之间的中间写缓冲区发送“写完成”确认。如果地址被标记为“不执行早期写确认”,那么必须由外围设备发送“写完成”确认。如果地址被标记为“早期写确认”,那么允许写缓冲区在外围设备收到数据之前发送“写完成”确认。


物理地址宽度


目前 ARM64 处理器支持的最大物理地址宽度是 48 位,如果实现了 ARMv8.2 标准的大物理地址(Large Physical AddressLPA)支持,并且页长度是 64KB,那么物理地址的最大宽度是 52 位。


可以使用寄存器 TCR_EL1Translation Control Register for Exception Level 1,异常级别 1 转换控制寄存器)的字段 IPSIntermediate Physical Address Size,中间物理地址长度)控制物理地址的宽度,IPS 字段的长度是 3 位,IPS 字段的值和物理地址宽度的对应关系如表 3.3 所示。



感兴趣者可进群一起交流学习


精华文章:【精华】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虚拟化和云计算等各方各面.
评论
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 84浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 114浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 113浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 81浏览
  • 在当前人工智能(AI)与物联网(IoT)的快速发展趋势下,各行各业的数字转型与自动化进程正以惊人的速度持续进行。如今企业在设计与营运技术系统时所面临的挑战不仅是技术本身,更包含硬件设施、第三方软件及配件等复杂的外部因素。然而这些系统往往讲究更精密的设计与高稳定性,哪怕是任何一个小小的问题,都可能对整体业务运作造成严重影响。 POS应用环境与客户需求以本次分享的客户个案为例,该客户是一家全球领先的信息技术服务与数字解决方案提供商,遭遇到一个由他们所开发的POS机(Point of Sal
    百佳泰测试实验室 2025-01-09 17:35 105浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 97浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 88浏览
  • 车机导航有看没有懂?智能汽车语系在地化不可轻忽!随着智能汽车市场全球化的蓬勃发展,近年来不同国家地区的「Automotive Localization」(汽车在地化)布局成为兵家必争之地,同时也是车厂在各国当地市场非常关键的营销利器。汽车在地化过程中举足轻重的「汽车语系在地化」,则是透过智能汽车产品文字与服务内容的设计订制,以对应不同国家地区用户的使用习惯偏好,除了让当地车主更能清楚理解车辆功能,也能进一步提高品牌满意度。客户问题与难处某车厂客户预计在台湾市场推出新一代车款,却由于车机导航开发人
    百佳泰测试实验室 2025-01-09 17:47 14浏览
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 38浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 96浏览
  • 1月9日,在2025国际消费电子展览会(CES)期间,广和通发布集智能语音交互及翻译、4G/5G全球漫游、随身热点、智能娱乐、充电续航等功能于一体的AI Buddy(AI陪伴)产品及解决方案,创新AI智能终端新品类。AI Buddy是一款信用卡尺寸的掌中轻薄智能设备,为用户带来实时翻译、个性化AI语音交互助手、AI影像识别、多模型账户服务、漫游资费服务、快速入网注册等高品质体验。为丰富用户视觉、听觉的智能化体验,AI Buddy通过蓝牙、Wi-Fi可配套OWS耳机、智能眼镜、智能音箱、智能手环遥
    物吾悟小通 2025-01-09 18:21 8浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 98浏览
  • HDMI 2.2 规格将至,开启视听新境界2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新HDMI规范为规模庞大的 HDMI 生态系统带来更多选择,为创建、分发和体验理想的终端用户效果提供更先进的解决方案。新技术为电视、电影和游戏工作室等内容制作商在当前和未来提供更高质量的选择,同时实现多种分发平台。96Gbps的更高带宽和新一代 HDMI 固定比率速率传输(Fixed Rate Link)技术为各种设备应用提供更优质的音频和视频。终端用户显示器能以最
    百佳泰测试实验室 2025-01-09 17:33 112浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 97浏览
  • 职场是人生的重要战场,既是谋生之地,也是实现个人价值的平台。然而,有些思维方式却会悄无声息地拖住你的后腿,让你原地踏步甚至退步。今天,我们就来聊聊职场中最忌讳的五种思维方式,看看自己有没有中招。1. 固步自封的思维在职场中,最可怕的事情莫过于自满于现状,拒绝学习和改变。世界在不断变化,行业的趋势、技术的革新都在要求我们与时俱进。如果你总觉得自己的方法最优,或者害怕尝试新事物,那就很容易被淘汰。与其等待机会找上门,不如主动出击,保持学习和探索的心态。加入优思学院,可以帮助你快速提升自己,与行业前沿
    优思学院 2025-01-09 15:48 101浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦