IO端口是指接口電路中能夠被CPU直接訪問的寄存器,一般有數據端口、控制端口和狀態端口。每個連接到IO總線的設備都有自己的地址(集合),即端口,可以被映射到物理地址空間。
IO內存和IO端口的主要區別是,IO端口操作具有邊際效應,而內存則沒有(所以可以用多種方法進行優化,比如重新排序、告訴緩存等)。
使用IO內存前要先申請request_mem_region,然後ioremap映射;使用IO port前要用request_region請求。Linux維護全局變量ioport_resource和iomem_resource,每次request的時候從其中分配。PCI設備所需的內存基址在啓動的時候已經有BIOS設定,所以在driver中需request_mem_region(base,length)聲明。
request_region和request_mem_region僅僅申請資源。io region爲0~64k,mem爲0~4G。申請後僅該驅動程序可以使用該資源。
request_mem_region 函數返回resource指針,ioremap函數將該物理地址映射成內核虛擬地址(內部用vm_struct組織,跟vmalloc類似)。
ioport_map用於將io port映射成內核虛擬地址。