2013-08-28 7 views
6

जब हम बिल्ली 'proc/kallsyms' या 'system.map' हम इस__ksymtab क्या है? लिनक्स कर्नेल में

.... 
c033718c T nf_hook_slow 
c04ca284 r __ksymtab_nf_hook_slow 
c04ca28c r __ksymtab_nf_hooks 
c04d24a0 r __kcrctab_nf_hook_slow 
c04d24a4 r __kcrctab_nf_hooks 
c04e9122 r __kstrtab_nf_hook_slow 
c04e9179 r __kstrtab_nf_hooks 
c054d854 D nf_hooks 
c0571ca0 d nf_hook_mutex 
.... 
  1. क्या टी, आर, डी का अर्थ है जैसे प्रतीकों, घ सामान मिल सकता है?
  2. मैं कर्नेल स्रोत में प्रतीकों को EXPORT_SYMBOL (...) के रूप में पा सकता हूं लेकिन अन्य लोग __ksymtab ... या __kstrtab के साथ उपसर्ग कर रहे हैं ... ये क्या हैं?
  3. क्या संभव है कि System.map में प्रतीकों हैं लेकिन/proc/kallsyms में शामिल हैं? (माना जाता है कि कर्नेल ठीक से संकलित किया गया है)
  4. मेरे पास नेटफिल्टर सक्षम लिनक्स कर्नेल है लेकिन मुझे प्रतीक 'nf_hooks' नहीं मिला है लेकिन '__ksymtab_nf_hook' है। __ksymtab_nf_hook का उपयोग कर nf_hooks का पता पाने का कोई तरीका है?
  5. मैं अपने लिनक्स स्रोत कोड EXPORT_SYMBOL (nf_hook) में देखता हूं लेकिन अगर मैं 'बिल्ली/proc/kallsyms' करता हूं तो मैं इसे नहीं ढूंढ सकता। क्या इसके लिए कुछ सामान्य कारण है?

अग्रिम धन्यवाद।

उत्तर

7
  1. प्रारूप output of nm utility के समान है, यह भी this page देखते हैं।

    इसे सरल रखने के लिए, 'टी' आमतौर पर एक वैश्विक (गैर स्थैतिक लेकिन आवश्यक रूप से निर्यात नहीं किया गया) फ़ंक्शन 'टी' - संकलन इकाई (यानी स्थैतिक), 'डी' - स्थानीय डेटा, 'डी' - संकलन इकाई के लिए स्थानीय डेटा। 'आर' और 'आर' - 'डी'/'डी' के समान लेकिन केवल पढ़ने के लिए डेटा के लिए।

  2. ये प्रतीकों को निर्यात करने के लिए आवश्यक विशेष वर्गों के आइटम हैं ताकि प्रतीक कर्नेल मॉड्यूल द्वारा उपयोग किए जा सकें।

    प्रत्येक निर्यात प्रतीक के लिए, अल कम से कम निम्नलिखित EXPORT_SYMBOL() द्वारा परिभाषित किया गया है:

    • __kstrtab_<symbol_name> - एक स्ट्रिंग
    • __ksymtab_<symbol_name> के रूप में प्रतीक के नाम - प्रतीक के बारे में जानकारी के साथ एक संरचना: उसका पता, __kstrtab_<symbol_name>, आदि
    • __kcrctab_<symbol_name> - प्रतीक के नियंत्रण योग (सीआरसी) का पता - उदाहरण के लिए, यह जांचने के लिए किया जाता है कि कर्नेल या मॉड्यूल एक दिए गए कर्नेल द्वारा आवश्यक एक ही प्रतीक प्रदान करता है या नहीं मॉड्यूल। यदि किसी मॉड्यूल को दिए गए नाम और सीआरसी के साथ एक प्रतीक की आवश्यकता होती है और कर्नेल उस नाम के साथ एक प्रतीक प्रदान करता है लेकिन एक अलग सीआरसी (उदाहरण के लिए यदि मॉड्यूल को एक अलग कर्नेल संस्करण के लिए संकलित किया गया था), मॉड्यूल लोडर उस कर्नेल मॉड्यूल को लोड करने से इंकार कर देगा (जब तक यह जांच अक्षम नहीं होती है)।

    जानकारी के लिए linux/export.h में EXPORT_SYMBOL() मैक्रो के क्रियान्वयन पर एक नजर डालें।

  3. सुनिश्चित नहीं है, लेकिन जब तक कोई फ़ंक्शन ("टेक्स्ट प्रतीक") या एक चर ("डेटा प्रतीक") System.map में मौजूद नहीं था, लेकिन/proc/kallsyms में नहीं दिखाया गया है, तब तक मुझे कोई स्थिति नहीं मिली है कर्नेल को ठीक से संकलित किया गया है और कॉलम पूरी तरह से सक्षम है (CONFIG_KALLSYMS = y, CONFIG_KALLSYMS_ALL = y)। यदि CONFIG_KALLSYMS_ALL = n, केवल फ़ंक्शंस (सटीक होने के लिए, * .text सेक्शन के प्रतीक) को/proc/kallsyms में दिखाया जाएगा।

  4. आपके कर्नेल संस्करण पर निर्भर करता है। आप अपने कर्नेल के लिए EXPORT_SYMBOL() की परिभाषा को देख सकते हैं और यह पता लगा सकते हैं कि __ksymtab_<symbol_name> चर किस प्रकार हैं। कर्नेल 3.11 में, यह struct kernel_symbollinux/export.h में परिभाषित है। उस संरचना और उसके पते की परिभाषा होने पर, मुझे लगता है कि आप प्रतीक का पता प्राप्त कर सकते हैं: struct kernel_symbol::value। यद्यपि यह खुद कोशिश नहीं की है।

    नोट, हालांकि, __ksymtab_nf_hooknf_hook के लिए है लेकिन nf_hooks के लिए नहीं है। नाम मेल खाना चाहिए। nf_hooks और nf_hook विभिन्न संस्थाएं हैं।

  5. कोड और/proc/kallsyms के प्रासंगिक भाग को देखे बिना बताना मुश्किल है। हो सकता है कि यह # ifdef'ed है और संकलित नहीं है, हो सकता है कि कुछ और हो।

    इसके अलावा, nf_hooks एक डेटा आइटम है, इसलिए यह CONFIG_KALLSYMS_ALL 'n' होने पर/proc/kallsyms में दिखाई नहीं दे सकता है।

+0

धन्यवाद! यह बहुत अच्छा है – daehee

संबंधित मुद्दे