コード例 #1
0
ファイル: kheap.c プロジェクト: stupaq/sos-kernel
void* kmalloc(uint32_t len) {
	len += sizeof(kheader_t);

	kheader_t *cur_header = kheap_first, *prev_header = 0;
	while (cur_header) {
		if (cur_header->allocated == 0 && cur_header->length >= len) {
			split_chunk(cur_header, len);
			cur_header->allocated = 1;
			return (void*) ((uint32_t) cur_header + sizeof(kheader_t));
		}
		prev_header = cur_header;
		cur_header = cur_header->next;
	}

	uint32_t chunk_start;
	if (prev_header)
		chunk_start = (uint32_t) prev_header + prev_header->length;
	else {
		chunk_start = KHEAP_START;
		kheap_first = (kheader_t *) chunk_start;
	}

	alloc_chunk(chunk_start, len);
	cur_header = (kheader_t *) chunk_start;
	cur_header->prev = prev_header;
	cur_header->next = 0;
	cur_header->allocated = 1;
	cur_header->length = len;

	prev_header->next = cur_header;

	return (void*) (chunk_start + sizeof(kheader_t));
}
コード例 #2
0
ファイル: heap.c プロジェクト: shui8023/shui_os
//还是理解一下内核中的堆栈的到底是怎么一个概念,
void *kmalloc(uint32 len)
{
	//申请的内存必须加上头指针,用于管理内存的空间
	len += sizeof(heap_t);
	
	heap_t * cur_head = heap_first;
	heap_t * prev_head = 0;
	
	//第一次运行的时候为0,然后运行的时候,先判断已经使用过的内存中
	//有没有能用的,如果有能用的,则不用申请其他的内存使用
	while (cur_head) {
		if (cur_head->allocate == 0 && cur_head->length > len) {
			//切分len的长度的内存出来
			split_chunk(cur_head, len);
			//将这个内存头指针标示为1,标示已经使用
			cur_head->allocate = 1;
			/*
			 *这个目前不是很理解
			 */
			return (void *) ((uint32)cur_head + sizeof(heap_t));
		} 
		prev_head = cur_head;
		cur_head = cur_head->next;
	}

	uint32 chunk_start;

	//第一次执行,会执行else后面的代码,然后第二次初始化后执行正确的
	if (prev_head) {
		chunk_start = (uint32)prev_head + prev_head->length;
	} else {
		chunk_start = HEAP_START;
		heap_first = (heap_t *)chunk_start;
	}

	//就是把这个线性地址和物理地址形成映射
	alloc_chunk(chunk_start, len);
	//描述找个内存块的相关信息
	cur_head = (heap_t *) chunk_start;
	//连接到上一个已经藐视内存的结构体
	cur_head->prev = prev_head;
	cur_head->next = 0;
	cur_head->allocate = 1;
	cur_head->length = len;
	
	//将两个用过的内存块链接在一起
	if (prev_head) {
		prev_head->next = cur_head;
	}
	//申请的空间头部有heap_t这个结构体,只是描述这个内存块的信息
	//所以返回的地址必须是除去这个结构体的,由于内存向上增加
	return (void *)(chunk_start + sizeof(heap_t));

}
コード例 #3
0
ファイル: heap.c プロジェクト: Andiry/hurlex-doc
void *kmalloc(uint32_t len)
{
	// 所有申请的内存长度加上管理头的长度
	// 因为在内存申请和释放的时候要通过该结构去管理
	len += sizeof(header_t);

	header_t *cur_header = heap_first;
	header_t *prev_header = 0;

	while (cur_header) {
		// 如果当前内存块没有被申请过而且长度大于待申请的块
		if (cur_header->allocated == 0 && cur_header->length >= len) {
			// 按照当前长度切割内存
			split_chunk(cur_header, len);
			cur_header->allocated = 1;
			// 返回的时候必须将指针挪到管理结构之后
			return (void *)((uint32_t)cur_header + sizeof(header_t));
		}
		// 逐次推移指针
		prev_header = cur_header;
		cur_header = cur_header->next;
	}

	uint32_t chunk_start;

	// 第一次执行该函数则初始化内存块起始位置
	// 之后根据当前指针加上申请的长度即可
	if (prev_header) {
		chunk_start = (uint32_t)prev_header + prev_header->length;
	} else {
		chunk_start = HEAP_START;
		heap_first = (header_t *)chunk_start;
	}

	// 检查是否需要申请内存页
	alloc_chunk(chunk_start, len);
	cur_header = (header_t *)chunk_start;
	cur_header->prev = prev_header;
	cur_header->next = 0;
	cur_header->allocated = 1;
	cur_header->length = len;
	
	if (prev_header) {
		prev_header->next = cur_header;
	}

	return (void*)(chunk_start + sizeof(header_t));
}
コード例 #4
0
static void	*sub_get_bestfit(t_chunk **b_fit, unsigned long total_size,
				 t_chunk **flist, t_chunk **alist)
{
  t_chunk	*tmp_sbrk;

  (*b_fit)->magic = M_ALLOC;
  if ((*b_fit)->size > total_size + HEADER_SIZE
      && (tmp_sbrk = sbrk(0)) != (void *)FAIL
      && (void *)(*b_fit) + total_size <= (void *)tmp_sbrk)
    {
      split_chunk(*b_fit, total_size);
      put_in_list(&flist[MAPSIZE - 1], (*b_fit)->next);
      (*b_fit)->next = NULL;
    }
  put_in_list(&(alist[INDEX((*b_fit)->size)]), *b_fit);
  return ((t_chunk *)(*b_fit) + 1);
}
コード例 #5
0
ファイル: heap.c プロジェクト: liexusong/tiny-os
void *kmalloc(uint32_t len)
{
	heap_header_t *curr, *prev;
	uint32_t chunk_start;

	len += sizeof(heap_header_t); // include sizeof(heap_header_t)

	curr = heap_frist;
	prev = 0;

	while (curr) {
		if (curr->allocated == 0 && curr->length >= len) {
			split_chunk(curr, len);
			curr->allocated = 1;
			return (void *)((uint32_t)curr + sizeof(heap_header_t));
		}
		prev = curr;
		curr = curr->next;
	}

	if (prev) {
		chunk_start = (uint32_t)prev + prev->length;
	} else {
		chunk_start = HEAP_START_ADDR;
		heap_frist = (heap_header_t *)chunk_start;
	}

	alloc_chunk(chunk_start, len);

	curr = (heap_header_t *)chunk_start;
	curr->prev = prev;
	curr->next = 0;
	curr->allocated = 1;
	curr->length = len;

	if (prev) {
		prev->next = curr;
	}

	return (void *)(chunk_start + sizeof(heap_header_t));
}
コード例 #6
0
static void
occupy_chunk( SurfaceManager *manager, Chunk *chunk, SurfaceBuffer *buffer, int length )
{
     D_MAGIC_ASSERT( manager, SurfaceManager );
     D_MAGIC_ASSERT( chunk, _Chunk_ );

     if (buffer->policy == CSP_VIDEOONLY)
          manager->available -= length;

     chunk = split_chunk( chunk, length );

     D_DEBUG_AT( Core_SM, "Allocating %d bytes at offset %d.\n", chunk->length, chunk->offset );

     buffer->video.health = CSH_RESTORE;
     buffer->video.offset = chunk->offset;
     buffer->video.chunk  = chunk;

     chunk->buffer = buffer;

     manager->min_toleration++;
}
コード例 #7
0
ファイル: heap.c プロジェクト: micnaelyuanfeng/BitCoinOS
void *kmalloc(uint32_t len){
  len += sizeof(header_t);

  header_t *cur_header = heap_first;
  header_t *prev_header = 0;

  while(cur_header){
    if(cur_header->allocated == 0 && cur_header->length >= len){
      split_chunk(cur_header, len);
      cur_header->allocated = 1;
      return (void *)((uint32_t)cur_header + sizeof(header_t));
    }

    prev_header = cur_header;
    cur_header = cur_header->next;
  }

  uint32_t chunk_start;

  if(prev_header){
    chunk_start = (uint32_t)prev_header + prev_header->length;
  }
  else{
    chunk_start = HEAP_START;
    heap_first = (header_t *)chunk_start;
  }

  //check if need RAM
  alloc_chunk(chunk_start, len);
  cur_header = (header_t *)chunk_start;
  cur_header->prev = prev_header;
  cur_header->next = 0;
  cur_header->allocated = 1;
  cur_header->length = len;

  if(prev_header)
    prev_header->next = cur_header;

  return (void*)(chunk_start + sizeof(header_t));
}