欢迎来到皮皮网网首页

【lamp 源码包】【全网免费源码】【cglib源码教学】ramdisk源码

来源:源码集合符号id 时间:2024-11-23 13:18:37

1.android系统编译能用分布式编译吗
2.如何编译android userdata.img
3.Linux 系统内核概述

ramdisk源码

android系统编译能用分布式编译吗

       é¡¹ç›®è¶Šæ¥è¶Šå¤§ï¼Œæ¯æ¬¡éœ€è¦é‡æ–°ç¼–译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。

       1. 使用tmpfs来代替部分IO读写

       ã€€ã€€2.ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失

       ã€€ã€€3.distcc,多机器编译

       ã€€ã€€4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。

       ã€€tmpfs

       ã€€ã€€æœ‰äººè¯´åœ¨Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。

       ã€€ã€€è¿™ä¸ªåšæ³•çš„实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。

       ã€€ã€€mount -t tmpfs tmpfs ~/build -o size=1G

       ã€€ã€€ç”¨2.6..2的Linux Kernel来测试一下编译速度:

       ã€€ã€€ç”¨ç‰©ç†ç£ç›˜ï¼šåˆ†ç§’

       ã€€ã€€ç”¨tmpfs:分秒

       ã€€ã€€å‘ƒâ€¦â€¦æ²¡ä»€ä¹ˆå˜åŒ–。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。

       ã€€ã€€make -j

       ã€€ã€€æ—¢ç„¶IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。

       ã€€ã€€ç”¨make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。

       ã€€ã€€è¿˜æ˜¯ç”¨Kernel来测试:

       ã€€ã€€ç”¨make: 分秒

       ã€€ã€€ç”¨make -j4:分秒

       ã€€ã€€ç”¨make -j8:分秒

       ã€€ã€€ç”±æ­¤çœ‹æ¥ï¼Œåœ¨å¤šæ ¸CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。

       ã€€ã€€ä¸è¿‡è¿™ä¸ªæ–¹æ¡ˆä¸æ˜¯å®Œå…¨æ²¡æœ‰cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。

       ã€€ã€€ccache

       ccache工作原理:

       ccache也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。

       ã€€ã€€ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的方案根本不能正常工作,只有每次make clean再make才行。

       ã€€ã€€å®‰è£…完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。

       ã€€ã€€å®‰è£…的另外一种方法:

       ã€€ã€€vi ~/.bash_profile

       ã€€ã€€æŠŠ/usr/lib/ccache/bin路径加到PATH下

       ã€€ã€€PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin

       ã€€ã€€è¿™æ ·æ¯æ¬¡å¯åŠ¨g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++

       ã€€ã€€æ•ˆæžœè·Ÿä½¿ç”¨å‘½ä»¤è¡Œccache g++效果一样

       ã€€ã€€è¿™æ ·æ¯æ¬¡ç”¨æˆ·ç™»å½•æ—¶ï¼Œä½¿ç”¨g++编译器时会自动启动ccache

       ã€€ã€€ç»§ç»­æµ‹è¯•ï¼š

       ã€€ã€€ç”¨ccache的第一次编译(make -j4):分秒

       ã€€ã€€ç”¨ccache的第二次编译(make -j4):8分秒

       ã€€ã€€ç”¨ccache的第三次编译(修改若干配置,make -j4):分秒

       çœ‹æ¥ä¿®æ”¹é…ç½®ï¼ˆæˆ‘改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很实用。

       ã€€ã€€å¯ä»¥ç”¨ccache -s来查看cache的使用和命中情况:

       ã€€ã€€cache directory           /home/lifanxi/.ccachecache hit              cache miss             called for link            not a C/C++ file          no input file            files in cache           cache size             .7 Mbytesmax cache size           .6 Mbytes

       ã€€ã€€å¯ä»¥çœ‹åˆ°ï¼Œæ˜¾ç„¶åªæœ‰ç¬¬äºŒç¼–次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了.7M的磁盘,还是完全可以接受的。

       ã€€ã€€distcc

       ã€€ã€€ä¸€å°æœºå™¨çš„能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。

       ã€€ã€€ä½¿ç”¨distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。

       ã€€ã€€distcc安装后,可以启动一下它的服务:

       ã€€ã€€/usr/bin/distccd --daemon --allow ..0.0/

       ã€€ã€€é»˜è®¤çš„端口允许来自同一个网络的distcc连接。

       ã€€ã€€ç„¶åŽè®¾ç½®ä¸€ä¸‹DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。

       ã€€ã€€export DISTCC_HOSTS="localhost ...1 ...2 ...3"

       ã€€ã€€ç„¶åŽä¸Žccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。

       ã€€ã€€åœ¨make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。

       ã€€ã€€åŒæ ·æµ‹è¯•ä¸€ä¸‹ï¼š

       ã€€ã€€ä¸€å°åŒæ ¸è®¡ç®—机,make -j4:分秒

       ã€€ã€€ä¸¤å°åŒæ ¸è®¡ç®—机,make -j4:分秒

       ã€€ã€€ä¸¤å°åŒæ ¸è®¡ç®—机,make -j8:分秒

       ã€€ã€€è·Ÿæœ€å¼€å§‹ç”¨ä¸€å°åŒæ ¸æ—¶çš„分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。

       ã€€ã€€åœ¨ç¼–译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。

       ã€€ã€€æ€»ç»“一下:

       ã€€ã€€ tmpfs: 解决IO瓶颈,充分利用本机内存资源

       ã€€ã€€make -j: 充分利用本机计算资源

       ã€€ã€€distcc: 利用多台计算机资源

       ã€€ã€€ccache: 减少重复编译相同代码的时间

       ã€€ã€€è¿™äº›å·¥å…·çš„好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。

       ã€€ã€€5.还有提速方法是把屏幕输出重定向到内存文件或/dev/null,因对终端设备(慢速设备)的阻塞写操作也会拖慢速度。推荐内存文件,这样发生错误时,能够查看。

