提取安卓的Linux内核和驱动

来源:互联网 发布:24芯三网合一网络箱 编辑:程序博客网 时间:2024/06/06 02:37
 2013-12-7 21:40 阅读(54)
     水平有限,中间可能有各种错误,欢迎拍砖指正。
    转自这位大侠的空间,写得很好,真的很需要 http://user.qzone.qq.com/249811077/blog/1386423610
    大家最关心的一个问题是,平板电脑或手机要是安装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


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

    有源代码的情况

    我是在有相应的源码而且源码里面有大部分驱动的情况下使用的。自行编译后的内核和模块就能启动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这个用户添加到了相应的用户组。



    主要待解决的事项:
    背光亮度调节。
    电量直接查看/sys/class/power_supply/battery/uevent就可以知道,充电的问题内核里就搞定。
     
    0 0
    原创粉丝点击