__initdata用法例子:
static struct init_tags {
struct tag_header hdr1;
struct tag_core core;
struct tag_header hdr2;
struct tag_mem32 mem;
struct tag_header hdr3;
} init_tags __initdata = {
{ tag_size(tag_core), ATAG_CORE },
{ 1, PAGE_SIZE, 0xff },
{ tag_size(tag_mem32), ATAG_MEM },
{ MEM_SIZE, PHYS_OFFSET },
{ 0, ATAG_NONE }
};
上面“init_tags __initdata = ”中的__initdata是一个宏(定义在include/linux/init.h中):
#define __initdata __attribute__ ((__section__ (".init.data")))
在一个函数中有如下语句:
struct tag *tags = (struct tag *)&init_tags;
******************************************************************************************************
由于4年前对于C语言和Linux的知识贫乏,所以当时对于模块中的函数定义没有细看。这次在温习《LDD3》的时候,重新看了一下关于__init、__initdata和__exit、__exitdata的知识,记录如下:
- PHY: 0:01 - Link is Up - 100/Full
- VFS: Mounted root (nfs filesystem) on device 0:14.
- devtmpfs: mounted
- Freeing init memory: 196K
- INIT: version 2.86 booting
- __init宏使内建模块中的init函数在执行完成后释放掉,不过可装载的模块不受影响。