如何编译android userdata.img

       1、android文件系统的结构

       android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。

       2、分离android文件系统出来

       system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:

       file ramdisk.img,输出:

       ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar ::

       Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:

       å°†ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

       gunzip ramdisk.img.gz

       ç„¶åŽæ–°å»ºä¸€ä¸ªæ–‡ä»¶å¤¹ï¼Œå«ramdisk吧,进入,输入命令

       cpio -i -F ../ramdisk.img

       è¿™ä¸‹ï¼Œä½ å°±èƒ½çœ‹è§å¹¶æ“ä½œramdisk里面的内容了。

       ç„¶åŽæŠŠAndroid源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。

       3、使用网络文件系统方式挂载android文件系统

       å› æ­¤ï¼Œæˆ‘们需要建立/nfsroot目录,再建立/nfsroot/androidfs目录,把刚才的android文件系统改名为androidfs,并链接到/nfsroot/androidfs

       4、android内核引导文件系统

       android内核挂载/nfsroot/androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:

       1)设置一些环境变量

       2)创建system、sdcard、data、cache等目录

       3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals

       4)设置一些文件的用户群组、权限

       5)设置一些线程参数

       6)设置TCP缓存大小

Linux 系统内核概述

       Linux内核是一种开源的类Unix操作系统宏内核。

       它是Linux操作系统的核心组件,同时也是计算机硬件与进程之间的桥梁。内核负责处理两者之间的通信,并高效地管理资源。内核被称为内核,lamp 源码包是因为它在操作系统中扮演着类似种子在果实硬壳中的角色,掌控着硬件的主要功能。内核的主要用途包括以下四项工作:

       在正确实施的情况下,内核对用户来说是不可见的,它在自己的小世界中(称为内核空间)工作,分配内存并跟踪内容的存储位置。用户所看到的全网免费源码内容被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。

       1. 内核简介

       Linux内核采用单内核体系设计,同时借鉴了微内核设计体系的优点,引入了模块化机制。

       2. 内核模块

       2.1 uname命令

       使用格式:uname [选项]

       参数解释:[选项]用于指定命令的功能,如-n显示内核名称。cglib源码教学

       2.2 lsmod命令

       显示由核心已经装载的内核模块。

       命令定义:lsmod [-v] [-c] [-s] [-m]

       字段含义:[-v]显示详细模式,[-c]显示模块数量,[-s]显示模块大小,[-m]显示模块名称。

       2.3 modinfo命令

       显示模块的原理源码大全详细描述信息。

       命令定义:modinfo [模块名称]

       语法:modinfo [-v] [模块名称]

       选项:[-v]显示详细模式。

       2.4 modprobe命令

       装载或卸载内核模块。

       命令定义:modprobe [模块名称] [选项]

       语法:modprobe [模块名称] [选项]

       选项:[模块名称]指定要装载或卸载的模块。

       2.5 depmod命令

       内核模块依赖关系文件及系统信息映射文件的生成工具。

       语法:depmod [-a] [-F file] [-e] [-n] [-N] [-v]

       参数:[-a]生成所有模块的依赖关系,[-F file]指定依赖关系文件,深度商店源码[-e]仅显示错误信息,[-n]不生成依赖关系,[-N]不生成映射文件,[-v]显示详细模式。

       2.6 insmod和rmmod命令

       装载或卸载内核模块。

       insmod命令:insmod [模块名称] [选项]

       rmmod命令:rmmod [模块名称] [选项]

       3. /proc目录

       内核将自己内部状态信息、统计信息以及可配置参数通过proc伪文件系统输出。

       3.1 sysctl命令

       语法格式:sysctl [-n] [-e] [-f file] [-p] [-a] [-r] [-w] [name [...]]

       命令参数:[-n]不打印数值,[-e]退出时显示错误,[-f file]指定配置文件,[-p]打印所有配置,[-a]显示所有参数,[-r]读取配置,[-w]写入配置,[name [...]]指定要设置的参数。

       3.2 修改配置文件

       3.3 实战演示

       4. /sys目录

       sysfs伪文件系统,输出内核识别出的各硬件设备的相关属性信息,以及内核对硬件特性的设定信息。有些参数可以修改,用于调整硬件工作特性。

       4.1 udev

       4.2 ramdisk文件的制作

       方法一:使用dd命令

       方法二:使用mkinitramfs命令

       4.3 查看ramdisk

       5. 编译内核

       5.1 前提准备

       (1) 准备好开发环境

       (2) 获取目标主机上硬件设备的相关信息

       (3) 获取到目标主机系统功能的相关信息

       (4) 获取内核源代码包

       5.2 简易安装内核

       简易安装:简单依据模板文件的制作内核

       5.3 详解编译内核

       (1) 配置内核选项

       (2) 编译 - make [-j #]

       链接:blog.csdn.net/daocaokaf...