X86 लिनक्स में 0 में भौतिक पता क्या है?


12

मुझे यकीन नहीं है कि यह सवाल यहाँ या उलटफेर में जाना चाहिए ।stackexchange.com

विकिपीडिया से उद्धरण :

8086 प्रोसेसर में, इंटरप्ट टेबल को आईवीटी (इंटरप्ट वेक्टर टेबल) कहा जाता है। आईवीटी हमेशा स्मृति में एक ही स्थान पर रहता है, 0x0000 से 0x03ff तक होता है, और इसमें 256 चार-बाइट वास्तविक मोड दूर बिंदु (256 × 4 = 1024 बाइट्स मेमोरी) होते हैं।

यह वही है जो मुझे qemu मॉनिटर में मिलता है:

(qemu) xp/128xw 0
0000000000000000: 0xf000ff53 0xf000ff53 0xf000e2c3 0xf000ff53
0000000000000010: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000020: 0xf000fea5 0xf000e987 0xf000d62c 0xf000d62c
0000000000000030: 0xf000d62c 0xf000d62c 0xf000ef57 0xf000d62c
0000000000000040: 0xc0005526 0xf000f84d 0xf000f841 0xf000e3fe
0000000000000050: 0xf000e739 0xf000f859 0xf000e82e 0xf000efd2
0000000000000060: 0xf000d648 0xf000e6f2 0xf000fe6e 0xf000ff53
0000000000000070: 0xf000ff53 0xf000ff53 0xf0006aa4 0xc0008930
0000000000000080: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000090: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000a0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000b0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000c0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000d0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000e0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000f0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000100: 0xf000ec59 0xf000ff53 0xf000ff53 0xc0006730
0000000000000110: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000120: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000130: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000140: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000150: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000160: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000170: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000180: 0x00000000 0x00000000 0x00000000 0x00000000
0000000000000190: 0x00000000 0x00000000 0x00000000 0xf000ff53
00000000000001a0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000001b0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000001c0: 0xf000d611 0xf000ec4e 0xf000ec4e 0xf000ec4e
00000000000001d0: 0xf000d61a 0xf000d623 0xf000d608 0xf000ec4e
00000000000001e0: 0xf000ff53 0x00000000 0xf000ff53 0xf000ff53
00000000000001f0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53

मुझे यकीन नहीं है कि उन मूल्यों का क्या करना है। यह एक इंटरप्ट डिस्क्रिप्टर तालिका की तरह नहीं दिखता है (उन मानों को सभी प्रकार के शून्य देता है)। तो क्या मैं वास्तव में यहाँ देख रहा हूँ?

जवाबों:


9

जो कुछ भी आपके फर्मवेयर ने इसे छोड़ दिया।

एक आदर्श आधुनिक प्रणाली में, प्रोसेसर कभी भी वास्तविक मोड में प्रवेश नहीं करता है, जैसा कि मैंने इस एसयू क्यू एंड ए शीर्षक में समझाया: आधुनिक 64-बिट इंटेल चिप पीसी किस मोड में बूट सेक्टर को चलाते हैं? भौतिक स्मृति का पहला KiB उतना ही अप्रासंगिक है जितना कि जोहान मेरेन ने इसे दूसरे उत्तर में दिया। लेकिन कई आधुनिक फ़र्मवेयर (अभी भी) को संगतता समर्थन है , जिसका अर्थ है

  • वे वापस आ सकते हैं (हाँ, पीछे , यह देखते हुए कि वे अवास्तविक मोड से सीधे मोड में चले गए हैं) संरक्षित मोड से वास्तविक मोड के लिए सिस्टम मोड चलाने के लिए जो वास्तविक मोड के लिए लिखे गए हैं, जैसे कि पुराने स्टाइल पीसी / एटी बूट प्रोग्राम। एमबीआर और वीबीआर; तथा
  • वे पुराने वास्तविक मोड फर्मवेयर एपीआई प्रदान करते हैं और उन एपीआई के लिए सभी डेटा संरचनाओं को सेट करते हैं, जो कि उपरोक्त सिस्टम सॉफ्टवेयर्स पर भरोसा करते हैं।

