2002-10-08 20:00:30

by swayampakulaa, sudhindra

[permalink] [raw]
Subject: mmap() driver entry point


> iam using this driver to fetch me some memory
> in my user space application by calling mmap with
> the file descriptor got by opening the device file
> for this driver.
> mmap(0, length, flags, flags, fd, offset)
> and the mmap entry point in the driver is implemented as below:
> In the implementation, it tries to write an index into the first
> four bytes, which i use to store in my internal structures
> ( to later reference it through the index),
> before zeroing out the buffer. But the index is always -1.
> I dont understand the part where its getting the
> physical address to map.
> whats the high_memory and whats the PAGE_OFFSET.
> Can someone help me in understanding what exactly
> is the mmap() entry point doing here and if its doing it right.
>
> himem_buf_allocated = 0;
>
> int xxx_mmap(struct file *filp,
> struct vm_area_struct *vma)
> {
> unsigned long size;
> char * virt_addr;
> int index;
>
> size = vma->vm_end - vma->vm_start;
> if ((size % PAGE_SIZE) != 0){
> size = (size / PAGE_SIZE) * PAGE_SIZE + PAGE_SIZE;
> }
>
> /* himem_buf_size is 0x80000000 */
> if (size + himem_buf_allocated >= himem_buf_size){
>
> return -ENOMEM;
> }
>
> /* himem_buf is calculated as high_memory - PAGE_OFFSET */
> umem_addr = himem_buf + himem_buf_allocated;
> if (umem_addr == 0){
> return -ENOMEM;
> }
> himem_buf_allocated += size;
>
>
> virt_addr = ioremap((unsigned long)umem_addr, PAGE_SIZE);
> if (virt_addr == 0){
> return -ENOMEM;
> }
> /* write the index into the first 4 bytes */
> writel(index, (uint32_t *)virt_addr);
>
> /* the values of index and *(virt_addr) do not match */
> /* *(virt_addr) is always -1 */
> /* Is something wrong here */
> dbg_printf(0,"index is %d, *(virt_addr) is %d\n", index,
> (int)readl(virt_addr));
> iounmap(virt_addr);
>
>
>
> remap_page_range(vma->vm_start, (ulong)umem_addr,
> vma->vm_end - vma->vm_start, vma->vm_page_prot);
>
> return 0;
>