GNU/Linux >> Belajar Linux >  >> Linux

Apa arti __init dalam kode kernel Linux?

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.


Linux
  1. Linux – Apa yang Disiratkan oleh Tata Letak Memori Kernel Virtual Di Dmesg?

  2. Linux – Apa Arti Errors=continue Mount Option?

  3. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  1. Linux – Bagian Kernel yang Dimiliki Atau Tertutup?

  2. Apa yang dilakukan make oldconfig persis di makefile kernel Linux?

  3. Apa artinya mengatakan kernel linux bersifat preemptive?

  1. Bagaimana kernel Linux menentukan urutan panggilan __init?

  2. Apa sumber kernel Linux saat ini?

  3. Bagaimana jika [[ $? -ne 0 ]]; berarti dalam .ksh