不知道学东西是不是对所有的基础知识都要掌握
一步步看了这么多驱动资料,现在要跟实际硬件挂钩了,自己心里对能不能学好驱动一点都没底了
不知道你有没有掌握硬件知识,反正我就没掌握硬件知识
但是想学底层,哥还是想拼下。。。慢慢啃了。。
1.mmap系统调用
映射:
--void* mmap(void *addr,size_t len,int prot,int flags,int fd, off_t offset)
--功能:把文件内容映射到进程虚拟内存空间中
*prot---PROT_EXEC/PROT_READ/PROT_WRITE(映射区保护方式)
*flags----MAP_SHARED/MAP_RPIVATE
解除映射:
int munmap(void *stat,size_t length)
虚拟内存区域--程序代码/数据/bss(非初始化数据)/栈区域/内存映射的区域
start_end perm offset major:minor inode
vm_area_struct--描述虚拟内存区域
2.mmap设备操作
功能:映射一个设备(把用户空间的一段地址关联到设备内存上)
---int (*mmap)(struct file*,struct vm_area_struct *)
mmap工作是建立虚拟地址到物理地址的页表
一步实现:
构造页表:int remap_pfn_range(struct vm_area_struct *vma,unsigned long addr,unsigned long pfn,unsigned long size,pgprot_t prot)
3.寄存器/内存
寄存器有副作用,读取完,自动清零
IO/内存空间(只有x86存在IO空间)
IO端口--位于IO空间
IO内存--位于内存空间
----操作I/O端口(1.申请 2.访问 3.释放)
*申请 struct resource *request_region(unsigned long first,unsigned long n,const char *name)
**/proc/ioports查看分配情况
*访问 读写:inb/outb(8) inw/outw(16) inl/outl(32)
*释放 void release_region(unsigned long start,unsigned long n)
----操作I/O内存(1.申请 2.映射 3.访问 4.释放)
*申请 struct resource *request_mem_region(unsigned long stat,unsigned long len,char *name)
**/proc/iomem 查看分配情况
*物理地址到虚拟地址映射 void *ioremap(unsigned long phys_addr,unsigned long size)
*访问 ioread8/iowrite8 ioread16/iowrite16 ioread32/iowrite32
*释放
解除映射 void iounmap(void *addr)
释放资源 void release_mem_region(unsigned long start,unsigned long len)
4.混杂设备miscdevice
注册:int misc_register(struct miscdevice *misc)