【问题标题】:Simple coding error (potentially) in kernel code内核代码中的简单编码错误(可能)
【发布时间】:2011-11-21 04:13:08
【问题描述】:

以下是相关的结构体:

typedef struct OS_BM {
  void *free;                     /* Pointer to first free memory block      */
  void *end;                      /* Pointer to memory block end             */
  U32  blk_size;                  /* Memory block size   */ 
  U32  owner_one;                   
} *P_BM;

typedef struct NEW {                           //struct ADDED BY ME
  void *free;
  U8 pid;
} *P_GH;

这里是有问题的代码(只有“由我添加”部分):

void *rt_alloc_box (void *box_mem) {
  /* Allocate a memory block and return start address. */
  void **free;
#if !(defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
  int  irq_dis;

  irq_dis = __disable_irq ();
  free = ((P_BM) box_mem)->free;        
  if (free) {
   array[counter]->free=((P_BM) box_mem)->free; //ADDED BY ME- MAY NOT BE WORKING
   array[counter]->pid = rt_tsk_self();         //ADDED BY ME
   counter++;                                  //ADDED BY ME
    ((P_BM) box_mem)->free = *free;
  }
  if (!irq_dis) __enable_irq ();
#else
  do {
    if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0) {
      __clrex();
      break;
    }
  } while (__strex((U32)*free, &((P_BM) box_mem)->free));
#endif
  return (free);
}

int free_owner (void *box_mem, void *box){ //FUNCTION ADDED BY ME
   int i; 

   for(i = 0; i<8;i++){
      if (box == array[i]->free;){            //MAY NOT BE WORKING
         if(rt_tsk_self() ==  (array[i]->pid)) 
         return (0);
      }
   }
   return (1);

}

代码说明:第一个功能是与内存分配有关,但我需要对从池中分配的内存块添加保护/所有权。这就是为什么我将内存块地址以及进程 ID(从rt_tsk_self() 返回)放入我创建的额外全局数组中。第二个函数只是检查使用分配块的进程是否与创建的进程拥有相同的所有权(再次使用rt_tsk_self())。

实际问题: 注释为“可能无法正常工作”的行似乎不起作用,因为我确信我可以将进程 ID 放入数组并检查它是否有效在那里,但我不能对内存块地址做同样的事情。这很可能只是一个简单的编码错误,而不是概念上的错误。

【问题讨论】:

  • 会不会是说counter++; 应该改为counta++ 的那一行?
  • if 表达式中有多余的分号?
  • 很抱歉,它应该是所有这些的 COUNTER。我在原始代码中使用了 counta,但我担心它会混淆人们。

标签: c memory-management pointers


【解决方案1】:
 if (box == array[i]->free;){            //MAY NOT BE WORKING

这不应该是:

 if (box == *(array[i]->free)){            //MAY NOT BE WORKING

另外,不知何故比较 void 指针让我感到不安。

【讨论】:

  • 我正在尝试比较 box 的地址和不受 rt_alloc_box 函数影响的变量
  • 也 if (box == *(array[i]->free)) 似乎没有解决问题,因为它们现在是不同的类型
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2021-05-03
  • 2017-11-22
  • 2023-04-07
  • 2014-08-16
相关资源
最近更新 更多