Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스] 한국 개발업체에서 절대 리눅스 전문가가 될 수 없는 이유(1) - SW문화

Guillermo Austin Kim|2018년 11월 12일

임베디드 리눅스 개발 업체에서 실제 있었던 일이다. 업무 시간에 있었던 일이다.현재 조직 책임자가 업무 시간에 리눅스 커널 소스 코드를 보지 말라고 했다.리눅스 커널 소스 코드는 다 알아서 스스로 보는 건데 뭘 그런 걸 보냐는 소리인 것이다. 이게 임베디드 리눅스 프로젝트를 개발하는 부서장이 하는 소리다.평소에 이 임베디드 리눅스 업체 관리자가 뇌깔리는 소리는 다음과 같다.1. 리눅스 커널은 안정화된 코드이기 때문이 다 가져다 쓴다.그러니 리눅스 커널을 보드에 잘 돌리는 기술만 익히면 된다. 이게 최근 임베디드 리눅스 개발의 추세다. 2. 리눅스 커널은 디바이스 드라이버가 지나다니는 통로일 뿐이다.그 제반 기술을 익혀서 뭘하나? 문제가 나오지도 않는데 말이야. 3. 빌드 스크립트나 컴파일 환경을 잘

[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트란

Guillermo Austin Kim|2018년 11월 8일

소프트웨어 인터럽트를 한 문장으로 정의해 봅시다. 소프트웨어 인터럽트는 인터럽트가 아닙니다. 인터럽트는 하드웨어서 올려주는 전기 신호로 언제 발생할지 모르는 비동기적인 이벤트이나 통지입니다. 그런데 소프트웨어 인터럽트는 ARM 프로세서에서 제공하는 “svc” 어셈블리 명령어를 실행하면 동작합니다. 소프트웨어 인터럽트를 발생하는 주체는 소프트웨어 관점으로 프로세스입니다. 소프트웨어 인터럽트란 용어의 인터럽트는 하드웨어 디바이스에서 비동기적으로 전달하는 신호는 아닙니다. 실제 인터럽트가 발생하면 ARM 프로세서는 인터럽트를 익셉션의 한 종류로 처리합니다. 리눅스 커널에서 다음은 같이 동작합니다.1. 익셉션 발생(인터럽트는 비동기적인 신호)2. 익셉션 벡터로 ARM 프로그램 카운터를 이동3. 익셉션 벡터에서

[안드로이드][리눅스커널] 시그널 - 유저 공간 abort(SIGABRT) 시 동작 시 흐름

Guillermo Austin Kim|2018년 11월 7일

유저 공간에서 zygote가 강제 종료되면서 부팅을 못하는 상황입니다. 커널 로그로 아래 메시지를 볼 수 있습니다.아래 로그는 init 프로세스가 zygote에 SIGABRT(6) 시그널을 전달해서 zygote를 종료시키고 있습니다.[ 46.116831 / 01-02 01:20:24.859][0] init: Service 'zygote' (pid 1777) killed by signal 6[ 46.124107 / 01-02 01:20:24.869][1] init: Service 'zygote' (pid 1777) killing any children in process group 그럼 이 동작을 할 때 커널 관점으로 어떤 코드가 수행되는지 살펴보겠습니다. zygote는 커널 공간에서 "main"

[라즈베리파이] 시스템 콜 - ARM 프로세서 관점 시스템 콜 처리

Guillermo Austin Kim|2018년 11월 6일

리눅스 시스템에서 시스템 콜을 어떻게 구현했는지 코드를 따라가면 어셈블리 코드를 만나게 됩니다.보통 어셈블리 코드는 ARM 프로세서 입장에서 실행하는 동작을 구현하는 경우가 많습니다. 어셈블리 코드로 구현되어 있다는 것은 시스템 콜이 아키텍처(ARM, x86) 동작과 연관이 있다는 의미입니다. 라즈베리파이는 ARM 아키텍처에서 구동하므로 ARM(Aarch32, ARM 32비트) 프로세서 기준으로 시스템콜이 어떻게 동작하는지 알아봅시다. ARM 프로세서 입장에서 시스템콜 동작을 더 자세히 알아보려면 ARM 프로세스 모드에 대해 살펴볼 필요가 있습니다. ARM 프로세서는 Supervisor, FIQ, IRQ, ABORT, UNDEF, USER, 6가지 모드를 지원하며 각 모드 별 레지스터 세트를 저장하고 있습

[라즈베리파이] 시스템 콜 - 전체 흐름도 소개

Guillermo Austin Kim|2018년 11월 6일

이전에 소개한 시스템 콜 흐름도와 시스템 콜 동작은 그리 간단하지 않습니다. 시스템 콜 세부 동작을 알려면 다음 시스템 전체 흐름도를 이해해야 합니다. 다음 그림은 이번에 다룰 전체 시스템 콜 흐름도입니다. open(), write() 그리고 read() 함수는 파일을 열고 읽어서 쓰는 파일 입출력 동작이고, fork()와 exit() 함수는 프로세스 생성과 종료와 연관된 동작을 실행합니다. 이를 리눅스 저수준 함수라고 부릅니다. 다른 관점으로 GNU C 라이브러리로 진입하는 함수이며 이를 API(Application Programming Interface) 라고 부릅니다. 리눅스 시스템에서는 390여 개의 표준 함수들이 있는데 위 그림에서 대표적인 함수 5개를 표현한 것입니다. 라즈베리파이에서 다음