如何为Android创建一个可加载的内核模块?

18

我知道有很多关于这个活动的步骤指引和教程在网上流传,但是即使我看了很多,仍然无法使它运作起来。如果有人能够有耐心浏览我所采取的步骤(如下所示),并指出我可能偏离轨迹的地方,我将不胜感激。我已经花了一天半的时间盯着make文件,并阅读了指引和教程,所以任何建议都会有用。

环境:

  • 我正在使用一个Ubuntu 10.04的32位虚拟机。
  • 我从一个64位的Windows 7主机进行托管。
  • 我的Core 2 Duo没有64位虚拟机的硬件支持,所以我正在尝试编译Android 2.1内核。
  • 我已经从Dapper repo安装了Java 1.5,并删除了我的1.6安装。
  • 其余的工具已经根据Android开发文档获得...

根据初始化构建环境

Java:

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper-updates main multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk

其他要求:

$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev libz-dev libgl1-mesa-dev
$ sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386

接下来是从下载源代码树部分摘录:

Repo:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
$ repo init -u https://android.googlesource.com/platform/manifest -b eclair
$ repo sync
$ gpg --import (imported the huge key)

引用自构建系统:

初始化:

$ source build/envsetup.sh

选择一个目标:

$ lunch generic-user

构建代码:

$ make -j4

已添加! make -j4 的输出:

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ECLAIR
============================================
build/core/copy_headers.mk:15: warning: overriding commands for target `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
build/core/copy_headers.mk:15: warning: ignoring old commands for target `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
/bin/bash: line 0: cd: sdk/layoutopt/app/src/resources: No such file or directory
Install: out/host/linux-x86/bin/acp
target Generated: libclearsilver-jni <= out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar
target Generated: libclearsilver-jni <= out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar
host SharedLib: libneo_cs (out/host/linux-x86/obj/lib/libneo_cs.so)
host C++: aapt <= frameworks/base/tools/aapt/AaptAssets.cpp
host C++: aapt <= frameworks/base/tools/aapt/Command.cpp
error: error reading out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar; error in opening zip file
error: error reading out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar; error in opening zip file
error: error reading out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar; cannot read zip file
error: cannot access org.clearsilver.HDF
class file for org.clearsilver.HDF not found
javadoc: error - Class org.clearsilver.HDF not found.
Error: No classes were specified on the command line.  Try -help.
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver-jni_intermediates/org_clearsilver_HDF.h] Error 15
make: *** Waiting for unfinished jobs....
error: error reading out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar; cannot read zip file
error: cannot access org.clearsilver.CS
class file for org.clearsilver.CS not found
In file included from frameworks/base/tools/aapt/AaptAssets.h:18,
                 from frameworks/base/tools/aapt/AaptAssets.cpp:5:
frameworks/base/tools/aapt/ZipFile.h:65: warning: ‘typedef’ was ignored in this declaration
javadoc: error - Class org.clearsilver.CS not found.
Error: No classes were specified on the command line.  Try -help.
In file included from frameworks/base/tools/aapt/AaptAssets.h:18,
                 from frameworks/base/tools/aapt/Main.h:14,
                 from frameworks/base/tools/aapt/Command.cpp:6:
frameworks/base/tools/aapt/ZipFile.h:65: warning: ‘typedef’ was ignored in this declaration
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver-jni_intermediates/org_clearsilver_CS.h] Error 15

已添加!

看起来我在这里遇到了一些问题。 我认为,一旦我解决了这些问题,我就能够拥有一个能够编译内核模块的环境。 如果我错了,请纠正我。

接下来,我进入包含我的module.c文件和它的makefile的目录。 下面是makefile的内容:

obj-m += mymodule.o

CROSS_COMPILE=~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
KERNEL_DIR ?= /home/<myuser>/WORKING_DIRECTORY
VERSION = v1.1



