2011-10-28 5 views
19

किसी सॉफ़्टवेयर बिंदु दृश्य से, एक निर्देश के बीच विलंबता क्या है जो स्मृति पृष्ठ को गंदगी करता है और जब कोर वास्तव में पृष्ठ तालिका प्रविष्टि (पीटीई) में पृष्ठ को गंदा करता है?पृष्ठ को गंदे बिट सेट करने पर x86 कितना संकेत है?

दूसरे शब्दों में, यदि कोई निर्देश किसी पृष्ठ को गंदे करता है, तो क्या अगला निर्देश पीटीई पढ़ सकता है और गंदे बिट सेट को देख सकता है?

मुझे वास्तविक विलुप्त चक्रों की परवाह नहीं है, केवल सॉफ़्टवेयर दृश्य विंडो है जिसमें गंदा बिट अभी तक सेट नहीं है। मुझे संदर्भ मैनुअल में कोई गारंटी नहीं मिल रही है।

उत्तर

8

एएमडी के मैनुअल (2005 लगभग), खंड 2 से: सिस्टम प्रोग्रामिंग:

5,4 पृष्ठ-अनुवाद-तालिका प्रविष्टि क्षेत्रों
...
Dirty (D) Bit. Bit 6.
This bit is only present in the lowest level of the page-translation hierarchy. It indicates whether the pagetranslation table or physical page to which this entry points has been written. The D bit is set to 1 by the processor the first time there is a write to the physical page.

इंटेल से डिट्टो (लगभग 2006), वॉल्यूम 3-ए: सिस्टम प्रोग्रामिंग गाइड, भाग 1:

3.7.6 पेज-निर्देशिका और पेज-टेबल प्रविष्टियां
...
Dirty (D) flag, bit 6
Indicates whether a page has been written to when set. (This flag is not used in page-directory entries that point to page tables.) Memory management software typically clears this flag when a page is initially loaded into physical memory. The processor then sets this flag the first time a page is accessed for a write operation.

अद्यतन:

नवीनतम इंटेल पुस्तिका (खंड 3 ए, सिस्टम प्रोग्रामिंग गाइड) से:

8.1.2.1 Automatic Locking
The operations on which the processor automatically follows the LOCK semantics are as follows:
...
When updating page-directory and page-table entries —
When updating page-directory and page-table entries, the processor uses locked cycles to set the accessed and dirty flag in the page-directory and page-table entries.

में पाठ के बाकी हिस्सों से खंड 8.1 और 8.2 यह इस प्रकार है कि एक बार जब सीपीयू लॉक ऑपरेशन का उपयोग करके गंदा बिट सेट करता है, तो अन्य CPUs को अद्यतन मान देखना शुरू करना चाहिए।

बेशक, आपके पास दौड़ की स्थिति हो सकती है कि आप पहले एक सीपीयू (या उसके धागे में) के रूप में गंदे बिट को 0 के रूप में पढ़ते हैं और बाद में एक और सीपीयू (या उसी सीपीयू पर एक और धागा) इस बिट का कारण बनता है 1 पर सेट करने के लिए, लेकिन यह कोई असामान्य नहीं है।

+0

मैंने दस्तावेज़ भी पढ़े। ये यह नहीं कहते हैं कि कोर जो गंदे बिट को सेट करने का कारण बनता है, उसके पीछे निर्देशों को क्रमबद्ध या बाड़ लगाना है। आम तौर पर पढ़ना लिखता है यदि कोई डेटा खतरा नहीं है, लेकिन यह वास्तव में एक मुश्किल मामला है जहां खतरे स्वयं के पते से अलग पते (पीटीई) पर है। मैं जानना चाहता हूं कि पाइपलाइन इस मामले की जांच कर रही है या नहीं। – srking

+0

डॉक्स को खोदने के लिए धन्यवाद :) – srking

+0

@srking: कृपया अपडेट देखें। –

5

AMD64 Architecture Programmer’s Manual Volume 2: System Programming (revision 3.22, Sept. 2012)

सामान्य, गंदा सा अद्यतन में, अन्य भार और दुकानों के संबंध में आदेश दिया जाता है, हालांकि जरूरी नहीं कि सम्मान के साथ शौचालय स्मृति में पहुँचता करने के लिए; विशेष रूप से, वे डब्ल्यूसी बफर को फ्लश नहीं कर सकते हैं। हालांकि, भविष्य में प्रोसेसर के साथ संगतता सुनिश्चित करने के लिए , डीटी पढ़ने से पहले एक क्रमबद्ध ऑपरेशन डाला जाना चाहिए।

(जोर मेरा।)

1

this document के पेज 2033 के अनुसार, इंटेल x86 पृष्ठ सारणी के बारे में जानकारी संचित करता है। पाठ में कहा गया है कि यदि गंदे बिट सॉफ़्टवेयर द्वारा साफ किया गया है, तो संभावना है कि सीपीयू अभी भी इसे 1 के बराबर देखता है।

अब सवाल के लिए: यदि सीपीयू गंदे बिट को कैश करता है, तो संभावना है कि पीटीई (पेज-टेबल-एंट्री) में अपडेट तुरंत नहीं होता है। इसे कैश-राइट-बैक पॉलिसी में देरी हो सकती है।

उसी दस्तावेज़ के पृष्ठ 1651 WBINVD निर्देश का वर्णन करता है, जो आंतरिक कैश को फ़्लश करता है। यह नहीं कहता है कि इसमें सीपीयू द्वारा कैश किए गए सभी डेटा शामिल हैं।

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