ioremap相关的人函数

2013年09月09日

uplooking 106 天

1.打印这个所有当前动行的进程的名字

   #include<linux/init.h>

   #include<linux/module.h>

   #include<linux/thread_info.h>

   #include<linux/sched.h>

   MODULE_LICENSE("GPL");

   MODULE_AUTHOR("you");

   int test_init()

   {

          int i;

          unsigned long addr = (unsigned long)&i;

          struct thread_info*pp;

          pp = (struct thread_info  *)(addr & ~((1<<13)-1));

          printk("this comm is %s\n",pp->task->comm);

          struct task_struct *cc = pp->task;

          do{

                 struct list_head *aa = cc->tasks.next;

                 cc = container_of(aa,struct task_struct,tasks);

 //container_of(ptr,type,member);这个宏得到一个指向type的地址                      printk("this comm is %s\n",cc->comm);

         }while(cc != pp->task);

         return 0;

  }

  void test_exit()

  {

          printk("goodbye module!!!!!!!!!!!!!!!!!!\n");

  }

  module_init(test_init);

  module_exit(test_exit);

这个文件相对应Makefile文件:

default:

make -C /root/Desktop/smdk6410_resource/src/linux-2.6.28_smdk6410 M=/mynfsroot/zuoye/0909

clean:

 make -C /root/Desktop/smdk6410_resource/src/linux-2.6.28_smdk6410 M=/mynfsroot/zuoye/0909 clean

rm *.order -rf

obj-m += test.o

 

 

 

 

2. ==>ioremap==>通过物理地址找虚拟地址

在OS下点灯(以模快的方式插入):

1.

ioread32()

iowrite32()

iounmap()

3.cat /proc/iomem==>查看系统中分配的内存地址

下午:

cdev 以驱动模型

     

    |   app

--|-----------------

    |   os

 

mknod wangcai c 9 1 (设备与设备号==类比人的名字与身份证)

 

 

例1:利用  ioremap 把我们的所给的物理地址,映射成虚拟地址.再通过虚拟地址,在有os的情况下,我们去访问,我们的外置register

#include<linux/init.h>

#include<linux/module.h>

#include<asm/sizes.h>

#include<asm/io.h>

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("you");

unsigned long virt;

unsigned long *gpmcon,*gpmdat;

int test_init(void)

{

virt = ioremap(0x7f008820&0xfffff000,SZ_4K);

gpmcon = virt + (0x7f008820 & 0x00000fff);

gpmdat = virt + (0x7f008824 & 0x00000fff);

 

*gpmcon = 1;

*gpmdat = 0;

return 0;

}

void test_exit(void)

{

printk("goodbye module!\n");

}

module_init(test_init);

module_exit(test_exit);

 

 

例二:当ioremap 的返回值为一个指针时:对一个指针加1,是加四个字节.

#include<linux/init.h>

#include<linux/module.h>

#include<asm/sizes.h>

#include<asm/io.h>

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("you");

//unsigned long *virt;

unsigned long  *virt;

unsigned long *gpmcon,*gpmdat;

int test_init(void)

{

virt = ioremap(0x7f008820&0xfffff000,SZ_4K);

gpmcon = virt + (0x7f008820 & 0x00000fff)>>2;

gpmdat = virt + (0x7f008824 & 0x00000fff)>>2;

*gpmcon =  0x1;

*gpmdat =  0;

return 0;

}

void test_exit(void)

{

printk("goodbye module!\n");

}

module_init(test_init);

module_exit(test_exit);

 

 

 

 

例三:与ioremap的其它的函数:

 

#include<linux/init.h>

#include<linux/module.h>

#include<asm/sizes.h>

#include<asm/io.h>

#include<linux/ioport.h>

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("you");

//unsigned long *virt;

unsigned long   *virt;

unsigned long *gpmcon,*gpmdat;

int test_init(void)

{

request_mem_region(0x7f008000,SZ_4K,"youyou");

virt = ioremap(0x7f008820&0xfffff000,SZ_4K);

gpmcon = virt + ((0x7f008820 & 0x00000fff)>>2);

gpmdat = virt + ((0x7f008824 & 0x00000fff)>>2);

iowrite32(ioread32(gpmcon)&~0xf | 0x1,gpmcon);

iowrite32(ioread32(gpmdat)&~0x1,gpmdat);

return 0;

}

void test_exit(void)

{

iounmap(virt);

release_mem_region(0x7f008000,SZ_4K);

printk("goodbye module!\n");

}

module_init(test_init);

module_exit(test_exit);

 

 

例四:我们步步进入我们的file_operations函数....(分配结构变量,才在内存中分配内存)

 

 

 

#include<stdio.h>

 

struct file_operations;

struct person{

int age;

struct file_operations *ops;

};

struct file_operations{

void (*fp)(struct person *t);

};

void show(struct person *this)

{

printf("this is age %d\n",this->age);

}

int main()

{

struct person tom;

tom.age= 28;

struct file_operations filp;

printf("struct person tom:%x\nstruct file_operations:%x\n",&tom.age,&tom.ops);

printf("struct file_operations:%x\n",&filp);

tom.ops = &filp;

filp.fp = show;

tom.ops->fp(&tom);

return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值