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은 아래 과정처럼 수정하거나 추가할 수 있습니다.
실제로 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해 주기 위해서 아래 순서로 차근 차근 실행 해 줍니다.