从用户空间写入时不调用write_proc

时间:2016-05-13 10:44:14

标签: linux kernel drivers procfs

我正在尝试了解用户空间和内核模块之间通信的procfs。我的模块具有procfs write_proc,driver_mmap的基本两个函数。 我通过调用fputs(" 123456789",fd)多次调用write_proc。其中fd是/ proc目录中procfs条目的文件描述符。但我没有看到多次调用write_proc。代码附在此处。

 <code>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <sound/core.h>
#include <sound/initval.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/mm.h>  /* mmap related stuff */


#define BUF_SIZE 64 * 1024
int  *MmapBuffer;
int   Factor = 1;


static int write_proc(struct file *filp, int *buf, size_t count, loff_t *offp) 
{
  int  rc,i;
   printk("in Write \n");
   for (i = 1; i <= 16*1024 ; i++)
   MmapBuffer[i-1] = (i+1)*Factor;
   Factor++;

  return count;   
}

static int driver_mmap(struct file *file, struct vm_area_struct *vma)

{
  int ret;
  vma->vm_flags  |= VM_LOCKED|VM_SHARED; 
  ret = remap_pfn_range(vma, vma->vm_start,
            virt_to_phys(MmapBuffer) >> PAGE_SHIFT,
            vma->vm_end-vma->vm_start, vma->vm_page_prot);
  if(ret != 0)
    printk("MMAP Failed \n");

  SetPageReserved(virt_to_page(MmapBuffer));
  printk("MMAP Succeeded \n");


  return 0;

}


//  file operations
struct file_operations proc_fops = 
{
  .write = write_proc,
  .mmap  = driver_mmap,
};


// init module 
int init_module_test(void)
{
  printk("<1>Hello world\n");
  MmapBuffer  = kzalloc(BUF_SIZE,__GFP_COLD|GFP_DMA);
  if(MmapBuffer ==  NULL)
    printk("Kzalloc failed. reduce buffer size \n");
  proc_create ("Test_fs",0,NULL, &proc_fops);
  return 0;
}

// exit module 
void cleanup_module_test(void)
{
  kfree(MmapBuffer);
  remove_proc_entry ("Test_fs", NULL);
  printk("Goodbye world\n");
}

module_init(init_module_test);
module_exit(cleanup_module_test);
MODULE_LICENSE("GPL");

</code>

申请代码

<code>
#include<stdio.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<errno.h>
#include <fcntl.h>

int main(void)
{
  int fd;
  int i,j;
  int *msg ;
  printf("Allocation started \n ");
  msg=(int*)malloc(64*1024);
  if(msg == NULL)
    printf("Allocation failed \n");

  //unsigned int *addr;
    printf("Starting opening \n ");
    if((fd=open("/proc/Test_fs", O_RDONLY ))<0)
  {
    printf("File not opened ");
  }
  printf("Starting mapping \n ");
  msg = mmap(NULL, 64*1024, PROT_READ, MAP_SHARED , fd, 0);
  printf("done from module \n ");

  if(msg == MAP_FAILED)
  {
    printf("MAP failed and error is %s", strerror(errno));
    return 0;
  }
  close(fd);
  printf("Successful mapping");

  FILE *f;
  f=fopen("/proc/Test_fs", "wr");
  if(!f)
  {
    printf("File not opened ");
  }
  for (j = 0; j < 10 ; j++)
  { 

    if(fputs("1234567890,",f) <= 0)
      printf("write failed, ");
    for (i = 0; i < 16*1024 ; i++)
      printf("%d, ", msg[i]);
    printf("\n \n done  \n \n ");


  }

  fclose(f);

  return 0;
}

</code>

0 个答案:

没有答案