大家好,又见面了,我是你们的朋友全栈君。
独立编址,统一编址: I/O地址空间与内存地址空间编址方式是否统一?例如51为统一编址,I/O和存储器总计64K地址空间;X86为独立编址,分为I/O地址空间和存储器地址空间。 IO空间,内存空间
X86:支持内存空间,IO空间,独立编址。 ARM,MIPS,PowerPC只支持内存空间,即统一编址。
IO端口和IO内存:对于X86系统区别很大,例如,网卡接口,可以连接在IO的这一组地址总线上,也可以连接在内存的这一组地址总线上,就可分别出现IO端口和IO内存的区别。
IO端口:当一个寄存器或内存位于IO空间时,称之为IO端口。
IO端口的操作:申请,访问,释放
申请:struct resource * __request_region(struct resource *parent, resource_size_t start, resource_size_t n, const char *name, int flags)
申请完以后,可以在/proc/ioports下面看到端口的占用情况。
访问:static inline int inb(unsigned long i) //读字节端口(8位) static inline void outb(char c, unsigned long i)//写字节端口(8位)其余访问16位,32位IO端口的函数为:inw,outw,inl,outl。
IO内存:当一个寄存器或内存位于内存空间时,称之为IO内存。
IO内存的操作:申请,映射,访问,释放
申请:request_mem_region(start, n, name)//start:申请的起始地址,n:申请的长度,name:申请使用区域的名字。
申请完以后,同样可以在/proc/iomem中查看iomem的使用情况。
映射:由于linux系统中不能直接使用物理地址,必须使用虚拟虚拟地址,所以对IO内存的操作,必须有一个映射的过程。
映射函数:ioremap(cookie, size)//cookie:物理地址,size :映射大小。
访问:访问IO内存,最好不要直接用*addr直接赋值的方式来完成,在某些情况下易出错,推荐使用内核已经提供的函数来完成。内核提供的函数有:ioread8,iowrite8,ioread16,iowrite16,ioread32,iowrite32等函数。而老版本的内核中也提供了例如:readb,writeb,readw,writew,readl,writel等函数
释放:iounmap()和release_mem_region()
冯·诺伊曼,哈佛结构: 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储 器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的 PIC16芯片的程序指令是14位宽度,而数据是8位宽度。 目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公 司的Z8系列、ATMEL公司的AVR系列和安谋公司的ARM9、ARM10和ARM11,51单片机也属于哈佛结构 冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。 目前使用冯·诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,英特尔公司的其他中央处理器、安谋公司的ARM7、MIPS公司的MIPS处理器也采用了冯·诺伊曼结构。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188517.html原文链接:https://javaforall.cn