[리눅스커널][시스템콜] SYSCALL_DEFINEx 매크로로 시스템콜 핸들러 선언
By Guillermo Austin Kim | 2019년 2월 21일 |
시스템 콜 관련 리눅스 커널 코드를 분석하려고 할 때 만나는 걸림돌은 어느 소스 코드를 봐야할 지 모르겠다는 것입니다. 시스템콜 핸들러 함수는 구현부를 찾기 어렵습니다. 한 가지 예를 들어 봅시다.리눅스 저수준 함수인 write() 와 read() 함수에 대한 시스템 콜 핸들러 함수는 sys_read()와 sys_read() 라고 합니다. 아무리 소스 코드에서 sys_read()와 sys_read() 함수를 검색해도 코드 위치를 찾기 어렵습니다. 그 이유는 시스템 콜 핸들러 함수는 리눅스 커널에서 제공하는 SYSCALL_DEFINE1과 같은 매크로 함수로 선언되어 있기 때문입니다. 시스템 콜 핸들러는 처리하는 인자 갯수에 따라 다음과 같이 선언합니다.SYSCALL_DEFINEx(시스템콜 번호, 1번째
[리눅스커널] 스케줄링: 선점 스케줄링(Preemptive Scheduling)이란 무엇일까?
By Guillermo Austin Kim | 2019년 9월 15일 |
선점 스케줄링은 다음과 같이 정의내릴 수 있습니다. CPU에서 실행 중인 프로세스를 비우고 새로운 프로세스를 CPU에서 실행시킴 선점 스케줄링에 대한 이해를 돕기 위해 야구에서 투수 교체를 하는 과정을 예를 들겠습니다. 마운드에 A란 투수가 있다고 가정합시다. A란 투수는 열심히 공을 던지고 있습니다. 감독은 투수가 마운드에서 제대로 공을 던지고 있는지 계속 관찰합니다. 제구는 좋은지 구속은 제대로 나오고 있는지 점검합니다. 그런데 시간이 흘러 B, C와 D란 투수가 자신이 공을 던지고 싶다는 의사와 함께 불펜에서 몸을 풀기 시작했습니다. B, C와 D란 투수도 A와 같은 기량의 투수입니다. 감독은 A와 B, C, D 투수를 비교합니다. 만약 B, C, D 투수 중에 A보다 잘 던진다고(
[리눅스커널] GCC 지시어
By Guillermo Austin Kim | 2019년 12월 21일 |
[부록-A] GCC 지시어 리눅스 커널 코드를 읽다 보면 낯선 구문을 만날 가능성이 높습니다. 이 중 하나가 GCC 컴파일러 지시어입니다. 이번 시간에는 리눅스 커널에서 자주 쓰는 GCC 지시어를 소개합니다. 1. __init과 __section() __init 키워드가 함수 선언부에 있으면 해당 함수는 init.text 섹션에 위치합니다. 이해를 돕기 위해 __init 키워드로 선언된 함수를 봅시다. void __init lockup_detector_init(void)02 {03 set_sample_period(); 01번째 줄과 같이 lockup_detector_init() 함수 옆에 보이는 __init 구문입니다. 함수 선언부에 __init 키워드가 보이면 부팅 과정에서 1번 호출되는 함수라고
[리눅스커널][스케줄링] 크래시 유틸리티로 컨택스트 스위칭 디버깅하기
By Guillermo Austin Kim | 2019년 3월 6일 |
크래시 유틸리티로 컨택스트 스위칭 디버깅하기 이번에는 크래시 유틸리티를 활용해 컨택스트 정보를 확인하겠습니다. 다음 정보는 ARM 코어에서 실행 중인 프로세스의 레지스터 세트입니다.pc : [<80f65224>] lr : [<80f65bcc>] psr: 0x80f655acsp : 0x9b7dfce8 ip : 0x9b7dfd74 fp : 0x9b7dfd64r10: 0x0 r9 : 0x9f89ea00 r8 : 0x9db8b200r7 : 0x81709294 r6 : 0x9eb07000 r5 : 0x828ea000 r4 : 0xa6b46780r3 : 0x00000000 r2 : 0x036db918 r1 : 0x00000089 r0 : 0x7