Linux (25) 썸네일형 리스트형 [KernelCrash] Abort at __stack_chk_fail() due to defective memory Very interesting kernel panic occurs with the following callstacks.crash> bt -I C0ED8B64 -S E853FD20 e5752c00PID: 1787 TASK: e5752c00 CPU: 4 COMMAND: "python"bt: WARNING: stack address:0xe853fa38, program counter:0xc0ee5b60 #0 [] (panic) from [] #1 [] (__stack_chk_fail) from [] #2 [] (sock_has_perm) from [] #3 [] (security_socket_recvmsg) from [] #4 [] (sock_recvmsg) from [] #5 [] (___sys_recvms.. [LinuxKernel][Spinlock] spin_lock(): in-depth code review Now, let me look into the spinlock implmentation in more details.After analyzing the assembly code, R2 is key debugging signature which is the original value of spinlock owner. Code Review: arch_spin_lock(part 1) -> If the spinlock is acquired sucessfully.Let me assume tickets.next=0x0, tickets.owner=0x0(spinlock is not held) before _raw_spin_lock() is executed[1]: R2: (raw_spinlock_t *)lock is .. [리눅스커널][스케줄링] 스케줄링(scheduling)/스케줄러(schedule)란 무엇일까? 스케줄링(scheduling)/스케줄러(schedule)란 무엇일까? 여러분들은 리눅스 시스템이 탑재된 휴대폰이나 라즈베리파이를 쓰면 동시에 여러 프로그램을 실행할 수 있습니다. 휴대폰을 보면 다양한 프로그램이 동시에 실행하는 것을 확인할 수 있습니다. 예를 들면 브라우저를 실행하면서 음악을 듣거나 메신저를 하면서 어플리케이션을 다운로드 할 수 있습니다. 그래서 사람들은 여러 프로세스들이 동시에 CPU에서 실행한다고 느낄 수 있습니다. 하지만 CPU는 여러 개의 프로세스를 절대로 동시에 실행할 수는 없습니다. 리눅스 커널을 포함한 다양한 운영체제에서 스케줄링과 멀티 태스킹 기법이 생겨난 이유는 다음과 같습니다.CPU는 한 순간에 한 개의 프로세스의 코드만을 실행할 수 있습니다. 여러 개의 프로세스들이 효.. [리눅스커널][Trace32] T32로 wakelock 디버깅 - container_of 함수 분석 임베디드 개발에서 T32-Trace32 장비를 많이 써서 소스 코드 디버깅을 합니다. 이번 시간에는 리눅스 커널에서 웨이크락(wake lock)을 잡는 모듈이 누구인지 파악하는 디버깅(Debugging) 방법을 소개합니다. 리눅스 커널는 wakeup_sources이란 연결 리스트를 통해 wakelock 정보를 확인할 수 있습니다. 리눅스 커널 개발자 중에 crash-utility을 잘 쓰는 분이 있습니다.하지만 임베디드 개발에선 Trace32도 더 많이 활용하는 것 같습니다.개발자는 다양한 툴을 써야 한 가지 툴에 종속된 노예 개발자가 되는 것을 피할 수 있습니다.또한 각 툴의 장점을 잘 활용할 수도 있습니다. 먼저, 다음 T32 명령어를 입력해서 offsetof와 container_of 매크로를 생성합.. [리눅스커널][시스템콜]시스템 콜 소개 - 시스템 콜은 누가 언제 실행할까요? 시스템 콜은 유저 모드에서 실행 중인 어플리케이션에서 커널에게 어떤 서비스를 요청할 때 실행합니다. 유저 어플리케이션에서 파일 시스템에 접근해서 파일을 읽고 쓰거나 PID와 같은 프로세스 정보를 얻으려 할 때 주어진 규약에 맞게 커널에 서비스를 요청을 하는 것입니다. 이를 위해 시스템 콜을 발생해서 유저 공간에서 커널 공간으로 실행 흐름을 이동합니다. 이 동작은 다음 그림으로 표현할 수 있습니다. 이번에 시스템 콜 세부 동작을 왜 잘 알아야 하는지 생각해봅시다.시스템 콜은 리눅스 시스템에서 당연히 잘 동작하는데 왜 알아야 할까요? 그 이유는 문제 해결 능력을 키우기 위해서입니다. 리눅스 시스템 저수준 함수를 써서 응용 어플리케이션 코드는 누구나 작성할 수 있습니다... [리눅스커널][프로세스] 기본 유저 레벨 프로세스 실행 실습 및 ftrace 로그 분석 기본 유저 레벨 프로세스 실행 실습 및 ftrace 로그 분석라즈베리파이에서 X-terminal 프로그램을 실행해서 셸을 엽시다. root@raspberrypi:/boot# ps -ely | grep bashS UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMDS 1000 541 443 0 80 0 4024 1645 poll_s tty1 00:00:00 bashS 1000 880 878 0 80 0 4008 1628 wait pts/0 00:00:00 bashS 0 977 972 0 80 0 3284 1416 wait pts/0 00:00:00 bashS 1000 993 989 0 80 0 3960 1628 poll_s pts/1 00:00:00 bash grep bas.. [리눅스커널][프로세스] 프로세스는 어떻게 생성하나? 프로세스에 대한 이해를 하려면 프로세스가 어떻게 생성되는 지 알면 좋습니다. 프로세스 생성 과정에서 프로세스를 관리하는 자료구조 관계를 알 수 있기 때문입니다. 리눅스에서 구동되는 프로세스는 크게 유저 레벨에서 생성된 프로세스와 커널 레벨에서 생성된 프로세스가 있습니다. 유저 레벨에서 생성된 프로세스는 유저 공간에서 프로세스를 생성하는 라이브러리(glibc) 도움을 받아 커널에게 프로세스 생성 요청을 합니다. 커널 프로세스는 kthread_create() 함수를 호출해서 커널 내부에서 프로세스를 생성합니다. 커널 프로세스는 커널 스레드라고 부르며 커널 내부에서 스레드를 직접 관리합니다. 공통으로 리눅스에서 생성된 프로세스는 _do_fork() 함수를 호출합니다. 프로세스 생성하는 핵심함수는 _do_for.. [리눅스커널][프로세스] ps 명령어로 프로세스 확인하기 리눅스 시스템 개발자(디바이스 드라이버, 데브옵스)로 오래 동안 실력을 인정 받으려면 리눅스 커널을 잘 알면 좋습니다. 하지만 리눅스 커널은 그 내용이 방대하고 깊이가 있어 단기간에 익히기 어려운 기술 영역입니다. "프로세스란 무엇인가"란 질문으로 리눅스 커널을 시작합니다. 성경이나 불경같이 근엄한 단어를 많이 보입니다. 안타깝게도 20페이지 정도 읽다가 포기합니다. 너무 이론으로 프로세스를 설명하기 때문입니다. 프로세스에 익숙해지려면 리눅스 시스템에 익숙해져야 합니다. 이번 장에서는 라즈베리파이에서 명령어를 입력하고 ftrace 로그에서 출력되는 로그로 프로세스 동작을 확인합니다. 먼저 다음 리눅스 명령어로 시스템에서 프로세스 목록을 확인합시다. 이를 위해 라즈베리파이에서 x-terminal 프로그램을..