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"); }
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; }