일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- HTML
- CSS
- 정보처리기사
- TiL
- 큐
- 리액트
- 나만무
- JavaScript
- 핀토스
- 알고리즘
- corou
- 프로그래머스
- 코드트리
- 소켓
- Flutter
- 모션비트
- 4기
- defee
- 크래프톤 정글
- userprog
- 백준
- Vue.js
- 사이드프로젝트
- 시스템콜
- 스택
- pintos
- 자바스크립트
- 크래프톤정글
- Java
- 자바
- Today
- Total
목록크래프톤 정글/pintOS (8)
문미새 개발일지
process.c 더보기 // 명령줄 인자를 스택에 배치한다. void argument_stack (char **argv, int argc, struct intr_frame *if_){ int minus_addr; int address = if_->rsp; // 스택 포인터(rsp)의 현재 위치를 담는다. // 인자를 거꾸로 넣기 위해 마지막부터 루프 for (int i = argc-1; i >= 0;i-- ){ // 현재 인자의 길이 + '\0'(1개)를 minus_addr에 저장 minus_addr = strlen(argv[i]) + 1; //if onearg, value = 7 address -= minus_addr; // 인자 크기만큼 address를 감소시켜 저..
syscall.c 더보기 #define MSR_STAR 0xc0000081 /* 세그먼트 셀렉터 MSR, 64비트 모드로 전환할 때 사용되는 셀렉터를 저장 */ #define MSR_LSTAR 0xc0000082 /* 롱 모드 SYSCALL 목표 주소를 저장하는 MSR */ #define MSR_SYSCALL_MASK 0xc0000084 /* 실행 시 EFLAGS 레지스터에 적용될 마스크를 저장한다. */ MSR_STAR (0xc0000081) : 시스템 콜이나 리턴 시 CS와 SS 세그먼트 레지스터를 로드하는데 사용 MSR_LSTAR 0xc0000082 : 64비트에서 syscall 명령어가 실행될 때, CPU는 이 레지스터에 저장된 주소로 점프MSR_SYSCALL_MASK 0xc00..
Krafton Jungle Week 8~9 Team 6 WIL Argument Passing project2의 메인인 시스템 콜을 만들기에 앞서 Argument Passing을 구현해야 했다. Argument Passing이란, main 함수로 들어오는 명령어를 구분하여 인자로 전달하는 것이다. 우선 init.c 안에 있는 main() 함수의 read_command_line() 함수가 커맨드라인으로 들어오는 인자를 받아와 저장한다. (예: -q -f put args-single run 'args-single onearg') 이 후 일차적으로 파싱을 통해 -q와 -f등의 플래그들을 제거한 후 남은 부분을 run_actions로 전달해준다. run_actions -> run tasks 등을 거쳐 args-s..
synch.c 더보기 // 세마포어 초기화 void sema_init (struct semaphore *sema, unsigned value) { ASSERT (sema != NULL); // 세마포어가 없으면 종료 sema->value = value; // 해당 세마포어의 value값을 인자의 value로 저장 list_init (&sema->waiters); // 해당 세마포어의 대기자를 매개로 list 초기화 } 더보기 // 세마 감소(스레드 잠금 획득) void sema_down (struct semaphore *sema) { enum intr_level old_level; ASSERT (sema != NULL); ASSERT (!intr_cont..
thread.c - mlfqs 더보기 // 스레드의 고급 우선순위를 계산 int calculate_advanced_priority(struct thread* t){ // priority = PRI_MAX - (recent_cpu / 4) - (nice * 2) 공식 이용 int advanced_priority; advanced_priority = PRI_MAX - ROUND_TO_INT(DIV_INT(t->recent_cpu, 4)) - t->nice_value * 2; return advanced_priority; } 더보기 // 현재 스레드의 nice값 설정 void thread_set_nice (int ni..
thread.c 더보기 // advanced scheduling 용도 //17.14 형식의 고정소수점 표현 #define P 17 #define Q 14 #define F (1 = 0 ? ((x + F/2)/F) : ((x - F/2)/F)) //고정소수점 기본 연산 #define ADD_FIXED(x,y) (x) + (y) #define SUB_FIXED(x,y) (x) - (y) #define MUL_FIXED(x,y) ((int64_t)(x)) * (y) / (F) #define DIV_FIXED(x,y) ((int64_t)(x)) * (F) / (y) #define ADD_INT(x, n) (x) + (n) * (F) #define SUB_INT(x, n) (x) - (n) * ..
Krafton Jungle Week 7~8 Team 6 WIL alarm-single 문제: timer_sleep이 기존에 구현되어 있었으나, Busy-wait을 하는 방식으로 되어있었기 때문에 효율이 좋지 않았다. 더보기 void timer_sleep (int64_t ticks) { int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start) 더보기 void timer_sleep (..
timer.c 더보기 // 초당 타이머 인터럽트 횟수가 19 초과 1000 미만 #if TIMER_FREQ = 19 #endif #if TIMER_FREQ > 1000 #error TIMER_FREQ 더보기 /*초당 PIT_FREQ를 인터럽트하고 해당 인터럽트를 등록시킨다. pit = 프로그래밍된 카운트에 도달할 때 출력 신호를 생성하는 카운터*/ void timer_init (void) { /* 8254 입력 주파수를 TIMER_FREQ로 나눈 값을 가장 가까운 값으로 반올림 */ uint16_t count = (1193180 + TIMER_FREQ / 2) / TIMER_FREQ; /* outb (pit의..