디바이스 드라이버(23)
-
시스템 콜 추가하기 (실습)
1. 커널에 4byte 데이터를 스택 형태로 저장하고 읽어오는 시스템 콜 추가2. Push : 4byte 데이터를 받아서 스택에 저장 (성공은 0, 실패는 -1 반환)3. Pop : 스택의 top에 있는 4byte 데이터를 반환 (스택에 아무런 데이터가 없으면 -1 반환)4. 추가한 시스템 콜을 사용하는 사용자 프로그램 작성 먼저 linux/kernel 위치에 stack.c 라는 파일을 만들어 데이터를 넣는 Push_data 시스템 콜과 데이터를 출력하는 Pop_data 시스템 콜을 구현한다. kernel의 Makefile에 들어가 obj-y에 stack.o 목적파일을 추가한다. linux 위치에 vi/include/uapi/asm-generic/unistd.h에 들어가서 구현한 시스템 콜의 번호를..
2024.12.10 -
GDB를 통한 디버깅
GDB (GNU Debugger)란?디버거 : 프로그램을 실행하는 중간에 어떤 일이 일어나는지 보여주는 프로그램- 프로그램이 예상한 대로 동작하지 않을 때 유용- 한 줄씩 실행하거나, 원하는 위치에 멈출 수 있음- 코드 상의 위치나 함수나 변수의 이름도 확인 가능 ( 단, 이를 위해서는 바이너리가 디버그 모드로 빌드되어야 함) GDB 명령어- start : 프로그램을 주어진 인자값을 주고 실행- cont : 프로그램 진행- list : 현재 위치와 그 주변에 있는 코드를 10줄 가량 출력- backtrace : 함수가 호출된 히스토리를 출력- info local : 함수 내에 선언된 변수 출력- info args : 현재 함수의 인자값 출력- print : 현재 시점에서 해당 수식이 실행될 때의 값 ..
2024.12.02 -
새로운 시스템 콜 추가하기 (2)
아래와 같이 간단한 문구를 출력하는 시스템 콜을 추가해본다. 먼저 linux/kernel 부분에 들어가서 위와 같은 vim 파일을 만든다.여기서 linux/kernel.h는 커널 소스 코드에서 사용되는 헤더 파일로, 다양한 유틸리티 함수와 매크로, 커널 코드에서 자주 쓰이는 정의들을 포함하고 있다. 지금 우리가 linux/kernel.h 헤더 파일을 사용한 이유는 printk함수를 사용하기 위해서이다. printk함수는 커널 로그를 출력하기 위한 함수로 stdio.h의 printf함수와 사용법이 동일하다. 다만 printk함수에서는 맨 앞에 로그레벨을 추가할 수 있는데 종류는 아래와 같다.KERN_EMERG , 0 , 시스템 불안정KERN_ALERT , 1 , 당장 조치 요구됨KERN_CRIT , 2 ,..
2024.11.28 -
새로운 시스템 콜 추가하기 (1)
시스템 콜이란?사용자 프로그램이 운영 체제의 기능을 사용하기 위해 호출되는 인터페이스.일반적인 프로그램들은 사용자 모드에서 실행되므로 커널 모드에 대한 직접적인 접근이 불가능하다. 따라서 커널에 요청하여 커널 모드에서 처리하고 그 결과를 사용자 모드의 프로그램에게 전달하는 것이 바로 시스템 콜. 시스템콜 호출 추적하기strace : 프로세스가 어떤 시스템 콜을 어떤 인자로 실행하는지 추적하는 도구 사용법● strace : 해당 명령어에서 실행되는 프로세스의 시스템 콜을 화면으로 출력● strace -o : 화면 대신 파일로 시스템 콜을 출력● strace -o -c : 시스템 콜의 개수를 세서 표로 출력● strace -o -p : 실행 중인 프로세스에서 실행하는 시스템 콜을 출력 이런 간..
2024.11.27 -
Makefile 실습
1. make buildroot-download : buildroot가 없다면 다운로드2. make buildroot-config : buildroot를 설정3. make buildroot : buildroot를 빌드4. make kernel-download : kernel이 없다면 다운로드5. make toolchain-download : toolchain 없다면 다운로드6. make kernel-config : kernel을 설정7. make run : QEMU로 리눅스 실행8. make kernel : kernel을 빌드 buildroot를 빌드하기 위해선 buildroot 설정이 되어있어야하고, buildroot를 설정하기 위해서는 buildroot가 다운로드 되어있어야한다. kernel을 빌드..
2024.11.26 -
QEMU에서 리눅스 실행하기
QEMU란?오픈소스의 다양한 CPU와 디바이스를 지원하는 에뮬레이터(하나의 시스템이나 장치가 다른 시스템이나 장치를 흉내 내거나 모방할 수 있게 해주는 소프트웨어나 하드웨어) 우선 QEMU를 설치해준다. QEMU를 실행하는 명령어는 밑과 같다. -kernel : 빌드한 커널 지정-drive : 사용할 가상의 디스크, 빌드한 루트 파일 시스템 지정-m : 메모리 크기-smp : 코어 개수 지정 다음과 같은 명령어로 QEMU를 실행하면 로그인 창이 뜨는데 기본 비밀번호는 root이다. QEMU를 통해 가상머신을 만들어 실행시킬 수 있으며, 가상 머신이 시작되면, 설정해두었던 리눅스 커널이 자동으로 부팅되고, 리눅스 커널은 사용자 모드에서 커널 모드로 전환된다.
2024.11.23