all:
    make -C $(KERNEL_DIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules
    rm -rf *.c~
    rm -rf *.mod*
    rm -rf *.o
clean:
    make -C $(KERNEL_DIR) M=$(PWD) clean

我对make和makefile的经验很少,但这看起来还算合理。我担心的是KERNEL-DIR变量。我尝试了几个不同的值,但出现了各种各样的错误,而当前值却没有问题。当然,它仍然可能是错误的,所以在此留下任何评论都是受欢迎的。

据我所知,我应该能够执行无需参数的make命令,它将弄清楚需要做什么。我尝试过make、make -f以及带有sudo和不带sudo的两种方式。所有四种排列组合产生的结果都相同:

make -C /home/<myuser>/WORKING_DIRECTORY M=/home/<myuser>/Desktop/<MyModuleDir> ARCH=arm CROSS_COMPILE=~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- modules
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ECLAIR
============================================
make[1]: Entering directory `/home/<myuser>/WORKING_DIRECTORY'
build/core/copy_headers.mk:15: warning: overriding commands for target `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
build/core/copy_headers.mk:15: warning: ignoring old commands for target `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
/bin/bash: line 0: cd: sdk/layoutopt/app/src/resources: No such file or directory
Available sub-modules:
01-test                     dumpsys                     libminui                    LotsOfApps
20-dns.conf                 dvz                     libminzip                   lowstoragetest
95-configured                   dx                      libmp4recognizer_utility            lsd
aapt                        dx-tests                    libmtdutils                 LunarLander
acc                     edify                       libnativehelper                 LunarLanderTests
AccountAndSyncSettings              Email                       libneo_cgi                  MagicSmokeWallpapers
accRuntimeTest                  EmailTests                  libneo_cs                   make_cfst
acp                     emma                        libneo_util                 makedict
adb                     emmalib                     libnetutils                 make_g2g
adbd                        emulator                    libocr                      makekeycodes
add-property-tag                emulator-arm                    libomx_aac_component_lib            make_ve_grammar
afar                        emulator-hw                 libomx_aacdec_sharedlibrary         mediaframeworktest
aidl                        emulator-tcg                    libomx_amr_component_lib            MediaProvider
AlarmClock                  EnabledTestApp                  libomx_amrdec_sharedlibrary         mediaserver
AliasActivity                   etc1tool                    libomx_amrenc_component_lib         memtest
am                      eventanalyzer                   libomx_amrenc_sharedlibrary         minigzip
android                     event-log-tags                  libomx_avc_component_lib            mkbootfs
android.core.tests.annotation           exc_dump                    libomx_avcdec_sharedlibrary         mkbootimg
android.core.tests.archive          ext                     libomx_baseclass_lib                mksdcard
android.core.tests.concurrent           Fallback                    libomx_common_lib               mkstubs
android.core.tests.crypto           fastboot                    libomx_m4v_component_lib            mkyaffs2image
android.core.tests.dom              FixedGridLayout                 libomx_m4vdec_sharedlibrary         Mms
android.core.tests.logging          flash_image                 libomx_mastercore_lib               MmsTests
android.core.tests.luni.io          FontLab                     libomx_mp3_component_lib            monkey
android.core.tests.luni.lang            framework                   libomx_mp3dec_sharedlibrary         monkeyrunner
android.core.tests.luni.net         FrameworkPermissionTests            libomx_queue_lib                mtpd
android.core.tests.luni.util            framework-res                   libomx_sharedlibrary                MultiResolution
android.core.tests.math             FrameworkTest                   libop                       Music
android.core.tests.nio              framework-tests                 libopencore_author              MusicTests
android.core.tests.nio_char         FrameworkTestTests              libopencore_common              nc
android.core.tests.prefs            fsck_msdos                  libopencore_download                netcfg
android.core.tests.regex            fs_config                   libopencore_downloadreg             netperf
android.core.tests.runner           fs_get_stats                    libopencore_mp4local                netserver
android.core.tests.security         Gallery                     libopencore_mp4localreg             ninepatch
android.core.tests.sql              Gallery3D                   libopencore_net_support             NinePatchLab
android.core.tests.text             GalleryTests                    libopencore_player              NoShareUidApp
android.core.tests.xml              gdbserver                   libopencore_rtsp                NotePad
android.core.tests.xnet             genext2fs                   libopencore_rtspreg             NotePadTests
android.cts.dpi                 GestureBuilder                  libosclbase                 opcontrol
android.cts.refapp              GL2JNI                      libosclerror                    openssl
android.policy                  GLJNI                       libosclio                   OpenWnn
android.policy_mid              GlobalSearch                    liboscllib                  oprofiled
android.policy_phone                GlobalSearchBenchmarks              libosclmemory                   org.eclipse.core.commands_3.4.0.I20080509-2000
androidprefs                    GlobalSearchPermissionTests         libosclproc                 org.eclipse.equinox.common_3.4.0.v20080421-2006
android.test.runner             GlobalSearchTests               libosclregcli                   org.eclipse.jface_3.4.2.M20090107-0800
AndroidTests                    GlobalTime                  libosclregserv                  org-netbeans-api-visual
angeles                     GoogleContactsProvider              libosclutil                 org-openide-util
ant                     GoogleContactsProviderTests         libpagemap                  osgi
antlr-2.7.7                 google-framework                libpassthru_oma1                PackageInstaller
anttasks                    googlelogin-client              libpcap                     parseStringTest
apicheck                    GoogleSearch                    libpixelflinger                 perm_checker
ApiDemos                    gpustate                    libpixelflinger_armv6               perm_checker.conf
ApiDemosReferenceTest               gralloc.default                 libpixelflinger_static              Phone
ApiDemosTests                   groovy-all-1.6.5                libplatform_library_jni             PicoTts
apkbuilder                  grxmlcompile                    libpng                      ping
ApplicationsProvider                gtest-filepath_test             libpopt                     PinyinIME
applypatch                  gtest-linked_ptr_test               libprotocolenginenode_base          PlatformLibraryClient
applypatch_static               gtest-message_test              libprotocolenginenode_common            platform.xml
app_process                 gtest-options_test              libprotocolenginenode_download_common       pm
AppWidgetHostTest               gtest-port_test                 libprotocolenginenode_pdl           post_trace
AppWidgetProvider               gtest_pred_impl_unittest            libprotocolenginenode_ps            pppd
apriori                     gtest_prod_test                 libpv_aac_dec                   preload
archquery                   gtest-test-part_test                libpvaacffparsernode                ProcessTests
asm-3.1                     gtest-typed-test2_test              libpvaacffrecognizer                procmem
atree                       gtest-typed-test_test               libpvaacparser                  procrank
AudioHardwareRecord             gtest_unittest                  libpvamrffparsernode                profile_pid
AudioHardwareRecordLoop             gzip                        libpvamrffrecognizer                profile_trace
AudioInRecord                   HelloActivity                   libpv_amr_nb_common_lib             Provision
backup_helper_test              HelloActivityTests              libpvamrwbdecoder               pvplayer
BackupTest                  hierarchyviewer                 libpvauthorengine               q2dm
BatteryWaster                   hist_trace                  libpv_avc_common_lib                q2g
bb2sym                      Home                        libpvavcdecoder                 qemud
bb_dump                     hosttestlib                 libpvavifileparser              qemu-props
bbprof                      hprof-conv                  libpv_config_parser             qwerty2.kcm
bison                       HTMLViewer                  libpvdecoder_gsmamr             qwerty.kcm
Bluetooth                   icache                      libpvdownloadinterface              racoon
BluetoothChat                   icudata                     libpvdownloadmanagernode            radiooptions
BluetoothDebug                  idegen                      libpvdownloadreginterface           read_addr
bmgr                        ime                     libpvencoder_gsmamr             read_method
bookmarks.xml                   ImfTest                     libpvfileoutputnode             read_pid
bootanimation                   ImfTestTests                    libpvfileparserutils                read_trace
Browser                     imgdiff                     libpvframemetadatautility           recovery
BrowserPowerTests               init                        libpvgendatastruct              required_hardware.xml
BrowserTestPlugin               input                       libpvgsmamrparser               rgb2565
BrowserTests                    installd                    libpv_http_parcom               rild
bsdiff                      invoke_mock_media_player            libpvid3parcom                  rsg-generator
bspatch                     iptables                    libpvjitterbuffer               RSSReader
btool                       ip-up-vpn                   libpvjitterbuffernode               run-core-tests
bugreport                   iself                       libpvjitterbufferrtp                run-core-tests-on-ri
BusinessCard                    isprelinked                 libpvlatmpayloadparser              safe_iop_test
Calculator                  jarjar                      libpvmediadatastruct                SampleBrowserPlugin
CalculatorTests                 jarutils                    libpvmediainputnode             schedtest
Calendar                    jasmin                      libpvmedialayernode             scp
CalendarProvider                jasmin.jar                  libpvmediaoutputnode                screenshot2
CalendarProviderTests               javax.obex                  libpvmf                     sdklib
CalendarTests                   jcommon-1.0.12                  libpvmfrecognizer               sdkmanager
Camera                      jdiff                       libpvmimeutils                  SdkSetup
CameraTests                 jdwpspy                     libpvmioaviwavfileinput             sdkstats
CertInstaller                   JETBoy                      libpvmiofileinput               sdkuilib
cfassembler                 jfreechart-1.0.9                libpvmiofileoutput              sdutil
check-lost+found                jfreechart-1.0.9-swt                libpvmp3                    SearchableDictionary
check_prereq                    junit                       libpvmp3ff                  sensors.goldfish
check_stack                 jython                      libpvmp3ffparsernode                service
check_trace                 kcm                     libpvmp3ffrecognizer                servicemanager
clearsilver                 keystore                    libpvmp4decoder                 services
cmu2nuance                  keystore_cli                    libpvmp4ff                  Settings
com.android.inputmethod.pinyin.lib      KeyStoreTests                   libpvmp4ffcomposer              SettingsProvider
com.example.android.platform_library        kxml2-2.3.0                 libpvmp4ffcomposernode              SettingsTests
commons-compress-1.0                latencytop                  libpvmp4ffparsernode                sh
Compass                     LatinIME                    libpvmp4ffrecognizer                ShareUidApp
ContactManager                  Launcher                    libpvmp4interface               showlease
Contacts                    Launcher2                   libpvmp4reginterface                showmap
ContactsProvider                launchperf                  libpvomxaudiodecnode                showslab
ContactsProviderTests               layoutlib                   libpvomxbasedecnode             sig
ContactsTests                   layoutlib_api                   libpvomxencnode                 sig-check
core                        layoutlib_create                libpv_omx_interface             sig-create
core-tests                  layoutlib_utils                 libpvomx_proxy_lib              signapk
CoreTests                   layoutopt                   libpvomxvideodecnode                SignatureTest
coverage                    libabi                      libpvplayer_engine              SignatureTestTests
cpueater                    libacc                      libpvpvxparser                  signature-tools
cpufeatures                 libaes                      libpvrtsp_cli_eng_node              SimpleJNI
crasher                     libandroidpv                    libpvrtspinterface              SkeletonApp
create_test_dmtrace             libandroidpvauthor              libpv_rtsp_parcom               SkeletonAppTests
cts                     libandroid_runtime              libpvrtspreginterface               skia_bench
CtsAccessibilityServiceTestCases        libandroid_servers              libpvsdpparser                  skia_gm
CtsAccountManagerTestCases          libapplypatch                   libpvsocketnode                 SlowSuggestions
CtsAppAccessData                libarity                    libpvstreamingmanagernode           SmokeTest
CtsAppSecurityTests             libastl                     libpvthreadmessaging                SmokeTestApp
CtsAppTestCases                 libaudioflinger                 libpvwav                    Snake
CtsAppWithData                  libaudiointerface               libpvwavffparsernode                SnakeTests
CtsBluetoothTestCases               libaudiopolicygeneric               libpvwavffrecognizer                SoftKeyboard
CtsContentTestCases             libbinder                   librank                     soslim
cts-dalvik-buildutil                libbz                       libreference-cdma-sms               sound
CtsDatabaseTestCases                libc                        libreference-ril                SoundRecorder
CtsDelegatingAccessibilityService       libcameraservice                libril                      SpammySuggestions
CtsDpiTestCases                 libcamerastub                   libRS                       SpareParts
CtsDpiTestCases2                libc_common                 librs_jni                   spec-progress
CtsExampleTestCases             libc_debug                  librtppayloadparser             sqlite3
CtsGestureTestCases             libclearsilver-jni              librtprtcp                  SRecTest
CtsGraphicsTestCases                libc_nomalloc                   libsafe_iop                 SRecTestAudio
CtsHardwareTestCases                libcolorconvert                 libsampleplugin                 ssh
CtsInstrumentationAppDiffCert           libcpm                      libSDL                      SslLoad
CtsJniTestCases                 libcrypto                   libSDLmain                  stack_dump
CtsLocationTestCases                libctest                    libsimplejni                    StatusBarTest
CtsMediaTestCases               libcts_jni                  libskia                     Stk
CtsNetTestCases                 libctspermission_jni                libskiagl                   strace
CtsOsTestCases                  libcutils                   libsonivox                  stringtemplate
CtsPerformance2TestCases            libdb                       libsoundpool                    su
CtsPerformance3TestCases            libdbus                     libspeex                    surfaceflinger
CtsPerformance4TestCases            libdbus-tools-common                libsqlite                   svc
CtsPerformance5TestCases            libdex                      libsqlite3_android              swing-worker-1.1
CtsPerformanceTestCases             libdl                       libsqlite3_phone_number_utils_test      swt
CtsPermission2TestCases             libdrm1                     libsqlite3_phonetic_string_utils_test       system_server
CtsPermissionDeclareApp             libdrm1_jni                 libSR_AcousticModels                tcpdump
CtsPermissionTestCases              libdrm2                     libSR_AcousticState             TelephonyProvider
CtsProviderTestCases                libdvm                      libSR_AudioIn                   telephonytest
CtsSharedUidInstall             libebl                      libSR_Core                  temp_layoutlib
CtsSharedUidInstallDiffCert         libebl_arm                  libsrec_jni                 Term
CtsSimpleAppInstall             libedify                    libSR_EventLog                  test_defs.xml
CtsSimpleAppInstallDiffCert         libEGL                      libSR_G2P                   TestDeviceSetup
CtsSpeechTestCases              libelf                      libSR_Grammar                   test-fb-refresh
CtsTargetInstrumentationApp         libelfcopy                  libSR_Nametag                   test-fb-simple
CtsTelephonyTestCases               libembunit                  libSR_Recognizer                test_g2g
CtsTestStubs                    libemoji                    libSR_Semproc                   test-mdp
CtsTextTestCases                libESR_Portable                 libSR_Session                   test-opengl-codegen
CtsUsePermissionDiffCert            libESR_Shared                   libSR_Vocabulary                test-opengl-fillrate
CtsUtilTestCases                libETC1                     libssl                      test-opengl-filter
CtsViewTestCases                libexif                     libstagefright                  test-opengl-finish
CtsWebkitTestCases              libexpat                    libstagefright_omx              test-opengl-gl2_basic
CtsWidgetTestCases              libext                      libstdc++                   test-opengl-gl_basic
CubeLiveWallpapers              libfdlibm                   libsurfaceflinger               test-opengl-gralloc
CustomLocale                    libFFTEm                    libsvoxpico                 test-opengl-linetex
daemonize                   libfst                      libsystem_server                test-opengl-swapinterval
dalvikvm                    libft2                      libsysutils                 test-opengl-textures
dasm                        libgetactualaacconfig               libterm                     test-opengl-tritex
dbus-daemon                 libgif                      libtestplugin                   test-progress
dbus-monitor                    libgl2jni                   libthread_db                    test-progress-new
dbus-send                   libGLES_android                 libthreadsafe_callback_ao           test_swiarb
ddmlib                      libGLESv1_CM                    libtinyxml                  test_zipfile
ddms                        libGLESv2                   libtomcrypt                 timeinfo
ddmuilib                    libgljni                    libtommath                  timetest
debuggerd                   libgoogleclient                 libttspico                  toolbox
DensityTest                 libgtest                    libttssynthproxy                traceview
descGen                     libgtest_main                   libui                       TransformTest
DeskClock                   libhardware                 libunz                      TtsService
Development                 libhardware_legacy              libutil                     tuttle2.kcm
dexdeps                     libhost                     libutils                    uix
dexdump                     libicudata-default              libvorbisidec                   updater
dexlist                     libicudata-eu                   libwbxml                    UpgradeExample
dexopt                      libicudata-jp                   libwbxml_jni                    usbtest
dexopt-wrapper                  libicudata-large                libwebcore                  UserDictionaryProvider
dexpreopt                   libicudata-us                   libwnndict                  VisualizationWallpapers
dex-tools                   libicui18n                  libWnnEngDic                    vm-tests
dhcpcd                      libicuuc                    libWnnJpnDic                    VoiceDialer
dhcpcd-run-hooks                libiptc                     libwpa_client                   Voiper
dictTest                    libjavacore                 libxml2                     vold
DisabledTestApp                 libjni_latinime                 libxml2wbxml                    VpnServices
dmtracedump                 libjni_pinyinime                libz                        wbxmltest
DownloadProvider                libjnitest                  libzipfile                  wdsclient
draw9patch                  libjpeg                     LightingTest                    webkitmerge
DrmProvider                 liblog                      line_endings                    Wiktionary
droiddoc                    libm                        linker                      WiktionarySimple
dumpeventlog                    libm4v_config                   LiveWallpapers                  xmlwriter
dumpkey                     libmedia                    LiveWallpapersPicker                yuv420sp2rgb
dump_regions                    libmedia_jni                    localize                    zipalign
DumpRenderTree                  libmediaplayerservice               logcat
dumpstate                   libmincrypt                 logwrapper
make[1]: Leaving directory `/home/<myuser>/WORKING_DIRECTORY'
rm -rf *.c~
rm -rf *.mod*
rm -rf *.o

你会注意到一些奇怪的警告,但据我所知,它们并不是真正的问题。如果有人对此有不同看法,请说出来。

make[1]: Entering directory `/home/<myuser>/WORKING_DIRECTORY'
build/core/copy_headers.mk:15: warning: overriding commands for target     `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
build/core/copy_headers.mk:15: warning: ignoring old commands for target     `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'
/bin/bash: line 0: cd: sdk/layoutopt/app/src/resources: No such file or directory

我猜最后一句听起来相当可疑,但我不知道该怎么做。 除了我提到的几件奇怪的事情外,似乎这一切都进行得很顺利。 然而,在整个过程完成后,我无法找到 *.ko 文件所在的位置。 我在我的家目录下执行了 ls -alRg | grep *.ko,但没有发现任何结果。 我被难住了。如果我能提供更多信息、运行任何测试或尝试其他任何不同的方法,我会经常查看。


1
你能否运行“emulator”命令并启动模拟器?如果一切编译正确,你就可以这样做。我在Mac OS X上做到了这一点,并且它对我起作用。如果我没记错的话,我也收到了类似的警告,但仍然能够运行模拟器。 - omermuhammed
@omermuhammed 好的,我尝试运行模拟器,但找不到它。然后我想也许我应该重新运行 make -j4,结果却导致我的虚拟机崩溃了。我打算重建整个内核,然后再看看运行模拟器会发生什么。成功启动模拟器实际上意味着什么? - Brian Sweeney
1
您将在计算机屏幕上看到手机运行,基本上它的意思就是它的名字所说的那样,在您的PC上运行一个完整的手机。 - omermuhammed
@omermuhammed运行了最近编译的内核?这将向我证明内核已经成功编译,这很好。那么这是否意味着我的环境已经准备好构建内核模块了呢? - Brian Sweeney
1
你说得对,如果编译成功并且能够启动和运行模拟器,那么就意味着你已经准备好进行开发了。 - omermuhammed
3个回答

7

对不起我迟到了,但希望这有所帮助:

http://tthtlc.wordpress.com/2011/12/29/how-to-write-a-kernel-module-on-android-sony-ericsson-xperia-arc-s/

我在我的索尼爱立信Xperia Arc S上编写和测试了代码,并且它可以工作(通常来说,它应该适用于任何安卓手机)。
通过adb和USB连接,并使用“su”切换到root用户,输入“lsmod”列出了所有内核模块(一般来说,这篇文章http://web.archive.org/web/20121106004141/http://developer.sonymobile.com/2011/05/06/how-to-build-a-linux-kernel提供了非常好的关于SonyEricsson手机Linux内核编译需要做什么的指导)。
lsmod
android_module 654 0 - Live 0x7f007000 (P)
sdio 16532 0 - Live 0x7f000000

"insmod android_module.ko"是我通过插入"android_module"模块来实现的。
以下是具体步骤:
首先,将原始程序从以下位置复制:

http://rechtzeit.wordpress.com/2011/03/21/77/

或者如下重现:

android_module.c:

#include"linux/module.h"
#include"linux/kernel.h"
//replace the "" with angular brackets
int init_module(void)
{
  printk(KERN_INFO "Hello android kernel...\n");
  return 0;
}

void cleanup_module(void)
{
  printk(KERN_INFO "Goodbye android kernel...\n");
}

Makefile:


obj-m += android_module.o

all:
make -C /home/tteikhua/android/sony_ericsson_src/58/kernel/ M=$(PWD) modules
clean:
make -C /home/tteikhua/android/sony_ericsson_src/58/kernel/ M=$(PWD) clean

内核所在的目录(上面的“-C”)就是内核所在的位置。
以下命令将使用上面提到的Makefile
ARCH=arm CROSS_COMPILE=/opt/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi- make

如上所示,我使用的交叉编译器来自CodeSourcery。
在执行insmod android_module.ko之后,您可以在dmesg输出中看到调试消息:
 <6>[11184.063507] Hello android kernel...
 <7>[11619.209655] msmrtc_timeremote_set_time: 11/29/2011 10:09:36 (04)
 <6>[11619.210418] RPC CALL -- TOD TIME UPDATE: ttick = 404244221
 <6>[11619.210418] stamp=52910543933046785, freq = 0
 <7>[11619.211578] msmrtc_tod_proc_result: 12/29/2011 10:09:36 (03)
 <6>[11619.211578] rs30000048 rs30000048.262144: setting system clock to 2011-12-29 10:09:36 UTC (1325153376)
 <6>[11662.112365] device rmnet0 left promiscuous mode
 <6>[11662.112579] device rmnet0 entered promiscuous mode
 <6>[11669.958221] device rmnet0 left promiscuous mode
 <6>[11669.958435] device rmnet0 entered promiscuous mode
 <7>[11698.181060] msmrtc_timeremote_set_time: 11/29/2011 10:10:55 (04)
 <6>[11698.187622] RPC CALL -- TOD TIME UPDATE: ttick = 406832008
 <6>[11698.187652] stamp=52910548228014081, freq = 0
 <7>[11698.193939] msmrtc_tod_proc_result: 12/29/2011 10:10:55 (03)
 <6>[11698.194030] rs30000048 rs30000048.262144: setting system clock to 2011-12-29 10:10:55 UTC (1325153455)
 <6>[11814.442901] bq27520 0-0055: bq27520_handle_soc_worker() capacity=97 (100) flags=0x229 ctrl_status=0x28b soh_state=0x3, valid=1
 <6>[11984.057373] Goodbye android kernel...

“Goodbye” 是执行 rmmod android_module 命令时的操作。在此之间是内核中其他组件的调试信息。

最后的话:

以上内容编写于2011年,如需更现代化的资源,请参考以下内容以开始:

https://source.android.com/docs/core/architecture/kernel/modular-kernels

https://source.android.com/docs/core/architecture/kernel

https://source.android.com/docs/setup/build/building-kernels

https://source.android.com/docs/core/architecture/kernel/loadable-kernel-modules


4
我已将您的博客文章复制到这里,因为仅提供链接的回答不受社区欢迎:http://meta.stackexchange.com/q/8231/ - Idolon

3
我想我已经读到模拟器内核不支持模块,因此您必须编译支持模块的内核。

我希望这个链接能帮助你。


这是一篇不错的文章;我昨天看了一下。似乎模拟器默认情况下未配置支持LKM,但可以重新编译以支持模块。其他版本的内核也是如此。然而,许多设备默认情况下都启用了模块支持。由于模拟器存在一些奇怪的问题,可能会减慢我的速度,所以我可能会远离它。我有几个真实的手机可供测试使用。 - Brian Sweeney

3

你需要做两件事。首先,创建一个支持可加载内核模块的模拟器内核。

这里有一篇详细的文章,介绍了设置模拟器内核的过程:post here

指令有两个部分需要修改:

  1. I find it easiest to keep the kernel within the repo area (in this case, ~/WORKING_DIRECTORY), like so:

    cd ~/WORKING_DIRECTORY
    mkdir kernel
    cd kernel
    git clone git://android.git.kernel.org/kernel/common.git
    
  2. The branch information is no longer correct, however, so where it says:

    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
    

使用这个替代:

    git checkout -t archive/android-gldfish-2.6.29 -b goldfish

正如您所发现的,内核默认情况下未配置可加载模块支持。在编译之前启用它。完成此步骤后:

make ARCH=arm goldfish_defconfig

请这样做:

make ARCH=arm menuconfig

出现一个基于文本的菜单。使用上/下箭头键进行导航,使用空格选择选项,使用回车扩展菜单(菜单在行尾有--->),使用Esc-Esc返回上一个菜单。
  1. 向下滚动并按下空格键选择“启用可加载模块支持”
  2. 按Esc-Esc退出,按Enter保存新配置
现在开始构建。根据您的设置,应该是:
make ARCH=arm CROSS_COMPILE=/home/<myuser>/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-

现在第一部分已经完成,你可以开始做第二部分了,即创建一个可加载的内核模块。你差不多就要成功了,但是因为你没有模拟器的内核源代码,所以它没有起作用。只需使用你已有的makefile并将KERNEL_DIR更改为:

KERNEL_DIR ?= /home/<myuser>/WORKING_DIRECTORY/kernel/common

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接