में एक प्रक्रिया की पेज टेबल चलना मैं लिनक्स में एक प्रक्रिया के लिए पेज टेबल पर नेविगेट करने की कोशिश कर रहा हूं। एक कर्नेल मॉड्यूल में मैं निम्नलिखित समारोह का एहसास:लिनक्स
static struct page *walk_page_table(unsigned long addr)
{
pgd_t *pgd;
pte_t *ptep, pte;
pud_t *pud;
pmd_t *pmd;
struct page *page = NULL;
struct mm_struct *mm = current->mm;
pgd = pgd_offset(mm, addr);
if (pgd_none(*pgd) || pgd_bad(*pgd))
goto out;
printk(KERN_NOTICE "Valid pgd");
pud = pud_offset(pgd, addr);
if (pud_none(*pud) || pud_bad(*pud))
goto out;
printk(KERN_NOTICE "Valid pud");
pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd) || pmd_bad(*pmd))
goto out;
printk(KERN_NOTICE "Valid pmd");
ptep = pte_offset_map(pmd, addr);
if (!ptep)
goto out;
pte = *ptep;
page = pte_page(pte);
if (page)
printk(KERN_INFO "page frame struct is @ %p", page);
out:
return page;
}
इस समारोह ioctl
और addr
से कहा जाता है प्रक्रिया पता स्थान में एक आभासी पता है:
static int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long addr)
{
struct page *page = walk_page_table(addr);
...
return 0;
}
अजीब बात यह है कि में ioctl
बुला एक उपयोगकर्ता अंतरिक्ष प्रक्रिया, यह segfaults ... लेकिन ऐसा लगता है कि जिस तरह से मैं पेज टेबल प्रविष्टि की तलाश में हूं, वह सही है क्योंकि dmesg
के साथ मैं प्रत्येक ioctl
कॉल के लिए उदाहरण प्राप्त करता हूं:
[ 1721.437104] Valid pgd
[ 1721.437108] Valid pud
[ 1721.437108] Valid pmd
[ 1721.437110] page frame struct is @ c17d9b80
तो प्रक्रिया क्यों 'ioctl' कॉल को पूरा नहीं कर सकती है? शायद मुझे पेज टेबल पर नेविगेट करने से पहले कुछ लॉक करना होगा?
मैं कर्नेल 2.6.35-22 और तीन स्तर पृष्ठ तालिकाओं के साथ काम कर रहा हूं।
सभी को धन्यवाद!
क्या यह संभव है कि ioctl syscall सफलतापूर्वक वापस आती है और कोड उसके बाद segfaulting है? –
नहीं क्योंकि 'वापसी' से पहले ioctl syscall 'main' में अंतिम निर्देश है।अगर मैं 'ioctl' टिप्पणी करता हूं तो प्रक्रिया segfault नहीं है। – MirkoBanchi
आपने उस भाग को क्यों छुपाया जहां आपने 'स्ट्रक्चर पेज' के पते का उपयोग किया था? क्या आप वाकई से अपने सेगफाल्ट नहीं आते हैं? क्या आपने इसे क्यूमु पर डीबग करने का प्रयास किया है? –