2012-02-24 11 views
12

में कर्नेल मॉड्यूल लोड हो रहा है मैं अपनी समस्या यहां सूचीबद्ध कर रहा हूं।एंड्रॉइड कर्नेल

मेरे पास Google Nexus एक ए.के.ए. "जुनून" फोन है। फास्टबूट और एडीबी उपकरण फोन में स्थापित हैं। और बूट लोडर अनलॉक है।

मेरा कार्य: मुझे एंड्रॉइड कर्नेल में एक लिनक्स कर्नेल मॉड्यूल जोड़ना है।

मैंने क्या किया:

मैं http://source.android.com/source/initializing.html में चरणों का पालन किया और android-2.3.6_r1 (जुनून) के लिए कर्नेल डाउनलोड किया है और यह निर्माण किया है। मैं इसे फोन पर फ्लैश करने में भी सक्षम हूं और नया एंड्रॉइड कर्नेल भी ठीक काम करता है। अब मैं कर्नेल को संशोधित करना चाहता हूं और अपना कर्नेल मॉड्यूल जोड़ना चाहता हूं और फिर इसे फोन पर फ्लैश करना चाहता हूं, ताकि फोन पर कर्नेल मेरा संशोधित कर्नेल हो।

अब मैं ऐसा करने के लिए दो दृष्टिकोणों में आया हूं।

1)

क्रॉस एंड्रॉयड कर्नेल के साथ मेरी कर्नेल मॉड्यूल संकलित करें और एशियाई विकास बैंक के आदेश के साथ डिवाइस पर इसे धक्का। कर्नेल में मेकफ़ाइल का उपयोग निम्नानुसार है।

VERSION = 2 
PATCHLEVEL = 3 
SUBLEVEL = 6 
EXTRAVERSION = -00054-g5f01537 
obj-m += hello-1.o 
KDIR=/home/apurva/android_dir 
PWD := $(shell pwd) 
all: 
     make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux- x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) modules 

clean: 
     make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) clean 

अब यह नया हैलो-1.ko उत्पन्न करने में सक्षम नहीं है। मुझे नहीं पता क्यों, मुझे लगता है कि संस्करण, पैचलेवल, सबवेल और एक्सट्रूशन मूल्यों में कुछ समस्या है। क्या ये आवश्यक हैं? मैंने एंड्रॉइड-2.3.6_आर 1 से भी इन मानों की कोशिश की लेकिन फिर भी यह काम नहीं करता है। मुझे यकीन नहीं है कि यह बहिष्करण मूल्य क्या है?

मैंने अपने उबंटू में कंपाइलर से उत्पन्न हैलो-1.ko के साथ भी कोशिश की। मैंने इस हैलो-1.ko को निम्नलिखित एडीबी कमांड के साथ एमुलेटर में धक्का दिया।

/root/bin/src/out/host/linux-x86/bin/adb shell mount 
/root/bin/src/out/host/linux-x86/bin/adb push hello-1.ko /data 
/root/bin/src/out/host/linux-x86/bin/adb insmod /data/hello-1.ko 

लेकिन हैलो-1.ko इनकोड करने में सक्षम नहीं है और मुझे निम्न त्रुटि मिलती है। insmod: init_module करने में त्रुटि() हैलो-1.ko समारोह लागू नहीं किया

हैलो-1.c जबकि काफी सरल है:

#include <linux/module.h>  /* Needed by all modules */ 
#include <linux/kernel.h>  /* Needed for KERN_INFO */ 

int init_module(void) 
{ 
     printk(KERN_INFO "Hello world 1.\n"); 
     return 0; 
} 

void cleanup_module(void) 
{ 
    printk(KERN_INFO "Goodbye world 1.\n"); 
} 

2)

ऐसा करने का दूसरा दृष्टिकोण एंड्रॉइड की कर्नेल निर्देशिका में कर्नेल मॉड्यूल की मेरी स्रोत फ़ाइलों को रख सकता है। सिस्टम निर्देशिका में या कहीं और हो सकता है और अन्य स्रोतों के साथ-साथ इन स्रोत फ़ाइलों को बनाने के लिए कहें। लेकिन मुझे यकीन नहीं है कि ऐसा करने के लिए मेक प्रक्रिया कहां से पूछें। मैंने main.mk में ऐसा करने की कोशिश की और मेरी स्रोत फ़ाइलों की स्रोत निर्देशिका में एक Android.mk फ़ाइल बनाई लेकिन यह काम नहीं किया। यह एक बेहतर समाधान हो सकता है लेकिन मुझे इस पर कोई मदद नहीं मिली।

