提取安卓的Linux内核和驱动

笔记本/便携移动设备,手机平板等软硬件
felonwan
帖子: 262
注册时间: 2008-09-12 12:32

提取安卓的Linux内核和驱动

#1

帖子 felonwan » 2013-10-25 0:42

水平有限,中间可能有各种错误,欢迎拍砖指正。

大家最关心的一个问题是,平板电脑或手机要是安装Linux,驱动的问题怎么解决?
我们知道Linux的驱动是要加载在内核里的,而且驱动和内核要匹配才能加载。
如果我们能提取安卓的Linux内核和驱动模块,它们肯定是匹配的,为什么不能用于其它Linux系统呢?

于是我就去试了试,结果发现是可以用的。之前自己直接编译的触摸屏驱动用不了,声音、wifi、键鼠、屏幕休眠都正常,视频也可以软解。
这样,自己不用编译驱动和内核,我们只是提取内核和驱动,然后安装到microSD卡上,就能从卡上启动Linux或者安卓系统了。
(当然,要是各种驱动的问题都能解决,系统用着感觉好,不妨再改改u-boot并用dd命令把相应的镜像写入到内置存储里面)


1. 提取驱动
驱动提取很好办,在/system/vendor/modules里面,那一堆.ko文件就是。另外可能还需要固件,在/system/vendor/firmware里面。

代码: 全选

cp -r /system/vendor/modules /sdcard/

2. 提取内核
提取内核稍微麻烦一点,首先要获取Android的boot分区镜像,这可以在android下做,或者直接从固件包里提取。前者是通用的,只需要找到你的nand分区里哪个是boot分区就好了。假设boot分区是nandb

代码: 全选

dd if=/dev/nandb of=/sdcard/boot.img
获得boot分区镜像后,还要做的一件事就是分离内核。因为安卓的boot镜像由三部分组成:header,kernel和ramdisk,我们需要的只是kernel。
上面的事情都是安卓下的终端应用里或者用adb进行的操作,下面的必须在电脑上进行操作。
需要下载一个工具:

代码: 全选

http://dl.linux-sunxi.org/users/arete74/tools.tar.gz
解压后:

代码: 全选

cd tool
./split_bootimg.pl ../boot.img
然后你就能看到一个boot.img-kernel的文件,将它转换成可以从卡上引导的镜像:

代码: 全选

mkimage -A arm -O linux -T kernel -C none -a 0x40008000 -e 0x40008000 -n "Linux 2.6" -d boot.img-kernel uImage

注意:
可能一些驱动在ramdisk里面,分离内核之后有个boot.img-ramdisk.gz的文件,两次解压,就可以看到里面有一些安卓启动的脚本,还有一个/system/目录,这个目录下也可能有驱动,如果有就一并提取出来。



最后放上全志系列芯片在SD卡上安装和启动安卓的教程,上面的这个分离安卓内核的工具和过程都来源于此(这个分离的工具是通用的,从ubuntu官方下载的ubuntu touch的各种boot镜像也能用它分离):
http://linux-sunxi.org/Boot_Android_from_SdCard
上次由 felonwan 在 2013-10-29 22:08,总共编辑 10 次。
felonwan
帖子: 262
注册时间: 2008-09-12 12:32

Re: 提取安卓Linux内核和驱动

#2

帖子 felonwan » 2013-10-25 0:42

提取完内核和驱动,但是怎么来用它们呢?

有源代码的情况

我是在有相应的源码而且源码里面有大部分驱动的情况下使用的。自行编译后的内核和模块就能启动SD卡上的系统,进入Linux桌面,但是触摸屏用不了。
这样的话,我直接替换掉原来SD卡上的内核,把/lib/modules/下编译的驱动模块目录拷一份,重新命名为安卓的Linux内核的版本名,再把相应的驱动模块用安卓下获得的模块替换掉。这样做完后,还要在/etc/modules里面调整好启动时需要加载的模块,这个直接在安卓下lsmod,把必要的模块都加上就可以了。最后启动SD卡上的Linux桌面,哈哈,触摸屏驱动就可以使用了。


如果没有源代码,怎么办?

如果从SD卡启动Linux系统,能正常使用lcd和键盘鼠标,就可以手动插入驱动模块来解决:

代码: 全选

insmod 安卓模块目录/模块名.ko
但是关键的部分,比如说lcd显示的驱动,不能在启动的时候就加载,这个就比较麻烦一点。
我没有遇到过,但是如果在启动脚本里,比如rc.local,用insmod命令挂载,应当是可以实现的。

Linux的内核的modules自动加载似乎限制很多,反正你能看到它在“/lib/modules/版本号”目录下有一堆module.*的文件,什么modules.order、modules.dep、modules.builtin啦,它们定义模块的启动顺序、依赖关系、是不是内建在内核里等。大概是为安全吧。如果在能保证安全的前提下解除这些限制,以insmod的方式实现安卓模块的加载,那就什么问题都没有了!

:em05 刚看到原来安卓的启动过程就完全是用insmod加载驱动的。


使用方法总结
构建一个可从平板启动的microSD卡,替换内核并且自己在启动脚本insmod各个驱动。



问题:
1. 启动过程稍有变慢。(不排除内核和模块编译优化的差异,我用linaro那个配置文件编译出来的各个模块都比安卓下的模块要小很多。);
2. 内置的nand读不了;
3. [已解决] 网络问题,必须是root帐户才能访问网络。这是安卓的内核在用户权限上的限制,按照下面方法做完重启就可以解决:

代码: 全选

http://archlinuxarm.org/forum/viewtopic.php?f=9&t=4611
之前声音、视频什么能用,可能是因为linaro这个镜像本来就把linaro这个用户添加到了相应的用户组。



