2009-08-07 9 views
9

इस सवाललिनक्स पर वास्तव में एक सिस्कल कैसे होता है?

How can I force GDB to disassemble?

से प्रेरित होकर और यह एक

What is INT 21h?

कैसे एक वास्तव में सिस्टम कॉल linux के तहत होता है से संबंधित? क्या होता है जब कॉल किया जाता है, जब तक कि वास्तविक कर्नेल दिनचर्या नहीं आती है?

+0

+1, दिलचस्प सवाल! –

+0

syscall कार्यान्वयन प्रश्न: http://stackoverflow.com/questions/499188/how-is-the-system-call-in-linux- कार्यान्वित – nik

+0

स्वयं को बंद करने के लिए मतदान कर रहा है। वास्तव में डुप्लिकेट है (खोज पर दिखाई नहीं दिया क्योंकि मैंने syscall का उपयोग किया था) –

उत्तर

8

मान लिया जाये कि हम 86 के बारे में बात कर रहे हैं:

  1. ID of the system call EAX में जमा किया जाता है रजिस्टर
  2. किसी भी सिस्टम कॉल के लिए आवश्यक तर्क locations dictated by the system call में जमा कर रहे हैं। उदाहरण के लिए, कुछ सिस्टम कॉलों को उनके तर्क को ईबीएक्स रजिस्टर में रहने की उम्मीद है। अन्य लोग अपने तर्क को ढेर के शीर्ष पर बैठने की उम्मीद कर सकते हैं।
  3. एक INT 0x80 बाधा उत्पन्न की जाती है।
  4. लिनक्स कर्नेल ईएक्स रजिस्टर में आईडी द्वारा पहचाने जाने वाले सिस्टम कॉल को पूर्व-निर्धारित स्थानों में किसी भी परिणाम जमा करते हैं।
  5. कॉलिंग कोड किसी भी परिणाम का उपयोग करता है।

मैं इस पर थोड़ा जंग लगी हो सकता है, यह एक कुछ वर्षों के अपने बहुत ही सरल हो गया है ...

+0

अगर मुझे सही याद है, क्योंकि कर्नेल का अपना ढेर है, तो कोई भी उपयोगकर्ता स्पेस प्रोग्राम कुछ नहीं डाल सकता है, इसलिए सभी तर्क रजिस्टरों के माध्यम से पारित किए जाने हैं। – Benno

+0

वास्तव में? मैं अपने प्रोफेसर को अस्पष्ट रूप से याद करता हूं कि लिनक्स के पास उपयोगकर्ता के पते को कर्नेलस्पेस पर मैप करने के लिए कुछ मैक्रोज़ थे ... मैं गलत हो सकता था। –

+3

INT 0x80 केवल तभी उपयोग किया जाता है जहां SYSCALL/SYSENTER निर्देश उपलब्ध नहीं हैं, आईआईआरसी। –

3

असल में,: स्मृति में कहीं न कहीं एक मेज है जहां प्रत्येक syscall संख्या और इसी हैंडलर के पते संग्रहीत किया गया है (x12 संस्करण के लिए http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32.S देखें)

आईएनटी 0x80 हस्तक्षेप हैंडलर तो रजिस्टरों से केवल तर्क लेता है, उन्हें (कर्नेल) स्टैक पर रखता है, और उपयुक्त सिस्कल हैंडलर को कॉल करता है।

4

यह पहले से ही
How is the system call in Linux implemented?
में उत्तर दिया जाता है शायद भिन्न "syscall" शब्द का उपयोग के कारण इस सवाल के साथ मेल नहीं खाती।

7

दिए गए उत्तरों सही हैं लेकिन मैं यह जोड़ना चाहता हूं कि कर्नेल मोड में प्रवेश करने के लिए और अधिक तंत्र हैं। प्रत्येक हालिया कर्नेल प्रत्येक प्रक्रिया 'पता स्थान में "vsyscall" पृष्ठ को मानचित्र करता है। इसमें सबसे कुशल सिस्कल जाल विधि से थोड़ा अधिक शामिल है।

एक नियमित रूप से 32 बिट सिस्टम पर उदाहरण के लिए यह हो सकता है:


0xffffe000: int $0x80 
0xffffe002: ret 

लेकिन मेरी 64-bitsystem पर मैं जिस तरह से करने के लिए उपयोग और अधिक कुशल पद्धति का उपयोग करके syscall/sysenter निर्देश


0xffffe000: push %ecx 
0xffffe001: push %edx 
0xffffe002: push %ebp 
0xffffe003:  mov %esp,%ebp 
0xffffe005:  sysenter 
0xffffe007: nop  
0xffffe008: nop  
0xffffe009: nop  
0xffffe00a: nop  
0xffffe00b: nop  
0xffffe00c: nop  
0xffffe00d: nop  
0xffffe00e:  jmp 0xffffe003 
0xffffe010: pop %ebp 
0xffffe011: pop %edx 
0xffffe012: pop %ecx 
0xffffe013: ret  
है

यह बनामस्कूल पृष्ठ कुछ सिस्टमकॉल भी मानचित्र करता है जिन्हें संदर्भ स्विच के बिना किया जा सकता है। मुझे विश्वास है gettimeofday, समय और getcpu वहाँ मैप की जाती हैं पता है, लेकिन मैं getpid बस के रूप में अच्छी तरह से में वहाँ फिट सकता कल्पना।

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

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