الوحدات النمطية / البناء / صنع / اختبار / POC / بروفة / ملاحظات / إخلاء / ترخيص / كتب / روابط
صندوق رمل وحدة Linux kernel (LKM) عبارة عن مجموعة من الوحدات المختلفة للتعلم واكتشاف وتجربة تطوير وحدات Kernel Linux. الغرض من هذا المستودع هو أيضًا ممارسة التطوير داخل Kernel Linux ودراسة مفاهيم متنوعة قبل الانتقال إلى تقديم التصحيح الأول إلى kernel.
توضح معظم الوحدات مفهومًا واحدًا وإظهار كيفية استخدام API kernel. يجمع عدد قليل من الوحدات النمطية أكثر من مفهوم واحد لتقديم كيفية عمل المفاهيم معًا. على سبيل المثال ، تقوم الوحدة LKM_Device بالوصول إلى جهاز حرف وتخزين رقمها الرئيسي في /Proc. أو الوحدة النمطية LKM_MEM تعرض معلومات الذاكرة /المبادلة بواسطة الملفات في /proc أيضًا.
آمل أن يكون ذلك ذا قيمة للمطورين الآخرين الذين يحاولون التعامل مع kernel Linux.
| لا. | الوحدة النمطية | مصدر | وصف |
|---|---|---|---|
| 1 | LKM Debugfs | lkm_debugfs.c | الوحدة التي توضح كيفية استخدام تصحيح الأخطاء DebuGFs |
| 2 | جهاز LKM | lkm_device.c | وحدة توضح كيفية العمل مع أجهزة الأحرف وتخزين معلومات الجهاز في /proc |
| 3 | أرقام أجهزة LKM | lkm_device_numbers.c | توضيح أرقام الأجهزة المخصصة بشكل ثابت وديناميكي |
| 3 | ذاكرة LKM | LKM_MEM.C | وحدة تعريض الذاكرة ومبادلة المعلومات إلى /proc |
| 4 | جهاز قائم على الذاكرة LKM | LKM_MEV.C | برنامج تشغيل لجهاز الأحرف المستند إلى الذاكرة ، والذي يعتمد على حد ما على Scull ، تم تطويره في برامج تشغيل أجهزة Linux للكتاب ، الفصل 3 |
| 5 | معلمات LKM | lkm_parameters.c | وحدة لتمرير المعلمات من المستخدم إلى kernelspace |
| 6 | LKM جميلة printk | LKM_PP.C | وحدة لاختبار تكامل Pretty-Printk |
| 7 | LKM بروك | LKM_PROC.C | الوحدة النمطية للوصول /نظام ملفات PROC باستخدام I /O متسلسل |
| 8 | عملية LKM | LKM_PROCESS.C | الوصول إلى وطباعة معلومات العملية الحالية |
| 9 | LKM Sandbox | lkm_sandbox.c | وحدة صندوق الرمل لتجارب مختلفة |
| 10 | الهيكل العظمي LKM | LKM_SKELETON.C | وحدة الهيكل العظمي لسقالات أسرع من وحدات جديدة |
عند الاستنساخ لأول مرة ، يرجى استنساخ أيضًا عارضات فرعية مع --recurse-submodules للحصول على printk جميلة أيضًا.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
لتشغيل جميع الاختبارات المتاحة ، بما في ذلك التحميل/التفريغ الأساسي وجميع اختبارات المفاهيم الإضافية ..
make testالاختبار عن طريق التحميل وتفريغ وإخراج المخزن المؤقت حلقة kernel (سيطلب Sudo أذونات الجذر).
make test-module name= < module-name > اختبارات إضافية لجهاز Sandbox بما في ذلك وحدة التحميل ، وجمع رقم الجهاز الرئيسي من /proc ، وإنشاء الجهاز ومقارنة الرسالة النهائية إما قم بتشغيل هدف Makefile مع make test-device أو تشغيل الأوامر التالية.
لإنشاء جهاز حرف ، هناك حاجة إلى الرقم الرئيسي ويمكن الحصول عليه عن طريق Catting الملف /proc /lkm_device_major. هذا الرقم الرئيسي مكتوب إلى المخزن المؤقت حلقة kernel كذلك. من الممكن توفير هذا الرقم الرئيسي باستخدام معلمة الوحدة النمطية param_major_num وتحميل هذه الوحدة مثل sudo insmod lkm_device.ko param_major_num=241 (في هذه اللحظة يبدو أن التخصيص الثابت لا يمكن أن يكون موثوقًا به.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device اختبارات إضافية للوصول إلى صندوق الرمل إلى /proc بما في ذلك وحدة التحميل ، واختبار الملف إذا كان الملف داخل /proc موجودًا وإخراج هذا الملف. إما تشغيل اختبار Target-Target-proc مع make test-proc أو الأوامر القليلة التالية:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc للاختبارات الإضافية لتمرير المعلمات إلى الوحدة النمطية LKM_Parameters ، قم بتشغيل المعلمات الهدف Makefile مع make test-parameters . سيؤدي ذلك إلى تحميل/إلغاء تحميل الوحدة النمطية ومقارنة رقم المعلمات والرسالة التي تم تمريرها عند تحميل الوحدة النمطية مع القيم قراءة في نظام ملفات/sys (/sys/module/lkm_parameters/parameters/*). أو تشغيل الأوامر التالية.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersأثناء التثليث وتصحيح الأخطاء والعمل مع الأخطاء والمشكلات ، يمكن أن يكون مفيدًا لتجربة بعض التعليمات البرمجية وكتابة POC لإثبات بعض العبارات أو الإجابة على سؤال. في ما يلي مجموعة من مثل هذه POC التي تتابع تقدمًا إلى إثبات البيانات والأفكار والأسئلة التي صادفتها مؤخرًا.
| ملف | وصف | تحفيز |
|---|---|---|
| مقارنة iopl-ioperm.c | مقارنة أذونات الإدخال/الإخراج الممنوحة من قبل IOPL و ioperm | BUG 205317 - IOPL (2) - يتم تعيين مستوى الامتياز لكل عملية أو لكل تراكم؟ |
| أذونات revisited.c | كيف يتم منح أذونات I/O عند استخدام استنساخ أو شوكة أو execve أو pthread؟ | BUG 205317 - IOPL (2) - يتم تعيين مستوى الامتياز لكل عملية أو لكل تراكم؟ |
لفهم أفضل للمفاهيم في مساحة Kernelspace ، من الضروري مراجعة الأساسيات الأساسية لـ C والمكتبة القياسية. بجانب القدرة على تحسين الفهم ، من الممكن مقارنة الأساليب. معظم هذه الأساسيات منخفضة المستوى ، بدءًا من ملف الإدخال/الإخراج ويمكن النظر إليه كمصدر مصاحب. ليس من السيئ أبدًا التدريب على الأشياء ، ولكن في بعض الأحيان محرجة بعض الشيء للاعتراف بالاضطرار إلى التدرب على مثل هذه الأشياء :)
| ملف | مفهوم |
|---|---|
| clone.c | عمليات الاستنساخ مع استنساخ () |
| execve.c | تنفيذ عملية أخرى مع execve () |
| فورك | خلق عملية الطفل مع Fork () |
| io_ports.c | عمليات الإدخال/الإخراج المنفذة ذات المستوى المنخفض |
| قراءة | قراءة الملفات في الفانيليا ج |
| Simple_circular_buffer.c | البسيط والمستقيم للأمام المخزن المؤقت |
| الكتابة | الكتابة/الإلحاق بالملفات في الفانيليا ج |
لإنشاء هذه الملفات ، قم فقط بتشغيل make clean && make ./rehearsals/
"وحدة Linux kernel هي قطعة من الكود الثنائي المترجم يتم إدراجها مباشرة في نواة Linux ، التي تعمل في الحلقة 0 ، وهي حلقة تنفيذ أدنى وأقل حماية في معالج x86–64."
"يمكن تجاهل نماذج تطوير التطبيقات التقليدية إلى حد كبير. بخلاف تحميل وتفريغ الوحدة النمطية الخاصة بك ، ستكتب رمزًا يستجيب لأحداث النظام بدلاً من العمل في نمط متسلسل."
"مع تطوير kernel ، أنت تكتب واجهات برمجة التطبيقات ، وليس التطبيقات نفسها."
سيطلب منك هذا المستودع إذنًا من الجذر ، لأن عمليات معينة مثل التحميل/التفريغ والوصول إلى الملفات في نظام Linux/GNU تعتمد على امتيازات الجذر. سوف يذكر Makefile مسبقًا لما سيتم استخدام هذه الأذونات.
يمكنك مراجعة كل هذه العمليات من خلال البحث في هذا المستودع عن Sudo وتأكد من إساءة استخدام هذا بأي شكل من الأشكال. أنا على دراية بأن هذه يمكن أن تكون مشكلة أمنية ، لكنني أحاول جعل هذه العملية أكثر شفافة قدر الإمكان. ولكن كن على دراية أيضًا بأن هذه الوحدات قادمة دون أي ضمان. يمكن أن يحدث ذعر kernel وفقدان البيانات ، يرجى استخدامها ويفضل أن يكون داخل جهاز افتراضي.
في ما يلي جدول مع جميع المواقع التي يتم فيها استخدام sudo (باستثناء readMe.MD).
grep -n -r " sudo " *| ملف: السطر | استخدام سودو |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (eval number_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | sudo rmmod $ (module_filename) |
| Makefile: 140 | sudo mknod $ (device_filename) c cat $(proc_filename) 0 |
| Makefile: 143 | sudo rm $ (device_filename) |
| Makefile: 144 | sudo rmmod $ (module_filename) |
| Makefile: 162 | sudo rmmod $ (module_filename) |
| Makefile: 175 | sudo mknod |
| Makefile: 176 | Echo "اختبار" | sudo tee $ (device_file) |
| Makefile: 178 | sudo rm -fv $ (device_file) |
| Makefile: 179 | sudo rmmod $ (وحدة) |
| Makefile: 190 | sudo insmod |
| Makefile: 193 | sudo rmmod $ (وحدة) |
| Makefile: 207 | sudo rmmod $ {module} |
| Makefile: 219 | sudo insmod $ (الوحدة النمطية). كو |
| Makefile: 222 | sudo rmmod $ (وحدة) |
| tests.mk:31 | lsmod | awk '{print $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| tests.mk:75 | sudo dmesg -lear |
| tests.mk:78 | sudo rmmod $ (1) |
LKM Sandbox عبارة عن برنامج مجاني: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط ترخيص GNU General Public كما تم نشره بواسطة مؤسسة البرمجيات المجانية ، إما الإصدار 2 من الترخيص ، أو (في خيارك) أي إصدار لاحق.
يتم توزيع صندوق LKM Sandbox على أمل أن يكون مفيدًا ، ولكن بدون أي ضمان ؛ بدون حتى الضمان الضمني للتسويق أو اللياقة لغرض معين. راجع رخصة GNU العامة لمزيد من التفاصيل.
يجب أن تكون قد تلقيت نسخة من رخصة GNU العامة مع LKM Sandbox. إذا لم يكن كذلك ، راجع https://www.gnu.org/licenses/.