13 Roland_Sun

尚未进行身份认证

我要认证

职业旅程:Engineer->Senior Engineer->QA Manager->Project Manager->Senior Staff Engineer

等级
TA的排名 9k+

ARM架构下常用GNU汇编程序伪指令介绍(Assembler Directive)

所有的GNU汇编程序伪指令都以句号(.)打头,后面接上伪指令的名字,通常是由小写字母组成。.section.subsection.pushsection.popsection.previous.ascii语法: .ascii "string"....ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“\0”字符)中的字符放在连续的地址单元。还有一个与.ascii 类似的.asciz,z ...

2020-07-31 09:41:38

Linux内核同步原语之信号量(Semaphore)

static inline int __sched __down_common(struct semaphore *sem, long state, long timeout){ struct semaphore_waiter waiter; list_add_tail(&waiter.list, &sem->wait_list); waiter.task = current; waiter.up = false; for (;;) { if...

2020-07-28 20:06:14

Linux同步原语之顺序锁(Sequence Lock)

(代码位于arch/arm64/include/asm/atomic.h中):#define ATOMIC_OP(op) \static inline void arch_##op(int i, atomic_t *v) \{ \ __lse_ll_sc_body(op, i, v); \}ATOMIC_OP(atomic_andnot)ATOMIC_OP(atomic_or)ATOMIC_OP(atomic_xor)ATOM...

2020-07-22 11:39:08

ARMv8.1平台下新添加原子操作指令

Large System Extensions (LSE)New atomic instructions to support scalable performance: Instructions for full-word, half-word, and byte operations are available. Most of the following have optional load-acquire and/or store-release semantics. Compare an

2020-07-24 08:01:04

Linux内核同步原语之原子操作(Atomic)

原子操作

2020-07-03 21:01:37

Arm64内存屏障

smp_load_acquire()forces a read of a location in memory (in much the same way asACCESS_ONCE()), but it ensures that the read happens before any subsequent reads or writes. smp_store_release()writes a value back to memory, ensuring that the write h...

2020-07-20 17:13:09

ARM64平台下WFE和SEV相关指令解析

WFEWait For Event.If the Event Register is not set,WFEsuspends execution until one of the following events occurs:An IRQ interrupt, unless masked by the CPSR I-bit. An FIQ interrupt, unless masked by the CPSR F-bit. An Imprecise Data abort, unles..

2020-07-20 09:13:09

Linux内核中的READ_ONCE和WRITE_ONCE宏

#define __READ_ONCE(x, check) \({ \ union { typeof(x) __val; char __c[1]; } __u; \ if (check) \ __read_once_size(&(x), __u.__c, sizeof(x)); \ else \ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ smp...

2020-07-16 09:08:46

Linux内核同步原语之自旋锁(Spin Lock)

在Linux内核代码中,大量使用了自旋锁。自旋锁不会让

2020-07-02 15:50:40

内存屏障简介

为了限制性能下降,CPU被设计成在从内存中获取数据的同时,可以执行其他指令和内存引用。这明显会导致指令和内存引用乱序执行,并导致严重的混乱仅仅在两个CPU之间或者CPU与设备之间存在需要交互的可能性时,才需要内存屏障。任何代码只要能够保证没有这样的交互,这样代码就不必使用内存屏障。但是,不使用内存屏障不代表不使用同步机制。重排序问题无时无刻不在发生,源自三种场景:编译器编译时的优化 处理器执行时的乱序优化 缓存同步顺序(导致可见性问题)...

2020-06-22 15:34:57

Linux时间子系统之Tick广播层(Tick Broadcast)

test reserve

2020-06-05 18:19:59

Linux时间子系统之Tick模拟层(Tick Sched)

在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,struct tick_sched { struct hrtimer sched_timer; unsigned long check_clocks; enum tick_nohz_mode nohz_mode; unsigned int inidle : 1; unsigned int tick_stopped : 1; unsigned int idle_active : 1; unsigned

2020-06-04 14:29:59

Linux时间子系统之高分辨率定时器层(HR Timer)

在前面介绍定时器层的文章中我们已经知道了在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足,最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000Hz之间。但是,原有的定时器层由于实现教早,应用广泛,如果完全替换掉会引入大量代码改动。因此,Linux内核又独立设计出了一个叫高精度定时器层(High Resolution Timer)的框架,可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求

2020-05-26 16:19:35

Linux时间子系统之时间维护层(Time Keeper)

struct timekeeper { struct tk_read_base tkr_mono; struct tk_read_base tkr_raw; u64 xtime_sec; unsigned long ktime_sec; struct timespec64 wall_to_monotonic; ktime_t offs_real; ktime_t of...

2020-05-19 15:14:56

Linux时间子系统之时间的表示

为了实现以上功能,Linux 实现了多种与时间相关但用于不同目的的数据结构。1)jiffies和jiffies_64内核用jiffies_64全局变量记录系统自启动以来经过了多少次Tick。它的声明如下(代码位于kernel/time/timer.c中):__visible u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES;EXPORT_SYMBOL(jiffies_64);可以看出来jiffies_64被定义成了6

2020-05-11 14:56:46

Linux时间子系统之定时器层(Timer)

定时器层是基于Tick层之上的,精度比较低,struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct hlist_node entry; unsigned long expires; void (...

2020-05-08 16:13:33

Linux时间子系统之时钟源层(Clock Source)

struct clocksource { u64 (*read)(struct clocksource *cs); u64 mask; u32 mult; u32 shift; u64 max_idle_ns; u32 maxadj;#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA struct arch_clocksource_data archda...

2020-04-26 17:58:55

Linux时间子系统之Tick层

所谓Tick设备,也称作滴答设备,就Tick设备在Linux时间子系统中用tick_device结构体表示(代码位于kernel/time/tick-sched.h中):struct tick_device { struct clock_event_device *evtdev; enum tick_device_mode mode;};可以看出来,它仅仅是对定时事件设备(Cl...

2020-04-23 20:08:58

Linux时间子系统之定时事件层(Clock Events)

几乎所有的计算机系统中都会存在一个所谓的定时设备,经过设置后,在某个固定的时间或某个相对的时间间隔后,达到触发条件,发送中断给处理器。系统中的每一种实际的定时事件设备都由一个叫做clock_event_device的结构体变量表示(代码位于include/linux/clockchips.h):struct clock_event_device { void (*event_han...

2020-04-21 17:51:18

Arm通用计时器简介

所有使用Arm处理器的系统中都会包含一个标准化的通用计时器(Generic Timer)框架。这个通用计时器系统提供了一个系统计数器(System Counter)和一组计时器(Timer)。其结构如下图:可以看到,系统计数器是全局唯一的,并且全局共享。而且这个系统计数器还是一直存在的,哪怕系统处于待机状态,所有内核都被关闭了,它仍然可以工作。每一个Arm核都配备一组专门为自己服务的计时器...

2020-04-16 18:03:59

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。