उन डेटा संरचनाओं में से एक वास्तविक मोड आईवीटी है। पुराने वास्तविक मोड फर्मवेयर एपीआई intनिर्देश पर आधारित होते हैं , और असली मोड आईवीटी को फर्मवेयर द्वारा उन निर्देशों के लिए विभिन्न फर्मवेयर हैंडलिंग रूट के लिए पॉइंटर्स के साथ इसके प्रारंभ के भाग के रूप में आबादी होती है।

संरक्षित मोड सिस्टम सॉफ्टवेयर्स को पुराने वास्तविक मोड फर्मवेयर एपीआई की आवश्यकता नहीं होती है, और प्रोसेसर को कभी भी वास्तविक मोड में नहीं चलाया जाता है, इसलिए भौतिक मेमोरी के पहले 1KiB में वास्तविक मोड IVT अप्रयुक्त है। (v8086 संरक्षित मोड भौतिक पता 00000000 और ऊपर की ओर नहीं पता है। याद रखें। यह तार्किक पते 00000000 और ऊपर के पते को संबोधित करता है, जो पृष्ठ तालिकाओं द्वारा अनुवादित हैं।) आधुनिक ईएफआई प्रणालियों में, फर्मवेयर ऑपरेटिंग सिस्टम को भौतिक मेमोरी के मेमोरी मैप पर सौंप देता है। बूटस्ट्रैप, यह बता रहा है कि फर्मवेयर को अपने स्वयं के संरक्षित मोड एपीआई प्रयोजनों के लिए कौन से भागों के लिए आरक्षित किया गया है, और कौन से हिस्से ऑपरेटिंग सिस्टम को आगे बढ़ने और भौतिक मेमोरी के अपने पूल के लिए उपयोग करने के लिए स्वतंत्र है। सिद्धांत रूप में, भौतिक स्मृति का पहला पृष्ठ बाद की श्रेणी में हो सकता है।

व्यवहार में, सबसे पहले, फर्मवर अक्सर भौतिक स्मृति के पहले पृष्ठ को "बूट सेवा कोड" के रूप में चिह्नित करते हैं, जिसका अर्थ है कि एक ऑपरेटिंग सिस्टम यह दावा कर सकता है और बस आगे बढ़ सकता है और इसे अपने भौतिक मेमोरी पूल के हिस्से के रूप में उपयोग कर सकता है, लेकिन केवल बूट के बाद- ईएफआई फर्मवेयर की समय सेवाओं को ऑपरेटिंग सिस्टम द्वारा बंद कर दिया गया है और फर्मवेयर केवल इसकी रन-टाइम सेवाएं प्रदान करने के लिए कम हो गया है। इसका एक उदाहरण add_efi_memmapफिनिश कर्बर पी। मर्फी द्वारा दिखाए गए लिनक्स कर्नेल लॉग ( विकल्प के साथ ) में देखा जा सकता है :

[0.000000] efi: mem00: type = 3, attr = 0xf, range = [0x0000000000000000-0x0000000000001000) (0MB)
जो एक और कार्यक्रम के साथ एक और मानव-पठनीय रूप में डिकोड करता है:

