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;
}