VPOS 를 구성하고 있는 각 함수들의 명세를 설명하고 있다. 소스코드를 이해하는 데 도움이 될 것으로 믿는다.
각 source file 별로 분류했으며, 명세의 형식은 '함수명, 인자, 기능' 으로 분류했다.
Fs : FAT 파일 시스템(차후 지원 예정)
Hal : 하드웨어 의존적인 코드들이 포함(부트로더, 하드웨어 초기화, CPU 메모리 맵등)
Images : 컴파일 후에 오브젝트 파일들이 생성
Include : 각 헤더 파일들
Kernel : 커널의 핵심적인 부분을 가지고 있는 코드
Lib : 라이브러리들(c 파일형태)
Net : 차후 지원 예정
Objs : .c 파일이 컴파일되면, .o 파일이 모두 저장됨
Examples : 커널위에서 수행되는 예제 애플리케이션들
Shell : vpsh 쉘 관련 코드
여기서는 hal, kernel, shell, example 에서의 함수들만 설명한다.
OS 의 도움을 받아서 실행할 수 없기 때문에, 스스로 loading 하기 위해서 필요한 파일이다.
부트로더로서, 인터럽트 벡터 테이블을 정의하고 flash 에 저장되어 있는 커널을 메모리의 0x30000000 으로 복사한 뒤에, pc 를 0x30000000 으로 옮긴다.
하나의 .s 파일로 구성되어 있다.
부트로더에 의해서 메모리 0x30000000 으로 옮겨지면, 가장 먼저 수행되는 파일로서 하드웨어 초기화와 각 mode 에 대한 테스트를 한다.
수행 후에 마지막으로 c 코드 레벨인 kernel_start.c 파일의 vpos_kernel_main() 함수를 호출한다.
HAL_swi_handler.c
함수명 | vk_swi_classifier |
인자 | unsigned thread |
기능 | 쓰레드를 발생시킨, 소프트웨어 인터럽트(swi)가 발생하면 숫자를 통해 어떤 인터럽트인지 구분해서 각각 처리한다 |
함수명 | vk_enable_interrupt |
인자 | void |
기능 | 소프트 인터럽트 값(swi_number)에 EI(40) 을 입력하고, 소프트웨어 인터럽트를 발생시킨다 |
함수명 | vk_disable_interrupt |
인자 | void |
기능 | 소프트 인터럽트 값(swi_number)에 EI(41) 을 입력하고, 소프트웨어 인터럽트를 발생시킨다 |
함수명 | vk_swi_scheduler |
인자 | void |
기능 | 소프트 인터럽트 값(swi_number)에 EI(44) 을 입력하고, 소프트웨어 인터럽트를 발생시킨다 |
함수명 | vk_save_thread_ctx |
인자 | vk_thread_t *thread |
기능 | 소프트 인터럽트 값(swi_number)에 SC(42) 을 입력하고, 소프트웨어 인터럽트를 발생시킨다 |
함수명 | vk_restore_thread_ctx |
인자 | vk_thread_t *thread |
기능 | 소프트 인터럽트 값(swi_number)에 RC(43) 을 입력하고, 소프트웨어 인터럽트를 발생시킨다 |
함수명 | vh_swi |
인자 | unsigned thread |
기능 | swi 0x00 소프트웨어 인터럽트를 발생시킨다 |
주의 | 사용하지 않음에도 불구하고, 인자값을 받는 이유는 단순히 현재 스레드(thread)의 주소를 넘겨주기 위함이다 |
함수명 | vh_enable_interrupt |
인자 | vh_enable_interrupt |
기능 | 인터럽트를 활성화 시킴, spsr 레지스터의 7,6 번 레지스트를 1로 세팅 |
함수명 | vh_disable_interrupt |
인자 | vk_thread_t* thread |
기능 | 인터럽트를 비활성화 시킴, spsr 레지스터의 7 번 레지스트를 1로 세팅 |
부트로더와 마찬가지로 혼자서 메모리 상에 loading 하기 위해서 필요한 파일이다.
하드웨어와 관련한 헤더파일들이다. 거의 대부분 CPU 의 데이터 시트를 보면, 알 수 있는 것들이다.
CPU(s3c2410) 에 의존적인 파일이다. 거의 대부분 데이터 시트에 정의되어 있는 것들이다.
외부 i/o 디바이스에 대한 주소값을 정의한다.
각 디바이스에 비트연산을 할 때, 용이하게 하기 위해서 정의한다.
배리어(barrier) 에 관련한 함수들을 포함하고 있다. 배리어는 쓰레드를 멈추게 하는 함수이다. 배리어는 특정한 수의 쓰레드가 배리어에 도착할 때까지 쓰레드를 멈추게 한다. 원하는 만큼의 쓰레드가 도달하면 모든 쓰레드가 다시 진행된다.
함수명 | pthread_barrier_init |
인자 | pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned count(쓰레드 숫자와 waiter 배열을 가진 구조체와 속성 구조체, 총 쓰레드의 숫자) |
기능 | vk_barrier_t 구조체를 생성하고, 크기만큼 메모리를 할당 받는다. 여기서는 총 5개의 쓰레드를 배리어시킬 것이므로, waiter 배열을 초기화(NULL) 시킨다 |
함수명 | pthread_barrier_destroy |
인자 | pthread_barrier_t *barrier |
기능 | 스케줄러를 lock 시키고, waiter 배열을 초기화(NULL)시키고, 메모리를 반환(free) 하고, 다시 스케줄러를 unlock 한다 |
함수명 | pthread_barrier_wait |
인자 | pthread_barrier_t *barrier |
기능 | 스케줄러를 lock 시키고, 쓰레드가 수행된 순서대로 waiter 배열에 저장한다. 그리고 상태(state)를 SLEEP 로 변경하고, ready queue 에서 빼낸다. 스케줄러를 unlock 하고, vk_scheduler() 를 수행한다. waiter 배열의 순서대로 쓰레드의 상태를 READY 로 변경하고, 다시 ready queue 로 넣는다. 그리고 전에 저장되었던 waiter 배열에 NULL 값을 넣고, 스케줄러를 unlock 하고 vk_scheduler() 를 수행한다 |
example 의 cond_example 에서 사용하는 함수들을 포함하고 있다.
함수명 | pthread_cond_init |
인자 | pthread_cond_t* cond, const pthread_condattr_t* attr |
기능 | 조건 변수 cond 를 초기화 한다. attr 인자는 옵션이며, cond 의 속성을 명시한다 |
함수명 | pthread_cond_destroy |
인자 | pthread_cond_t *cond |
기능 | 더 이상 필요하지 않은 조건변수 cond 를 파괴한다. cond 는 더 이상 사용될 수 없다 |
함수명 | pthread_cond_wait |
인자 | pthread_cond_t *cond, pthread_mutex_t *mu |
기능 | 시그널이나 브로드캐스트에 의해 깨어날 때까지 조건변수 cond 에서 대기한다 |
함수명 | pthread_cond_signal |
인자 | pthread_cond_t *cond |
기능 | 조건변수 cond 로 시그널을 보내서, 대기 중인 쓰레드 하나를 깨운다. SCHED_FIFO 나 SCHED_ |
함수명 | pthread_cond_broadcast |
인자 | pthread_cond_t *cond |
기능 | 조건변수 cond 로 브로드캐스트를 하여 모든 대기자들을 깨운다 |