Re: initialize data not at file scope - WTF?

From: Richard B. Johnson
Date: Mon Jan 12 2004 - 16:55:34 EST


On Mon, 12 Jan 2004, Ian Pilcher wrote:

> In include/linux/init.h, it says:
>
> For initialized data:
> You should insert __initdata between the variable name and equal
> sign followed by value, e.g.:
>
> static int init_variable __initdata = 0;
> static char linux_logo[] __initdata = { 0x32, 0x36, ... };
>
> Don't forget to initialize data not at file scope, i.e. within a
> function, as gcc otherwise puts the data into the bss section and not
> into the init section.
>
> Does this mean that __initdata can't be used for file scope variables,
> that it can only be used for file scope variables, or something else?
>
> Thanks!

Data, not at file-scope, means data like this:

int foo()
{
static int bar = 0;
}

Bar is private to function foo(). It does not have file-scope.
However, it is static and therefore is expected to persist over
multiple calls to foo. It, therefore, does not exist on the
stack as local data. Instead, it is normally put in ".bss" or
".data" depending upon initialization.

If you want this data to go away after initialization, you
declare it as:

static int bar __initdata = 0;;

Any data you want to go away after initialization, including
file-scope data, can get the __initdata attribute. FYI, this
puts the data in a special segment that gets freed after
initialization. The idea is to save RAM.

Cheers,
Dick Johnson
Penguin : Linux version 2.4.24 on an i686 machine (797.90 BogoMips).
Note 96.31% of all statistics are fiction.


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/