Skip to contentSkip to conversation

initialize data not at file scope - WTF?

DISCUSSION Ian Pilcher 2 participants 2 messages Jan 12, 2004

lore
Share & tools
lore
#0 lore raw

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!

Signature · 3 lines
========================================================================
Ian Pilcher                                        [email protected]
========================================================================
#1 lore raw
Quoted 9 lines · Ian Pilcher

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, ... };
Quoted 8 lines

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.