سؤال

هل من الممكن تجميع نواة لينكس (2.6) وحدة التي تتضمن وظائف محددة من غير نواة تشمل؟

وعلى سبيل المثال:


وkernelmodule.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...

وماكيفيلي

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order

وحدة النواة كنت قد كتبت وتحاول تجميع يحتوي على وظائف وجدت في عدد من الملفات تشمل بينسل.

وماكيفيلي القياسية الواردة أعلاه لا يسمح يتضمن خارج رؤوس لينكس. هل من الممكن أن تشمل هذه الوظيفة، وإذا كان الأمر كذلك، فأرجو أن لي نقطة في الاتجاه الصحيح.

وشكرا، مايك

هل كانت مفيدة؟

المحلول

والنواة لا يمكن استخدام كود مساحة المستخدم ويجب أن تقف وحدها (أي أن تماما بذاته، لا مكتبات)، وبالتالي فإنه لا تلتقط رؤوس القياسية.

وليس من الواضح ما فائدة محاولة لالتقاط رؤوس مساحة المستخدم و. إذا كانت هناك أشياء في هناك أنه سيكون من صالح لاستخدام (الثوابت، وربما تقدم بعض وحدات الماكرو التي لا تستدعي أية وظائف مساحة المستخدم)، ثم قد يكون من الأفضل لتكرار لهم وتشمل أجزاء فقط متوافقة النواة التي تحتاج إليها.

وليس من الممكن لربط النواة مع المكتبات مصممة للاستخدام مساحة المستخدم - حتى لو كانوا لا تجعل أي مكالمات OS - لأن البيئة ربط في النواة لا يمكن أن يلتقطها

وبدلا من ذلك، إعادة ترجمة أية وظائف لاستخدامها في النواة (على افتراض أنها لا تجعل أي نظام تشغيل أو مكتبة المكالمات - على سبيل المثال malloc - في هذه الحالة سوف تحتاج إلى تعديل على أي حال). دمجها في مكتبتك الخاصة لاستخدامها في وحدات النواة.


والإصدارات الأخيرة من لينكس تحتوي على وظائف التشفير على أي حال، بما في ذلك مختلف SHA تجزئات - ربما يمكنك استخدام واحدة من تلك بدلا من ذلك


وهناك فكرة أخرى تتمثل في وقف تحاول أن تفعل التشفير في نواة الفضاء ونقل الرمز إلى مساحة المستخدم. كود مساحة المستخدم هو أسهل في الكتابة / تصحيح / الحفاظ على غيرها.

نصائح أخرى

ولقد اتخذت بت من التعليمات البرمجية مساحة المستخدم الذي كتبته وتحويلها للعمل في الفضاء النواة (أي باستخدام kmalloc ()، وما إلى ذلك)، فإنه ليس من الصعب. ومع ذلك، تقتصر على فهم نواة للC، وليس مساحة المستخدم، والذي يختلف قليلا .. لا سيما مع مختلف أنواع كثافة العمليات القياسية.

ومجرد ربط ضد الفضاء المستخدم DSO ليس من الممكن - نواة لينكس هي متجانسة، يتضمن تماما النفس. لا يستخدم LIBC مساحة المستخدم والمكتبات أو أجزاء أخرى كما ذكر آخرون.

و9/10 مرات، وسوف تجد ما تحتاجه <م> مكان في النواة. فمن المحتمل جدا أن شخصا آخر واجهت نفس يحتاج لديك، وكتب بعض وظائف ثابتة في بعض وحدة لتفعل ما تريد .. فقط انتزاع تلك وإعادة استخدامها.

في حالة التشفير، كما قال آخرون، ومجرد استخدام ما هو في النواة. شيء واحد أن نلاحظ، ستحتاج لهم أن يدعم ال kconfig التي قد تكون أو لا يحدث اعتمادا على ما يختار المستخدم عند بنائه. لذلك، احترس من تبعيات وتكون واضحة، قد تضطر إلى الإختراق بعض الإدخالات في kconfig التي تختار أيضا API التشفير التي تريدها عند تحديد الوحدة النمطية الخاص بك. يمكن القيام بذلك يكون قليلا من الألم عند بناء من شجرة.

وحتى من ناحية لدينا "مجرد نسخ وإعادة تسمية الاشياء مع إضافة سخام العام"، من جهة أخرى كان لديك "نقول للناس ما يجب أن يكون مصدر نواة الكامل". انها واحدة من المراوغات التي تأتي مع نواة متجانسة.

ومع النوية، كل شيء تقريبا يعمل في مساحة المستخدم، فلا تقلق ربط ضد DSO لبعض السائق ... انها قضية غير. من فضلك لا تأخذ هذا البيان بمثابة اشارة لإعادة بدء فلسفة التصميم نواة في تصريحات، وهذا ليس في نطاق هذه المسألة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top