variable attributes:
• aligned
• deprecated
• mode
• nocommon
• packed
• section
• transparent_union
• unused
• vector_size
• weak
section ("section-name")'
extern void foobar (void) __attribute__ ((section ("bar")));
puts the function 『foobar' in the 『bar' section.
example:
#define subsys_initcall(fn) __define_initcall("4",fn,4)
//用來將指定的函數pointer fn放到initcall.init section
//是把fn放到.initcall.init的section.initcall4.init
initcall4.init defined in arch/i386/kernel/vmlinux.lds.S
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET)
{
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
2. likely and unlikely
in include/linux/compiler.h
#define __builtin_expect(x, expected_value) (x)
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
example:
if(likely(value))
{
}
else
{
}
//看起來likely和unlikely是一樣的, 但事實上是有差異的
//likely表示value的值為true的可能性更大一些,那麼執行if的機會大;
//unlikely表示value的值為false的可能性大一些,執行else機會大一些。
//有了這種修飾,gcc編成組語後,
//會將likely使得if後面的執行語句緊跟著前面的;
//unlikely使得else後面的語句緊跟著前面的程序
//這樣就會可以讓cache預先讀取,
//目的是增加程序的執行速度