硬件访问
1.寄存器与内存的区别在那里呢??
寄存器和RAM的主要不同在于:寄存器操作有副作用(side effect或边际效果),读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。
2.内存与I/O
在X86处理器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的X86系统中,I/O空间大小为64K,内存空间大小为4G
把不同的硬件安排到不同的地址空间中
比如:网卡和内存安排到内存地址空间。并口安排在IO地址空间
支持IO地址空间是硬件特性(与CPU有关)不是软件特征
3.IO端口与ID内存
IO端口:当一个寄存器或内存位于IO空间时,称其为IO端口
IO内存:当一个寄存器或内存位于内存空间时,称其为IO内存
这是由硬件连线决定的
4.对IO端口的操作
1.申请2.访问3.释放
1.申请:
request_region(first,n,name)//这个函数告诉内核,你要使用从first开始的n个端口,name参数是设备的名字。如果申请成功,返回非NULL,申请失败返回NULL。
在/proc/ioports中展示有系统中端口的分配情况
2.访问
IO端口可分为8、16、32位端口,LINUX内核头文件(体系依赖头文件<asm/io.h>)定义了下列内联函数来访问IO端口:
unsigned inb(unsigned port)
读取字节端口(8位宽)
void outb(unsigned char byte,unsigned port)
写字节端口(8位宽)
inw()
outw()
inl()
outl()
3.当使用完一组IO端口(通常在卸载驱动时),应使用如下函数把他返还给系统。
void release_region()
5.对IO内存的使用
1.申请2.映射3.访问4.释放
1.申请
request_mem_region(start,len,name)//这个函数申请一个从start开始长度为len字节的内存区。如果成功,返回非NULL,否则范围NULL
在/proc/iomem中列出
2.映射
物理地址到虚拟地址的映射
ioremap(phys_addr,size)
返回虚拟地址
3.访问
ioread8(addr)
ioread16(addr)
ioread32(addr)
iowrite8(value,addr)
iowrite16(value,addr)
iowrite32(value,addr)
4.释放
iounmap(addr)
release_mem_region()
混杂设备驱动
1.概述
在LINUX中存在一类字符设备,他们共享一个主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)
所有混杂设备形成一个链表,对设备访问时,内核根据次设备号查找到相应的miscdevice设备。
其根本是字符设备。
可能是为了节省主设备号,其主设备号都是10
2.描述
使用struct miscdevice来描述
成员中包含次设备号,设备名,文件操作(file_operations)等
3.注册
使用misc_register来注册一个混杂设备驱动
int misc_register(struct miscdevice* misc)
1.寄存器与内存的区别在那里呢??
寄存器和RAM的主要不同在于:寄存器操作有副作用(side effect或边际效果),读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。
2.内存与I/O
在X86处理器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的X86系统中,I/O空间大小为64K,内存空间大小为4G
把不同的硬件安排到不同的地址空间中
比如:网卡和内存安排到内存地址空间。并口安排在IO地址空间
支持IO地址空间是硬件特性(与CPU有关)不是软件特征
3.IO端口与ID内存
IO端口:当一个寄存器或内存位于IO空间时,称其为IO端口
IO内存:当一个寄存器或内存位于内存空间时,称其为IO内存
这是由硬件连线决定的
4.对IO端口的操作
1.申请2.访问3.释放
1.申请:
request_region(first,n,name)//这个函数告诉内核,你要使用从first开始的n个端口,name参数是设备的名字。如果申请成功,返回非NULL,申请失败返回NULL。
在/proc/ioports中展示有系统中端口的分配情况
2.访问
IO端口可分为8、16、32位端口,LINUX内核头文件(体系依赖头文件<asm/io.h>)定义了下列内联函数来访问IO端口:
unsigned inb(unsigned port)
读取字节端口(8位宽)
void outb(unsigned char byte,unsigned port)
写字节端口(8位宽)
inw()
outw()
inl()
outl()
3.当使用完一组IO端口(通常在卸载驱动时),应使用如下函数把他返还给系统。
void release_region()
5.对IO内存的使用
1.申请2.映射3.访问4.释放
1.申请
request_mem_region(start,len,name)//这个函数申请一个从start开始长度为len字节的内存区。如果成功,返回非NULL,否则范围NULL
在/proc/iomem中列出
2.映射
物理地址到虚拟地址的映射
ioremap(phys_addr,size)
返回虚拟地址
3.访问
ioread8(addr)
ioread16(addr)
ioread32(addr)
iowrite8(value,addr)
iowrite16(value,addr)
iowrite32(value,addr)
4.释放
iounmap(addr)
release_mem_region()
混杂设备驱动
1.概述
在LINUX中存在一类字符设备,他们共享一个主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)
所有混杂设备形成一个链表,对设备访问时,内核根据次设备号查找到相应的miscdevice设备。
其根本是字符设备。
可能是为了节省主设备号,其主设备号都是10
2.描述
使用struct miscdevice来描述
成员中包含次设备号,设备名,文件操作(file_operations)等
3.注册
使用misc_register来注册一个混杂设备驱动
int misc_register(struct miscdevice* misc)

本文详细介绍了硬件访问的基本概念,包括寄存器与内存的区别、内存与I/O的关系,以及如何操作IO端口和IO内存。同时,还探讨了混杂设备驱动的结构、注册方法及其在Linux系统中的应用。
2180

被折叠的 条评论
为什么被折叠?



