二、与架构无关的操作:
当我们已经有一个可移植内核的CPU,所有的操作都不必考虑架构,即使你编写了设备驱动程序,你也不必担心底层的细节,因为所有移植的内核都为上层提供了相同的接口(内存分配、中断分配、 IO 端口)。驱动程序编写者面临更多的板级开发支持,技术难度比前面提到的芯片级支持要容易得多。写一个好的设备驱动程序还是需要了解内核的机制。
例如:
基于i386的CPU,驱动程序开发我们使用kmalloc调用内存分配;
基于ARM CPU的驱动程序开发我们称之为内存分配仍然使用kmalloc。
因此,对于驱动程序的开发者来说,往往不必太担心 kalloc 函数的实现,而对于芯片级的迁移,开发者必须具体实现 kmallocc 函数。实际上i386和arm kmalloc的实现还是有很大区别的。再看一下 linux 内核的文件组织,我们发现 drivers 目录和 arch 目录是一级的。在这就说明了驱动程序是平台无关的, i386 架构的驱动程序可以不加修改地移植到 ARM 架构上。虽然驱动程序可以独立于 CPU 架构,但它与主板的配置有关。
例如,以8255并行端口芯片为例,它可以作为并行端口扩展应用到任何CPU平台,在i386架构中,我们的CPU是P4,并行端口扩展使用8255。在ARM架构中,CPU为LH7A404(夏普的ARM9),并行端口扩展仍然使用8255。
如果你找到了一个基于8255的并行端口驱动程序,恭喜你,你不用自己写驱动程序了,而且它不是拿过来就可以用的。。这与上面的说法并不矛盾,因为 P4 平台 8255 和 LH 7A404 的 IO 地址并不一定相同。。如果在 P4 平台上 8255 的 IO 地址是 0X0378 - 0x037f ,而 I / O 地址为 0xc00248 - 0Xc0000024f 的 LH 7A404 平台,您需要修改地址定义。。这些地址是在设计主板时由电路本身决定的。在i386中,端口和内存分别寻址,端口使用16位地址。在ARM中,端口和内存是统一寻址的,使用32位地址,而由于IO端口的操作已经由内核移植者完成,因此可以直接使用。