有小伙伴提出疑问,拜托TintSoft出一期关于外设驱动程序和CPU架构的关系以及外设驱动程序是否需要考虑CPU架构的问题。那么今天,它,来啦!

首先,我的回答是:设备驱动程序与CPU无关。我分为2大点给大家讲一下与CPU架构相关的操作以及不相关的操作,这样大家就可以判断外设驱动程序等相关软件是否需要考虑CPU架构啦!

 

一、与架构相关的操作:

IO 口操作、内存分配操作、 DMA 基本操作、中断初始化、系统时钟,这些操作和具体的 CPU 架构有很大的关系。也就是所谓的芯片级迁移。针对不同的 CPU 需要编写相应的各种底层函数,这些函数都是由内核的移植程序来完成的。在不同的系统应用中,内核对于同类型的 CPU 是可以通用的,只需在内核的基础上添加设备驱动即可,设备驱动程序既可以作为内核的一部分编译到内核中,也可以编译成可以动态加载的模块。

 

为特定的CPU编写内核需要硬件模拟器支持。例如,arch/i386目录下的所有文件都是为PC上的CPU编写的内核代码。。arch/arm目录下的所有文件都是ARM处理器的内核代码。因为台式计算机的CPU大多是Intel和AMD生产的,处理器之间的差别比较小,代码非常通用。对于 ARM 处理器,虽然 ARM 公司给出了规格说明,但 ARM 内核版本( arm 7 、 arm 9 )与同一内核不同厂商的处理器(飞利浦和三星 arm7 )还是有很大区别的。因此,可以在每个处理器的芯片级移植内核。

 

二、与架构无关的操作:

当我们已经有一个可移植内核的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端口的操作已经由内核移植者完成,因此可以直接使用。

 

还想了解什么欢迎关注TintSoft并留言,感谢观看!

点赞 ({{click_count}}) 收藏 (99)

Listary——高效文件搜索工具

10款黑科技小工具推荐,电脑必装!

7款小众软件推荐,每一款都是精品