커널

포스트: 228|조회수: 0|CIVILIZATION
Items

Posts

228 posts

[리눅스커널][시그널] T32: 시그널 생성 과정 디버깅해보기

Guillermo Austin Kim|2019년 6월 12일

이전 포스팅에서 커널이 '시그널'을 어떤 방식으로 처리하는지 살펴봤습니다.이전에 배웠던 내용을 리뷰하는 차원으로 '시그널' 처리 과정을 정리해볼까요? 1. 시그널 생성 시그널을 받은 프로세스의 태스크 디스크립터에 시그널 정보를 써주고 해당 프로세스를 깨운다. 2. 시그널 전달 시그널을 받을 프로세스는 깨어나 시그널을 처리한다. 시그널 처리 과정에 대해 소스 코드를 분석했는데 이번에는 __send_signal() 함수에서 시그널을 생성할 때 바뀌는 시그널 자료구조에 대해서 디버깅해보는 시간을 갖겠습니다. 사실 함수 실행 흐름과 자료구조는 '이와 잇몸'의 관계와 같습니다. 조금 더 구체적으로 말씀드리면 다음과 같겠네요. "함수는 자료구조를 읽고 바꾸기 위해 실행한다." "자료구조

[라즈베리파이] 라즈비안(Raspbian) 리눅스 커널(LinuxKernel) 빌드하기

Guillermo Austin Kim|2019년 5월 14일

이번 절에서는 라즈베리파이에서 라즈비안 리눅스 커널 소스 코드를 내려받고 빌드하는 방법을 알아보겠습니다. 필자는 라즈베리파이를 쓸 때 다음 명령어로 root로 변경해 커널 빌드를 합니다.$ sudo su 명령어 입력 과정에서 불필요한 권한 설정을 피하기 위해서입니다. 라즈비안 커널 소스 코드 내려받기 리눅스 커널 소스 코드를 다운로드 받는 방법을 소개합니다. 다음 명령어를 입력하면 라즈비안 최신 커널 소스를 내려 받을 수 있습니다.git clone --depth=3000 위 명령어를 라즈베리파이 터미널에서 입력하면 다음 화면을 볼 수 있습니다.root@raspberrypi:/home/pi/RPi_kernel_src# git clone --depth=3000 into 'linux'...remote

[리눅스커널] 비트 마스크를 어셈블리 코드로 빨리 읽는 방법 - HARDIRQ_MASK, SOFTIRQ_MASK, NMI_MASK

Guillermo Austin Kim|2019년 5월 11일

이번에는 비트 마스크를 C 코드가 아닌 어셈블리 코드로 읽는 방법을 소개합니다. in_interrupt() 함수 소개 in_interrupt() 함수는 현재 프로세스가 인터럽트 컨택스트인지 알려주는 기능입니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h]#define in_interrupt() (irq_count()) in_interrupt() 함수 코드를 보면 irq_count() 함수로 치환됩니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h]#define irq_count() (preempt_count() & (HAR

[리눅스커널][가상파일시스템] 수퍼블록: 슈퍼블록 정보를 statfs 시스템 콜로 읽는 과정 살펴보기

Guillermo Austin Kim|2019년 5월 8일

슈퍼블록 각 멤버들은 파일시스템에 대한 메타 정보를 저장합니다.유저 공간에서 파일시스템 정보를 알려면 어떤 함수를 호출해야 할까요? 유저 공간에서 statfs() 함수를 호출하면 커널 공간에서 해당 시스템 콜 핸들러 함수인 sys_statfs() 함수를 실행합니다. 예제 코드는 다음과 같습니다.1 #define FILENAME_NAME "/home/pi"2 #define BUFF_SIZE 2563 int main() 4 {5 struct statfs file_sys_info;6 char fname[BUFF_SIZE] = {0,};78 strcpy(fname, FILENAME_NAME);9 12 if(statfs(fname, &file_sys_info)) {13 printf("Unable to s