提取安卓的Linux内核和驱动模块

原文: http://forum.ubuntu.org.cn/viewtopic.php?t=450939

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

大家最关心的一个问题是,平板电脑或手机要是安装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
3. 分离内核

获得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
4. 在linux中的使用

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

4.1 有源代码的情况

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

4.2 无源代码的情况

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

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

insmod 安卓模块目录/模块名.ko

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

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

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

5. 使用方法总结

构建一个可从平板启动的microSD卡,替换内核并且自己在启动脚本insmod各个驱动。
问题:

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

之前声音、视频什么能用,可能是因为linaro这个镜像本来就把linaro这个用户添加到了相应的用户组。

主要待解决的事项:
背光亮度调节。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值