मुझे उम्मीद है कि एड्रेस स्पेस लेआउट रैंडमाइजेशन (एएलएसआर) के कारण किसी अन्य प्रक्रिया से फोर्क की गई प्रक्रिया में mmap
पर कॉल करते समय अलग-अलग पते होंगे। लेकिन जैसा कि मैंने पाया, वह मामला नहीं था। मैंने उस उद्देश्य के लिए निम्नलिखित परीक्षण कार्यक्रम बनाया है। malloc
द्वारा लौटाए गए सभी पते माता-पिता और बच्चे के लिए बिल्कुल समान हैं। ध्यान दें कि malloc
, CL1, CL2, PL1 के लिए pl2 आंतरिक mmap
का उपयोग करता है, क्योंकि वे बड़े ब्लॉकों हैं।पता स्पेस लेआउट रैंडमाइजेशन (एएलएसआर) और एमएमएपी
तो, मेरा सवाल यह है कि क्यों mmap
एएलएसआर की उपस्थिति में भी अलग-अलग पते नहीं लौटा रहा है। शायद इसकी वजह यह है कि यहाँ यादृच्छिकरण के लिए बीज मूल और फोर्क प्रक्रिया के लिए समान है। या कोई अन्य कारण है?
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc(4096);
void * c2 = malloc(4096);
void * cl1 = malloc((long)512e3); // internally uses mmap
void * cl2 = malloc((long)512e3); // internally uses mmap
printf("c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2);
}
else
{
void * p1 = malloc(4096);
void * p2 = malloc(4096);
void * pl1 = malloc((long)512e3); // internally uses mmap
void * pl2 = malloc((long)512e3); // internally uses mmap
printf("p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2);
}
return 0;
}
मुझे यकीन नहीं है कि एएसएलआर के लिए आवश्यक है कि 'एमएमएपी' अलग-अलग पते लौटाए; इसका मतलब यह है कि यह * अलग * वापस कर सकता है। और शायद (बस एक अनुमान!) यह 'फोर्क' की तुलना में 'execve' द्वारा और अधिक ट्रिगर किया गया है। निश्चित रूप से, यदि मैं आपके कार्यक्रम के उत्तराधिकार में दो बार शुरू करता हूं, तो मुझे अलग-अलग पते मिल रहे हैं। और यह भविष्य के कर्नेल के साथ बदल सकता है, या शायद SELinux सक्षम लोगों के साथ ... –
आपको यह उपयोगी मिल सकता है: http://xorl.wordpress.com/2011/01/16/linux- कर्नेल-aslr-implementation/ – Necrolis
@ बेसिल: निश्चित रूप से, आपको प्रत्येक रन के लिए अलग-अलग पते मिलेंगे, लेकिन एक रन के लिए, दो प्रक्रियाओं (माता-पिता और बच्चे) के पते कभी अलग होते हैं? – MetallicPriest