Exemplo n.º 1
0
 void algo8_2_main()
 {
   int i,n;
   FreeList a;
   Space q[N]={NULL}; // q数组为占用块的首地址
   printf("sizeof(WORD)=%u m=%u int(pow(2,m))=%u\n",sizeof(WORD),m,int(pow(2,m)));
   for(i=0;i<=m;i++) // 初始化a
   {
     a[i].nodesize=int(pow(2,i));
     a[i].first=NULL;
   }
   r=a[m].first=new WORD[a[m].nodesize]; // 在最大链表中生成一个结点
   if(r) // 生成结点成功
   {
     r->llink=r->rlink=r; // 初始化该结点
     r->tag=0;
     r->kval=m;
     Print(a);
     PrintUser(q);
     n=100;
     q[0]=AllocBuddy(a,n); // 向a申请100个WORD的内存(实际获得128个WORD)
     printf("申请%d个字后,可利用空间为:\n",n);
     Print(a);
     PrintUser(q);
     n=200;
     q[1]=AllocBuddy(a,n); // 向a申请200个WORD的内存(实际获得256个WORD)
     printf("申请%d个字又",n);
     n=220;
     q[2]=AllocBuddy(a,n); // 向a申请220个WORD的内存(实际获得256个WORD)
     printf("申请%d个字后,可利用空间为:\n",n);
     Print(a);
     PrintUser(q);
     Reclaim(a,q[1]); // 回收q[1],伙伴不空闲
     printf("回收q[1]后,可利用空间为:\n");
     Print(a);
     PrintUser(q);
     Reclaim(a,q[0]); // 回收q[0],伙伴空闲
     printf("回收q[0]后,可利用空间为:\n");
     Print(a);
     PrintUser(q);
     Reclaim(a,q[2]); // 回收q[2],伙伴空闲,生成一个大结点
     printf("回收q[2]后,可利用空间为:\n");
     Print(a);
     PrintUser(q);
   }
   else
     printf("ERROR\n");
 }
Exemplo n.º 2
0
 int acoral_link_app(App_Info appInfo)
{
	struct file *fp;            //file pointer
	mm_segment_t old_fs;        
    loff_t pos = 0;
	void __iomem *add;          //temp address
	unsigned int  file_len = 0; //file length
	int index;                  //which appMemInfo

    struct   timeval   start,stop;

    //App_para *para; 
    WORD_b *app_blk = 0;        //store app.o
    WORD_b *para_blk = 0;       //store app para struct
    WORD_b *ret_blk = 0;        //store app return value

    do_gettimeofday(&start);
    //App_Info appInfo = appInfo_t;
    //printk("filename:%s\n", appInfo.filename);
    //printk("para:%x\n", appInfo.para);
    //printk("ret:%x\n", appInfo.ret);
    //printk("parasize:%d\n",appInfo.parasize);
    //printk("acoral enter\n");
    fp = filp_open(appInfo.filename, O_RDONLY , 0644);
   	if (IS_ERR(fp)) {
         printk("create file error\n");
        return -1;
     }
    old_fs = get_fs();      //get_fs是取得当前的地址访问限制值
    set_fs(KERNEL_DS);  //set_fs是设置当前的地址访问限制值  KERNEL_DS会跳过地址检查
	
	 file_len = vfs_llseek(fp, 0, SEEK_END);//get file length
     
     /*find free appMemInfo struct*/
    local_irq_disable();
    while((index = find_and_set_bit_appMemInfo(appMemInfo_bitmap)) < 0);
    local_irq_enable();    
    printk("index: %d\n", index);


	app_blk = AllocBuddy(AllList, file_len);
    if(app_blk == 0)
    {
        printk("alloc error\n");
        return -1;
    }
    para_blk = AllocBuddy(AllList, appInfo.parasize);
    if(para_blk == 0)
    {
        printk("para_blk error\n");
        return -1;
    }
    ret_blk = AllocBuddy(AllList, appInfo.retsize);
    if(ret_blk == 0)
    {
        printk("ret_blk error\n");
        return -1;
    }
    
    //translate the virtuel address to physical address
    memcpy(para_blk->addr, appInfo.para, appInfo.parasize);
	appMemInfo[index].addr = app_blk->addr - first_blk_phy + ALLOC_MEM_START;//virt_to_bus(blk->addr);
    appMemInfo[index].para = para_blk->addr - first_blk_phy + ALLOC_MEM_START;//virt_to_bus(para_blk->addr);
    appMemInfo[index].ret = ret_blk->addr - first_blk_phy + ALLOC_MEM_START;
    appMemInfo[index].com_index = index;    /////which com
    appMemInfo[index].prio = appInfo.prio;
/*
    memcpy(&appMemInfo[1], &appMemInfo[0], sizeof(App_Mem_Info));
    memcpy(&appMemInfo[2], &appMemInfo[0], sizeof(App_Mem_Info));

    acoral_tasks = 3;
    appMemInfo[0].task_start = 0;
    appMemInfo[1].task_start = 150;
    appMemInfo[2].task_start = 300;
    */
   // printk("blk_addr:%x\n", appMemInfo[index].addr);
    //printk("para: %x\n", appMemInfo[index].para);
    //printk("ret: %x\n", appMemInfo[index].ret);
    printk("prio:%d\n", appMemInfo[index].prio);

    //para = (App_para *)(para_blk->addr);
    //printk("%d : %d\n", para->para1, para->para2);
	add = (void __iomem *)(app_blk->addr);
	if(vfs_read(fp, add, file_len, &pos) != file_len)
	{
		printk("vfs_read err\n");
		return -1;
	}
	
     //printk("read file length: %d\n", file_len);

     filp_close(fp, NULL);
     set_fs(old_fs);         //恢复地址访问限制值

     do_gettimeofday(&stop);
    timeval_subtract("para_time",&start,&stop); 
	send_ipi(ACORAL_IPI_INT3_CPU1_APP);
   // wait_for_completion(&memInfo[index].com);
    //init_completion(&acoral_com);
    wait_for_completion(&acoral_com[index]);

    //printk("result:%d ret: %d\n", *(ret_blk->addr), *(int *)appInfo.ret);
    //printk("retadd:%x\n", appInfo.ret);

    do_gettimeofday(&start);
    memset(&appMemInfo[index], 0, sizeof(App_Mem_Info));
    if(copy_to_user(appInfo.ret, ret_blk->addr, appInfo.retsize)) 
        return -EFAULT;
   // free_bit_appMemInfo(index, appMemInfo_bitmap);
    FreeBuddy(AllList, app_blk);
    FreeBuddy(AllList, para_blk);
    FreeBuddy(AllList, ret_blk);
    do_gettimeofday(&stop);
    timeval_subtract("trans_ret_time",&start,&stop); 
	//return appMemInfo[index].ret;;
    return 0;
}