본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]김정우-11월30일

by 알 수 없는 사용자 2011. 11. 30.
728x90
반응형

BrickOS
메모리 관리

make : 반자동 컴파일.
make clean : 코드작성시 수정가능한 파일들을 지운다. 수정할 필요없는 실행파일들은 남겨 놓는다.
make realclean : make관련 모든 파일을 다 지운다.....
(make realclean 했다가 폴더를 여러번 복사함....ㅠㅠ )

 




먼저....brickOS에서는 메모리를 커널과 유저의 두가지로 구분돼 있고 커널 코드와 커널의 스태틱  데이터는 0X8000번지에서 시작해 mm_start까지 위치 한다. 여기까지는 글로벌 변수라고 봐야 한다. mm_start부터 0xFFFF가지가 우리가 활용할 메모리 영역이다.


         <기본 메모리 블럭>
 우리가 사용하는 일반적인 운영체제에서의 메모리는 4바이트 단위로 블럭을 계산하고 int형도 4바이트 지만 여기서 사용할 메모리는 2바이트 word단위로 사용하면서 int가 2바이트 라는 것을 기억해야 한다.
위의 기본 메모리 블럭을 생각하며 다음내용을 보면 조금은 이해하기가 쉬울듯...


brickos.lds 에서 mm_start의 주소를 알아보면... 0x2E6A 라고 나와있다.

커널이 기동되는 동안, mm_init()함수에서 메모리를 초기화 한다.

 


mm_start_free가  최초의 프리 블럭을 가리키도록 설정 된다.소스에서 보면 mm_update_first_free(&mm_start);
에서 수행한다.
 초기화 과정은 MM_BLOCK_FREE(addr)과 MM_BLOCK_RESERVED(addr)이라는 2개의 매크로를 통해 이루어 진다.

초기화를 했으면 이제 malloc의 호출시 어떻게 코드가 되어 있는지 알아보자.
malloc명령을 하면 함수가 호출이 될것이다. 함수를 살펴 보면...


메모리에서 어찌어찌 하여 할당을 받았다. 이제 해제를 하는 것을 보자.
해제를 하기위해서는 얼마의 크기를 가지고 있는지를 알아야 한다. 위에서 할당 받을때 저장해놓은 크기를 확인하고 그만큼 반환을 하면 된다.


 

calloc 은 동적할당을 해주면서 메모리를 초기화 시켜주는 함수이다. 하지만 자신이 직접 하는것이 아니라 malloc과 memset을 가져다 쓰면서 마치 자신이 한것같이 행동하는 함수이다. 
 

void *calloc(size_t nmemb, size_t size) {
  void *ptr;
  size_t original_size = size;

  if (nmemb == 0 || size == 0)
    return 0;
 
  size*=nmemb;

  // if an overflow occurred, size/nmemb will not equal original_size
  if (size/nmemb != original_size)
    return 0;
  
  if((ptr=malloc(size))!=NULL) // malloc을 호출해 일을 시킨다.
    memset(ptr,0,size);  // 초기화를 자신이 하지 않고 memset을 시킨다.



mm_free_mem 
int mm_free_mem(void) {
  int free = 0;
  size_t *ptr;
  
#ifdef CONF_TM
  ENTER_KERNEL_CRITICAL_SECTION();
#endif

  // Iterate through the free list
  for (ptr = mm_first_free; 
       ptr >= &mm_start; 
       ptr += *(ptr+1) + MM_HEADER_SIZE) // 메모리 전 영역에돌면서 확인
    free += *(ptr+1);

#ifdef CONF_TM
  LEAVE_KERNEL_CRITICAL_SECTION();
#endif    
  return free*2; // 블럭단위로 계산했던것을 2를 곱해 바이트로 반환한다.
}



mm_defalg 함수는 블럭들을 서로 연결시켜 주는 함수이고
mm_reaper 함수는 메모리를 free시키는 함수이다. 이 함수는 어떠한 특정 tid에 사용되었던 블럭들을 모두 free시킨다. 또 mm_defalg함수를 내부에서 호출하기 때문에 free된 메모리들을서로 모으는 기능가지 한다.

 

728x90