मैं 'mem_map' शुरू होने वाली भौतिक स्मृति को पढ़ने के लिए उपयोगकर्ता स्थान में mmap का उपयोग करने का प्रयास कर रहा हूं। यह एक सरणी है जिसमें सभी भौतिक पृष्ठ शामिल हैं। यह एक i386 मशीन 3.0 कर्नेल चल रहा है।mmap: ऑपरेशन की अनुमति नहीं है
कोड इस तरह है:
....
//define page size
//
#define PAGE_SIZE 0x1000 //4096 bytes
#define PAGE_MASK (PAGE_SIZE - 1)
....
/* open /dev/mem file*/
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
printf("/dev/mem could not be opened.\n");
perror("open");
exit(1);
} else {
printf("/dev/mem opened.\n");
}
/* Map one page */
printf(" mem_map is at physical addr: 0x%x\n", mem_map_phy_addr);
map_base = mmap(0, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, (mem_map_phy_addr & ~PAGE_MASK)); //mem_map_phy_addr is at 0x356f2000
if(map_base == (void *) -1) {
printf("Memory map failed. err num = %d\n",errno);
perror("mmap"); //failed here
} else {
printf("Memory mapped at address %p.\n", map_base);
}
मैं एक रूट के रूप में इस भाग गया। उत्पादन होता है:
/dev/mem opened.
mem_map is at physical addr: 0x356f2000
Memory map failed. err num = 1
mmap: Operation not permitted
यह सुनिश्चित हो, मैं इस समस्या googled और मेरी /etc/sysctl.conf फ़ाइल में निम्न पंक्ति कहा:
vm.mmap_min_addr = 0
लेकिन यह या तो काम नहीं करता।
कोई भी जानता है कि इस तरह mem_map ऑपरेशन की अनुमति क्यों नहीं है और मैं इसके आसपास कैसे हो सकता हूं?
धन्यवाद।
FYI करें, यह 'x और ~ PAGE_MASK' उपयोग करने के लिए सही नहीं है। 64 बिट सिस्टम पर, यह 32 बिट्स पर पते को छोटा कर देगा। पूरक लेने से पहले आपको 'uintptr_t' या समकक्ष विस्तृत प्रकार पर डालना होगा। –
क्या आपने mmap_min_addr के मान को सेट करने के लिए sysctl कमांड चलाया था या केवल conf फ़ाइल संपादित करें? आपको दोनों करना है। –
हाँ, मैंने बाद में "sysctl -p" किया था। – user899159