国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Ubuntu中為Android系統上實現內置C可執行程序測試Linux內核驅動程序

2019-12-12 05:47:44
字體:
來源:轉載
供稿:網友

在前一篇文章中,我們介紹了如何在Ubuntu上為Android系統編寫Linux內核驅動程序。在這個名為hello的Linux內核驅動程序中,創建三個不同的文件節點來供用戶空間訪問,分別是傳統的設備文件/dev/hello、proc系統文件/proc/hello和devfs系統屬性文件/sys/class/hello/hello/val。進一步,還通過cat命令來直接訪問/proc/hello和/sys/class/hello/hello/val文件來,以驗證驅動程序的正確性。在這一篇文章里,我們將通過自己編寫的C可執行程序來訪問設備文件/dev/hello。可能讀者會覺得奇怪,怎么能在Android系統中用C語言來編寫應用程序呢?Android系統上的應用程序不都是Java應用程序嗎?其實是可以的,讀者不妨用adb shell命令連上Android模擬器,在/system/bin目錄下可以看到很多C可執行程序,如cat命令。今天,我們就來學習一下怎么在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文件:

#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./n", DEVICE_NAME);		return -1;	}		printf("Read original value:/n");	read(fd, &val, sizeof(val));	printf("%d./n/n", val);	val = 5;	printf("Write value %d to %s./n/n", val, DEVICE_NAME); write(fd, &val, sizeof(val));		printf("Read the value again:/n"); read(fd, &val, sizeof(val)); printf("%d./n/n", val);	close(fd);	return 0;

 這個程序的作用中,打開/dev/hello文件,然后先讀出/dev/hello文件中的值,接著寫入值5到/dev/hello中去,最后再次讀出/dev/hello文件中的值,看看是否是我們剛才寫入的值5。從/dev/hello文件讀寫的值實際上就是我們虛擬的硬件的寄存器val的值。

 四. 在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)

   注意:BUILD_EXECUTABLE表示我們要編譯的是可執行程序。

 五. 參照如何單獨編譯Android源代碼中的模塊一文,使用mmm命令進行編譯:

       USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello

  編譯成功后,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行文件hello了。

 六. 重新打包Android系統文件system.img:

       USER-NAME@MACHINE-NAME:~/Android$ make snod

 這樣,重新打包后的system.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內核驅動程序,敬請期待。

后續繼續對這部分的資料整理,謝謝大家支持本站!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁阳县| 巴塘县| 龙陵县| 大埔区| 玛纳斯县| 报价| 分宜县| 台江县| 昭觉县| 台东县| 武威市| 阿拉尔市| 大洼县| 木里| 濮阳县| 普兰店市| 专栏| 凤冈县| 辽中县| 海淀区| 民权县| 竹北市| 武平县| 丹棱县| 乌鲁木齐县| 扎赉特旗| 宾川县| 伊宁县| 斗六市| 台山市| 田林县| 泰和县| 彰化县| 贵州省| 海门市| 孟村| 普洱| 白河县| 嘉黎县| 武隆县| 雷山县|