kernel 中的__read_mostly

read_mostly

使用

//结构体
struct cgroup_subsys memory_cgrp_subsys __read_mostly;
//指针
struct mem_cgroup *root_mem_cgroup __read_mostly;
//数值
int do_swap_account __read_mostly;

作用

会将这些带__read_mostly的变量放入.data…read_mostly这个section中,这个主要在编译的链接阶段起作用,
在链接时会把这些值放在同一个区间块, __read_mostly是在cache.h定义的,猜也能猜出来跟Cache相关了。

kernel-4.14/arch/arm64/include/asm/cache.h

#define __read_mostly __attribute__((__section__(".data..read_mostly")))
/kernel-4.14/include/asm-generic/vmlinux.lds.h

258  #define READ_MOSTLY_DATA(align)						\
259  	. = ALIGN(align);						\
260  	*(.data..read_mostly)						\
261  	. = ALIGN(align);
................

895  #define RW_DATA_SECTION(cacheline, pagealigned, inittask)		\
896  	. = ALIGN(PAGE_SIZE);						\
897  	.data : AT(ADDR(.data) - LOAD_OFFSET) {				\
898  		INIT_TASK_DATA(inittask)				\
899  		NOSAVE_DATA						\
900  		PAGE_ALIGNED_DATA(pagealigned)				\
901  		CACHELINE_ALIGNED_DATA(cacheline)			\
902  		READ_MOSTLY_DATA(cacheline)				\
903  		DATA_DATA						\
904  		CONSTRUCTORS						\
905  	}								\
906  	BUG_TABLE	

kernel-4.14/arch/arm64/kernel/vmlinux.lds.S#193

187 	. = ALIGN(SEGMENT_ALIGN);
188 	__initdata_end = .;
189 	__init_end = .;
190 
191 	_data = .;
192 	_sdata = .;
193 	RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)

也就是把所有的__read_mostly的变量以大小cacheline的size对齐放到同一个区别,这样CPU读写数据时,会把这些__read_mostl的变量先放到Cache中,会增加Cache hit的概率,使整个系统的性能增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值