天津做网站的公司,济宁网站建设 企业谷,沛县网站定制,wordpress商店如何添加商品在linux kernel 中#xff0c;物理地址是不能直接使用的#xff0c;必须通过转换才可以。转换分为两种#xff0c; 静态和动态。 静态就是下面那种#xff0c;不过#xff0c;静态的地址转换#xff0c;还需要在kernel 初始化的时候作映射。 动态映射是使用 ioremap 函…在linux kernel 中物理地址是不能直接使用的必须通过转换才可以。转换分为两种 静态和动态。 静态就是下面那种不过静态的地址转换还需要在kernel 初始化的时候作映射。 动态映射是使用 ioremap 函数 。 [cpp] view plaincopy #define SL2312_GPIO_BASE 0x4D000000 #define IO_ADDRESS(x) (((X)0x0fffffff)(((x)4)0x0f000000)0xf0000000) #define GEMINI_GPIO_BASE1 IO_ADDRESS(SL2312_GPIO_BASE) linux 有内存保护机制无论是内核态还是用户态。 静态映射 是在物理地址上加一个偏移量 所以虚拟地址是固定的。 动态映射 系统会生成一个虚拟地址对应到物理地址上虚拟地址不是固定的。 linux在初始化运行时会根据一个map_desc的数组中的物理地址进行静态映射0x4D000000地址应该就是这样映射的。 静态映射的地址无须使用icoremap函数只要知道在map_desc数组中物理地址与虚拟地址的移仿就可以了。 至于驱动程序中关于物理地址是不是都要转换呢这个是当然的linux是运行在虚拟地址的。 任何程序不能访问物理地址都必须转换为物理地址才能访问。只不过在内核空间已经是转换好了的如前所述可以随便的访问。 动态映射是由Linux内核统一管理当使用kmalloc分配在内核空间和malloc函数申请时内核会找到一块空余的物理内存并在页表中动态地添加一项其与虚拟地址对应的表项。 静态映射那应该就是LINUX在初始化阶段读取map_desc数组进行的地址映射map_desc中包括了一对对的物理地址和虚拟地址的对应关系这个可以根据硬件修改其中的虚拟地址必须是内核空间的例如SDRAM的物理是0x30000000 那么可以将其映射为0xe0000000. 通过静态映射后的地址一般之后就不会更改了的除非你想办法改掉。 注以上均摘自论坛仅供参考不对的请指正谢谢