লিনাক্স কার্নেল কোডটিতে __init এর অর্থ কী?


91

লিনাক্স কার্নেল উত্স কোডে আমি এই ফাংশনটি পেয়েছি:

static int __init clk_disable_unused(void) 
{
   // some code
}

এখানে আমি কী বোঝাতে চাইছি তা বুঝতে পারি না __init

উত্তর:


76

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)

55

চূড়ান্ত নির্বাহকারী বাইনারিগুলিতে লিনাক্স কোডের কিছু অংশ বিশেষ ক্ষেত্রগুলিতে সনাক্ত করার জন্য এগুলি কেবল ম্যাক্রো। __initউদাহরণস্বরূপ, (বা আরও ভাল __attribute__ ((__section__ (".init.text")))এই ম্যাক্রো প্রসারিত হয়) এই ফাংশনটিকে একটি বিশেষ উপায়ে চিহ্নিত করতে সংকলককে নির্দেশ দেয়। শেষে লিঙ্কারটি বাইনারি ফাইলের শেষে (বা শুরু) এই চিহ্ন সহ সমস্ত ফাংশন সংগ্রহ করে।

যখন কার্নেলটি শুরু হয়, এই কোডটি কেবল একবার চালিত হয় (আরম্ভ)। এটি চালানোর পরে, কার্নেল এটিকে পুনরায় ব্যবহার করতে এই মেমরিটি মুক্ত করতে পারে এবং আপনি কার্নেল বার্তাটি দেখতে পাবেন:

অব্যবহৃত কার্নেল মেমরি নিখরচায়: 108 কে মুক্তি দেওয়া হয়েছে

এই বৈশিষ্ট্যটি ব্যবহার করতে, আপনার একটি বিশেষ লিঙ্কার স্ক্রিপ্ট ফাইল দরকার যা লিঙ্কারকে সমস্ত চিহ্নিত ফাংশনগুলি কোথায় সনাক্ত করতে পারে তা বলে।


11
চালাক! সুতরাং "অব্যবহৃত কার্নেল মেমরি: 108 কে মুক্তি" এর অর্থ এটিই। :-) আমি এত বছর অবাক হয়েছি। আমি ধরে নিয়েছিলাম এটি কোনও ধরণের বাফার বা কিছু, কোড নয়।
অধ্যাপক ফ্যালকেন

6

এটি কার্নেল ২.২ এবং তার পরবর্তী বৈশিষ্ট্য প্রদর্শন করে। সংজ্ঞা পরিবর্তন লক্ষ্য করুন initএবং cleanupফাংশন। __initম্যাক্রো ঘটায় initফাংশন পরিত্যাগ করা ও তার স্মৃতি একবার মুক্ত initবিল্ট-ইন ড্রাইভার, কিন্তু না লোডযোগ্য মডিউল জন্য ফাংশন শেষ। আপনি যদি initফাংশনটি চালু হওয়ার বিষয়ে চিন্তা করেন , এটি সঠিক ধারণা দেয়।

সূত্র


5

__init একটি ম্যাক্রো যা ./incolve/linux/init.h এ সংজ্ঞায়িত হয় যা প্রসারিত হয় __attribute__ ((__section__(".init.text")))

এটি এই ফাংশনটিকে একটি বিশেষ উপায়ে চিহ্নিত করতে সংকলককে নির্দেশ দেয়। শেষে লিঙ্কারটি বাইনারি ফাইলের শেষে (বা শুরু) এই চিহ্ন সহ সমস্ত ফাংশন সংগ্রহ করে। যখন কার্নেলটি শুরু হয়, এই কোডটি কেবল একবার চালিত হয় (আরম্ভ)। এটি চালানোর পরে, কার্নেল এটিকে পুনরায় ব্যবহার করতে এই মেমরিটি মুক্ত করতে পারে এবং আপনি কার্নেলটি দেখতে পাবেন


3

মন্তব্য (এবং একই সাথে ডকস) লিনাক্স / init.h এ পড়ুন

আপনার আরও জানা উচিত যে লিনাক্স কার্নেল কোডের জন্য জিসিসি-র কিছু এক্সটেনশন রয়েছে এবং দেখে মনে হচ্ছে এই ম্যাক্রো তাদের মধ্যে একটি ব্যবহার করে।


1

যখন আপনি কার্নেলের মধ্যে একটি লিনাক্স কার্নেল মডিউল সংকলন এবং সন্নিবেশ করান তখন প্রথম ফাংশনটি নির্ধারিত হয় __init.This ফাংশনটি মূলত ডিভাইস ড্রাইভার ইত্যাদি রেজিস্ট্রেশন ইত্যাদির মতো প্রধান ক্রিয়াকলাপ সম্পাদন করার আগে আরম্ভ করার জন্য ব্যবহৃত হয়, বিপরীত প্রভাবের সাথে আরও একটি ফাংশন রয়েছে আপনি যখন কার্নেল মডিউলটি মুছে ফেলেন তখন কিছু নিবন্ধিত ডিভাইস বা অনুরূপ কোনও ফাংশন মুছে ফেলার জন্য ব্যবহৃত হয় __স্থানীয় প্রস্থান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.