Ubuntu 에 서 는 Android 시스템 에 내 장 된 C 실행 가능 프로그램 테스트 Linux 커 널 드라이버 를 구현 합 니 다.

이전 글 에 서 는 우 분투 에서 안 드 로 이 드 시스템 을 위해 리 눅 스 커 널 드라이버 를 만 드 는 방법 을 소개 했다.hello 라 는 리 눅 스 커 널 드라이버 에서 세 개의 서로 다른 파일 노드 를 만들어 사용자 공간 에 접근 할 수 있 도록 합 니 다.각각 전통 적 인 장치 파일/dev/hello,proc 시스템 파일/proc/hello 와 devfs 시스템 속성 파일/sys/class/hello/hello/val 입 니 다.더 나 아가 cat 명령 을 통 해 드라이버 의 정확성 을 검증 하기 위해/proc/hello 와/sys/class/hello/hello/val 파일 에 직접 접근 합 니 다.이 글 에서 저 희 는 자신 이 작성 한 C 실행 가능 한 프로그램 을 통 해 장치 파일/dev/hello 에 접근 할 것 입 니 다.독자 들 이 이상 하 게 생각 할 수도 있 습 니 다.어떻게 안 드 로 이 드 시스템 에서 C 언어 로 프로그램 을 만 들 수 있 습 니까?Android 시스템 의 응용 프로그램 은 모두 자바 응용 프로그램 이 아 닙 니까?사실은 가능 합 니 다.독 자 는 adb 셸 명령 으로 안 드 로 이 드 시 뮬 레이 터 를 연결 하 셔 도 됩 니 다./system/bin 디 렉 터 리 에서 cat 명령 과 같은 C 실행 가능 한 프로그램 을 많이 볼 수 있 습 니 다.오늘 은 안 드 로 이 드 시스템 에 C 언어 로 작 성 된 실행 가능 한 프로그램 을 추가 하 는 방법 을 배 워 보 자.
 1.Ubuntu Android 시스템 에서 Linux 커 널 드라이버 구현 방법 작성문 을 참조 하여 Linux 드라이버 를 준비 합 니 다.Android 시 뮬 레이 터 를 사용 하여 이 Linux 드라이버 를 포함 하 는 커 널 파일 을 불 러 오고 adb 셸 명령 연결 에 시 뮬 레이 션 을 사용 하여/dev 디 렉 터 리 에 장치 파일 hello 가 존재 하 는 지 검증 합 니 다.
2.Android 소스 코드 프로젝트 의 external 디 렉 터 리 에 들 어가 hello 디 렉 터 리 를 만 듭 니 다.
      USER-NAME@MACHINE-NAME:~/Android$ cd external
      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello
 3.hello 디 렉 터 리 에 hello.c 파일 을 새로 만 듭 니 다.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define DEVICE_NAME "/dev/hello"
int main(int argc, char** argv)
{
	int fd = -1;
	int val = 0;
	fd = open(DEVICE_NAME, O_RDWR);
	if(fd == -1) {
		printf("Failed to open device %s.
", DEVICE_NAME); return -1; } printf("Read original value:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); val = 5; printf("Write value %d to %s.

", val, DEVICE_NAME); write(fd, &val, sizeof(val)); printf("Read the value again:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); close(fd); return 0;
 이 프로그램의 역할 에 서 는/dev/hello 파일 을 열 고/dev/hello 파일 의 값 을 읽 은 다음 에 값 5 를/dev/hello 에 기록 하고 마지막 으로/dev/hello 파일 의 값 을 다시 읽 어서 우리 가 방금 쓴 값 5 인지 확인 합 니 다./dev/hello 파일 에서 읽 고 쓴 값 은 실제 적 으로 우리 가상 하드웨어 의 레지스터 val 의 값 입 니 다.
 4.hello 디 렉 터 리 에 Android.mk 파일 을 새로 만 듭 니 다.
     LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE_TAGS := optional
      LOCAL_MODULE := hello
      LOCAL_SRC_FILES := $(call all-subdir-c-files)
      include $(BUILD_EXECUTABLE)
   주의:BUILDEXECUTABLE 는 우리 가 컴 파일 해 야 할 것 은 실행 가능 한 프로그램 이 라 고 밝 혔 다.
 5.Android 소스 코드 의 모듈 을 따로 컴 파일 하 는 방법 을 참조 하여 mmm 명령 으로 컴 파일 합 니 다.
       USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello
  컴 파일 에 성공 하면 out/target/produt/gerneric/system/bin 디 렉 터 리 에서 실행 가능 한 파일 hello 를 볼 수 있 습 니 다.
 6.안 드 로 이 드 시스템 파일 system.img 을 다시 포장 합 니 다.
       USER-NAME@MACHINE-NAME:~/Android$ make snod
 이렇게 해서 다시 포장 한 system.img 파일 은 방금 컴 파일 한 hello 실행 가능 한 파일 을 포함 합 니 다.
7.시 뮬 레이 터 를 실행 하고/system/bin/hello 실행 가능 한 프로그램 을 사용 하여 리 눅 스 커 널 드라이버 에 접근 합 니 다.
      USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &
      USER-NAME@MACHINE-NAME:~/Android$ adb shell
      root@android:/ # cd system/bin
      root@android:/system/bin # ./hello
      Read the original value:
      0.
      Write value 5 to /dev/hello.
      Read the value again:
      5.
 이 결 과 를 보고 우리 가 작성 한 C 실행 가능 프로그램 이 우리 가 작성 한 Linux 커 널 드라이버 에 접근 할 수 있다 고 말 합 니 다.
      C 언어 로 작 성 된 실행 가능 한 프로그램 을 사용 하여 리 눅 스 커 널 드라이버 를 방문 하 는 방법 을 소개 하 였 습 니 다.독자 들 은 안 드 로 이 드 의 Application Frameworks 에서 자바 인 터 페 이 스 를 제공 하여 리 눅 스 커 널 드라이버 에 접근 할 수 있 습 니까?네,다음 몇 편의 글 에서 우 리 는 안 드 로 이 드 의 Application Frameworks 에서 자바 인 터 페 이 스 를 추가 하여 리 눅 스 커 널 드라이버 를 방문 하 는 방법 을 소개 할 것 입 니 다.기대 하 시기 바 랍 니 다.
후속 으로 이 부분 에 대한 자 료 를 계속 정리 하 겠 습 니 다.여러분 이 본 사 이 트 를 지지 해 주 셔 서 감사합니다!

좋은 웹페이지 즐겨찾기