ऐसा करने के बाद, मेरे कर्नेल मॉड्यूल एंड्रॉइड फोन के वैनिक (वायरलेस नेटवर्क इंटरफेस डिवाइस) को नियंत्रित करने में सक्षम होना चाहिए। यह नींबू को नींद मोड में डालने में सक्षम होना चाहिए और उसके बाद मेरे कर्नेल मॉड्यूल से कमांड प्राप्त करने के बाद इसे जगाएं। यदि आपके पास ऐसा करने के तरीके पर कुछ पॉइंटर्स हैं, तो यह एक सहायता होगी। मैंने पाया है कि एंड्रॉइड पर इसे wpa_supplicant निजी ड्राइवर के माध्यम से नियंत्रित किया जाता है। कमांड, जैसे:

wpa_cli driver powermode 0 - auto 
wpa_cli driver powermode 1 - active 

मेरा काम कर सकता है, लेकिन मुझे यकीन नहीं है क्योंकि मैंने कोशिश नहीं की है। मैं उस चरण तक नहीं पहुंचा हूं।

कृपया इसे देखें और कुछ सहायता/मार्गदर्शन प्रदान करें।

धन्यवाद,

अपूर्व

उत्तर

5

कर्नेल मॉड्यूल (KO की) बहुत एक स्थिर गिरी से साथ काम करने में आसान हैं - जब तक गिरी उन्हें सक्षम बनाया है। बताने का सबसे आसान तरीका एक "adb shell lsmod" है। दूसरा यह देखने के लिए है कि कर्नेल .config ने CONFIG_MODULES = y और CONFIG_MODULE_UNLOAD = y को सक्षम किया है या नहीं। लिनक्स केओ विकास के बारे में वेब पर बहुत सारी जानकारी।

हमम, आप करीब हैं लेकिन ऐसा लगता है कि मेकफ़ाइल खराब है। सबसे पहले यूनिट परीक्षण के लिए अपने मेजबान पर हैलो केओ बनाने का प्रयास करें, फिर अपने लक्ष्य पर निर्माण करें।

# Makefile for trivial android kernel module 

obj-m += mod_hello.o 

CROSS_COMPILE=/opt/distros/ARM/bin/arm-none-linux-gnueabi- 
TARG_KDIR ?= /opt/android/dal/nook_kernel 

HOST_KDIR=/lib/modules/$(shell uname -r)/build 

# target creates: 
# .<obj>.o: CC command line for the .o, including dependencies 
# .<obj>.mod.o.cmd: CC command line for the mod.o, including dependencies 
# .<obj>.ko.cmd: LD command line which links the .o and .mod.o to create the .ko 
target: 
    @echo "Make module for target arm" 
    make -C $(TARG_KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules 

host: 
    @echo "Make module for host" 
    make -C $(HOST_KDIR) M=$(PWD) modules 

clean: 
    @echo "cleaning target" 
    make -C $(TARG_KDIR) M=$(PWD) clean 
    @echo "cleaning host" 
    make -C $(HOST_KDIR) M=$(PWD) clean 
1

.config में पहले जांच कर लें मॉड्यूल समर्थन सक्षम किया गया है: यहाँ एक नमूना makefile मैं एक OMAP36xx चल जिंजरब्रेड पर उपयोग करते हैं। (CONFIG_MODULES = y और CONFIG_MODULE_UNLOAD = y) यदि मेन्यूनफ़िग का उपयोग करके उन्हें सक्षम नहीं करते हैं।

फिर गिरी स्रोत की जड़ पर अपने मॉड्यूल जगह है और मुख्य makefile आप रूट

core-y  := usr/ yourModule/ 

में खोजने के लिए इस जोड़ सकते हैं और yourModule फ़ोल्डरों को यह makefile

obj-m := yourModule.o 
संबंधित मुद्दे