linux - Why mmap /dev/mem return different address? -
यहां कार्यक्रम है:
#include & lt; stdio.h & gt; # शामिल करें & lt; stdint.h & gt; # शामिल करें & lt; unistd.h & gt; # शामिल करें & lt; stdlib.h & gt; # शामिल करें & lt; sys / mman.h & gt; # शामिल करें & lt; sys / types.h & gt; # शामिल करें & lt; sys / file.h & gt; # शामिल करें & lt; errno.h & gt; लंबा * नक्शामैम (ऑफसेट ऑफसेट) {int fd; लंबे समय तक; एफडी = ओपन ("/ dev / mem", O_RDWR | O_SYNC); यदि (एफडी == -1) {दर्पण ("खुली"); वापसी नल; } Printf ("ऑफसेट (पेजएड्डर) है:% ld \ n", ऑफ़सेट); Ret = mmap (0, आकार (लंबे), PROT_READ | PROT_WRITE, MAP_SHARED, fd, ऑफ़सेट); अगर (रेट == MAP_FAILED) {झूठ ("mmap"); रेट = नल; } Printf ("वापसी पता है:% p \ n", ret); यदि (बंद करें (एफडी) == -1) झपट्टा ("बंद"); रिटर्न रिट; } Int main (int argc, char * argv []) {long * mem = 0; अस्थिर लंबे * _mem = 0, डमी; लंबे समय से चक्कर आना, ऑफसेट, पेजएड्रर; चार * अंत; If (argc! = 2) {fprintf (stderr, "उपयोग% s & lt; addr & gt; \ n", argv [0]); वापसी 1; } Addr = strtoll (argv [1], और अंत, 16); Offset = addr% sysconf (_SC_PAGE_SIZE); पेजएडआर = एडर - ऑफसेट; Printf ("ऐड्रर है:% एलएलडी, ऑफ़सेट:% एलएलडी, पेजएड्र:% एलडड \ n", एड्रर, ओफ़्सेट, पेजएड्रर); Mem = mapmem (पेजएडर); वापसी 0; }
एमएमएमपीड भौतिक पता अलग-अलग क्यों है जो हम पारित कर चुके हैं? या क्या उस पते को वास्तविक भौतिक पते पर मैप करने वाला आभासी पता दिया गया है?
उपर्युक्त कार्यक्रम चलाने के लिए मेरा आउटपुट:
$ sudo ./test 0x12345 एडीआर है: 74565, ऑफसेट: 837, पेजःडर: 73728 ऑफसेट है: 73728 रिटर्न पता है : 0x7f3081fc0000
एमएमएपी आपके द्वारा उपयोग किए जा सकने वाले स्मृति बफर का पता देता है: जैसे, यह एक आभासी पता है, क्योंकि यह भी है कि भौतिक पते उपयोगकर्ताओं के लिए दृश्यमान नहीं हैं। दरअसल, मौजूदा आर्किटेक्चर हमेशा (लेकिन बूट प्रक्रिया के बहुत ही शुरुआती सेकंड में) मेमोरी वर्चुअलाइजेशन के साथ चलाया जाता है। आपको केवल कर्नेल के भीतर ही भौतिक पता दिखाई देता है, और केवल अगर आप भौतिक मेमोरी के साथ स्पष्ट रूप से काम करते हैं; लेकिन आप उन्हें सीधे एक्सेस नहीं कर सकते हैं, आपको सबसे पहले उनको आभासी पते में मैप करने की आवश्यकता है।
आप अपने कार्यक्रम में जो देखते हैं वह एक ऐसा आभासी पता है, जो समय-समय पर अलग है। जब आप एमएमएपी, लिनक्स आपकी प्रोसेस की वर्चुअल मेमोरी के अंदर एक नि: शुल्क आभासी मेमोरी क्षेत्र का चयन करता है जो मैपिंग का अनुरोध करने के लिए पर्याप्त है और उस क्षेत्र में भौतिक मेमोरी को मैप करता है। जो वर्चुअल स्मृति क्षेत्र लिनक्स का चयन उपलब्धता पर निर्भर करता है और अन्य कारकों जैसे पता स्थान लेआउट रैंडमैक्शन ()।
Comments
Post a Comment