본문 바로가기

Linux

(25)
[리눅스] insmod 명령어로 드라이버 설치 시 커널 내부 동작 디버깅해보기(ftrace) - (Aarch32, v5.4) 이전에 다음 글에서 insmod 명령어를 통해 모듈 타입 디바이스 드라이버가 설치될 때, 커널 내부 함수가 어떤 흐름으로 작동하는지 코드를 리뷰했습니다. 유저 공간에서 insmod가 실행되면 시스템 콜이 발생합니다. 커널 내부에서 다음과 같은 함수들이 호출됩니다.    ● sys_finit_module() 함수     ● load_module() 함수     ● do_init_module() 함수     ● do_one_initcall() 함수 위 함수 흐름을 보면 do_one_initcall() 함수에서 다음과 같이 module_init 키워드로 정의한 hello_module_init() 함수를 호출한다는 사실을 알 수 있습니다. static int hello_module_init(void) { pri..
[리눅스커널] 인터럽트(Interrupt)의 주요 개념 앞에서 인터럽트에 대해 소개했으니 리눅스 커널에서 인터럽트를 처리하는 방식을 이해하기 위해 알아야 할 주요 개념을 소개합니다.  인터럽트 핸들러  인터럽트 벡터  인터럽트 디스크립터  인터럽트 컨텍스트 인터럽트 핸들러란? 인터럽트가 발생하면 이를 핸들링하기 위한 함수가 호출되는데 이를 인터럽트 핸들러라고 합니다. 예를 들어, 키보드를 타이핑해서 인터럽트가 발생하면 키보드 인터럽트를 처리하는 키보드 인터럽트 핸들러가 호출됩니다. 마찬가지로 휴대폰에서 화면을 손으로 만지면 터치 인터럽트가 발생하고 터치 인터럽트를 처리하는 터치 인터럽트 핸들러가 호출됩니다. 다음 그림을 보면서 각 디바이스별로 인터럽트 핸들러가 처리되는 과정을 알아보겠습니다. 그림 5.2 디바이스별로 실행되는 인터럽트 핸들러 그림 5...
[리눅스커널] 인터럽트(Interrupt)란 인터럽트란 무엇일까요? 인터럽트란 일반적인 상황에서 갑자기 발생하는 비동기적인 통지나 이벤트라고 볼 수 있습니다. 이번 절에서는 인터럽트라는 용어와 그것의 의미를 알아보겠습니다. 일상 생활에서의 인터럽트 인터럽트란 단어가 생소하신가요? 낯설게 들리는 분도 있고 귀에 익은 분도 있을 것입니다. 일상생활에서 인터럽트란 갑자기 생긴 일이나 하던 일을 멈춘다는 의미입니다. 일상적으로 하던 일을 멈추게 하는 무엇인가가 갑자기 발생한 상황을 뜻합니다. 예를 들면, 책을 읽다가 갑자기 전화가 와서 읽던 책을 덮어 놓고 전화를 받는 상황이 그러합니다. 하드웨어 관점에서 인터럽트란? 임베디드 시스템 관점에서 인터럽트는 무엇일까요? 먼저 하드웨어 관점에서 생각해 봅시다. 하드웨어 관점에서 인터럽트란 하드웨어의 변화를 감지..
『디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 2』 출간 새로운 '리눅스 커널' 책인 《디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 2》 이 출간돼 소개합니다. 링크 http://www.yes24.com/Product/Goods/90085976 http://www.yes24.com/Product/Goods/90087307 이 책은 방대한 리눅스 커널을 처음 접하는 분들이 리눅스 커널을 학습하는 데 실패하지 않고, 끝까지 따라갈 수 있도록 구성했습니다. 두 권에 걸쳐 리눅스 커널의 주요 구성요소를 빠짐없이 소개하고 있어 리눅스 커널을 한층 더 깊게 체감하실 수 있습니다. 이 책을 다음과 같은 분들께 추천합니다. - 리눅스 보드로 졸업 과제를 준비 중인 졸업반 학생 - 연구실의 프로젝트를 리눅스 환경(리눅스 보드, 리눅스 배포판)에서 진행 중인 대학원생 ..
[리눅스커널] 스케줄링(scheduling)에 대해서 알아보기 여러분들은 리눅스 시스템이 탑재된 휴대폰이나 라즈베리파이를 쓰면 동시에 여러 프로그램을 실행할 수 있습니다. 휴대폰을 보면 다양한 프로그램이 동시에 실행하는 것을 확인할 수 있습니다. 예를 들면 브라우저를 실행하면서 음악을 듣거나 메신저를 하면서 어플리케이션을 다운로드 할 수 있습니다. 그래서 사람들은 여러 프로세스들이 동시에 CPU에서 실행한다고 느낄 수 있습니다. 하지만 CPU는 여러 개의 프로세스를 절대로 동시에 실행할 수는 없습니다. 리눅스 커널을 포함한 다양한 운영체제에서 스케줄링과 멀티 태스킹 기법이 생겨난 이유는 다음과 같습니다.CPU는 한 순간에 한 개의 프로세스의 코드만을 실행할 수 있습니다. 여러 개의 프로세스들이 효율적으로 번갈아 CPU에서 실행할 수 있게 규칙을 부여하고 프로세스들을..
[리눅스커널] current_thread_info()/current 함수와 자료구조 분석하기 리눅스 커널 코드를 읽으면 다음 매크로를 자주 볼 수 있습니다.+ current_thread_info()+ current 위 매크로를 활용해서 프로세스 태스크 디스크립터와 struct thread_info 구조체 필드 정보를 읽어 프로세스를 제어합니다. 4.10.1 current_thread_info()이전 절에서 프로세스 스택 최상단 주소에 struct thread_info 구조체에 프로세스 실행을 저장한다고 분석했습니다. current_thread_info() 매크로 함수는 프로세스가 어떤 함수를 실행하더라도 struct thread_info 구조체가 있는 스택 최상단 주소를 전달합니다. current_thread_info() 매크로 함수 구현부를 분석하기 전에 매크로 함수가 어느 코드에서 쓰는 지 ..
[리눅스커널] struct thread_info: 프로세스 컨택스트 정보를 어떤 자료구조에 저장할까? 프로세스 컨택스트 정보는 어떻게 저장할까? 리눅스 커널에서는 프로세스 실행 흐름은 컨택스트란 용어로 표현합니다. 컨택스트 종류는 다음과 같습니다. 1. 프로세스 컨택스트: 프로세스가 스케줄링 될 수 있는 상태 2. 인터럽트 컨택스트: 인터럽트가 발생한 후 인터럽트 핸들링을 위한 동작 중 3. Soft IRQ 컨택스트: Soft IRQ 서비스를 실행 중이며 Soft IRQ 서브루틴(하부 함수 흐름) 동작 중 컨택스트 정보는 struct thread_info 구조체 preempt_count 멤버에서 확인할 수 있습니다. 커널은 이 값을 읽어서 컨택스트 종류를 식별합니다. 커널에서는 어떻게 프로세스가 어떤 컨택스트에서 실행하는지 파악할까요?in_interrupt()와 in_softirq() 매크로 함수를 통해..
[리눅스커널] 프로세스 세부 실행 정보를 저장하는 struct thread_info 스레드 정보(struct thread_info)프로세스 상세 정보를 저장하는 자료구조는 태스크 디스크립터입니다. 이와 더불러 프로세스 세부 실행 정보를 저장하는 struct thread_info 자료구조가 있습니다. 커널이 프로세스를 생성할 때 프로세스마다 고유한 스택 공간을 부여합니다. 스택 최상단 주소에 struct thread_info 구조체 필드가 저장돼 있습니다. 이 구조체 필드는 커널이 프로세스를 제어할 때 필요한 중요 정보를 담고 있습니다.+ 프로세스 컨택스트 정보+ 선점 스케줄링 여부+ 컨택스트 스위칭 시 저장한 레지스터 세트 이번 절에서는 프로세스 동작을 표현하는 struct thread_info 구조체에 대해서 알아봅시다. struct thread_info 구조체 각 멤버에 대해 알아보..