এটি সম্ভব নয় কারণ সিস্টেম কল টেবিল (ডাকা sys_call_table
) একটি স্থির আকারের অ্যারে। এবং এর আকারটি সংকলিত সময়ে নিবন্ধীকৃত সিস্টস্কেলের সংখ্যা দ্বারা নির্ধারিত হয়। এর অর্থ অন্য একের জন্য কোনও স্থান নেই।
আপনি উদাহরণস্বরূপ arch/x86/kernel/syscall_64.c
ফাইলের x86 আর্কিটেকচারের জন্য বাস্তবায়ন পরীক্ষা করতে পারেন , যেখানে sys_call_table
সংজ্ঞায়িত করা হয়েছে। এর আকার হুবহু __NR_syscall_max+1
। হিসাবে __NR_syscall_max
এটি সংজ্ঞায়িত করা হয়েছে (এটি শেষ সিসকলের সংখ্যা), যেখানে সমস্ত সিস্কল সহ একটি টেবিল রয়েছে।arch/x86/kernel/asm-offsets_64.c
sizeof(syscalls) - 1
syscall
এর একটি সম্ভাব্য সমাধান হ'ল কিছু বিদ্যমান (বা আপনার স্থাপত্যের একটি যদি অবহেলিত হয় তবে এটি পুনরায় ব্যবহার করুন sys_setaltroot
) উদাহরণস্বরূপ দেখুন আপনার সাথে থাকা সাইকেল নম্বরটি কারণ এটির জন্য মেমরির আরও স্থান প্রয়োজন হবে না। কিছু আর্কিটেকচারের সিস্টোল টেবিলের মধ্যেও গর্ত থাকতে পারে (x86 এর 64 বিট সংস্করণের মতো) যাতে আপনি এটিও ব্যবহার করতে পারেন।
আপনি যদি নতুন সিস্কেল বিকাশ করে থাকেন এবং পরীক্ষার সময় পুনরায় চালনা এড়াতে চান তবে আপনি এই কৌশলটি ব্যবহার করতে পারেন। আপনাকে আপনার নতুন সিস্টেম কলটি সংজ্ঞায়িত করতে হবে, সিস্কাল টেবিলের বিদ্যমান প্রবেশের সন্ধান করতে হবে এবং তারপরে এটি আপনার মডিউল থেকে প্রতিস্থাপন করতে হবে।
কার্নেল মডিউল থেকে এটি করা তুচ্ছ নয় কারণ কার্নেল ২. 2. sys_call_table
সংস্করণ অনুযায়ী মডিউলগুলিতে রফতানি করে না (সর্বশেষ কার্নেল সংস্করণে এই প্রতীকটি রফতানি হয়েছিল 2.5.41
)।
এটিকে ঘিরে কাজ করার একটি উপায় হ'ল আপনার কার্নেলটি sys_call_table
মডিউলগুলিতে প্রতীক রফতানি করতে পরিবর্তন করা। এটি করতে, আপনাকে নিম্নলিখিত দুটি লাইন যুক্ত করতে হবে kernel/kallsyms.c
( উত্পাদন মেশিনে এটি করবেন না ):
extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);
আর একটি কৌশল হ'ল গতিশীলভাবে সিস্কেল টেবিলটি খুঁজে পাওয়া। আপনি কার্নেল স্মৃতিতে পুনরাবৃত্তি করে প্রতিটি শব্দকে একটি পয়েন্টারের সাথে পরিচিত সিস্টেম কল ফাংশনের সাথে তুলনা করেন। আপনি যেহেতু টেবিলের মধ্যে এই সিস্কলটি জানেন তার অফসেট জানেন, আপনি সারণী শুরুর ঠিকানাটি গণনা করতে পারেন।