- 论坛徽章:
- 0
|
小弟最近在写一个小小小小的ARM RTOS,以前写过一个小小小小的 X86 OS caseyOS, 现在想将 caseyOS裁剪移植到开发板 TQ2440上
是这样的,我实现将 内核的3G - 4G-1地址全部只读共享给用户进程,因此在创建进程的时候必须要 copy_kernel_page_tbls
- #define INIT_L1_BASE (0x30100000) /* 16K */
- #define INIT_L2_BASE (0x30104000) /* 64k */
-
- #define KERNEL_IMG_SIZE (0x20000) /* 128 K */
- #define KERNEL_CODE_START (0xC0000000) /* 3G start */
-
- #define TTB_BASE (0x30000000)
- #define PAGE_DIR (TTB_BASE)
- #define TTB_FULL_SIZE (0x4000) /* 16K */
- #define PAGE_TABLE (TTB_BASE+TTB_FULL_SIZE)
-
- #define PAGE_DIR_SIZE (0x4000) /* 16k */
- #define PAGE_TBL_SIZE (0x10000) /* 64K */
-
- void copy_kernel_page_tbls (unsigned dest_ttb,unsigned vaddr,unsigned size)
- {
- if ((size & 0xFFFFF) || (vaddr & 0xFFFFF)) /* 1M alignment */
- panic ( "trying to copy page tables with non-1M alignment !\n" );
- volatile unsigned *_from_page_dir,*_to_page_dir;
-
- _from_page_dir = (volatile unsigned *)(TTB_BASE);
- _to_page_dir = (volatile unsigned *)dest_ttb;
-
- unsigned l1_idx;
- unsigned i = 0,j = 0,k = 0,page;
- volatile unsigned *_to_page_tbl,*_from_page_tbl;
-
- for (k = 0 ,size >>= 20 ; k < size ; k ++,vaddr += 0x100000 )
- {
- l1_idx = vaddr>>20;
- if ( !(_from_page_dir[l1_idx] & ~0x3FF))
- continue;
- if ( !(_to_page_dir[l1_idx] & ~0x3FF) ) { /* if dest page dir unit is empty */
- i = l1_idx & ~3;
- if ((_to_page_dir[i+0] & ~0x3FF) || (_to_page_dir[i+1] & ~0x3FF)
- || (_to_page_dir[i+2] & ~0x3FF) || (_to_page_dir[i+3] & ~0x3FF) )
- {
- panic ( "page dir corrupts with l1_idx %d !\n",l1_idx );
- }
- if (!(page = find_free_page ()))
- panic ( "no more free page !\n" ); /* alloc a page page dir*/
- wordset ((void*)page,AP_FAULT_ALL|CB|TTB1_SPG,0x1000); /* set all be fault */
-
- _to_page_dir[i+0] = (page + 0x000)|DOMAIN_SYS|TTB0_COARSE; /* small page 1st 1KB */
- _to_page_dir[i+1] = (page + 0x400)|DOMAIN_SYS|TTB0_COARSE; /* small page 2nd 1KB */
- _to_page_dir[i+2] = (page + 0x800)|DOMAIN_SYS|TTB0_COARSE; /* small page 3rd 1KB */
- _to_page_dir[i+3] = (page + 0xC00)|DOMAIN_SYS|TTB0_COARSE; /* small page 4th 1KB */
- }
- _from_page_tbl = (volatile unsigned*)(_from_page_dir[l1_idx] & ~(0x3FF));
- _to_page_tbl = (volatile unsigned*)(_to_page_dir[l1_idx] & ~(0x3FF));
-
- /* continue copying .... */
- for (j = 0 ; j < 256 ; j++ ) { /* 256 * 4K */
- if (_from_page_tbl[j] & ~0xFFF)
- _to_page_tbl[j] = _from_page_tbl[j]; /* FIXME : change attribute */
- }
- }
- }
复制代码 我是这么调用的,在 return_to_usr_mode 之前就分配好 text code 内存页,page dir 16K,然后开始拷贝内核页表- copy_kernel_page_tbls (INIT_L1_BASE,KERNEL_CODE_START,1<<30); /* 1G size */
复制代码 然后时钟 handler 是这样的-
- extern unsigned long __ticks;
-
- #define __DEBUG__
-
- static
- void schedlue ( void )
- {
- sync_dcaches ();
- invalidate_icaches ();
- invalidate_dcaches ();
-
- invalidate_tlbs();
- set_ttb_base(current_p->ttb_base);
- }
-
- void __do_timer0 (void)
- {
- static unsigned i = 0;
- ++ i;
- /* just 2 tasks */
- current_p = task_st[i & 1];
- __ticks ++;
-
- schedule ();
- }
复制代码 >>>> 请高手指点下,哪里出错了....
Any help appreciated !
|
|