Linux内核访问外设I/O资源

 关于Linux内核访问外设I/O资源的方式,dongas的博文说的很好了,转过来做个备份,地址:http://blog.chinaunix.net/space.php?uid=20643761&do=blog&id=1594857

但该篇文章有点老,这里再加一点自己的理解。

一般情况下编写驱动时是用动态映射(ioremap)方式的,因为不关注像Mach-s3c2410这样的板级文件的话,不会知道有哪些外设I/O资源被静态映射(map_desc)过。驱动开发人员会自己用ioremap动态映射,也更便于移植。但静态方式也有它的用处,像上文中说的音频编解码buffer等。

还要注意这个宏:MACHINE_START(SMDK2410, "SMDK2410") 。目前linux已经被移植到众多的平台上,源码Arch文件夹下有一堆的文件夹(平台),自己用的板子在启动时是怎么识别到相应的系统呢?这就是这个宏的功能。比如原文中对于SMDK2410,是这样定义的:

MACH_TYPE_SMDK2410定义在arch/include/asm-arm/mach-types.h内,值为193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410             193

我们称它为机器码,它是惟一的,每个系统都有一个相应的机器码(或者也可以共享别人的机器码移植)。比如我的开发板mini2440是1999。开发板的uboot中会被传递一个机器码,告知要启动哪个系统,当二者相同时,uboot才会启动相应的系统。

原文中虚拟地址的起始位置在0xF0000000,有定义 :#define S3C2410_ADDR(x)        ((void __iomem *)0xF0000000 + (x)) ,6.32内核中被定义为0xF4000000。内核空间是从3G(0xc0000000)开始的,要定义在这个范围之后。

不知道理解的对不对,望指正。

你可能感兴趣的:(Linux内核访问外设I/O资源)