UbuntuにはAndroidシステムに内蔵C実行可能プログラムのLinuxカーネルドライバをテストする.

4596 ワード

前の記事では、UbuntuでAndroidシステムのLinuxカーネルドライバを作成する方法について説明しました.このhelloというLinuxカーネルドライバでは、従来のデバイスファイル/dev/hello、procシステムファイル/proc/hello、devfsシステムプロパティファイル/sys/class/hello/helloの3つの異なるファイルノードを作成してユーザー空間にアクセスします.さらに、catコマンドを使用して/proc/helloおよび/sys/class/hello/hello/valファイルに直接アクセスし、ドライバの正確性を検証します.この記事では、自分で作成したC実行可能プログラムを通じてデバイスファイル/dev/helloにアクセスします.読者は不思議に思うかもしれませんが、AndroidシステムでC言語でアプリケーションを書くことができますか?AndroidシステムのアプリはすべてJavaアプリではないでしょうか?実はできます.読者はadb shellコマンドでAndroidシミュレータに接続してもいいです.catコマンドのようなC実行可能なプログラムは/system/binディレクトリの下にたくさん見られます.今日は、AndroidシステムにC言語で書かれた実行可能プログラムを追加する方法を学びましょう.
一.UbuntuでAndroidシステムのLinuxカーネルドライバを作成する文書を参照し、Linuxドライバを用意します.Androidシミュレータを使用してLinuxドライバを含むカーネルファイルをロードし、adb shellコマンドを使用してシミュレーションを接続し、/devディレクトリにデバイスファイルhelloがあることを確認します.
二.Androidソースエンジニアリングのexternalディレクトリに入り、helloディレクトリを作成します.
      USER-NAME@MACHINE-NAME:~/Android$ cd external
      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello
三.helloディレクトリにhelloを新規作成します.cファイル:
[cpp] view plain copy print ?
#include    
  • #include    

  • #include    
  • #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;  

  • }  
    #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の値です.
    四.ハローディレクトリに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)
    注意、BUILD_EXECUTABLEは、コンパイルするプログラムが実行可能であることを示しています. 
    五.Androidソースのモジュールを個別にコンパイルする方法を参照し、mmmコマンドを使用してコンパイルします.
          USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello
    コンパイルに成功すると、out/target/product/gerneric/system/binディレクトリの下に実行可能ファイルhelloが表示されます.
    六.Androidシステムファイルを再パッケージします.img:
          USER-NAME@MACHINE-NAME:~/Android$ make snod
    これにより、梱包後のシステムを再梱包する.imgファイルには、さっきコンパイルしたhello実行可能ファイルが含まれています.
    七.シミュレータを実行し、/system/bin/hello実行プログラムを使用してLinuxカーネルドライバにアクセスします.
          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言語で作成された実行可能プログラムを使用してLinuxカーネルドライバにアクセスする方法を紹介しましたが、AndroidのApplication FrameworksでJavaインタフェースを提供してLinuxカーネルドライバにアクセスできますか?はい、次の記事では、AndroidのApplication FrameworksでJavaインタフェースを追加してLinuxカーネルドライバにアクセスする方法について説明しますので、ご期待ください