[# 00] प्रकार: EfiBootServicesCode Attr: 0xF
      भौतिकी: 0000000000000000-0000000000001000
      पुण्य: 0000000000000000-0000000000001000

व्यवहार में, दूसरी बात, लिनक्स स्पष्ट रूप से भौतिक स्मृति की इस सीमा को अनदेखा करता है, भले ही फर्मवेयर का कहना है कि यह आगे जा सकता है और इसका उपयोग कर सकता है। आप पाएंगे कि दोनों EFI और गैर-EFI फ़र्मवारों पर समान रूप से एक बार, लिनक्स के पास भौतिक मेमोरी मैप होता है, जो इसे पैच करता है ( नाम दिए गए फ़ंक्शन मेंtrim_bios_range ), जिसके परिणामस्वरूप कर्नेल लॉग संदेश जैसे:

[0.000000] e820: अपडेट [मेम 0x00000000-0x00000fff] usable ==> आरक्षित

यह आधुनिक ईएफआई फर्मवरों के साथ सामना करने के लिए इतना नहीं है, जहां वास्तविक मोड आईवीटी फर्मवेयर एपीआई का हिस्सा नहीं है, क्योंकि यह पुराने पीसी 98 फर्मवरों के साथ सामना करना है, जहां यह फर्मवेयर एपीआई का हिस्सा है, लेकिन फर्मवार इसकी रिपोर्ट करते हैं (इसके माध्यम से) भौतिक मेमोरी के रूप में स्व-एपीआई () उसी तरह की है जो ऑपरेटिंग सिस्टम द्वारा ब्लिटली ओवरराइट करने के लिए उपलब्ध है।

तो सिद्धांत में whilst कि भौतिक स्मृति की सीमा में मनमाना कोड या डेटा शामिल हो सकता है, जो कि कर्नेल मेमोरी एलोकेटर और मांग-पृष्ठबद्ध वर्चुअल मेमोरी की क्षणिक जरूरतों से निर्भर करता है; व्यवहार में लिनक्स बस इसे छोड़ देता है क्योंकि फर्मवेयर मूल रूप से इसे सेट करता है।

और आपके सिस्टम पर फर्मवेयर ने इसे वास्तविक मोड आईवीटी प्रविष्टियों के साथ आबाद किया था। असली मोड आईवीटी प्रविष्टियां केवल 16:16 दूर के संकेत हैं, और यदि आप 2-बाइट हेक्सडंप का उपयोग करके अपनी मेमोरी को देखते हैं तो आप वास्तव में इसे बहुत स्पष्ट रूप से देख सकते हैं। कुछ उदाहरण:

  • आपकी अधिकांश IVT प्रविष्टियाँ F000 की ओर इशारा करती हैं: FF53, वास्तविक मोड फर्मवेयर रोम क्षेत्र में एक पता। यह शायद एक डमी दिनचर्या है जो एक से ज्यादा कुछ नहीं करती है iret
  • IVT प्रविष्टि 1E F000: 6AA4, उसी ROM क्षेत्र में एक तालिका की ओर इशारा करती है।
  • IVT प्रविष्टि 1F C000 को इंगित करता है: 8930, वास्तविक मोड वीडियो ROM फर्मवेयर क्षेत्र में एक तालिका।
  • आईवीटी प्रविष्टि 43 अंक C000: 6730, वास्तविक मोड वीडियो रोम फर्मवेयर क्षेत्र में एक और तालिका।

आगे की पढाई


नहीं, मेरा मतलब है कि मैंने क्या लिखा है। इंटेल आर्किटेक्चर सॉफ्टवेयर डेवलपर्स का मैनुअल वॉल्यूम 3 अध्याय 20
J

खैर अब आपके पास है, क्योंकि यह है; जैसा कि उस खंड का पहला वाक्य बताता है। मुझे इस पर संदेह है कि सामान्य संक्षिप्त नाम "v8086" की गैर-मान्यता एक प्रकार का शिब्बू है। (-:
JdeBP

आपको यह जानने की जरूरत है कि कैसे संज्ञात्मक संज्ञाओं को पढ़ना है। वरना मशरूम के सूप के बिना जीना सीख लो।
JDBP

7

मूल 8086 प्रोसेसर आर्किटेक्चर (80286+ प्रोसेसर में रियल मोड के रूप में कार्यान्वित) लिनक्स के लिए कोई प्रासंगिकता नहीं है, जो संरक्षित मोड में संचालित होता है। भौतिक पता 0 पर कोई रुकावट वेक्टर तालिका नहीं है, इसके बजाय एक इंटरप्टिक डिस्क्रिप्टर तालिका जिसमें इंटरप्ट डिस्क्रिप्टर्स का उपयोग किया जाता है। आईडीटी को मेमोरी में कहीं भी स्थित किया जा सकता है।

लिनक्स कर्नेल को फ़र्मवेयर (BIOS या EFI) से एक भौतिक मेमोरी मैप मिलता है जो बताता है कि कौन से भौतिक मेमोरी पेज फ़्रेम उपयोग करने योग्य हैं और जो आरक्षित हैं या मौजूद नहीं हैं। प्रयोग करने योग्य पृष्ठ फ़्रेमों की सीमा सन्निहित नहीं है, लेकिन आमतौर पर इसमें बड़े छेद होते हैं। परंपरागत रूप से, x86 लिनक्स कर्नेल ने भौतिक स्मृति की शुरुआत को छोड़ दिया है, भले ही यह प्रयोग करने योग्य के रूप में चिह्नित हो। इस प्रकार, भौतिक पता 0 का उपयोग लिनक्स कर्नेल द्वारा नहीं किया जाता है।


यह समझ में आता है। किसी भी विचार है कि अप्रयुक्त पृष्ठ में बचे हुए सामग्री क्या है?
रोडियो

के लिए Googling 53 ffपता चलता है कि इस सबसे अधिक संभावना है वास्तव में एक 8086 रियल मोड बाधा वेक्टर फर्मवेयर या एक बूट लोडर द्वारा स्थापित टेबल है।
जोहान मायरेन

4

डंपिंग मेमोरी

यहां सिस्टम के अंदर मेमोरी की सामग्री को डंप करने का एक वैकल्पिक तरीका है। इसे बाहरी रूप से करने के लिए:

$ head /dev/mem | hexdump -C
00000000  53 ff 00 f0 53 ff 00 f0  53 ff 00 f0 53 ff 00 f0  |S...S...S...S...|
00000010  53 ff 00 f0 53 ff 00 f0  cc e9 00 f0 53 ff 00 f0  |S...S.......S...|
00000020  a5 fe 00 f0 87 e9 00 f0  53 ff 00 f0 46 e7 00 f0  |........S...F...|
00000030  46 e7 00 f0 46 e7 00 f0  57 ef 00 f0 53 ff 00 f0  |F...F...W...S...|
00000040  22 00 00 c0 4d f8 00 f0  41 f8 00 f0 fe e3 00 f0  |"...M...A.......|
00000050  39 e7 00 f0 59 f8 00 f0  2e e8 00 f0 d4 ef 00 f0  |9...Y...........|
00000060  a4 f0 00 f0 f2 e6 00 f0  6e fe 00 f0 53 ff 00 f0  |........n...S...|
00000070  ed ef 00 f0 53 ff 00 f0  c7 ef 00 f0 ed 57 00 c0  |....S........W..|
00000080  53 ff 00 f0 53 ff 00 f0  53 ff 00 f0 53 ff 00 f0  |S...S...S...S...|
...
...
000afea0  00 00 00 00 00 00 00 00  aa aa aa 00 aa aa aa 00  |................|
000afeb0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000b0000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
000c0000  55 aa 40 e9 62 0a 00 00  00 00 00 00 00 00 00 00  |U.@.b...........|
000c0010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 49 42  |..............IB|

विश्लेषण

000c0000 से ऊपर का ऊपरी हिस्सा बूटलोडर से संबंधित हो सकता है। मुझे इस पर शक क्यों होगा? स्थान पर कोड 55aah 000c0000आमतौर पर एक माध्यमिक बूटलोडर चलाने के लिए BIOS के लिए ट्रिगर जैसी चीजों के लिए स्मृति में एक निशान हो सकता है।

संदर्भ: बूट हस्ताक्षर - BIOS

  एस एस # 1

हालाँकि, इस 55aah c0000h-effffh रेंज में होता है, यह अधिक संभावना है कि यह हिस्सा PNP विस्तार हैडर है:

संदर्भ: BIOS बूट विशिष्टता

PnP विस्तार हेडर के साथ 3.3 डिवाइस

विकल्प रोम वाले सभी आईपीएल उपकरणों में एक वैध विकल्प ROM हेडर होना चाहिए जो कि सिस्टम मेमोरी एड्रेस C0000h और EFFFFh के बीच 2k सीमा पर रहता है और 55AAh से शुरू होता है। एक डिवाइस की बूटिंग को केवल तभी नियंत्रित किया जा सकता है जब उसमें PnP एक्सपेंशन हैडर हो। विस्तार हैडर, जिसका पता ऑफसेट + 1Ah में मानक विकल्प ROM हेडर के भीतर रहता है, में डिवाइस को कॉन्फ़िगर करने के लिए उपयोग की जाने वाली महत्वपूर्ण जानकारी शामिल है। इसमें डिवाइस के विकल्प ROM (BCV या BEV) में कोड करने के लिए पॉइंटर्स भी होते हैं जो कि BIOS डिवाइस से बूट करने के लिए कॉल करेगा। PnP विस्तार हैडर की संरचना के लिए परिशिष्ट A देखें। PnP Expansion Header के साथ IPL डिवाइस को बूट करने के दो तरीके हो सकते हैं। इसमें BCV या BEV होना चाहिए।

53ff ...

शुरुआत में जो 53ffh डेटा है। यह मेरे लिए अस्पष्ट है कि वास्तव में क्या है। आगे यह शोध करने की संभावना है कि लिनक्स कर्नेल को बूट करने के लिए एमबीआर के बूट लोडिंग के बाद लिनक्स कर्नेल ने वहां लिखा है।

आमतौर पर, बूटलोडर कर्नेल को मेमोरी में लोड करेगा, और फिर कर्नेल पर कूद जाएगा। कर्नेल तब बूटलोडर द्वारा उपयोग की गई मेमोरी को पुनः प्राप्त करने में सक्षम होगा (क्योंकि यह पहले से ही अपना काम कर चुका है)। हालाँकि बूट सेक्टर के भीतर OS कोड को शामिल करना और OS शुरू होने के बाद इसे निवासी बनाए रखना संभव है

आगे खुदाई मैं एक शोध पत्र शीर्षक से इस पैराग्राफ को खोजने में सक्षम था: दुर्भावनापूर्ण कोड इंजेक्शन / देव / मेम के माध्यम से :

1 मेम डिवाइस

/ देव / मेम शारीरिक रूप से संबोधित करने योग्य स्मृति के लिए ड्राइवर इंटरफ़ेस है। मेम और किमीम दोनों का मूल इरादा कर्नेल को डिबग करने में सहायता के लिए था। हम एक पता ऑफसेट का चयन करने के लिए lseek () का उपयोग करके एक नियमित चरित्र डिवाइस की तरह डिवाइस का उपयोग कर सकते हैं। किमीम डिवाइस समान है लेकिन वर्चुअल एड्रेसिंग के संदर्भ में कर्नेल मेमोरी की छवि प्रदान करता है। एक्सएमआर सर्वर वीईएसए वीडियो मेमोरी के साथ-साथ वीएमए मोड में वीडियो मोड में हेरफेर करने के लिए भौतिक पते 0x00000000 पर स्थित वीईएसए वीडियो मेमोरी के साथ-साथ BIOS रोम इंटरप्ट वेक्टर टेबल (आईवीटी) तक पहुंचने के लिए मेम डिवाइस का उपयोग करता है। DOSEMU भी BIOS IVT का उपयोग करने के लिए विभिन्न कार्यों के लिए BIOS इंटरप्ट (डिस्क रीड, कंसोल पर मुद्रण, आदि) करने में सक्षम होने के लिए इसका उपयोग करता है।

संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.