linux驱动,该怎么解决

linux驱动
int emc_value;
static int emc_init(void)
{
 emc_value=register_chrdev(0,"emc",&emc_contrl);
if(emc_value<0)
{
printk("emc register failed!\n");
return 0;
}
else
{
printk("emc register sucess!\n");
}
   vdpm_start_address=(volatile unsigned long *)ioremap(dpm_start_address,4);
   vP2_MUX_CLR        =(volatile unsigned long *)ioremap(P2_MUX_CLR,4);
   vEMCStatus         =(volatile unsigned long *)ioremap(EMCStatus,4);
   vEMCConfig         =(volatile unsigned long *)ioremap(EMCConfig,4);
   vEMCStaticConfig  =(volatile unsigned long *)ioremap(EMCStaticConfig,4);
   vEMCStaticWaitWen =(volatile unsigned long *)ioremap(EMCStaticWaitWen,4);
   vEMCStaticWaitOen =(volatile unsigned long *)ioremap(EMCStaticWaitOen,4);
   vEMCStaticWaitRd0 =(volatile unsigned long *)ioremap(EMCStaticWaitRd0,4);
   vEMCStaticWaitwr  =(volatile unsigned long *)ioremap(EMCStaticWaitwr,4);
   vEMCStaticWaitTurn3=(volatile unsigned long *)ioremap(EMCStaticWaitTurn3,4);
   vEMCAHBControl0   =(volatile unsigned long *)ioremap(EMCAHBControl0,4);
   vEMCAHBControl3   =(volatile unsigned long *)ioremap(EMCAHBControl3,4);
   vEMCAHBTimeOut0   =(volatile unsigned long *)ioremap(EMCAHBTimeOut0,4);
   vEMCAHBTimeOut3   =(volatile unsigned long *)ioremap(EMCAHBTimeOut3,4);
   vEMCAHBControl4   =(volatile unsigned long *)ioremap(EMCAHBControl4,4);
   vEMCAHBTimeOut4   =(volatile unsigned long *)ioremap(EMCAHBTimeOut4,4);
   vEMCcontrl         =(volatile unsigned long *)ioremap(EMCcontrl,4);
   printk("emc_init sucess\n");
return 1;
}
static int emc_exit(void)
{
   
   iounmap(vdpm_start_address);
   iounmap(vP2_MUX_CLR);
   iounmap(vEMCStatus);
   iounmap(vEMCConfig);
   iounmap(vEMCStaticConfig);
   iounmap(vEMCStaticWaitWen);
   iounmap(vEMCStaticWaitOen);
   iounmap(vEMCStaticWaitRd0);
   iounmap(vEMCStaticWaitwr);
   iounmap(vEMCStaticWaitTurn3);
   iounmap(vEMCAHBControl0 );
   iounmap(vEMCAHBControl3);
   iounmap(vEMCAHBTimeOut0 );
   iounmap(vEMCAHBTimeOut3);
   iounmap(vEMCAHBControl4);
   iounmap(vEMCAHBTimeOut4);
   iounmap(vEMCcontrl);
   unregister_chrdev(emc_value,&emc_contrl);
return 1;
}

module_init(emc_init);
module_exit(emc_exit);
MODULE_LICENSE("Dual BSD/GPL");
这个是程序的一部分,我想在加载驱动的时候执行物理地址到虚拟地址的映射,程序那样映射是否合理呢?为什么在裸机下用物理地址操作程序没有问题,但是放了操作系统,把驱动加载进内核,程序没有反应了。

------解决方案--------------------
操作系统有它自己的内存管理机制,在系统初始化的时候已经决定了哪一部分进行虚实转化,哪一部分不进行虚实转化,你完全可以利用操作系统提供的虚实转化接口得到自己想要的虚/实地址.