리눅스에서의 main() 호출과정
1. 쉘에서 프로그램 수행: ./test
2. fork로 새로운 프로세스 복사
3. execve() 호출(시스템 콜) -> sys_execve()호출 => 사용자 모드에서 커널 모드로 전환
4. do_execve() -> open_exec()가 파일정보를 읽어 들여 적합한 binary handler를 실행
5. flush_old_exec()가 기존 프로세스 정보를 삭제하고, 현재 프로세스를 "current"로 설정
6. 새로운 프로세스에서 사용할 메모리 레이아웃 설정. text, data, bss, stack 등의 세그먼드를 선형 메모리에 맵핑
7. 동적 링커 메모리에 로딩. elf 포맷이면 load_elf_interp()가 /lib/ld_linux.so.2를 메모리에 로딩
8. start_thread()->elf 인터프리터(elf_interpreter) 실행
9. sys_execve() 종료=> 커널 모드에서 사용자 모드로 전환
10. reschedule() / 문맥교환
11. _start 코드에 의해 main()호출
1. 쉘에서 프로그램 수행: ./test
2. fork로 새로운 프로세스 복사
3. execve() 호출(시스템 콜) -> sys_execve()호출 => 사용자 모드에서 커널 모드로 전환
4. do_execve() -> open_exec()가 파일정보를 읽어 들여 적합한 binary handler를 실행
5. flush_old_exec()가 기존 프로세스 정보를 삭제하고, 현재 프로세스를 "current"로 설정
6. 새로운 프로세스에서 사용할 메모리 레이아웃 설정. text, data, bss, stack 등의 세그먼드를 선형 메모리에 맵핑
7. 동적 링커 메모리에 로딩. elf 포맷이면 load_elf_interp()가 /lib/ld_linux.so.2를 메모리에 로딩
8. start_thread()->elf 인터프리터(elf_interpreter) 실행
9. sys_execve() 종료=> 커널 모드에서 사용자 모드로 전환
10. reschedule() / 문맥교환
11. _start 코드에 의해 main()호출
운영체제 없음
1. 인터럽트 사용불가(disable)로 설정한다.
//만약 시스템에 와치독 타이머가 있따면 이 또한 disable 해주어야 한다
/사용가능 상태로 설정하고 스타트업 코드를 실행한다면 시스템이 계속 재시작 할 수도 있다.
2. rw_data를 ROM 에서 RAM으로 복사
3. ZI(bss)영역을 0으로 클리어
4. 모드별 stack 생성
5. 힙 생성
6. 인터럽트 사용가능(enable)으로 설정
7. main()호출
'컴퓨터 과학 & 영상처리 관련 > 임베디드' 카테고리의 다른 글
gcc 컴파일 설정 (0) | 2012.05.29 |
---|---|
ARM과 인텔의 경우 arg갯수에 따라 load/store 명령을 하기도함 (0) | 2012.05.27 |
포인터의 연산 120521 (0) | 2012.05.21 |
임베디드 시스템의 전형적인 task의 모습 (0) | 2012.05.12 |
arm program status registers (0) | 2012.05.10 |