- 博客(16)
- 资源 (3)
- 收藏
- 关注
原创 TLS 变量在主线程和子线程上的位置区别
Glibc会分配一块内存区域,用于存储主线程的TLS变量,并在主线程的执行开始时进行初始化。栈通常是在线程创建时分配的,并且可以包含线程特定的数据,包括TLS变量。在这种情况下,TLS变量存储在子线程的栈上,而不是在全局的。这是因为主线程的TLS变量通常是在主线程启动时由glibc(GNU C库)创建的,而不是在。创建的子线程,TLS变量通常是存储在子线程的。段中,而子线程的TLS变量通常存储在子线程的。:主线程的TLS变量通常不会存在于主线程的。总之,主线程的TLS变量通常存储在全局的。
2023-10-11 16:33:57 148
原创 关于静态库编译时增加-fPIC选项
这些位置无关代码对于可执行的静态库没有直接的用处,因为它们不会在运行时加载到不同的内存地址。对于静态库链接到动态库的场景,那么编译静态库的时候就必须使用-fPIC选项了。选项应用于静态库编译时,编译器会生成额外的位置无关代码和数据布局,以确保生成的静态库可以在不同的内存地址上加载。
2023-09-28 10:54:13 3571
转载 关于ARM寄存器TTBR0 TTBR1
At the hardware level, ARM supports two page table trees simultaneously, using the hardware registers TTBR0 and TTBR1. A virtual address is mapped to a physical address by the CPU depending on settings in TTBRC. This control register has a field which sets
2022-09-30 14:15:12 707
原创 Linux lockdep信息分析
lockdep是内核提供协助发现死锁问题的feature以如下ABBA类型circular locking为例分析一下打印信息 1[13.007000]WARNING:possiblecircularlockingdependencydetected 2[13.007587]5.0.0-rc3-00018-g2fa53f892422-dirty#477Nottainted 3[13.008124]------------------------...
2020-07-09 23:53:46 712
原创 vsync从中断到用户态的经历
vsync是显示屏的垂直同步信号它指示着前一帧的结束,和新一帧的开始。 在本人的G965手机源码中,可以看到硬件的vsync首先是外部command屏幕的GPIO中断出发的(简称vsync_irq),中断handler里会调用wake_up_interruptible_all函数唤醒内核态vsync线程(简称k_vsync_thread),在k_vsync_thread中会调用sysfs_notify函数唤醒一个kworker,这个kworker的callback函数里会调用wake_up...
2020-05-19 22:56:13 915
原创 linux的0号进程是不可抢占的
从linux的调度策略来讲,当一个CPU没有调度实体可被调度的时候,才会轮到0号进程idle的运行。调度实体就是sched_entity结构,由于每个task_struct都嵌入了sched_entity的一个实例,所以linux进程是可调度实体,但逆命题是不正确的,因为还有线程和进程组。 idle是优先级最低的进程,可以想象在任何情况下都能被别的进程immediately抢占,而实际上,通过ftrace可以看到idle在运行的时候一直是关抢占的(preempt-depth不为零),也就是说只有i...
2020-05-19 22:51:25 281
翻译 Linux内核如何管理内存
翻译一篇老文章,基础原理十年未变 https://manybutfinite.com/post/how-the-kernel-manages-your-memory/进程虚拟地址空间布局出来后,我们回到内核探究其管理用户态内存的机制,这里仍旧是gonzo进程:Linux进程在内核空间是以一个task_struct实现的,这个实例就是进程描述符。task_struct 里的mm指针指...
2019-08-13 00:34:40 256
原创 linux用户态进程地址空间管理
在linux操作系统下,每个进程或者线程都用一个task_struct来描述,这其中有一个mm_struct结构体来管理用户态进程的内存,我们称之为内存描述符,该结构体包含了用户态进程地址空间相关的全部信息。task_struct 中还有一个很重要的元素为 active_mm (上一个被调用的用户态进程的mm指针),主要用于内核线程访问内核页全局目录,事实上,内核线程并没有相关的内存描述符...
2019-05-25 22:06:36 1017
原创 DPDK 无锁操作如何保证原子?
rte_atomic32_cmpset()称为CAS(compare and set)操作,是DPDK无锁队列实现的关键函数,代码如下:static inline intrte_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src){uint8_t res;asm volatile( MPLOCKED...
2019-04-18 14:26:23 1874
原创 Cgroup内核框架分析
Cgroup是linux内核提供的一种可以限制、记录、隔离task(进程或者线程)所使用物理资源的机制,LXC为实现虚拟化使用了Cgroup作为资源管理手段。用户空间使用文件的方式组织和管理Cgroup资源,所有的资源管理都有标准化的subsystem(子系统)实现,在文件 include/linux/cgroup_subsys.h 列出了所有的子系统,subsystem的hook函数通过...
2019-04-11 23:33:41 573
原创 一次linux平台X86架构下DPDK应用启动的OOM
问题背景是X86板子上搭载DPDK的中间件启动后再起应用程序会出现OOM(Out Of Memory)软件环境是linux4.9.154 版本中间件封装了DPDK内存大小为8GBkernel启动阶段会配置两个1G的大页供应用程序使用cmdline参数: hugepagesz=1G hugepages=2不加载application时用户态启动阶段会fork出4个进程在不同...
2019-03-11 19:35:37 355
原创 多线程共享数据时cache不对齐对performance的影响
LMAX是一家英国的外汇交易公司,该公司开发了基于JVM的并发开源框架Disruptor,它能够在一个线程里每秒处理6百万订单,业务逻辑处理器完全运行在内存中,使用事件源驱动方式,其发布的开源架构介绍文章中讲到用内存填充的方式规避cache line对多线程并发的影响。文章中提到了一个叫伪共享的概念: https://lmax-exchange.github.io/disruptor/file...
2019-02-26 20:21:26 321
原创 RCU在功耗和性能场景下的扩展
RCU概念 ReadCopy Update (RCU) 是Linux的一种同步机制,把写数据看成一个update操作,可分为两个阶段removal和reclamation。removal阶段将旧数据的指针替换为新数据的指针,可以与 reader 并发,reclamation阶段在等待旧数据的读操作完成后将其回收或直接释放,两个阶段之间的间隔也被称之为grace period。从代码的实现...
2019-02-08 22:07:07 1825
原创 ARM64架构下Linux进程何时抢占?
Linux系统下,进程调度有主动和被动之分,最终是调用schedule()函数。主动是指进程需要等待资源而主动让出CPU,被动就是抢占(PREEMPT)。 主动schedule由业务代码自行决定,运行在Linux抢占式内核上要确保进程的运行时间就需要关注抢占。抢占的过程分为两步:设置调度标记 为CPU上正在运行的进程thread_info结构体里的flag...
2019-02-08 21:44:55 442
ARM DynamIQ The future of multi-core computing.pdf
2018-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人