- 论坛徽章:
- 0
|
小弟写了个测试的应用程序希望看看物理内存是如何分配的,
所以需要在应用程序中将虚拟地址转化为物理地址,所以用到了一些内核中的方法,以下代码是参考网上例子:- unsigned long vtop(unsigned long addr){
- unsigned long real_addr = 0x00;//要输出的地址
- struct task_struct *cur_task;
- cur_task = get_current();//获取当前进程控制块
- if(cur_task==NULL){
- goto out;
- }
- struct mm_struct *mm = cur_task->mm;//进程虚拟空间
- pgd_t *pgd;//描述页全局目录项
- pmd_t *pmd;//描述页中间项
- pte_t *pte;//页表项
-
- pgd = pgd_offset(mm, addr);//找出所在目录
- if (pgd_none(*pgd)){
- goto out;
- }
- pmd = pmd_offset(pgd, addr);//找出所在中间项
- if (pmd_none(*pmd)){
- goto out;
- }
- pte = pte_offset(pmd, addr);//找出所在页面
- if (pte_none(*pte)) {
- goto out;
- }
- //假设每页4KB
- real_addr = addr & 0x00003fff; //取出页面偏移量
- real_addr += pte;//内核空间访问的地址
- real_addr -= PAGE_OFFSET;//真正物理地址()
- return real_addr;
- out:
- printk("没有内存映射",real_addr);
- }
复制代码 但是结构task_struct和pgd_t、pmd_t、pte_t都是未定义的,这几个结构是定义在include/linux/sched.h和include/asm/page.h两个文件里,
而usr/include/linux下的头文件其实和内核的头文件有所不同。请问在应用中应该如何调用这些内核结构?
|
|