전체 보기
[C Lab] How-To inline assembly & test
Linux Kernel에 존재하는 시스템 콜을 직접 구현해보면서 inline assembly 문법에 대해 궁금해져 쓰는 글이다. 레퍼런스는 이 글의 제일 아래에 명시해놓았다. How-To inline assembly Why we use the inline assembly? 이유는 몇 가지가 있다. 1) 시스템 성능 최적화에 제격이라 2) 어셈블리어로 작업할게 필요한데 그때마다 서브루틴의 프롤로그와 에필로그의 작성이 번거로울 때 이외에도 있을 텐데 내가 아는 선에서는 그렇다. Grammar __asm__ __volatile__ (asms : output : input : clobber ); __asm__ : asm으로도 쓸 수 있지만, ansi 옵션일 때는 asm이 정의되지 않기 때문에 되도록이면 __as..
[Linux Kernel] 부팅 중 Kernel Panic 해결하기
커널 만지다가 책 따라서 실습을 하고 있었지만 똑같이 하니 역시 옛날 환경이라 예상치 못한 일들이 일어난다. 그중 하나가 바로 부팅 시 커널 패닉이 일어나는 상황이다. 이번에 내가 마주한 상황은 VFS 싱크로 관련 에러였다. 그때 당시의 스크린샷을 찍지는 못했지만 위에서 나타난 에러 구문과 똑같았다. Cause & Solution https://unix.stackexchange.com/questions/414655/not-syncing-vfs-unable-to-mount-root-fs-on-unknown-block0-0 not syncing: VFS: Unable to mount root fs on unknown-block(0,0) I had Windows 10 and Manjaro on my lapto..
[Linux Kernel] 커널 빌드 과정
make mrproper Mr.Proper는 수세미 이름인데 딱딱한 스펀지로 되어 있어 잘 지워진다. 그래서 커널 소스 처음 가져왔을 때나 커널을 여러 번 컴파일했을 때 기존에 설정되어 있던 모든 의존 관계를 완전히 제거해주는 역할을 한다. make menuconfig GUI 메뉴 형식의 커널 환경 설정 시작 명령어. CLI는 "make config"로 가능하다. make dep 커널에 설정된 내용에 따라 소스 코드의 파일들을 확인하고 필요한 링크들을 생성하는 것과 같은 의존성 설정 작업. 의존성 확인 후 커널 컴파일에 필요한 파일들의 목록만 각 디렉터리에 .depend 파일로 저장. 이 과정을 거치지 않고 "make bzImage" 명령어를 사용해도 되지만 안 했을 때보다는 컴파일 과정이 빠르게 실행된..
[Linux Kernel] IRQ 스레드 실습
본 실습은 책 「디버깅을 통한 리눅스 커널의 구조와 원리」 p.438를 기준으로 진행했다. IRQ 스레드 생성 실습 IRQ 스레드를 생성할 인터럽트 선택 라즈베리 파이에 존재하는 IRQ 스레드의 개수는 많지 않다. 먼저 존재하는 IRQ 스레드를 확인해보면, 책과는 달리 166번 인터럽트에 대한 IRQ 스레드도 보인다. usb 관련 인터럽트 같은데 지금은 그냥 넘어가도 된다. 이제 IRQ 스레드를 생성해 볼 인터럽트를 선택하기 위해 "cat /proc/interrupts" 명령어로 확인해본다. 각 cpu 번호 별로 실행된 횟수를 참고해서 선택할 예정이다. 위에서 이미 돌고 있던 86, 166번 인터럽트를 제외하고 선택하면, 적당한 횟수로 도는 17번 인터럽트 3f00b880.mailbox가 좋겠다. 17번..
[Linux Kernel] Interrupt 후반부 처리
인터럽트 후반부 처리 Top Half, Bottom Half 중 Bottom Half 처리. 인터럽트가 실행되는 동안인 인터럽트 컨텍스트 상태일 때는 프로세스가 멈춰있으므로 가능한 한 빨리 실행되고 컨텍스트를 돌려줘야 하는데, 꼭 인터럽트 컨텍스트일 때 처리하지 않아도 되는 것들은 인터럽트 핸들러가 끝나고 빠르게 여러 가지 방법으로 마무리한다. IRQ 스레드 (threaded IRQ) "irq/인터럽트 번호-인터럽트 이름" 형식의 이름을 가진 프로세스가 바로 IRQ 스레드다. 어찌됐던 스레드이기 때문에 스케줄링하는 과정이 필요하고 그러므로 1초에 몇 천 번 이상 인터럽트가 걸리는 핸들러는 IRQ 스레드를 이용하면 부하가 많이 걸리니 추천하지 않는다. 부팅 단계에서 request_threaded_irq()..
[OS 개발] qemu-system-arm trouble shooting
목차 gtk initialization failed arm-none-eabi-gdb installation failed 1. gtk initialization failed qemu-system-arm -M realview-pb-a8 -kernel navilos.axf -S -gdb tcp::1234,ipv4 책에서 ELF 실행 파일을 만든 후 위의 커맨드를 입력해서 디버깅을 하기 위한 준비를 한다. 하지만 Ubuntu 20.04 on WSL2 & QEMU 4.2.1 버전 환경에서 실행해보면 책과는 다른 에러가 도출된다. $ qemu-system-arm -M realview-pb-a8 -kernel navilos.axf -S -gdb tcp::1234,ipv4 Unable to init server: Co..
[Linux Kernel] Interrupt
ARMv7 코어 기준 Interrupt란 하드웨어적 관점 : 하드웨어에서 발생하는 전기 신호 CPU 관점 : 프로세스가 하던 일 멈추고 인터럽트 서비스 루틴(ISR; Interrupt Service Routine) 실행 Ω 진리 Ω 인터럽트는 그 자체로 프로세스의 진행을 멈추고 실행하는 것이기 때문에 시스템에 많은 부하가 걸리지 않게 짧고 간결하게 실행되어야 한다. 그렇기 때문에 인터럽트 컨텍스트에서는 휴면 상태로 진입할 수 없고 인터럽트 컨텍스트에서 호출 가능한 커널 함수는 제한되어 있다(안 되는 함수는 예를 들어 lock 얻는 함수 같은 거). 주요 개념 인터럽트 핸들러 - 발생된 인터럽트를 실제로 처리하는 함수 인터럽트 벡터 - 각 인터럽트 별로 정해진 주소가 있는 주소 테이블 인터럽트 디스크립터 ..
[Raspberry Pi] 원격 접속 설정
개요 「디버깅을 통해 배우는 리눅스 커널의 구조와 원리」 책에서 소개하는 대로 라즈베리 파이 OS를 기준으로 커널을 공부하는 중이다. 처음 환경 세팅부터 시작해서 실습 환경을 갖추고 사용하면서 지금까지는 귀찮게 내 pc 모니터랑 키보드, 마우스 다 라즈베리 파이에 연결해서 사용했다. 그러다 보니 데스크톱의 기능이 봉인된 채로 계속 사용하다 보니 너무 힘들었다. 사실 귀찮아서 지금까지 설정 안 한건 안 비밀... 그래서 vscode에 ssh 물려서 이용하려고 간단하게 세팅한 방법과 후기를 남겨놓는다. Setting 1. raspberry pi에 ssh 설정하기 먼저 아무런 세팅이 되어있지 않은 라즈베리 파이를 기준으로 했을 때 ssh 설정이 되어 있지 않다. 그래서 SD 카드에 구워놓은 boot 폴더 안에..