System Call in Linux

양성우·2024년 3월 14일
0

Embedded System

// System Call

  1. 어떻게 에뮬레이터나 기기에 접근할 수 있을까?

    ADB(Android Debug Bridge)

    • Command line tool letting you
      communicate with emulators
      or devices
      ADB는 에뮬레이터나 실제 기기와 통신할 수 있게 해주는 명령줄 도구를 의미합니다. 이를 통해 다양한 작업을 수행할 수 있는데, 그 중에는 호스트와 기기간의 파일 전송, 앱 설치 및 디버깅, 쉘 명령 실행, 로그 모니터링, 터치나 GPS 같은 이벤트 생성 등이 포함됩니다. ADB는 안드로이드 개발과 테스트 과정에서 매우 유용한 도구로, 개발자가 기기에 직접 연결하여 애플리케이션 개발 과정을 더욱 효율적으로 진행할 수 있게 돕습니다.

이를 Linux 환경에서 Terminal을 열어서 접근해 보면 우선 Android/Sdk/platform-tools 경로로 접근한 뒤 아래 코드를 terminal에서 입력해 줍니다.

cd ~/Android/Sdk/platform-tools
export PATH=~/Android/Sdk/platform-tools:$PATH // 편리한 사용을 위해 이 경로를 시스템의 PATH 환경 변수에 추가
// 이 변경사항을 영구적으로 적용하려면, 이 명령어를 ~/.bashrc 파일의 마지막 부분에 추가
// ~/.bashrc 파일을 수정한 후에는 source ~/.bashrc 명령을 실행하여 변경사항을 즉시 반영할 수 있음

ADB (Android Debug Bridge)를 사용하여 연결된 에뮬레이터나 디바이스의 목록을 확인하려면
" $ adb devices " 명령을 사용하면 됩니다. 이를 통해 연결된 장치가 표시됩니다.
특정 장치나 에뮬레이터에 대한 쉘을 실행하고 싶다면 $ adb shell 명령을 사용,
특정 장치를 대상으로 하려면 $ adb -s shell 명령을 사용합니다.

기본적으로 일부 명령어는 권한 부족으로 인해 "permission denied" 오류를 반환할 수 있습니다.
이런 경우, 장치의 루트 사용자 권한을 얻기 위해 $ adb root 명령을 사용할 수 있습니다.
루트 권한을 얻은 후에는 $ adb shell을 다시 실행하여 더 높은 권한으로 장치에 접근할 수 있습니다.

위 그림은 시스템 콜(System Call)의 작동 방식을 설명하는 다이어그램입니다. 사용자 공간(User Space)과 커널 공간(Kernel Space)을 구분하는 선이 보이며, 이 두 공간 사이에는 시스템 콜 인터페이스(System Call Interface)가 있습니다.

  • main() 함수: 사용자 공간에 있는 프로그램의 시작점입니다.
  • foo() 함수: main()에서 호출된 다른 사용자 공간의 함수입니다.
  • function_in_kernel() 함수: 커널 공간에서 실행되는 함수로, 시스템 콜을 통해 사용자 공간에서 접근됩니다.
  • another_function_in_kernel() 함수: 커널 공간 내의 다른 함수로, 커널 공간의 function_in_kernel() 함수에서 호출됩니다.
  • 사용자 공간에서의 함수 호출은 시스템 콜 인터페이스를 통해 커널 공간의 함수로 변환되며, 이는 운영 체제의 핵심적인 기능을 사용하게 해줍니다. 시스템 콜은 하드웨어 자원에 대한 접근, 파일 시스템 조작, 통신 등에 사용됩니다. 사용자 공간의 코드는 직접적으로 커널 공간에 접근할 수 없고, 시스템 콜 인터페이스를 통해서만 접근할 수 있습니다. 이는 보안과 안정성을 유지하기 위해 중요합니다.

새로운 System call을 추가 하기 위해서는
• Add a new system call to the system call table
• Add the new system call to header
• Register a fallback routine
• Implement the new system call
• Update Makefile
다섯 단계를 거치면 됩니다.

아래 경로 세 곳에 new sys call header파일을 추가하고 cfile을 생성합니다.
• Add a new system call entry (arch/x86/syscalls/syscall_64.tbl)
• Add the new system call to header (include/linux/syscalls.h)
• Register a fallback function (kernel/sys_ni.c)

embedded/helloworld.c embedded dir에 helloworld.c파일을 아래 그림과 같이 생성하고

#include <linux/kernel.h>
asmlinkage long sys_embedded_helloworld(void)
{
	//kernerl에서 실행되므로 print"k"를 써야된다.  
	printk("[Embedded System Practice] Hello World!\n");
	// dump_stack() 함수는 리눅스 커널에서 제공하는 디버깅 함수로, 현재의 스택 트레이스를 출력한다.
	dump_stack();
	return 0;
}

리눅스 커널의 Makefile은 아래 과정처럼 수정하거나 추가할 수 있습니다.

  1. 새로운 Makefile 생성:
  • 리눅스 커널 소스의 embedded라는 새 디렉토리에 Makefile이라는 새 파일을 생성합니다.
  • 이 파일에 obj-y := helloworld.o 라는 내용을 작성하여 helloworld.o 오브젝트 파일이 컴파일 대상에 포함되도록 합니다.
  1. 루트 Makefile 업데이트:
  • 리눅스 커널 소스 루트에 있는 Makefile을 수정합니다.
  • 문서에서 core-y를 검색하여 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ 이라는 줄을 찾습니다.
  • 이 줄에 embedded/를 추가하여, core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ embedded/와 같이 수정합니다. 이렇게 하면 embedded 디렉토리 내의 오브젝트들이 올바르게 컴파일되도록 확실히 합니다.
  • 요약하면, 사용자는 새로운 helloworld.o 오브젝트 파일을 컴파일하기 위해 새로운 Makefile을 생성하고, 리눅스 커널을 빌드할 때 이 새로운 디렉토리가 포함되도록 루트 Makefile을 업데이트합니다.

실습

실제로 user-level program using our new system call을 작성해 보겠습니다. syscall_test.c를 생성해 준 뒤 아래와 같이 code를 작성해 줍니다.

#include <unistd.h>
#include <stdio.h>
#define __NR_embedded_hello_world 500
int main()
{
printf("Call a new system call\n");
syscall(__NR_embedded_hello_world);
printf("Done\n");
return 0;
}

생성해준 C파일을 compile해 주기 위해서 아래 순서로 차근 차근 실행 해 줍니다.

  1. 크로스 컴파일:
  • NDK의 LLVM 툴체인을 사용하여 lab2_syscall_test.c 소스 파일을 컴파일합니다. 이때 명령어 예시로 $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linuxandroid21-clang lab2_syscall_test.c가 주어져 있습니다.
  1. 컴파일된 실행 파일을 기기로 복사:
  • ADB를 사용하여 컴파일된 실행 파일을 안드로이드 기기의 /data/local/tmp 디렉토리로 복사합니다. 예시 명령어는 $ adb push a.out /data/local/tmp 입니다.
  1. 실행 및 메시지 확인:
  • ADB 쉘을 통해 안드로이드 기기 내에서 /data/local/tmp/a.out 실행 파일을 실행합니다.
    이후에, dmesg 명령어를 사용하여 커널 로그 메시지를 확인합니다. 커널 로그에서는 방금 실행한 프로그램의 출력이나 시스템 콜에 의해 발생된 메시지를 볼 수 있습니다.
profile
mem 회로설계 / AI개발 / PS / OS / IC 설계 / AI 반도체 / FPGA / 디지털집적회로설계 / Verilog HDL

0개의 댓글