Ini menunjukkan fitur kernel 2.2 dan yang lebih baru. Perhatikan perubahan definisi dari init
dan cleanup
fungsi. __init
makro menyebabkan init
fungsi untuk dibuang dan memorinya dibebaskan setelah init
fungsi selesai untuk driver bawaan, tetapi bukan modul yang dapat dimuat. Jika Anda memikirkan kapan init
fungsi dipanggil, ini sangat masuk akal.
sumber
include/linux/init.h
/* These macros are used to mark some functions or
* initialized data (doesn't apply to uninitialized data)
* as `initialization' functions. The kernel can take this
* as hint that the function is used only during the initialization
* phase and free up used memory resources after
*
* Usage:
* For functions:
*
* You should add __init immediately before the function name, like:
*
* static void __init initme(int x, int y)
* {
* extern int z; z = x * y;
* }
*
* If the function has a prototype somewhere, you can also add
* __init between closing brace of the prototype and semicolon:
*
* extern int initialize_foobar_device(int, int, int) __init;
*
* 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 const char linux_logo[] __initconst = { 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.
*
* Also note, that this data cannot be "const".
*/
/* These are for everybody (although not all archs will actually
discard it in modules) */
#define __init __section(.init.text) __cold notrace
#define __initdata __section(.init.data)
#define __initconst __section(.init.rodata)
#define __exitdata __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)
Ini hanyalah makro untuk menemukan beberapa bagian dari kode linux ke dalam area khusus dalam biner eksekusi akhir.__init
, misalnya (atau lebih baik __attribute__ ((__section__
(".init.text")))
makro ini diperluas ke) menginstruksikan kompiler untuk menandai fungsi ini dengan cara khusus. Pada akhirnya penaut mengumpulkan semua fungsi dengan tanda ini di akhir (atau awal) file biner.
Saat kernel dimulai, kode ini hanya berjalan sekali (inisialisasi). Setelah dijalankan, kernel dapat membebaskan memori ini untuk digunakan kembali dan Anda akan melihat pesan kernel:
Membebaskan memori kernel yang tidak terpakai:108k dibebaskan
Untuk menggunakan fitur ini, Anda memerlukan file skrip penaut khusus, yang memberi tahu penaut di mana menemukan semua fungsi yang ditandai.