1.androidç³»ç»ç¼è¯è½ç¨åå¸å¼ç¼è¯å
2.å¦ä½ç¼è¯android userdata.img
3.Linux 系统内核概述
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...