当前位置: 技术问答>linux和unix
我是初学者哦~简单的模块编程的问题啦
来源: 互联网 发布时间:2016-10-25
本文导语: 本帖最后由 xinanlxh 于 2010-12-03 21:29:41 编辑 1.我要写一个函数:查找出虚拟地址addr所在的vma,并通过printk打印该段的起始地址、终止地址和段标志等信息。 我在模块里是写了一个函数,内容如下: struct vm_area_struct ...
我在模块里是写了一个函数,内容如下:
struct vm_area_struct *my_vma;
struct mm_struct *my_mm;
printk("this is the findvma function...n");
printk("the addr need to be found is : 0x%lxn",addr);
down_read(¤t->mm->mmap_sem);
my_mm=current->mm;
my_vma=find_vma(my_mm,addr);
if(!my_vma)
{
printk("virt_addr 0x%lx not available.n",addr);
return -1;
}
printk("the vma information is n");
printk("the start addr is: 0x%lx .n",my_vma->vm_start);
printk("the end addr is: 0x%lx .n",my_vma->vm_end);
printk("the flags is: 0x%lx .n",my_vma->vm_flags);
up_read(¤t->mm->mmap_sem);
printk("leave the findvma function...n");
结果当然是实现了上述的那个功能,但是我有问题,
首先,就是我们输入的addr和它所在的vm_area_struct是什么关系,还有这个vm_area_struct的起始地址和结束地址和我们输入的addr是什么关系?这个start_addr和end_addr也是指虚址吧?
然后,如果我们输入的addr是内核空间的地址怎么办?
再然后,如果我们输入的addr所对应的vm_area_struct是用户的空间的,那这样的话我们根据它输出的start_addr来找它的物理地址是不是有可能没有呢?
就是这个虚址实址我很不明白,google一下,是有蛮多的,但是越看越乱……请哪位大虾出来指教哦!
起始上面问那么多问题,主要是要把这个搞点明白~也是因为还要做一个作业,就是:
找到虚拟地址addr对应的物理地址并打印~~
在线等指教哦!!!谢谢哈~~O(∩_∩)O哈哈~
|
简单的说虚拟地址空间也是不连续的,vm_area_struct就代表一段,你通过find_vma就可以找到addr属于哪一段
你上面操作的所有东西都是虚拟地址(线性地址)
用户空间的虚拟地址也可以找到物理地址,只不过要求这个虚拟地址已经映射到了某个物理地址
你上面操作的所有东西都是虚拟地址(线性地址)
用户空间的虚拟地址也可以找到物理地址,只不过要求这个虚拟地址已经映射到了某个物理地址
|
支持2楼的。
这个程序只是判断addr这个虚拟地址是否在程序分配的虚拟地址空间中。
vm_area_struct在分配时,如果发现与已分配空间连续且一些属性相同,如都是只读的...具体可以参考ulk,那么就会合并成一个。
而找物理地址,这个应该就是要找到对应的page吧。然后加上偏移。 是否如此还是建议参考ulk
这个程序只是判断addr这个虚拟地址是否在程序分配的虚拟地址空间中。
vm_area_struct在分配时,如果发现与已分配空间连续且一些属性相同,如都是只读的...具体可以参考ulk,那么就会合并成一个。
而找物理地址,这个应该就是要找到对应的page吧。然后加上偏移。 是否如此还是建议参考ulk
|
可以参考一下ULK的虚拟地址空间那章
|
这块我也不懂呢,但是我觉得 他们之间都用一定的关系,比如函数表达式,通过某种计算出来的吧