主要待解决的事项:
背光亮度调节。
上次由 felonwan 在 2013-10-29 22:11,总共编辑 8 次。
felonwan
帖子: 262
注册时间: 2008-09-12 12:32

Re: 提取安卓的Linux内核和驱动

#4

帖子 felonwan » 2013-10-25 13:17

photor 写了:直接提取就可以用? :em09
可以的,我的能用。
内核替换为提取出来的内核,那么驱动采用“insmod 驱动模块名”的方式加载就可以用了。
adqiy
帖子: 8
注册时间: 2013-10-10 0:03
系统: ubuntu1204

Re: 提取安卓的Linux内核和驱动

#5

帖子 adqiy » 2013-10-29 20:27

楼主,为啥我的安卓手机系统/system/vendor下,没有modules文件,还有firmware文件也没有
felonwan
帖子: 262
注册时间: 2008-09-12 12:32

Re: 提取安卓的Linux内核和驱动

#6

帖子 felonwan » 2013-10-29 21:49

adqiy 写了:楼主,为啥我的安卓手机系统/system/vendor下,没有modules文件,还有firmware文件也没有
哈哈,你手机是啥的?

如果不在这里面,大概就在安卓的Linux内核或ramdisk镜像里了。
安卓内核里的驱动你就不用管它,启动系统里自己就加载了。
在ramdisk镜像里面也有一个/system/vendor目录,里面可能有放驱动。
adqiy
帖子: 8
注册时间: 2013-10-10 0:03
系统: ubuntu1204

Re: 提取安卓的Linux内核和驱动

#7

帖子 adqiy » 2013-10-31 17:19

felonwan 写了:
adqiy 写了:楼主,为啥我的安卓手机系统/system/vendor下,没有modules文件,还有firmware文件也没有
哈哈,你手机是啥的?

如果不在这里面,大概就在安卓的Linux内核或ramdisk镜像里了。
安卓内核里的驱动你就不用管它,启动系统里自己就加载了。
在ramdisk镜像里面也有一个/system/vendor目录,里面可能有放驱动。
哦……我的是华为8813q……那我这镜像里找找……谢谢……有不懂的再问你 :em06
头像
nokia5320
帖子: 50
注册时间: 2012-07-17 18:12
系统: XP + ubutntu12.4

Re: 提取安卓的Linux内核和驱动

#8

帖子 nokia5320 » 2014-09-19 23:20

http://www.emui.com/plugin.php?id=hwdow ... ail&mid=32
是华为荣耀3c 联通版,官方给了源代码,您看看这是啥东西?我可以下载android L的源码一起编译固件吗?
鄙人小白,正在linux 学习中
felonwan
帖子: 262
注册时间: 2008-09-12 12:32

Re: 提取安卓的Linux内核和驱动

#9

帖子 felonwan » 2014-10-01 15:05

nokia5320 写了:http://www.emui.com/plugin.php?id=hwdow ... ail&mid=32
是华为荣耀3c 联通版,官方给了源代码,您看看这是啥东西?我可以下载android L的源码一起编译固件吗?
鄙人小白,正在linux 学习中
版本: H30-U10,JellyBean,kernel-3.4.5

应该是内核源码吧,能不能一起编我不知道,你可以试试。
1135799109
帖子: 1
注册时间: 2015-07-06 21:07
系统: ubuntu15.04

Re: 提取安卓的Linux内核和驱动

#10

帖子 1135799109 » 2015-07-06 21:52

楼至我有一个问题,我的手机F160硬件配置只有屏幕材质与F260不同,cpu都是高通8960 显卡也一样,,我刷了260的4cm11发现屏幕在显示开机动画前黑屏,但是有震动有声音,我想可能是显示驱动问题 ,所以现在我想移植f260 的cm12,有内核源码,该如何修改,如何配置 ?也有4.1的官方源码。
谢谢,如果不嫌能不能告诉你的联系方式或加QQ1135799109 :em01
jsjkj
帖子: 1
注册时间: 2009-10-11 16:51

Re: 提取安卓的Linux内核和驱动

#11

帖子 jsjkj » 2015-10-25 12:12

felonwan,
请问你是如何制作SD 卡启动的?
我看了全志的链接,分区和bootloader弄不成,是否可以写个详细点的制作启动盘的教程

谢谢
gfm1911
帖子: 2
注册时间: 2016-04-19 21:36
系统: win10

Re: 提取安卓的Linux内核和驱动

#12

帖子 gfm1911 » 2016-05-16 16:02

楼主能否写个

nVidia Shield Android TV 装UBUNTU的教程,在外网看了个没看明白,http://forum.xda-developers.com/shield- ... v-t3150352
sheepbao
帖子: 13
注册时间: 2015-07-11 17:02
系统: ubuntu1404

Re: 提取安卓的Linux内核和驱动

#13

帖子 sheepbao » 2016-05-24 14:57

确实,android也是linux,驱动的话,如果芯片都是同系列的,那直接提取ko文件是可以的,但是不同的内核版本有可能出现不兼容的情况,最好还是直接用源码编译的驱动最好。PS:提取so库不错,编程用的
just for fun
melon301
帖子: 3
注册时间: 2016-09-07 15:53
系统: win7

Re: 提取安卓的Linux内核和驱动

#14

帖子 melon301 » 2016-11-02 20:54

felonwan, 你好,我正好有这个需求,可以留个联系方式么?QQ48176827
头像
懒蜗牛Gentoo
论坛版主
帖子: 7353
注册时间: 2007-03-02 17:36
系统: Linux Mint

Re: 提取安卓的Linux内核和驱动

#15

帖子 懒蜗牛Gentoo » 2016-11-04 23:00

Mark之~
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事
回复