文档详情

内存与端口映射.doc

发布:2016-11-22约4.3万字共11页下载文档
文本预览下载声明
A. 可重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误 在kernel/Resource.c中定义了全局变量ioport_resource和iomem_resource,分别描述基于I/O映射方式的I/O端口空间和基于内存映射方式的I/O内存资源空间(包括I/O端口和外设内存)。其定义如下:? ?struct?resource?ioport_resource? =??{?PCI?IO,?0x0000,?IO_SPACE_LIMIT,?IORESOURCE_IO?} struct?resource?iomem_resource ?=?{?PCI?mem,?0?0xffffffff,?IORESOURCE_MEM?} ?其中,宏IO_SPACE_LIMIT表示整个I/O空间的大小,对于X86平台而言,它是0xffff(定义在include/asm-i386/io.h头文件中)。显然,I/O内存空间的大小是4GB。 ●IO端口空间?的申请、检测、释放操作 基于I/O?Region的操作函数__XXX_region(),Linux在头文件include/linux/ioport.h中定义了三个对I/O端口空间进行操作的宏:①request_region()宏,请求在I/O端口空间中分配指定范围的I/O端口资源。②check_region()宏,检查?I/O端口空间中的指定I/O端口资源是否已被占用。③release_region()宏,释放I/O端口空间中的指定I/O端口资源。这三个宏的定义如下: 1???#define?request_region(start,n,name)??? __request_region(ioport_resource,?(start),?(n),?(name))? 2???#define?check_region(start,n)? ?__check_region(ioport_resource,?(start),?(n))? 3???#define?release_region(start,n)? ?__release_region(ioport_resource,?(start),?(n)) 其中,宏参数start指定I/O端口资源的起始物理地址(是I/O端口空间中的物理地址),宏参数n指定I/O端口资源的大小。 ●读写I/O端口空间 ?在驱动程序请求了I/O端口空间中的端口资源后,它就可以通过CPU的IO指定来读写这些I/O端口了。在读写I/O端口时要注意的一点就是,大多数平台都区分8位、16位和32位的端口,也即要注意I/O端口的宽度。 Linux中访问IO端口函数:inb(),inw(),inl(),outb(),outw(),outl(), “b”“w”“l”分别代表8位,16位,32位。 ●I/O内存资源的申请、检测、释放操作 基于I/O?Region的操作函数__XXX_region(),Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏: #define?request_mem_region(start,n,name)? ?__request_region(iomem_resource,?(start),?(n),?(name))? #define?check_mem_region(start,n)? ?__check_region(iomem_resource,?(start),?(n))? #define?release_mem_region(start,n)? __release_region(iomem_resource,?(start),?(n) 1) request_mem_region(),请求分配指定的IO内存资源   2) check_mem_region(),检查指定的IO内存资源是否已被占用 3) release_mem_region(),释放指定的IO内存资源 其中,参数start是IO内存区的物理地址(是CPU的RAM物理地址空间中的物理地址),参数n指定I/O内存资源的大小。   ●驱动开发人员可以将内存映射方式的IO端口和外设内存统一看作是IO内存资源。 ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。 ●读写IO内存资源 Linux中访问IO内存资函数:readb(),readw(),readl(),writeb(),writew(),
显示全部
相似文档