免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1945 | 回复: 1
打印 上一主题 下一主题

[操作系统] ttb_base 切换出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-11 16:58 |只看该作者 |倒序浏览
小弟最近在写一个小小小小的ARM RTOS,以前写过一个小小小小的 X86 OS caseyOS, 现在想将 caseyOS裁剪移植到开发板 TQ2440上
是这样的,我实现将 内核的3G - 4G-1地址全部只读共享给用户进程,因此在创建进程的时候必须要 copy_kernel_page_tbls

  1. #define INIT_L1_BASE        (0x30100000)            /* 16K */
  2.     #define INIT_L2_BASE        (0x30104000)            /* 64k */
  3.    
  4.     #define KERNEL_IMG_SIZE     (0x20000)               /* 128 K */  
  5.     #define KERNEL_CODE_START   (0xC0000000)            /* 3G start */
  6.    
  7.     #define TTB_BASE            (0x30000000)         
  8.     #define PAGE_DIR            (TTB_BASE)         
  9.     #define TTB_FULL_SIZE       (0x4000)                /* 16K */   
  10.     #define PAGE_TABLE          (TTB_BASE+TTB_FULL_SIZE)                 
  11.    
  12.     #define PAGE_DIR_SIZE       (0x4000)                /* 16k */
  13.     #define PAGE_TBL_SIZE       (0x10000)               /* 64K */
  14.    
  15.     void copy_kernel_page_tbls (unsigned dest_ttb,unsigned vaddr,unsigned size)
  16.     {
  17.         if ((size & 0xFFFFF) || (vaddr & 0xFFFFF))                            /* 1M alignment */
  18.             panic ( "trying to copy page tables with non-1M alignment !\n" );
  19.         volatile unsigned *_from_page_dir,*_to_page_dir;
  20.    
  21.         _from_page_dir = (volatile unsigned *)(TTB_BASE);
  22.         _to_page_dir = (volatile unsigned *)dest_ttb;
  23.    
  24.         unsigned l1_idx;
  25.         unsigned i = 0,j = 0,k = 0,page;
  26.         volatile unsigned *_to_page_tbl,*_from_page_tbl;
  27.    
  28.         for (k = 0 ,size >>= 20 ; k < size ; k ++,vaddr += 0x100000 )
  29.         {
  30.             l1_idx = vaddr>>20;
  31.             if ( !(_from_page_dir[l1_idx] & ~0x3FF))
  32.                 continue;
  33.             if ( !(_to_page_dir[l1_idx] & ~0x3FF) ) {                       /* if dest page dir unit is empty */
  34.                 i = l1_idx & ~3;
  35.                 if ((_to_page_dir[i+0] & ~0x3FF) || (_to_page_dir[i+1] & ~0x3FF)
  36.                 ||  (_to_page_dir[i+2] & ~0x3FF) || (_to_page_dir[i+3] & ~0x3FF) )
  37.                 {
  38.                     panic ( "page dir corrupts with l1_idx %d !\n",l1_idx );
  39.                 }
  40.                 if (!(page = find_free_page ()))
  41.                     panic ( "no more free page !\n" );                      /* alloc a page page dir*/
  42.                 wordset ((void*)page,AP_FAULT_ALL|CB|TTB1_SPG,0x1000);      /* set all be fault  */
  43.    
  44.                 _to_page_dir[i+0] = (page + 0x000)|DOMAIN_SYS|TTB0_COARSE;  /* small page 1st 1KB */
  45.                 _to_page_dir[i+1] = (page + 0x400)|DOMAIN_SYS|TTB0_COARSE;  /* small page 2nd 1KB */
  46.                 _to_page_dir[i+2] = (page + 0x800)|DOMAIN_SYS|TTB0_COARSE;  /* small page 3rd 1KB */
  47.                 _to_page_dir[i+3] = (page + 0xC00)|DOMAIN_SYS|TTB0_COARSE;  /* small page 4th 1KB */
  48.             }
  49.             _from_page_tbl = (volatile unsigned*)(_from_page_dir[l1_idx] & ~(0x3FF));
  50.             _to_page_tbl = (volatile unsigned*)(_to_page_dir[l1_idx] & ~(0x3FF));
  51.    
  52.             /* continue copying .... */
  53.             for (j = 0 ; j < 256 ; j++ ) {                                  /* 256 * 4K */
  54.                 if (_from_page_tbl[j] & ~0xFFF)
  55.                     _to_page_tbl[j] = _from_page_tbl[j];                    /* FIXME : change attribute */
  56.             }
  57.         }
  58.     }
复制代码
我是这么调用的,在 return_to_usr_mode 之前就分配好 text code 内存页,page dir 16K,然后开始拷贝内核页表
  1.   copy_kernel_page_tbls (INIT_L1_BASE,KERNEL_CODE_START,1<<30);           /* 1G size */
复制代码
然后时钟 handler 是这样的
  1.    
  2. extern unsigned long __ticks;
  3.    
  4.     #define __DEBUG__
  5.    
  6.     static   
  7.     void schedlue ( void )
  8.     {
  9.             sync_dcaches ();
  10.             invalidate_icaches ();
  11.             invalidate_dcaches ();
  12.    
  13.             invalidate_tlbs();                                 
  14.             set_ttb_base(current_p->ttb_base);                        
  15.     }
  16.         
  17.     void __do_timer0 (void)
  18.     {
  19.         static unsigned i = 0;
  20.         ++ i;
  21.         /* just 2 tasks */
  22.             current_p = task_st[i & 1];                       
  23.             __ticks ++;
  24.    
  25.             schedule ();
  26.     }
复制代码
>>>> 请高手指点下,哪里出错了....
Any help appreciated !

论坛徽章:
0
2 [报告]
发表于 2013-05-11 17:06 |只看该作者
新人,学习下     
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP