如题所述
linux驱å¨ç¨åºä¸è¬å·¥ä½å¨å
æ ¸ç©ºé´ï¼ä½ä¹å¯ä»¥å·¥ä½å¨ç¨æ·ç©ºé´ãä¸é¢æ们å°è¯¦ç»è§£æï¼ä»ä¹æ¯å
æ ¸ç©ºé´ï¼ä»ä¹æ¯ç¨æ·ç©ºé´ï¼ä»¥åå¦ä½å¤æä»ä»¬ã
ããLinuxç®åäºå段æºå¶ï¼ä½¿å¾èæå°åä¸çº¿æ§å°åæ»æ¯ä¸è´ï¼å æ¤ï¼Linuxçèæå°å空é´ä¹ä¸º0~4G.Linuxå æ ¸å°è¿4Gåèç空é´å为两é¨åãå°æé«ç1Gåè(ä»èæå°å0xC0000000å°0xFFFFFFFF)ï¼ä¾å æ ¸ä½¿ç¨ï¼ç§°ä¸º"å æ ¸ç©ºé´".èå°è¾ä½ç3Gåè(ä»èæå°å 0x00000000å°0xBFFFFFFF)ï¼ä¾å个è¿ç¨ä½¿ç¨ï¼ç§°ä¸º"ç¨æ·ç©ºé´)ãå 为æ¯ä¸ªè¿ç¨å¯ä»¥éè¿ç³»ç»è°ç¨è¿å ¥å æ ¸ï¼å æ¤ï¼Linuxå æ ¸ç±ç³»ç»å çææè¿ç¨å ±äº«ãäºæ¯ï¼ä»å ·ä½è¿ç¨çè§åº¦æ¥çï¼æ¯ä¸ªè¿ç¨å¯ä»¥æ¥æ4Gåèçèæ空é´ã
ããLinux使ç¨ä¸¤çº§ä¿æ¤æºå¶ï¼0级ä¾å æ ¸ä½¿ç¨ï¼3级ä¾ç¨æ·ç¨åºä½¿ç¨ãä»å¾ä¸å¯ä»¥çåº(è¿éæ æ³è¡¨ç¤ºå¾)ï¼æ¯ä¸ªè¿ç¨æåèªçç§æç¨æ·ç©ºé´(0~3G)ï¼è¿ä¸ªç©ºé´å¯¹ç³»ç»ä¸çå ¶ä»è¿ç¨æ¯ä¸å¯è§çãæé«ç1GBåèèæå æ ¸ç©ºé´å为ææè¿ç¨ä»¥åå æ ¸æå ±äº«ã
ããå æ ¸ç©ºé´ä¸åæ¾çæ¯å æ ¸ä»£ç åæ°æ®ï¼èè¿ç¨çç¨æ·ç©ºé´ä¸åæ¾çæ¯ç¨æ·ç¨åºç代ç åæ°æ®ãä¸ç®¡æ¯å æ ¸ç©ºé´è¿æ¯ç¨æ·ç©ºé´ï¼å®ä»¬é½å¤äºèæ空é´ä¸ã
ããè½ç¶å æ ¸ç©ºé´å æ®äºæ¯ä¸ªèæ空é´ä¸çæé«1GBåèï¼ä½æ å°å°ç©çå åå´æ»æ¯ä»æä½å°å(0x00000000)å¼å§ã对å æ ¸ç©ºé´æ¥è¯´ï¼å ¶å°åæ å°æ¯å¾ç®åç线æ§æ å°ï¼0xC0000000å°±æ¯ç©çå°åä¸çº¿æ§å°åä¹é´çä½ç§»éï¼å¨Linux代ç ä¸å°±å«åPAGE_OFFSET.
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¹é´å¦ä½è¿è¡é讯ï¼
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¸è¬éè¿ç³»ç»è°ç¨è¿è¡éä¿¡ã
ããå¦ä½å¤æä¸ä¸ªé©±å¨æ¯ç¨æ·æ¨¡å¼é©±å¨è¿æ¯å æ ¸æ¨¡å¼é©±å¨ï¼ å¤æçæ åæ¯ä»ä¹ï¼
ããç¨æ·ç©ºé´æ¨¡å¼ç驱å¨ä¸è¬éè¿ç³»ç»è°ç¨æ¥å®æ对硬件ç访é®ï¼å¦éè¿ç³»ç»è°ç¨å°é©±å¨çio空é´æ å°å°ç¨æ·ç©ºé´çãå æ¤ï¼ä¸»è¦çå¤æä¾æ®å°±æ¯ç³»ç»è°ç¨ã
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¸ä¸å太å¤äºï¼è¯´ä¸å®ï¼æ¯å¦ç¨æ·æçé¾è¡¨åå æ ¸é¾è¡¨ä¸ä¸æ ·;ç¨æ·æç¨printf,å æ ¸æç¨printk;ç¨æ·ææ¯ä¸ªåºç¨ç¨åºç©ºé´æ¯èæçï¼ç¸å¯¹ç¬ç«çï¼å æ ¸æä¸å´ä¸æ¯ç¬ç«çï¼æ以ç¼ç¨è¦é常å°å¿ãççã
ããè¿æç¨æ·æåå æ ¸æç¨åºé讯çæ¹æ³å¾å¤ï¼ä¸ååæ¯ç³»ç»è°ç¨ï¼å®é ä¸ç³»ç»è°ç¨æ¯ä¸ªä¸å¥½çéæ©ï¼å 为éè¦ç³»ç»è°ç¨å·ï¼è¿ä¸ªéè¦ç»ä¸åé ã
ããå¯ä»¥éè¿ioctlãsysfsãprocçæ¥å®æã
å¨è¿è¡è®¾å¤é©±å¨ç¨åºï¼å æ ¸åè½æ¨¡åçç³»ç»çº§å¼åæ¶ï¼é常éè¦å¨å æ ¸åç¨æ·ç¨åºä¹é´äº¤æ¢ä¿¡æ¯ãLinuxæä¾äºå¤ç§æ¹æ³å¯ä»¥ç¨æ¥å®æè¿äºä»»å¡ãæ¬ææ»ç»äºåç§å¸¸ç¨çä¿¡æ¯äº¤æ¢æ¹æ³ï¼å¹¶ç¨ç®åçä¾åæ¼ç¤ºè¿äºæ¹æ³åèªçç¹ç¹åç¨æ³ãå ¶ä¸æ大家é常çæçæ¹æ³ï¼ä¹æç¹æ®æ¡ä»¶ä¸æ¹å¯ä½¿ç¨çæ段ãéè¿å¯¹æ¯æç¡®è¿äºæ¹æ³ï¼å¯ä»¥å æ·±æ们对Linuxå æ ¸ç认è¯ï¼æ´éè¦çæ¯ï¼å¯ä»¥è®©æ们æ´çç»é©¾å¾¡linuxå æ ¸çº§çåºç¨å¼åææ¯ã
å æ ¸ç©ºé´(kernel-space) VS ç¨æ·ç©ºé´(user-space)
ä½ä¸ºä¸ä¸ªLinuxå¼åè ï¼é¦å åºè¯¥æ¸ æ¥å æ ¸ç©ºé´åç¨æ·ç©ºé´çåºå«ãå ³äºè¿ä¸ªè¯é¢ï¼å·²ç»æå¾å¤ç¸å ³èµæï¼æ们å¨è¿éç®åæè¿°å¦ä¸ï¼
ç°ä»£ç计ç®æºä½ç³»ç»æä¸åå¨ç®¡çé常é½å å«ä¿æ¤æºå¶ãæä¾ä¿æ¤çç®çï¼æ¯è¦é¿å ç³»ç»ä¸çä¸ä¸ªä»»å¡è®¿é®å±äºå¦å¤çæå±äºæä½ç³»ç»çåå¨åºåãå¦å¨IntelX86ä½ç³»ä¸ï¼å°±æä¾äºç¹æ级è¿ç§ä¿æ¤æºå¶ï¼éè¿ç¹æ级å«çåºå«æ¥éå¶å¯¹åå¨åºåç访é®ã åºäºè¿ç§ææ¶ï¼Linuxæä½ç³»ç»å¯¹èªèº«è¿è¡äºååï¼ä¸é¨åæ ¸å¿è½¯ä»¶ç¬ç«äºæ®éåºç¨ç¨åºï¼è¿è¡å¨è¾é«çç¹æ级å«ä¸ï¼ï¼Linux使ç¨Intelä½ç³»çç¹æ级3æ¥è¿è¡å æ ¸ãï¼å®ä»¬é©»çå¨è¢«ä¿æ¤çå å空é´ä¸ï¼æ¥æ访é®ç¡¬ä»¶è®¾å¤çæææéï¼Linuxå°æ¤ç§°ä¸ºå æ ¸ç©ºé´ã
ç¸å¯¹çï¼å ¶å®é¨å被ä½ä¸ºåºç¨ç¨åºå¨ç¨æ·ç©ºé´æ§è¡ãå®ä»¬åªè½çå°å 许å®ä»¬ä½¿ç¨çé¨åç³»ç»èµæºï¼å¹¶ä¸ä¸è½ä½¿ç¨æäºç¹å®çç³»ç»åè½ï¼ä¸è½ç´æ¥è®¿é®ç¡¬ä»¶ï¼ä¸è½ç´æ¥è®¿é®å æ ¸ç©ºé´ï¼å½ç¶è¿æå ¶ä»ä¸äºå ·ä½ç使ç¨éå¶ãï¼Linux使ç¨Intelä½ç³»çç¹æ级0æ¥è¿è¡ç¨æ·ç¨åºãï¼
ä»å®å ¨è§åº¦è®²å°ç¨æ·ç©ºé´åå æ ¸ç©ºé´ç½®äºè¿ç§é对称访é®æºå¶ä¸æ¯å¾ææçï¼å®è½æµå¾¡æ¶æç¨æ·ç窥æ¢ï¼ä¹è½é²æ¢è´¨éä½å£çç¨æ·ç¨åºç侵害ï¼ä»è使系ç»è¿è¡å¾æ´ç¨³å®å¯é ãä½æ¯ï¼å¦æåè¿æ ·å®å ¨ä¸å 许ç¨æ·ç¨åºè®¿é®å使ç¨å æ ¸ç©ºé´çèµæºï¼é£ä¹æ们çç³»ç»å°±æ æ³æä¾ä»»ä½ææä¹çåè½äºã为äºæ¹ä¾¿ç¨æ·ç¨åºä½¿ç¨å¨å æ ¸ç©ºé´æè½å®å ¨æ§å¶çèµæºï¼èåä¸è¿åä¸è¿°çç¹æè§å®ï¼ä»ç¡¬ä»¶ä½ç³»ç»ææ¬èº«å°æä½ç³»ç»ï¼é½å®ä¹äºæ åç访é®çé¢ãå ³äºX86ç³»ç»çç»èï¼è¯·æ¥é åèèµæ1
ä¸è¬ç硬件ä½ç³»æºæé½æä¾ä¸ç§âé¨âæºå¶ãâé¨âçå«ä¹æ¯æå¨åçäºç¹å®äºä»¶çæ¶åä½ç¹æçåºç¨ç¨åºå¯ä»¥éè¿è¿äºâé¨âè¿å ¥é«ç¹æçå æ ¸ç©ºé´ã对äºIntelX86ä½ç³»æ¥è¯´ï¼Linuxæä½ç³»ç»æ£æ¯å©ç¨äºâç³»ç»é¨âè¿ä¸ªç¡¬ä»¶çé¢ï¼éè¿è°ç¨int $0x80æºå¨æ令)ï¼æé äºå½¢å½¢è²è²çç³»ç»è°ç¨ä½ä¸ºè½¯ä»¶çé¢ï¼ä¸ºåºç¨ç¨åºä»ç¨æ·æé·å ¥å°å æ ¸ææä¾äºééãéè¿âç³»ç»è°ç¨â使ç¨âç³»ç»é¨â并ä¸éè¦ç¹å«çæéï¼ä½é·å ¥å°å æ ¸çå ·ä½ä½ç½®å´ä¸æ¯éæçï¼è¿ä¸ªä½ç½®ç±âç³»ç»è°ç¨âæ¥æå®ï¼æè¿æ ·çéå¶æè½ä¿è¯å æ ¸å®å ¨æ èãæ们å¯ä»¥å½¢è±¡å°æè¿°è¿ç§æºå¶ï¼ä½ä¸ºä¸ä¸ªæ¸¸å®¢ï¼ä½ å¯ä»¥ä¹°ç¥¨è¦æ±è¿å ¥éçå¨ç©åï¼ä½ä½ å¿ é¡»èèå®å®çåå¨è§å 车ä¸ï¼æç §è§å®ç路线è§å 游è§ãå½ç¶ï¼ä¸åä¸è½¦ï¼å 为é£æ ·å¤ªå±é©ï¼ä¸æ¯è®©ä½ 丢æå°å½ï¼å°±æ¯è®©ä½ ååäºéçå¨ç©ã
åºäºæçå代ç 大å°çèèï¼å æ ¸ç¨åºä¸è½ä½¿ç¨æ ååºå½æ°ï¼å½ç¶è¿æå ¶å®ç顾èï¼è¯¦ç»åå 请æ¥é åèèµæ2ï¼å æ¤å æ ¸å¼åä¸å¦ç¨æ·ç¨åºå¼åé£ä¹æ¹ä¾¿ã
å æ ¸ç©ºé´åç¨æ·ç©ºé´çç¸äºä½ç¨
ç°å¨ï¼è¶æ¥è¶å¤çåºç¨ç¨åºéè¦ç¼åå æ ¸çº§åç¨æ·çº§çç¨åºæ¥ä¸èµ·å®æå ·ä½çä»»å¡ï¼é常éç¨ä»¥ä¸æ¨¡å¼ï¼é¦å ï¼ç¼åå æ ¸æå¡ç¨åºå©ç¨å æ ¸ç©ºé´æä¾çæéåæå¡æ¥æ¥æ¶ãå¤çåç¼åæ°æ®ï¼ç¶åç¼åç¨æ·ç¨åºæ¥åå åå®æçå æ ¸æå¡ç¨åºäº¤äºï¼å ·ä½æ¥è¯´ï¼å¯ä»¥å©ç¨ç¨æ·ç¨åºæ¥é ç½®å æ ¸æå¡ç¨åºçåæ°ï¼æåå æ ¸æå¡ç¨åºæä¾çæ°æ®ï¼å½ç¶ï¼ä¹å¯ä»¥åå æ ¸æå¡ç¨åºè¾å ¥å¾ å¤çæ°æ®ã
æ¯è¾å ¸åçåºç¨å æ¬: Netfilter(å æ ¸æå¡ç¨åºï¼é²ç«å¢)VS Iptableï¼ç¨æ·çº§ç¨åºï¼è§å设置ç¨åºï¼ï¼IPSEC(å æ ¸æå¡ç¨åºï¼VPNåè®®é¨å)VS IKE(ç¨æ·çº§ç¨åºï¼vpnå¯é¥ååå¤ç)ï¼å½ç¶è¿å æ¬å¤§éç设å¤é©±å¨ç¨åºåç¸åºçåºç¨è½¯ä»¶ãè¿äºåºç¨é½æ¯ç±å æ ¸çº§åç¨æ·çº§ç¨åºéè¿ç¸äºäº¤æ¢ä¿¡æ¯æ¥ä¸èµ·å®æç¹å®ä»»å¡çã
ä¿¡æ¯äº¤äºæ¹æ³
ç¨æ·ç¨åºåå æ ¸çä¿¡æ¯äº¤æ¢æ¯ååçï¼ä¹å°±æ¯è¯´æ¢å¯ä»¥ä¸»å¨ä»ç¨æ·ç©ºé´åå æ ¸ç©ºé´åéä¿¡æ¯ï¼ä¹å¯ä»¥ä»å æ ¸ç©ºé´åç¨æ·ç©ºé´æ交æ°æ®ãå½ç¶ï¼ç¨æ·ç¨åºä¹å¯ä»¥ä¸»å¨å°ä»å æ ¸æåæ°æ®ãä¸é¢æ们就é对å æ ¸åç¨æ·äº¤äºæ°æ®çæ¹æ³åä¸æ»ç»ãå½çº³ã
ä¿¡æ¯äº¤äºæä¿¡æ¯ä¼ è¾åèµ·æ¹å¯ä»¥å为ç¨æ·åå æ ¸ä¼ é/æåæ°æ®åå æ ¸åç¨æ·ç©ºé´æ交请æ±ä¸¤å¤§ç±»ï¼å æ¥è¯´è¯´ï¼
ç±ç¨æ·çº§ç¨åºä¸»å¨åèµ·çä¿¡æ¯äº¤äºã
ï¼1ï¼ç¼åèªå·±çç³»ç»è°ç¨
ä»åæå¯ä»¥çåºï¼ç³»ç»è°ç¨æ¯ç¨æ·çº§ç¨åºè®¿é®å æ ¸æåºæ¬çæ¹æ³ãç®ålinux大è´æä¾äºäºç¾å¤ä¸ªæ åçç³»ç»è°ç¨ï¼å¹¶ä¸å 许æ们添å èªå·±çç³»ç»è°ç¨æ¥å®ç°åå æ ¸çä¿¡æ¯äº¤æ¢ãæ¯å¦æ们å¸æ建ç«ä¸ä¸ªç³»ç»è°ç¨æ¥å¿ç³»ç»ï¼å°ææçç³»ç»è°ç¨å¨ä½è®°å½ä¸æ¥ï¼ä»¥ä¾¿è¿è¡å ¥ä¾µæ£æµãæ¤æ¶ï¼æ们å¯ä»¥ç¼åä¸ä¸ªå æ ¸æå¡ç¨åºã该ç¨åºè´è´£æ¶éææçç³»ç»è°ç¨è¯·æ±ï¼å¹¶å°è¿äºè°ç¨ä¿¡æ¯è®°å½å°å¨å æ ¸ä¸èªå»ºçç¼å²éãæ们æ æ³å¨å æ ¸éå®ç°å¤æçå ¥ä¾µæ£æµç¨åºï¼å æ¤å¿ é¡»å°è¯¥ç¼å²éçè®°å½æåå°ç¨æ·ç©ºé´ãæç´æªäºå½çæ¹æ³æ¯èªå·±ç¼åä¸ä¸ªæ°ç³»ç»è°ç¨å®ç°è¿ç§æåç¼å²æ°æ®çåè½ãå½å æ ¸æå¡ç¨åºåæ°ç³»ç»è°ç¨é½å®ç°åï¼æ们就å¯ä»¥å¨ç¨æ·ç©ºé´éç¼åç¨æ·ç¨åºè¿è¡å ¥ä¾µæ£æµä»»å¡äºï¼å ¥ä¾µæ£æµç¨åºå¯ä»¥å®æ¶ãè½®è®æå¨éè¦çæ¶åè°ç¨æ°ç³»ç»è°ç¨ä»å æ ¸æåæ°æ®ï¼ç¶åè¿è¡å ¥ä¾µæ£æµ(å ·ä½æ¥éª¤å代ç åè§Linuxå æ ¸ä¹æ ç½ç«çµåæå¿ç¬¬åæ)ã
ï¼2ï¼ç¼å驱å¨ç¨åº
Linux/UNIXçä¸ä¸ªç¹ç¹å°±æ¯æææçä¸è¥¿é½çä½æ¯æ件(every thing is a file)ãç³»ç»å®ä¹äºç®æ´å®åç驱å¨ç¨åºçé¢ï¼å®¢æ·ç¨åºå¯ä»¥ç¨ç»ä¸çæ¹æ³éè¿è¿ä¸ªçé¢åå æ ¸é©±å¨ç¨åºäº¤äºãè大é¨åç³»ç»ç使ç¨è åå¼åè å·²ç»é常çæè¿ç§çé¢ä»¥åç¸åºçå¼åæµç¨äºã
驱å¨ç¨åºè¿è¡äºå æ ¸ç©ºé´ï¼ç¨æ·ç©ºé´çåºç¨ç¨åºéè¿æ件系ç»ä¸/dev/ç®å½ä¸çä¸ä¸ªæ件æ¥åå®äº¤äºãè¿å°±æ¯æ们çæçé£ä¸ªæ件æä½æµç¨ï¼open() ââ read()() ââ write() ââ ioctl() ââclose()ãï¼éè¦æ³¨æçæ¯ä¹ä¸æ¯ææçå æ ¸é©±å¨ç¨åºé½æ¯è¿ä¸ªçé¢ï¼ç½ç»é©±å¨ç¨åºååç§åè®®æ ç使ç¨å°±ä¸å¤§ä¸è´ï¼æ¯å¦è¯´å¥æ¥å£ç¼ç¨è½ç¶ä¹æopen()åclose()çæ¦å¿µï¼ä½å®çå æ ¸å®ç°ä»¥åå¤é¨ä½¿ç¨æ¹å¼é½åæ®é驱å¨ç¨åºæå¾å¤§å·®å¼ãï¼å ³äºè¿é¨åçç¼ç¨ç»èï¼è¯·æ¥é åèèµæ3ã4ã
设å¤é©±å¨ç¨åºå¨å æ ¸ä¸è¦åçä¸æååºã设å¤ç®¡çãæ°æ®å¤çççåç§å·¥ä½è¿ç¯æç« ä¸å»å ³å¿ï¼æ们æ注æåéä¸å¨å®ä¸ç¨æ·çº§ç¨åºäº¤äºè¿ä¸é¨åãæä½ç³»ç»ä¸ºæ¤å®ä¹äºä¸ç§ç»ä¸ç交äºçé¢ï¼å°±æ¯åé¢æ说çopen(), read(), write(), ioctl()åclose()ççãæ¯ä¸ªé©±å¨ç¨åºæç §èªå·±çéè¦åç¬ç«å®ç°ï¼æèªå·±æä¾çåè½åæå¡éèå¨è¿ä¸ªç»ä¸çé¢ä¸ã客æ·çº§ç¨åºéæ©éè¦ç驱å¨ç¨åºææå¡ï¼å ¶å®å°±æ¯éæ©/dev/ç®å½ä¸çæ件ï¼ï¼æç §ä¸è¿°çé¢åæ件æä½æµç¨ï¼å°±å¯ä»¥è·å æ ¸ä¸ç驱å¨äº¤äºäºãå ¶å®ç¨é¢å对象çæ¦å¿µä¼æ´å®¹æ解éï¼ç³»ç»å®ä¹äºä¸ä¸ªæ½è±¡ççé¢ï¼abstract interfaceï¼ï¼æ¯ä¸ªå ·ä½ç驱å¨ç¨åºé½æ¯è¿ä¸ªçé¢çå®ç°ï¼implementationï¼ã
æ以驱å¨ç¨åºä¹æ¯ç¨æ·ç©ºé´åå æ ¸ä¿¡æ¯äº¤äºçéè¦æ¹å¼ä¹ä¸ãå ¶å®ioctl, read, writeæ¬è´¨ä¸è®²ä¹æ¯éè¿ç³»ç»è°ç¨å»å®æçï¼åªæ¯è¿äºè°ç¨å·²è¢«å æ ¸è¿è¡äºæ åå°è£ ï¼ç»ä¸å®ä¹ãå æ¤ç¨æ·ä¸å¿ åå¡«å æ°ç³»ç»è°ç¨é£æ ·å¿ 须修æ¹å æ ¸ä»£ç ï¼éæ°ç¼è¯æ°å æ ¸ï¼ä½¿ç¨èæ设å¤åªéè¦éè¿æ¨¡åæ¹æ³å°æ°çèæ设å¤å®è£ å°å æ ¸ä¸ï¼insmodä¸ï¼å°±è½æ¹ä¾¿ä½¿ç¨ãå ³äºæ¤æ¹é¢è®¾è®¡ç»è请æ¥é åèèµæ5ï¼ç¼ç¨ç»è请æ¥é åèèµæ6ã
å¨linuxä¸ï¼è®¾å¤å¤§è´å¯å为ï¼å符设å¤ï¼å设å¤ï¼åç½ç»æ¥å£ï¼å符设å¤å æ¬é£äºå¿ 须以顺åºæ¹å¼ï¼ååèæµä¸æ ·è¢«è®¿é®ç设å¤ï¼å¦å符ç»ç«¯ï¼ä¸²å£çãå设å¤æ¯æé£äºå¯ä»¥ç¨éæºæ¹å¼ï¼ä»¥æ´åæ°æ®ä¸ºåä½æ¥è®¿é®ç设å¤ï¼å¦ç¡¬ççï¼ç½ç»æ¥å£ï¼å°±æé常ç½å¡ååè®®æ çå¤æçç½ç»è¾å ¥è¾åºæå¡ï¼ãå¦æå°æ们çç³»ç»è°ç¨æ¥å¿ç³»ç»ç¨å符å驱å¨ç¨åºçæ¹å¼å®ç°ï¼ä¹æ¯ä¸ä»¶è½»æ¾æ¬æå°å·¥ä½ãæ们å¯ä»¥å°å æ ¸ä¸æ¶éåè®°å½ä¿¡æ¯çé£ä¸é¨åç¼åæä¸ä¸ªå符设å¤é©±å¨ç¨åºãè½ç¶æ²¡æå®é 对åºçç©ç设å¤ï¼ä½è¿å¹¶æ²¡ä»ä¹é®é¢ï¼Linuxç设å¤é©±å¨ç¨åºæ¬æ¥å°±æ¯ä¸ä¸ªè½¯ä»¶æ½è±¡ï¼å®å¯ä»¥ç»å硬件æä¾æå¡ï¼ä¹å®å ¨å¯ä»¥ä½ä¸ºçº¯è½¯ä»¶æä¾æå¡ï¼å½ç¶ï¼å åç使ç¨æ们æ¯æ æ³é¿å çï¼ãå¨é©±å¨ç¨åºä¸ï¼æ们å¯ä»¥ç¨openæ¥å¯å¨æå¡ï¼ç¨read()è¿åå¤ç好çè®°å½ï¼ç¨ioctl()设置记å½æ ¼å¼çï¼ç¨close()åæ¢æå¡ï¼write()没æç¨å°ï¼é£ä¹æ们å¯ä»¥ä¸å»å®ç°å®ãç¶åå¨/dev/ç®å½ä¸å»ºç«ä¸ä¸ªè®¾å¤æ件对åºæ们æ°å å ¥å æ ¸çç³»ç»è°ç¨æ¥å¿ç³»ç»é©±å¨ç¨åºã
ï¼3ï¼ ä½¿ç¨proc æ件系ç»
procæ¯Linuxæä¾çä¸ç§ç¹æ®çæ件系ç»ï¼æ¨åºå®çç®çå°±æ¯æä¾ä¸ç§ä¾¿æ·çç¨æ·åå æ ¸é´ç交äºæ¹å¼ãå®ä»¥æ件系ç»ä½ä¸ºä½¿ç¨çé¢ï¼ä½¿åºç¨ç¨åºå¯ä»¥ä»¥æ件æä½çæ¹å¼å®å ¨ãæ¹ä¾¿çè·åç³»ç»å½åè¿è¡çç¶æåå ¶å®ä¸äºå æ ¸æ°æ®ä¿¡æ¯ã
procæ件系ç»å¤ç¨äºçè§ã管çåè°è¯ç³»ç»ï¼æ们使ç¨çå¾å¤ç®¡çå·¥å ·å¦ps,topçï¼é½æ¯å©ç¨procæ¥è¯»åå æ ¸ä¿¡æ¯çãé¤äºè¯»åå æ ¸ä¿¡æ¯ï¼procæ件系ç»è¿æä¾äºåå ¥åè½ãæ以æ们ä¹å°±å¯ä»¥å©ç¨å®æ¥åå æ ¸è¾å ¥ä¿¡æ¯ãæ¯å¦ï¼éè¿ä¿®æ¹procæ件系ç»ä¸çç³»ç»åæ°é ç½®æ件ï¼/proc/sysï¼ï¼æ们å¯ä»¥ç´æ¥å¨è¿è¡æ¶å¨ææ´æ¹å æ ¸åæ°ï¼åå¦ï¼éè¿ä¸é¢è¿æ¡æ令ï¼
echo 1 > /proc/sys/net/ip_v4/ip_forward
å¼å¯å æ ¸ä¸æ§å¶IP转åçå¼å ³ï¼æ们就å¯ä»¥è®©è¿è¡ä¸çLinuxç³»ç»å¯ç¨è·¯ç±åè½ã类似çï¼è¿æ许å¤å æ ¸é项å¯ä»¥ç´æ¥éè¿procæ件系ç»è¿è¡æ¥è¯¢åè°æ´ã
é¤äºç³»ç»å·²ç»æä¾çæ件æ¡ç®ï¼procè¿ä¸ºæ们çææ¥å£ï¼å 许æ们å¨å æ ¸ä¸å建æ°çæ¡ç®ä»èä¸ç¨æ·ç¨åºå ±äº«ä¿¡æ¯æ°æ®ãæ¯å¦ï¼æ们å¯ä»¥ä¸ºç³»ç»è°ç¨æ¥å¿ç¨åºï¼ä¸ç®¡æ¯ä½ä¸ºé©±å¨ç¨åºä¹å¥½ï¼è¿æ¯ä½ä¸ºå纯çå æ ¸æ¨¡åä¹å¥½ï¼å¨procæ件系ç»ä¸å建æ°çæ件æ¡ç®ï¼å¨æ¤æ¡ç®ä¸æ¾ç¤ºç³»ç»è°ç¨ç使ç¨æ¬¡æ°ï¼æ¯ä¸ªåç¬ç³»ç»è°ç¨ç使ç¨é¢çççãæ们ä¹å¯ä»¥å¢å å¦å¤çæ¡ç®ï¼ç¨äºè®¾ç½®æ¥å¿è®°å½è§åï¼æ¯å¦è¯´ä¸è®°å½openç³»ç»è°ç¨ç使ç¨æ åµçãå ³äºprocæ件系ç»å¾ä½¿ç¨ç»èï¼è¯·æ¥é åèèµæ7ã
ï¼4ï¼ä½¿ç¨èææ件系ç»
æäºå æ ¸å¼åè 认为å©ç¨ioctlï¼ï¼ç³»ç»è°ç¨å¾å¾ä¼ä¼¼çç³»ç»è°ç¨æä¹ä¸æç¡®ï¼èä¸é¾æ§å¶ãèå°ä¿¡æ¯æ¾å ¥å°procæ件系ç»ä¸ä¼ä½¿ä¿¡æ¯ç»ç»æ··ä¹±ï¼å æ¤ä¹ä¸èµæè¿å¤ä½¿ç¨ãä»ä»¬å»ºè®®å®ç°ä¸ç§å¤ç«çèææ件系ç»æ¥ä»£æ¿ioctl()å/procï¼å 为æ件系ç»æ¥å£æ¸ æ¥ï¼èä¸ä¾¿äºç¨æ·ç©ºé´è®¿é®ï¼åæ¶å©ç¨èææ件系ç»ä½¿å¾å©ç¨èæ¬æ§è¡ç³»ç»ç®¡çä»»å¡æ´å®¶æ¹ä¾¿ãææã
æ们举ä¾æ¥è¯´å¦ä½éè¿èææ件系ç»ä¿®æ¹å æ ¸ä¿¡æ¯ãæ们å¯ä»¥å®ç°ä¸ä¸ªå为sagafsçèææ件系ç»ï¼å ¶ä¸æ件log对åºå æ ¸åå¨çç³»ç»è°ç¨æ¥å¿ãæ们å¯ä»¥éè¿æ件访é®ç¹æ®éæ¹æ³è·å¾æ¥å¿ä¿¡æ¯ï¼å¦
# cat /sagafs/log
使ç¨èææ件系ç»ââVFSå®ç°ä¿¡æ¯äº¤äºä½¿å¾ç³»ç»ç®¡çæ´å æ¹ä¾¿ãæ¸ æ°ãä½æäºç¼ç¨è ä¹è®¸ä¼è¯´VFS çAPI æ¥å£å¤æä¸å®¹æææ¡ï¼ä¸è¦æ å¿2.5å æ ¸å¼å§å°±æä¾äºä¸ç§å«ålibfsçä¾ç¨åºå¸®å©ä¸çææ件系ç»çç¨æ·å°è£ äºå®ç°VFSçéç¨æä½ãæå ³å©ç¨VFSå®ç°äº¤äºçæ¹æ³çåèèµæã
(5) 使ç¨å åæ å
Linuxéè¿å åæ åæºå¶æ¥æä¾ç¨æ·ç¨åºå¯¹å åç´æ¥è®¿é®çè½åãå åæ åçæææ¯æå æ ¸ä¸ç¹å®é¨åçå å空é´æ å°å°ç¨æ·çº§ç¨åºçå å空é´å»ãä¹å°±æ¯è¯´ï¼ç¨æ·ç©ºé´åå æ ¸ç©ºé´å ±äº«ä¸åç¸åçå åãè¿æ ·åçç´è§æææ¾èæè§ï¼å æ ¸å¨è¿åå°åå åå¨åæ´çä»»ä½æ°æ®ï¼ç¨æ·å¯ä»¥ç«å³åç°å使ç¨ï¼æ ¹æ¬æ é¡»æ°æ®æ·è´ãèå¨ä½¿ç¨ç³»ç»è°ç¨äº¤äºä¿¡æ¯æ¶ï¼å¨æ´ä¸ªæä½è¿ç¨ä¸å¿ é¡»æä¸æ¥æ°æ®æ·è´çå·¥ä½ââæè æ¯æå æ ¸æ°æ®æ·è´å°ç¨æ·ç¼å²åºï¼æåªæ¯æç¨æ·æ°æ®æ·è´å°å æ ¸ç¼å²åºââè¿å¯¹äºè®¸å¤æ°æ®ä¼ è¾é大ãæ¶é´è¦æ±é«çåºç¨ï¼è¿æ çæ¯è´å½çä¸å»ï¼è®¸å¤åºç¨æ ¹æ¬å°±æ æ³å¿åæ°æ®æ·è´æèè´¹çæ¶é´åèµæºã
æ们æ¾ç»ä¸ºä¸åé«ééæ ·è®¾å¤å¼åè¿é©±å¨ç¨åºï¼è¯¥è®¾å¤è¦æ±å¨20å éæ ·çä¸ä»¥1KHzçéå¤é¢çè¿è¡16ä½å®æ¶éæ ·ï¼æ¯æ¯«ç§éè¦éæ ·ãDMAåå¤ççæ°æ®éæ人ï¼å¦æè¦ä½¿ç¨æ°æ®æ·è´çæ¹æ³ï¼æ ¹æ¬æ æ³è¾¾æè¦æ±ãæ¤æ¶ï¼å åæ åæ为å¯ä¸çéæ©ï¼æ们å¨å åä¸ä¿çäºä¸å空é´ï¼å°å ¶é ç½®æç¯å½¢éåä¾éæ ·è®¾å¤DMAè¾åºæ°æ®ãåæè¿åå å空é´æ å°å°å¨ç¨æ·ç©ºé´è¿è¡çæ°æ®å¤çç¨åºä¸ï¼äºæ¯ï¼éæ ·è®¾å¤ååå¾å°å¹¶ä¼ éå°ä¸»æºä¸çæ°æ®ï¼é©¬ä¸å°±å¯ä»¥è¢«ç¨æ·ç©ºé´çç¨åºå¤çã
å®é ä¸ï¼å åæ å°æ¹å¼é常ä¹æ£æ¯åºç¨å¨é£äºå æ ¸åç¨æ·ç©ºé´éè¦å¿«é大é交äºæ°æ®çæ åµä¸ï¼ç¹å«æ¯é£äºå¯¹å®æ¶æ§è¦æ±è¾å¼ºçåºç¨ãX windowç³»ç»çæå¡å¨çèæå ååºåï¼å°±å¯ä»¥è¢«çåæ¯å åæ åç¨æ³çä¸ä¸ªå ¸åä¾åï¼Xæå¡å¨éè¦å¯¹è§é¢å åè¿è¡å¤§éçæ°æ®äº¤æ¢ï¼ç¸å¯¹äºlseek/writeæ¥è¯´ï¼å°å¾å½¢æ¾ç¤ºå åç´æ¥æ å°å°ç¨æ·ç©ºé´å¯ä»¥æ¾èæé«æè½ã
并ä¸æ¯ä»»ä½ç±»åçåºç¨é½éåmmapï¼æ¯å¦å串å£åé¼ æ è¿äºåºäºæµæ°æ®çå符设å¤ï¼mmap就没æ太大çç¨æ¦ä¹å°ã并ä¸ï¼è¿ç§å ±äº«å åçæ¹å¼åå¨ä¸å¥½åæ¥çé®é¢ãç±äºæ²¡æä¸é¨çåæ¥æºå¶å¯ä»¥è®©ç¨æ·ç¨åºåå æ ¸ç¨åºå ±äº«ï¼æ以å¨è¯»åååå ¥æ°æ®æ¶è¦æé常谨æ ç设计以ä¿è¯ä¸ä¼äº§çå¹²ç»ã
mmapå®å ¨æ¯åºäºå ±äº«å åçè§å¿µäºï¼ä¹æ£å 为æ¤ï¼å®è½æä¾é¢å¤ç便å©ï¼ä½ä¹ç¹å«é¾ä»¥æ§å¶ã
ç±å æ ¸ä¸»å¨åèµ·çä¿¡æ¯äº¤äº
å¨å æ ¸åèµ·ç交äºä¸ï¼æ们æå ³å¿åæå ´è¶£çåºè¯¥æ¯å æ ¸å¦ä½åç¨æ·ç¨åºåæ¶æ¯ï¼ç¨æ·ç¨åºåæ¯ææ ·æ¥æ¶è¿äºæ¶æ¯çï¼å ·ä½é®é¢é常éä¸å¨ä¸é¢è¿å 个æ¹é¢ï¼å æ ¸å¯å¦è°ç¨ç¨æ·ç¨åºï¼æ¯å¦å¯ä»¥éè¿åç¨æ·è¿ç¨åä¿¡å·æ¥åç¥ç¨æ·è¿ç¨äºä»¶åçï¼
åé¢ä»ç»ç交äºæ¹æ³æ大çä¸åå¨äºè¿äºæ¹å¼æ¯ç±å æ ¸éå主å¨ï¼èä¸æ¯çç³»ç»è°ç¨æ¥è¢«å¨çè¿åä¿¡æ¯çã
(1) ä»å æ ¸ç©ºé´è°ç¨ç¨æ·ç¨åºã
å³ä½¿å¨å æ ¸ä¸ï¼æ们ææ¶ä¹éè¦æ§è¡ä¸äºå¨ç¨æ·çº§ææä¾çæä½ï¼å¦æå¼æ个æ件以读åç¹å®æ°æ®ï¼æ§è¡æ个ç¨æ·ç¨åºä»èå®ææ个åè½ãå 为许å¤æ°æ®ååè½å¨ç¨æ·ç©ºé´æ¯ç°æçæè å·²ç»è¢«å®ç°äºï¼é£ä¹æ²¡æå¿ è¦è费大éçèµæºå»éå¤ãæ¤å¤ï¼å æ ¸å¨è®¾è®¡æ¶ï¼ä¸ºäºæ¥ææ´å¥½çå¼¹æ§æè æ§è½ä»¥æ¯ææªç¥ä½æå¯è½åççååï¼æ¬èº«å°±è¦æ±ä½¿ç¨ç¨æ·ç©ºé´çèµæºæ¥é åå®æä»»å¡ãæ¯å¦å æ ¸ä¸å¨æå 载模åçé¨åéè¦è°ç¨kmodãä½å¨ç¼è¯kmodçæ¶åä¸å¯è½æææçå æ ¸æ¨¡åé½è®¢ä¸æ¥ï¼è¦æ¯è¿æ ·çè¯å¨æå 载模å就没æåå¨æä¹äºï¼ï¼æ以å®ä¸å¯è½ç¥éå¨å®ä»¥åæåºç°çé£äºæ¨¡åçä½ç½®åå è½½æ¹æ³ãå æ¤ï¼æ¨¡åçå¨æå 载就éç¨äºå¦ä¸çç¥ï¼å 载任å¡å®é ä¸ç±ä½äºç¨æ·ç©ºé´çmodprobeç¨åºå¸®å©å®æââæç®åçæ å½¢æ¯modprobeç¨å æ ¸ä¼ è¿æ¥ç模åååä½ä¸ºåæ°è°ç¨insmodãç¨è¿ç§æ¹æ³æ¥å è½½æéè¦ç模åã
å æ ¸ä¸å¯å¨ç¨æ·ç¨åºè¿æ¯è¦éè¿execveè¿ä¸ªç³»ç»è°ç¨åå½¢ï¼åªæ¯æ¤æ¶çè°ç¨åçå¨å æ ¸ç©ºé´ï¼èä¸è¬çç³»ç»è°ç¨åå¨ç¨æ·ç©ºé´è¿è¡ãå¦æç³»ç»è°ç¨å¸¦åæ°ï¼é£å°ä¼ç¢°å°ä¸ä¸ªé®é¢ï¼å 为å¨ç³»ç»è°ç¨çå ·ä½å®ç°ä»£ç ä¸è¦æ£æ¥åæ°åæ³æ§ï¼è¯¥æ£æ¥è¦æ±ææçåæ°å¿ é¡»ä½äºç¨æ·ç©ºé´ââå°åå¤äº0x0000000ââ0xC0000000ä¹é´ï¼æ以å¦ææ们ä»å æ ¸ä¼ éåæ°ï¼å°å大äº0xC0000000ï¼,é£ä¹æ£æ¥å°±ä¼æç»æ们çè°ç¨è¯·æ±ã为äºè§£å³è¿ä¸ªé®é¢ï¼æ们å¯ä»¥å©ç¨set_fså®æ¥ä¿®æ¹æ£æ¥çç¥ï¼ä½¿å¾å 许åæ°å°å为å æ ¸å°åãè¿æ ·å æ ¸å°±å¯ä»¥ç´æ¥ä½¿ç¨è¯¥ç³»ç»è°ç¨äºã
ä¾å¦ï¼å¨kmodéè¿è°ç¨execveæ¥æ§è¡modprobeç代ç åéè¦æset_fs(KERNEL_DS):
......
set_fs(KERNEL_DS);
/* Go, go, go... */
if (execve(program_path, argv, envp) < 0)
return -errno;
ä¸è¿°ä»£ç ä¸program_path 为"/sbin/modprobe"ï¼argv为{ modprobe_path, "-s", "-k", "--", (char*)module_name, NULL }ï¼envp为{ "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }ã
ä»å æ ¸ä¸æå¼æ件åæ ·ä½¿ç¨å¸¦åæ°çopenç³»ç»è°ç¨ï¼æéçä»æ¯è¦å è°ç¨set_fså®ã
(2) å©ç¨brkç³»ç»è°ç¨æ¥å¯¼åºå æ ¸æ°æ®
å æ ¸åç¨æ·ç©ºé´ä¼ éæ°æ®ä¸»è¦æ¯ç¨get_user(ptr)åput_user(datum,ptr)ä¾ç¨ãæ以å¨å¤§é¨åéè¦ä¼ éæ°æ®çç³»ç»è°ç¨ä¸é½å¯ä»¥æ¾å°å®ä»¬ç身影ãå¯æ¯ï¼å¦ææ们ä¸æ¯éè¿ç¨æ·ç¨åºåèµ·çç³»ç»è°ç¨ââä¹å°±æ¯è¯´ï¼æ²¡ææç¡®çæä¾ç¨æ·ç©ºé´å çç¼å²åºä½ç½®ââçæ åµä¸ï¼å¦ä½åç¨æ·ç©ºé´ä¼ éå æ ¸æ°æ®å¢ï¼
æ¾ç¶ï¼æ们ä¸è½åç´æ¥ä½¿ç¨put_user()äºï¼å 为æ们没æåæ³ç»å®æå®ç®çç¼å²åºãæ以ï¼æ们è¦åç¨brkç³»ç»è°ç¨åå½åè¿ç¨ç©ºé´ï¼brkç¨äºç»è¿ç¨è®¾ç½®å 空é´ç大å°ãæ¯ä¸ªè¿ç¨æ¥æä¸ä¸ªç¬ç«çå 空é´ï¼mallocçå¨æå ååé å½æ°å ¶å®å°±æ¯è¿ç¨çå 空é´ä¸è·åå åçãæ们å°å©ç¨brkå¨å½åè¿ç¨(current process)çå 空é´ä¸æ©å±ä¸åæ°ç临æ¶ç¼å²åºï¼åç¨put_userå°å æ ¸æ°æ®å¯¼åºå°è¿ä¸ªç¡®å®çç¨æ·ç©ºé´å»ã
è¿è®°å¾åææ们å¨å æ ¸ä¸è°ç¨ç¨æ·ç¨åºçè¿ç¨åï¼å¨é£éï¼æ们æä¸ä¸ªè·³è¿åæ°æ£æ¥çæä½ï¼ç°å¨æäºè¿ç§æ¹æ³ï¼å¯ä»¥å¦è¾è¹å¾äºï¼æ们å¨å½åè¿ç¨çå ä¸æ©å±ä¸å空é´ï¼æç³»ç»è°ç¨è¦ç¨å°çåæ°éè¿put_user()æ·è´å°æ°æ©å±å¾å°çç¨æ·ç©ºé´éï¼ç¶åå¨è°ç¨execveçæ¶å以è¿ä¸ªæ°å¼è¾ç©ºé´å°åä½ä¸ºåæ°ï¼äºæ¯ï¼åæ°æ£æ¥çéç¢ä¸å¤åå¨äºã
char * program_path = "/bin/ls" ;
/* æ¾å°å½åå 顶çä½ç½®*/
mmm=current->mm->brk;
/* ç¨brkå¨å 顶ä¸åæ©å±åºä¸å256åèçæ°ç¼å²åº*/
ret = brk(*(void)(mmm+256));
/* æexecveéè¦ç¨å°çåæ°æ·è´å°æ°ç¼å²åºä¸å»*/
put_user((void*)2,program_path,strlen(program_path)+1);
/* æåæ§è¡/bin/lsç¨åºï¼*/
execve((char*)(mmm+2));
/* æ¢å¤ç°åº*/
tmp = brk((void*)mmm);
è¿ç§æ¹æ³æ²¡æä¸è¬æ§ï¼å ·ä½ç说ï¼è¿ç§æ¹æ³æè´é¢æåºåï¼ï¼åªè½ä½ä¸ºä¸ç§æå·§ï¼ä½æ们ä¸é¾åç°ï¼å¦æä½ çæå æ ¸ç»æï¼å°±å¯ä»¥åå°å¾å¤ææ³ä¸å°çäºæ ï¼
(3) 使ç¨ä¿¡å·
ä¿¡å·å¨å æ ¸éçç¨é主è¦éä¸å¨éç¥ç¨æ·ç¨åºåºç°é大é误ï¼å¼ºè¡ææ»å½åè¿ç¨ï¼è¿æ¶å æ ¸éè¿åéSIGKILLä¿¡å·éç¥è¿ç¨ç»æ¢ï¼å æ ¸åéä¿¡å·ä½¿ç¨send_sign(pid,sig)ä¾ç¨ï¼å¯ä»¥çå°ä¿¡å·åéå¿ é¡»è¦äºå ç¥éè¿ç¨åºå·ï¼pidï¼ï¼æ以è¦æ³ä»å æ ¸ä¸éè¿åä¿¡å·çæ¹å¼å¼æ¥éç¥ç¨æ·è¿ç¨æ§è¡æ项任å¡ï¼é£ä¹å¿ é¡»äºå ç¥éç¨æ·è¿ç¨çè¿ç¨å·æå¯ãèå æ ¸è¿è¡æ¶æç´¢å°ç¹å®è¿ç¨çè¿ç¨å·æ¯ä¸ªè´¹äºçå·¥ä½ï¼å¯è½è¦éåæ´ä¸ªè¿ç¨æ§å¶åé¾è¡¨ãæ以ç¨ä¿¡å·éç¥ç¹å®ç¨æ·è¿ç¨çæ¹æ³å¾ç³ç³ï¼ä¸è¬å¨å æ ¸ä¸ä¼ä½¿ç¨ãå æ ¸ä¸ä½¿ç¨ä¿¡å·çæ å½¢åªåºç°å¨éç¥å½åè¿ç¨ï¼å¯ä»¥ä»currentåéä¸æ¹ä¾¿è·å¾pidï¼åæäºéç¨æä½ï¼å¦ç»æ¢æä½çãå æ¤å¯¹å æ ¸å¼åè 该æ¹æ³ç¨å¤ä¸å¤§ã
类似æ åµè¿ææ¶æ¯æä½ãè¿éä¸ç½å¦äºã
æ»ç» ç±ç¨æ·çº§ç¨åºä¸»å¨åèµ·çä¿¡æ¯äº¤äºï¼æ 论æ¯éç¨æ åçè°ç¨æ¹å¼è¿æ¯éè¿é©±å¨ç¨åºçé¢ï¼ä¸è¬é½è¦ç¨å°ç³»ç»è°ç¨ãèç±å æ ¸ä¸»å¨åèµ·ä¿¡æ¯äº¤äºçæ åµä¸å¤ãä¹æ²¡ææ åççé¢ï¼æä½å¤§ä¸æ¹ä¾¿ãæ以ä¸è¬æ åµä¸ï¼å°½å¯è½ç¨æ¬ææè¿°çåå ç§æ¹æ³è¿è¡ä¿¡æ¯äº¤äºãæ¯ç«ï¼å¨è®¾è®¡çæ ¹æºä¸ï¼ç¸å¯¹äºå®¢æ·çº§ç¨åºï¼å æ ¸å°±è¢«å®ä¹ä¸ºä¸ä¸ªè¢«å¨çæå¡æä¾è ãå æ¤ï¼æ们èªå·±çå¼åä¹åºè¯¥å°½ééµå¾ªè¿ç§è®¾è®¡ååã
ããLinuxç®åäºå段æºå¶ï¼ä½¿å¾èæå°åä¸çº¿æ§å°åæ»æ¯ä¸è´ï¼å æ¤ï¼Linuxçèæå°å空é´ä¹ä¸º0~4G.Linuxå æ ¸å°è¿4Gåèç空é´å为两é¨åãå°æé«ç1Gåè(ä»èæå°å0xC0000000å°0xFFFFFFFF)ï¼ä¾å æ ¸ä½¿ç¨ï¼ç§°ä¸º"å æ ¸ç©ºé´".èå°è¾ä½ç3Gåè(ä»èæå°å 0x00000000å°0xBFFFFFFF)ï¼ä¾å个è¿ç¨ä½¿ç¨ï¼ç§°ä¸º"ç¨æ·ç©ºé´)ãå 为æ¯ä¸ªè¿ç¨å¯ä»¥éè¿ç³»ç»è°ç¨è¿å ¥å æ ¸ï¼å æ¤ï¼Linuxå æ ¸ç±ç³»ç»å çææè¿ç¨å ±äº«ãäºæ¯ï¼ä»å ·ä½è¿ç¨çè§åº¦æ¥çï¼æ¯ä¸ªè¿ç¨å¯ä»¥æ¥æ4Gåèçèæ空é´ã
ããLinux使ç¨ä¸¤çº§ä¿æ¤æºå¶ï¼0级ä¾å æ ¸ä½¿ç¨ï¼3级ä¾ç¨æ·ç¨åºä½¿ç¨ãä»å¾ä¸å¯ä»¥çåº(è¿éæ æ³è¡¨ç¤ºå¾)ï¼æ¯ä¸ªè¿ç¨æåèªçç§æç¨æ·ç©ºé´(0~3G)ï¼è¿ä¸ªç©ºé´å¯¹ç³»ç»ä¸çå ¶ä»è¿ç¨æ¯ä¸å¯è§çãæé«ç1GBåèèæå æ ¸ç©ºé´å为ææè¿ç¨ä»¥åå æ ¸æå ±äº«ã
ããå æ ¸ç©ºé´ä¸åæ¾çæ¯å æ ¸ä»£ç åæ°æ®ï¼èè¿ç¨çç¨æ·ç©ºé´ä¸åæ¾çæ¯ç¨æ·ç¨åºç代ç åæ°æ®ãä¸ç®¡æ¯å æ ¸ç©ºé´è¿æ¯ç¨æ·ç©ºé´ï¼å®ä»¬é½å¤äºèæ空é´ä¸ã
ããè½ç¶å æ ¸ç©ºé´å æ®äºæ¯ä¸ªèæ空é´ä¸çæé«1GBåèï¼ä½æ å°å°ç©çå åå´æ»æ¯ä»æä½å°å(0x00000000)å¼å§ã对å æ ¸ç©ºé´æ¥è¯´ï¼å ¶å°åæ å°æ¯å¾ç®åç线æ§æ å°ï¼0xC0000000å°±æ¯ç©çå°åä¸çº¿æ§å°åä¹é´çä½ç§»éï¼å¨Linux代ç ä¸å°±å«åPAGE_OFFSET.
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¹é´å¦ä½è¿è¡é讯ï¼
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¸è¬éè¿ç³»ç»è°ç¨è¿è¡éä¿¡ã
ããå¦ä½å¤æä¸ä¸ªé©±å¨æ¯ç¨æ·æ¨¡å¼é©±å¨è¿æ¯å æ ¸æ¨¡å¼é©±å¨ï¼ å¤æçæ åæ¯ä»ä¹ï¼
ããç¨æ·ç©ºé´æ¨¡å¼ç驱å¨ä¸è¬éè¿ç³»ç»è°ç¨æ¥å®æ对硬件ç访é®ï¼å¦éè¿ç³»ç»è°ç¨å°é©±å¨çio空é´æ å°å°ç¨æ·ç©ºé´çãå æ¤ï¼ä¸»è¦çå¤æä¾æ®å°±æ¯ç³»ç»è°ç¨ã
ããå æ ¸ç©ºé´åç¨æ·ç©ºé´ä¸ä¸å太å¤äºï¼è¯´ä¸å®ï¼æ¯å¦ç¨æ·æçé¾è¡¨åå æ ¸é¾è¡¨ä¸ä¸æ ·;ç¨æ·æç¨printf,å æ ¸æç¨printk;ç¨æ·ææ¯ä¸ªåºç¨ç¨åºç©ºé´æ¯èæçï¼ç¸å¯¹ç¬ç«çï¼å æ ¸æä¸å´ä¸æ¯ç¬ç«çï¼æ以ç¼ç¨è¦é常å°å¿ãççã
ããè¿æç¨æ·æåå æ ¸æç¨åºé讯çæ¹æ³å¾å¤ï¼ä¸ååæ¯ç³»ç»è°ç¨ï¼å®é ä¸ç³»ç»è°ç¨æ¯ä¸ªä¸å¥½çéæ©ï¼å 为éè¦ç³»ç»è°ç¨å·ï¼è¿ä¸ªéè¦ç»ä¸åé ã
ããå¯ä»¥éè¿ioctlãsysfsãprocçæ¥å®æã
å¨è¿è¡è®¾å¤é©±å¨ç¨åºï¼å æ ¸åè½æ¨¡åçç³»ç»çº§å¼åæ¶ï¼é常éè¦å¨å æ ¸åç¨æ·ç¨åºä¹é´äº¤æ¢ä¿¡æ¯ãLinuxæä¾äºå¤ç§æ¹æ³å¯ä»¥ç¨æ¥å®æè¿äºä»»å¡ãæ¬ææ»ç»äºåç§å¸¸ç¨çä¿¡æ¯äº¤æ¢æ¹æ³ï¼å¹¶ç¨ç®åçä¾åæ¼ç¤ºè¿äºæ¹æ³åèªçç¹ç¹åç¨æ³ãå ¶ä¸æ大家é常çæçæ¹æ³ï¼ä¹æç¹æ®æ¡ä»¶ä¸æ¹å¯ä½¿ç¨çæ段ãéè¿å¯¹æ¯æç¡®è¿äºæ¹æ³ï¼å¯ä»¥å æ·±æ们对Linuxå æ ¸ç认è¯ï¼æ´éè¦çæ¯ï¼å¯ä»¥è®©æ们æ´çç»é©¾å¾¡linuxå æ ¸çº§çåºç¨å¼åææ¯ã
å æ ¸ç©ºé´(kernel-space) VS ç¨æ·ç©ºé´(user-space)
ä½ä¸ºä¸ä¸ªLinuxå¼åè ï¼é¦å åºè¯¥æ¸ æ¥å æ ¸ç©ºé´åç¨æ·ç©ºé´çåºå«ãå ³äºè¿ä¸ªè¯é¢ï¼å·²ç»æå¾å¤ç¸å ³èµæï¼æ们å¨è¿éç®åæè¿°å¦ä¸ï¼
ç°ä»£ç计ç®æºä½ç³»ç»æä¸åå¨ç®¡çé常é½å å«ä¿æ¤æºå¶ãæä¾ä¿æ¤çç®çï¼æ¯è¦é¿å ç³»ç»ä¸çä¸ä¸ªä»»å¡è®¿é®å±äºå¦å¤çæå±äºæä½ç³»ç»çåå¨åºåãå¦å¨IntelX86ä½ç³»ä¸ï¼å°±æä¾äºç¹æ级è¿ç§ä¿æ¤æºå¶ï¼éè¿ç¹æ级å«çåºå«æ¥éå¶å¯¹åå¨åºåç访é®ã åºäºè¿ç§ææ¶ï¼Linuxæä½ç³»ç»å¯¹èªèº«è¿è¡äºååï¼ä¸é¨åæ ¸å¿è½¯ä»¶ç¬ç«äºæ®éåºç¨ç¨åºï¼è¿è¡å¨è¾é«çç¹æ级å«ä¸ï¼ï¼Linux使ç¨Intelä½ç³»çç¹æ级3æ¥è¿è¡å æ ¸ãï¼å®ä»¬é©»çå¨è¢«ä¿æ¤çå å空é´ä¸ï¼æ¥æ访é®ç¡¬ä»¶è®¾å¤çæææéï¼Linuxå°æ¤ç§°ä¸ºå æ ¸ç©ºé´ã
ç¸å¯¹çï¼å ¶å®é¨å被ä½ä¸ºåºç¨ç¨åºå¨ç¨æ·ç©ºé´æ§è¡ãå®ä»¬åªè½çå°å 许å®ä»¬ä½¿ç¨çé¨åç³»ç»èµæºï¼å¹¶ä¸ä¸è½ä½¿ç¨æäºç¹å®çç³»ç»åè½ï¼ä¸è½ç´æ¥è®¿é®ç¡¬ä»¶ï¼ä¸è½ç´æ¥è®¿é®å æ ¸ç©ºé´ï¼å½ç¶è¿æå ¶ä»ä¸äºå ·ä½ç使ç¨éå¶ãï¼Linux使ç¨Intelä½ç³»çç¹æ级0æ¥è¿è¡ç¨æ·ç¨åºãï¼
ä»å®å ¨è§åº¦è®²å°ç¨æ·ç©ºé´åå æ ¸ç©ºé´ç½®äºè¿ç§é对称访é®æºå¶ä¸æ¯å¾ææçï¼å®è½æµå¾¡æ¶æç¨æ·ç窥æ¢ï¼ä¹è½é²æ¢è´¨éä½å£çç¨æ·ç¨åºç侵害ï¼ä»è使系ç»è¿è¡å¾æ´ç¨³å®å¯é ãä½æ¯ï¼å¦æåè¿æ ·å®å ¨ä¸å 许ç¨æ·ç¨åºè®¿é®å使ç¨å æ ¸ç©ºé´çèµæºï¼é£ä¹æ们çç³»ç»å°±æ æ³æä¾ä»»ä½ææä¹çåè½äºã为äºæ¹ä¾¿ç¨æ·ç¨åºä½¿ç¨å¨å æ ¸ç©ºé´æè½å®å ¨æ§å¶çèµæºï¼èåä¸è¿åä¸è¿°çç¹æè§å®ï¼ä»ç¡¬ä»¶ä½ç³»ç»ææ¬èº«å°æä½ç³»ç»ï¼é½å®ä¹äºæ åç访é®çé¢ãå ³äºX86ç³»ç»çç»èï¼è¯·æ¥é åèèµæ1
ä¸è¬ç硬件ä½ç³»æºæé½æä¾ä¸ç§âé¨âæºå¶ãâé¨âçå«ä¹æ¯æå¨åçäºç¹å®äºä»¶çæ¶åä½ç¹æçåºç¨ç¨åºå¯ä»¥éè¿è¿äºâé¨âè¿å ¥é«ç¹æçå æ ¸ç©ºé´ã对äºIntelX86ä½ç³»æ¥è¯´ï¼Linuxæä½ç³»ç»æ£æ¯å©ç¨äºâç³»ç»é¨âè¿ä¸ªç¡¬ä»¶çé¢ï¼éè¿è°ç¨int $0x80æºå¨æ令)ï¼æé äºå½¢å½¢è²è²çç³»ç»è°ç¨ä½ä¸ºè½¯ä»¶çé¢ï¼ä¸ºåºç¨ç¨åºä»ç¨æ·æé·å ¥å°å æ ¸ææä¾äºééãéè¿âç³»ç»è°ç¨â使ç¨âç³»ç»é¨â并ä¸éè¦ç¹å«çæéï¼ä½é·å ¥å°å æ ¸çå ·ä½ä½ç½®å´ä¸æ¯éæçï¼è¿ä¸ªä½ç½®ç±âç³»ç»è°ç¨âæ¥æå®ï¼æè¿æ ·çéå¶æè½ä¿è¯å æ ¸å®å ¨æ èãæ们å¯ä»¥å½¢è±¡å°æè¿°è¿ç§æºå¶ï¼ä½ä¸ºä¸ä¸ªæ¸¸å®¢ï¼ä½ å¯ä»¥ä¹°ç¥¨è¦æ±è¿å ¥éçå¨ç©åï¼ä½ä½ å¿ é¡»èèå®å®çåå¨è§å 车ä¸ï¼æç §è§å®ç路线è§å 游è§ãå½ç¶ï¼ä¸åä¸è½¦ï¼å 为é£æ ·å¤ªå±é©ï¼ä¸æ¯è®©ä½ 丢æå°å½ï¼å°±æ¯è®©ä½ ååäºéçå¨ç©ã
åºäºæçå代ç 大å°çèèï¼å æ ¸ç¨åºä¸è½ä½¿ç¨æ ååºå½æ°ï¼å½ç¶è¿æå ¶å®ç顾èï¼è¯¦ç»åå 请æ¥é åèèµæ2ï¼å æ¤å æ ¸å¼åä¸å¦ç¨æ·ç¨åºå¼åé£ä¹æ¹ä¾¿ã
å æ ¸ç©ºé´åç¨æ·ç©ºé´çç¸äºä½ç¨
ç°å¨ï¼è¶æ¥è¶å¤çåºç¨ç¨åºéè¦ç¼åå æ ¸çº§åç¨æ·çº§çç¨åºæ¥ä¸èµ·å®æå ·ä½çä»»å¡ï¼é常éç¨ä»¥ä¸æ¨¡å¼ï¼é¦å ï¼ç¼åå æ ¸æå¡ç¨åºå©ç¨å æ ¸ç©ºé´æä¾çæéåæå¡æ¥æ¥æ¶ãå¤çåç¼åæ°æ®ï¼ç¶åç¼åç¨æ·ç¨åºæ¥åå åå®æçå æ ¸æå¡ç¨åºäº¤äºï¼å ·ä½æ¥è¯´ï¼å¯ä»¥å©ç¨ç¨æ·ç¨åºæ¥é ç½®å æ ¸æå¡ç¨åºçåæ°ï¼æåå æ ¸æå¡ç¨åºæä¾çæ°æ®ï¼å½ç¶ï¼ä¹å¯ä»¥åå æ ¸æå¡ç¨åºè¾å ¥å¾ å¤çæ°æ®ã
æ¯è¾å ¸åçåºç¨å æ¬: Netfilter(å æ ¸æå¡ç¨åºï¼é²ç«å¢)VS Iptableï¼ç¨æ·çº§ç¨åºï¼è§å设置ç¨åºï¼ï¼IPSEC(å æ ¸æå¡ç¨åºï¼VPNåè®®é¨å)VS IKE(ç¨æ·çº§ç¨åºï¼vpnå¯é¥ååå¤ç)ï¼å½ç¶è¿å æ¬å¤§éç设å¤é©±å¨ç¨åºåç¸åºçåºç¨è½¯ä»¶ãè¿äºåºç¨é½æ¯ç±å æ ¸çº§åç¨æ·çº§ç¨åºéè¿ç¸äºäº¤æ¢ä¿¡æ¯æ¥ä¸èµ·å®æç¹å®ä»»å¡çã
ä¿¡æ¯äº¤äºæ¹æ³
ç¨æ·ç¨åºåå æ ¸çä¿¡æ¯äº¤æ¢æ¯ååçï¼ä¹å°±æ¯è¯´æ¢å¯ä»¥ä¸»å¨ä»ç¨æ·ç©ºé´åå æ ¸ç©ºé´åéä¿¡æ¯ï¼ä¹å¯ä»¥ä»å æ ¸ç©ºé´åç¨æ·ç©ºé´æ交æ°æ®ãå½ç¶ï¼ç¨æ·ç¨åºä¹å¯ä»¥ä¸»å¨å°ä»å æ ¸æåæ°æ®ãä¸é¢æ们就é对å æ ¸åç¨æ·äº¤äºæ°æ®çæ¹æ³åä¸æ»ç»ãå½çº³ã
ä¿¡æ¯äº¤äºæä¿¡æ¯ä¼ è¾åèµ·æ¹å¯ä»¥å为ç¨æ·åå æ ¸ä¼ é/æåæ°æ®åå æ ¸åç¨æ·ç©ºé´æ交请æ±ä¸¤å¤§ç±»ï¼å æ¥è¯´è¯´ï¼
ç±ç¨æ·çº§ç¨åºä¸»å¨åèµ·çä¿¡æ¯äº¤äºã
ï¼1ï¼ç¼åèªå·±çç³»ç»è°ç¨
ä»åæå¯ä»¥çåºï¼ç³»ç»è°ç¨æ¯ç¨æ·çº§ç¨åºè®¿é®å æ ¸æåºæ¬çæ¹æ³ãç®ålinux大è´æä¾äºäºç¾å¤ä¸ªæ åçç³»ç»è°ç¨ï¼å¹¶ä¸å 许æ们添å èªå·±çç³»ç»è°ç¨æ¥å®ç°åå æ ¸çä¿¡æ¯äº¤æ¢ãæ¯å¦æ们å¸æ建ç«ä¸ä¸ªç³»ç»è°ç¨æ¥å¿ç³»ç»ï¼å°ææçç³»ç»è°ç¨å¨ä½è®°å½ä¸æ¥ï¼ä»¥ä¾¿è¿è¡å ¥ä¾µæ£æµãæ¤æ¶ï¼æ们å¯ä»¥ç¼åä¸ä¸ªå æ ¸æå¡ç¨åºã该ç¨åºè´è´£æ¶éææçç³»ç»è°ç¨è¯·æ±ï¼å¹¶å°è¿äºè°ç¨ä¿¡æ¯è®°å½å°å¨å æ ¸ä¸èªå»ºçç¼å²éãæ们æ æ³å¨å æ ¸éå®ç°å¤æçå ¥ä¾µæ£æµç¨åºï¼å æ¤å¿ é¡»å°è¯¥ç¼å²éçè®°å½æåå°ç¨æ·ç©ºé´ãæç´æªäºå½çæ¹æ³æ¯èªå·±ç¼åä¸ä¸ªæ°ç³»ç»è°ç¨å®ç°è¿ç§æåç¼å²æ°æ®çåè½ãå½å æ ¸æå¡ç¨åºåæ°ç³»ç»è°ç¨é½å®ç°åï¼æ们就å¯ä»¥å¨ç¨æ·ç©ºé´éç¼åç¨æ·ç¨åºè¿è¡å ¥ä¾µæ£æµä»»å¡äºï¼å ¥ä¾µæ£æµç¨åºå¯ä»¥å®æ¶ãè½®è®æå¨éè¦çæ¶åè°ç¨æ°ç³»ç»è°ç¨ä»å æ ¸æåæ°æ®ï¼ç¶åè¿è¡å ¥ä¾µæ£æµ(å ·ä½æ¥éª¤å代ç åè§Linuxå æ ¸ä¹æ ç½ç«çµåæå¿ç¬¬åæ)ã
ï¼2ï¼ç¼å驱å¨ç¨åº
Linux/UNIXçä¸ä¸ªç¹ç¹å°±æ¯æææçä¸è¥¿é½çä½æ¯æ件(every thing is a file)ãç³»ç»å®ä¹äºç®æ´å®åç驱å¨ç¨åºçé¢ï¼å®¢æ·ç¨åºå¯ä»¥ç¨ç»ä¸çæ¹æ³éè¿è¿ä¸ªçé¢åå æ ¸é©±å¨ç¨åºäº¤äºãè大é¨åç³»ç»ç使ç¨è åå¼åè å·²ç»é常çæè¿ç§çé¢ä»¥åç¸åºçå¼åæµç¨äºã
驱å¨ç¨åºè¿è¡äºå æ ¸ç©ºé´ï¼ç¨æ·ç©ºé´çåºç¨ç¨åºéè¿æ件系ç»ä¸/dev/ç®å½ä¸çä¸ä¸ªæ件æ¥åå®äº¤äºãè¿å°±æ¯æ们çæçé£ä¸ªæ件æä½æµç¨ï¼open() ââ read()() ââ write() ââ ioctl() ââclose()ãï¼éè¦æ³¨æçæ¯ä¹ä¸æ¯ææçå æ ¸é©±å¨ç¨åºé½æ¯è¿ä¸ªçé¢ï¼ç½ç»é©±å¨ç¨åºååç§åè®®æ ç使ç¨å°±ä¸å¤§ä¸è´ï¼æ¯å¦è¯´å¥æ¥å£ç¼ç¨è½ç¶ä¹æopen()åclose()çæ¦å¿µï¼ä½å®çå æ ¸å®ç°ä»¥åå¤é¨ä½¿ç¨æ¹å¼é½åæ®é驱å¨ç¨åºæå¾å¤§å·®å¼ãï¼å ³äºè¿é¨åçç¼ç¨ç»èï¼è¯·æ¥é åèèµæ3ã4ã
设å¤é©±å¨ç¨åºå¨å æ ¸ä¸è¦åçä¸æååºã设å¤ç®¡çãæ°æ®å¤çççåç§å·¥ä½è¿ç¯æç« ä¸å»å ³å¿ï¼æ们æ注æåéä¸å¨å®ä¸ç¨æ·çº§ç¨åºäº¤äºè¿ä¸é¨åãæä½ç³»ç»ä¸ºæ¤å®ä¹äºä¸ç§ç»ä¸ç交äºçé¢ï¼å°±æ¯åé¢æ说çopen(), read(), write(), ioctl()åclose()ççãæ¯ä¸ªé©±å¨ç¨åºæç §èªå·±çéè¦åç¬ç«å®ç°ï¼æèªå·±æä¾çåè½åæå¡éèå¨è¿ä¸ªç»ä¸çé¢ä¸ã客æ·çº§ç¨åºéæ©éè¦ç驱å¨ç¨åºææå¡ï¼å ¶å®å°±æ¯éæ©/dev/ç®å½ä¸çæ件ï¼ï¼æç §ä¸è¿°çé¢åæ件æä½æµç¨ï¼å°±å¯ä»¥è·å æ ¸ä¸ç驱å¨äº¤äºäºãå ¶å®ç¨é¢å对象çæ¦å¿µä¼æ´å®¹æ解éï¼ç³»ç»å®ä¹äºä¸ä¸ªæ½è±¡ççé¢ï¼abstract interfaceï¼ï¼æ¯ä¸ªå ·ä½ç驱å¨ç¨åºé½æ¯è¿ä¸ªçé¢çå®ç°ï¼implementationï¼ã
æ以驱å¨ç¨åºä¹æ¯ç¨æ·ç©ºé´åå æ ¸ä¿¡æ¯äº¤äºçéè¦æ¹å¼ä¹ä¸ãå ¶å®ioctl, read, writeæ¬è´¨ä¸è®²ä¹æ¯éè¿ç³»ç»è°ç¨å»å®æçï¼åªæ¯è¿äºè°ç¨å·²è¢«å æ ¸è¿è¡äºæ åå°è£ ï¼ç»ä¸å®ä¹ãå æ¤ç¨æ·ä¸å¿ åå¡«å æ°ç³»ç»è°ç¨é£æ ·å¿ 须修æ¹å æ ¸ä»£ç ï¼éæ°ç¼è¯æ°å æ ¸ï¼ä½¿ç¨èæ设å¤åªéè¦éè¿æ¨¡åæ¹æ³å°æ°çèæ设å¤å®è£ å°å æ ¸ä¸ï¼insmodä¸ï¼å°±è½æ¹ä¾¿ä½¿ç¨ãå ³äºæ¤æ¹é¢è®¾è®¡ç»è请æ¥é åèèµæ5ï¼ç¼ç¨ç»è请æ¥é åèèµæ6ã
å¨linuxä¸ï¼è®¾å¤å¤§è´å¯å为ï¼å符设å¤ï¼å设å¤ï¼åç½ç»æ¥å£ï¼å符设å¤å æ¬é£äºå¿ 须以顺åºæ¹å¼ï¼ååèæµä¸æ ·è¢«è®¿é®ç设å¤ï¼å¦å符ç»ç«¯ï¼ä¸²å£çãå设å¤æ¯æé£äºå¯ä»¥ç¨éæºæ¹å¼ï¼ä»¥æ´åæ°æ®ä¸ºåä½æ¥è®¿é®ç设å¤ï¼å¦ç¡¬ççï¼ç½ç»æ¥å£ï¼å°±æé常ç½å¡ååè®®æ çå¤æçç½ç»è¾å ¥è¾åºæå¡ï¼ãå¦æå°æ们çç³»ç»è°ç¨æ¥å¿ç³»ç»ç¨å符å驱å¨ç¨åºçæ¹å¼å®ç°ï¼ä¹æ¯ä¸ä»¶è½»æ¾æ¬æå°å·¥ä½ãæ们å¯ä»¥å°å æ ¸ä¸æ¶éåè®°å½ä¿¡æ¯çé£ä¸é¨åç¼åæä¸ä¸ªå符设å¤é©±å¨ç¨åºãè½ç¶æ²¡æå®é 对åºçç©ç设å¤ï¼ä½è¿å¹¶æ²¡ä»ä¹é®é¢ï¼Linuxç设å¤é©±å¨ç¨åºæ¬æ¥å°±æ¯ä¸ä¸ªè½¯ä»¶æ½è±¡ï¼å®å¯ä»¥ç»å硬件æä¾æå¡ï¼ä¹å®å ¨å¯ä»¥ä½ä¸ºçº¯è½¯ä»¶æä¾æå¡ï¼å½ç¶ï¼å åç使ç¨æ们æ¯æ æ³é¿å çï¼ãå¨é©±å¨ç¨åºä¸ï¼æ们å¯ä»¥ç¨openæ¥å¯å¨æå¡ï¼ç¨read()è¿åå¤ç好çè®°å½ï¼ç¨ioctl()设置记å½æ ¼å¼çï¼ç¨close()åæ¢æå¡ï¼write()没æç¨å°ï¼é£ä¹æ们å¯ä»¥ä¸å»å®ç°å®ãç¶åå¨/dev/ç®å½ä¸å»ºç«ä¸ä¸ªè®¾å¤æ件对åºæ们æ°å å ¥å æ ¸çç³»ç»è°ç¨æ¥å¿ç³»ç»é©±å¨ç¨åºã
ï¼3ï¼ ä½¿ç¨proc æ件系ç»
procæ¯Linuxæä¾çä¸ç§ç¹æ®çæ件系ç»ï¼æ¨åºå®çç®çå°±æ¯æä¾ä¸ç§ä¾¿æ·çç¨æ·åå æ ¸é´ç交äºæ¹å¼ãå®ä»¥æ件系ç»ä½ä¸ºä½¿ç¨çé¢ï¼ä½¿åºç¨ç¨åºå¯ä»¥ä»¥æ件æä½çæ¹å¼å®å ¨ãæ¹ä¾¿çè·åç³»ç»å½åè¿è¡çç¶æåå ¶å®ä¸äºå æ ¸æ°æ®ä¿¡æ¯ã
procæ件系ç»å¤ç¨äºçè§ã管çåè°è¯ç³»ç»ï¼æ们使ç¨çå¾å¤ç®¡çå·¥å ·å¦ps,topçï¼é½æ¯å©ç¨procæ¥è¯»åå æ ¸ä¿¡æ¯çãé¤äºè¯»åå æ ¸ä¿¡æ¯ï¼procæ件系ç»è¿æä¾äºåå ¥åè½ãæ以æ们ä¹å°±å¯ä»¥å©ç¨å®æ¥åå æ ¸è¾å ¥ä¿¡æ¯ãæ¯å¦ï¼éè¿ä¿®æ¹procæ件系ç»ä¸çç³»ç»åæ°é ç½®æ件ï¼/proc/sysï¼ï¼æ们å¯ä»¥ç´æ¥å¨è¿è¡æ¶å¨ææ´æ¹å æ ¸åæ°ï¼åå¦ï¼éè¿ä¸é¢è¿æ¡æ令ï¼
echo 1 > /proc/sys/net/ip_v4/ip_forward
å¼å¯å æ ¸ä¸æ§å¶IP转åçå¼å ³ï¼æ们就å¯ä»¥è®©è¿è¡ä¸çLinuxç³»ç»å¯ç¨è·¯ç±åè½ã类似çï¼è¿æ许å¤å æ ¸é项å¯ä»¥ç´æ¥éè¿procæ件系ç»è¿è¡æ¥è¯¢åè°æ´ã
é¤äºç³»ç»å·²ç»æä¾çæ件æ¡ç®ï¼procè¿ä¸ºæ们çææ¥å£ï¼å 许æ们å¨å æ ¸ä¸å建æ°çæ¡ç®ä»èä¸ç¨æ·ç¨åºå ±äº«ä¿¡æ¯æ°æ®ãæ¯å¦ï¼æ们å¯ä»¥ä¸ºç³»ç»è°ç¨æ¥å¿ç¨åºï¼ä¸ç®¡æ¯ä½ä¸ºé©±å¨ç¨åºä¹å¥½ï¼è¿æ¯ä½ä¸ºå纯çå æ ¸æ¨¡åä¹å¥½ï¼å¨procæ件系ç»ä¸å建æ°çæ件æ¡ç®ï¼å¨æ¤æ¡ç®ä¸æ¾ç¤ºç³»ç»è°ç¨ç使ç¨æ¬¡æ°ï¼æ¯ä¸ªåç¬ç³»ç»è°ç¨ç使ç¨é¢çççãæ们ä¹å¯ä»¥å¢å å¦å¤çæ¡ç®ï¼ç¨äºè®¾ç½®æ¥å¿è®°å½è§åï¼æ¯å¦è¯´ä¸è®°å½openç³»ç»è°ç¨ç使ç¨æ åµçãå ³äºprocæ件系ç»å¾ä½¿ç¨ç»èï¼è¯·æ¥é åèèµæ7ã
ï¼4ï¼ä½¿ç¨èææ件系ç»
æäºå æ ¸å¼åè 认为å©ç¨ioctlï¼ï¼ç³»ç»è°ç¨å¾å¾ä¼ä¼¼çç³»ç»è°ç¨æä¹ä¸æç¡®ï¼èä¸é¾æ§å¶ãèå°ä¿¡æ¯æ¾å ¥å°procæ件系ç»ä¸ä¼ä½¿ä¿¡æ¯ç»ç»æ··ä¹±ï¼å æ¤ä¹ä¸èµæè¿å¤ä½¿ç¨ãä»ä»¬å»ºè®®å®ç°ä¸ç§å¤ç«çèææ件系ç»æ¥ä»£æ¿ioctl()å/procï¼å 为æ件系ç»æ¥å£æ¸ æ¥ï¼èä¸ä¾¿äºç¨æ·ç©ºé´è®¿é®ï¼åæ¶å©ç¨èææ件系ç»ä½¿å¾å©ç¨èæ¬æ§è¡ç³»ç»ç®¡çä»»å¡æ´å®¶æ¹ä¾¿ãææã
æ们举ä¾æ¥è¯´å¦ä½éè¿èææ件系ç»ä¿®æ¹å æ ¸ä¿¡æ¯ãæ们å¯ä»¥å®ç°ä¸ä¸ªå为sagafsçèææ件系ç»ï¼å ¶ä¸æ件log对åºå æ ¸åå¨çç³»ç»è°ç¨æ¥å¿ãæ们å¯ä»¥éè¿æ件访é®ç¹æ®éæ¹æ³è·å¾æ¥å¿ä¿¡æ¯ï¼å¦
# cat /sagafs/log
使ç¨èææ件系ç»ââVFSå®ç°ä¿¡æ¯äº¤äºä½¿å¾ç³»ç»ç®¡çæ´å æ¹ä¾¿ãæ¸ æ°ãä½æäºç¼ç¨è ä¹è®¸ä¼è¯´VFS çAPI æ¥å£å¤æä¸å®¹æææ¡ï¼ä¸è¦æ å¿2.5å æ ¸å¼å§å°±æä¾äºä¸ç§å«ålibfsçä¾ç¨åºå¸®å©ä¸çææ件系ç»çç¨æ·å°è£ äºå®ç°VFSçéç¨æä½ãæå ³å©ç¨VFSå®ç°äº¤äºçæ¹æ³çåèèµæã
(5) 使ç¨å åæ å
Linuxéè¿å åæ åæºå¶æ¥æä¾ç¨æ·ç¨åºå¯¹å åç´æ¥è®¿é®çè½åãå åæ åçæææ¯æå æ ¸ä¸ç¹å®é¨åçå å空é´æ å°å°ç¨æ·çº§ç¨åºçå å空é´å»ãä¹å°±æ¯è¯´ï¼ç¨æ·ç©ºé´åå æ ¸ç©ºé´å ±äº«ä¸åç¸åçå åãè¿æ ·åçç´è§æææ¾èæè§ï¼å æ ¸å¨è¿åå°åå åå¨åæ´çä»»ä½æ°æ®ï¼ç¨æ·å¯ä»¥ç«å³åç°å使ç¨ï¼æ ¹æ¬æ é¡»æ°æ®æ·è´ãèå¨ä½¿ç¨ç³»ç»è°ç¨äº¤äºä¿¡æ¯æ¶ï¼å¨æ´ä¸ªæä½è¿ç¨ä¸å¿ é¡»æä¸æ¥æ°æ®æ·è´çå·¥ä½ââæè æ¯æå æ ¸æ°æ®æ·è´å°ç¨æ·ç¼å²åºï¼æåªæ¯æç¨æ·æ°æ®æ·è´å°å æ ¸ç¼å²åºââè¿å¯¹äºè®¸å¤æ°æ®ä¼ è¾é大ãæ¶é´è¦æ±é«çåºç¨ï¼è¿æ çæ¯è´å½çä¸å»ï¼è®¸å¤åºç¨æ ¹æ¬å°±æ æ³å¿åæ°æ®æ·è´æèè´¹çæ¶é´åèµæºã
æ们æ¾ç»ä¸ºä¸åé«ééæ ·è®¾å¤å¼åè¿é©±å¨ç¨åºï¼è¯¥è®¾å¤è¦æ±å¨20å éæ ·çä¸ä»¥1KHzçéå¤é¢çè¿è¡16ä½å®æ¶éæ ·ï¼æ¯æ¯«ç§éè¦éæ ·ãDMAåå¤ççæ°æ®éæ人ï¼å¦æè¦ä½¿ç¨æ°æ®æ·è´çæ¹æ³ï¼æ ¹æ¬æ æ³è¾¾æè¦æ±ãæ¤æ¶ï¼å åæ åæ为å¯ä¸çéæ©ï¼æ们å¨å åä¸ä¿çäºä¸å空é´ï¼å°å ¶é ç½®æç¯å½¢éåä¾éæ ·è®¾å¤DMAè¾åºæ°æ®ãåæè¿åå å空é´æ å°å°å¨ç¨æ·ç©ºé´è¿è¡çæ°æ®å¤çç¨åºä¸ï¼äºæ¯ï¼éæ ·è®¾å¤ååå¾å°å¹¶ä¼ éå°ä¸»æºä¸çæ°æ®ï¼é©¬ä¸å°±å¯ä»¥è¢«ç¨æ·ç©ºé´çç¨åºå¤çã
å®é ä¸ï¼å åæ å°æ¹å¼é常ä¹æ£æ¯åºç¨å¨é£äºå æ ¸åç¨æ·ç©ºé´éè¦å¿«é大é交äºæ°æ®çæ åµä¸ï¼ç¹å«æ¯é£äºå¯¹å®æ¶æ§è¦æ±è¾å¼ºçåºç¨ãX windowç³»ç»çæå¡å¨çèæå ååºåï¼å°±å¯ä»¥è¢«çåæ¯å åæ åç¨æ³çä¸ä¸ªå ¸åä¾åï¼Xæå¡å¨éè¦å¯¹è§é¢å åè¿è¡å¤§éçæ°æ®äº¤æ¢ï¼ç¸å¯¹äºlseek/writeæ¥è¯´ï¼å°å¾å½¢æ¾ç¤ºå åç´æ¥æ å°å°ç¨æ·ç©ºé´å¯ä»¥æ¾èæé«æè½ã
并ä¸æ¯ä»»ä½ç±»åçåºç¨é½éåmmapï¼æ¯å¦å串å£åé¼ æ è¿äºåºäºæµæ°æ®çå符设å¤ï¼mmap就没æ太大çç¨æ¦ä¹å°ã并ä¸ï¼è¿ç§å ±äº«å åçæ¹å¼åå¨ä¸å¥½åæ¥çé®é¢ãç±äºæ²¡æä¸é¨çåæ¥æºå¶å¯ä»¥è®©ç¨æ·ç¨åºåå æ ¸ç¨åºå ±äº«ï¼æ以å¨è¯»åååå ¥æ°æ®æ¶è¦æé常谨æ ç设计以ä¿è¯ä¸ä¼äº§çå¹²ç»ã
mmapå®å ¨æ¯åºäºå ±äº«å åçè§å¿µäºï¼ä¹æ£å 为æ¤ï¼å®è½æä¾é¢å¤ç便å©ï¼ä½ä¹ç¹å«é¾ä»¥æ§å¶ã
ç±å æ ¸ä¸»å¨åèµ·çä¿¡æ¯äº¤äº
å¨å æ ¸åèµ·ç交äºä¸ï¼æ们æå ³å¿åæå ´è¶£çåºè¯¥æ¯å æ ¸å¦ä½åç¨æ·ç¨åºåæ¶æ¯ï¼ç¨æ·ç¨åºåæ¯ææ ·æ¥æ¶è¿äºæ¶æ¯çï¼å ·ä½é®é¢é常éä¸å¨ä¸é¢è¿å 个æ¹é¢ï¼å æ ¸å¯å¦è°ç¨ç¨æ·ç¨åºï¼æ¯å¦å¯ä»¥éè¿åç¨æ·è¿ç¨åä¿¡å·æ¥åç¥ç¨æ·è¿ç¨äºä»¶åçï¼
åé¢ä»ç»ç交äºæ¹æ³æ大çä¸åå¨äºè¿äºæ¹å¼æ¯ç±å æ ¸éå主å¨ï¼èä¸æ¯çç³»ç»è°ç¨æ¥è¢«å¨çè¿åä¿¡æ¯çã
(1) ä»å æ ¸ç©ºé´è°ç¨ç¨æ·ç¨åºã
å³ä½¿å¨å æ ¸ä¸ï¼æ们ææ¶ä¹éè¦æ§è¡ä¸äºå¨ç¨æ·çº§ææä¾çæä½ï¼å¦æå¼æ个æ件以读åç¹å®æ°æ®ï¼æ§è¡æ个ç¨æ·ç¨åºä»èå®ææ个åè½ãå 为许å¤æ°æ®ååè½å¨ç¨æ·ç©ºé´æ¯ç°æçæè å·²ç»è¢«å®ç°äºï¼é£ä¹æ²¡æå¿ è¦è费大éçèµæºå»éå¤ãæ¤å¤ï¼å æ ¸å¨è®¾è®¡æ¶ï¼ä¸ºäºæ¥ææ´å¥½çå¼¹æ§æè æ§è½ä»¥æ¯ææªç¥ä½æå¯è½åççååï¼æ¬èº«å°±è¦æ±ä½¿ç¨ç¨æ·ç©ºé´çèµæºæ¥é åå®æä»»å¡ãæ¯å¦å æ ¸ä¸å¨æå 载模åçé¨åéè¦è°ç¨kmodãä½å¨ç¼è¯kmodçæ¶åä¸å¯è½æææçå æ ¸æ¨¡åé½è®¢ä¸æ¥ï¼è¦æ¯è¿æ ·çè¯å¨æå 载模å就没æåå¨æä¹äºï¼ï¼æ以å®ä¸å¯è½ç¥éå¨å®ä»¥åæåºç°çé£äºæ¨¡åçä½ç½®åå è½½æ¹æ³ãå æ¤ï¼æ¨¡åçå¨æå 载就éç¨äºå¦ä¸çç¥ï¼å 载任å¡å®é ä¸ç±ä½äºç¨æ·ç©ºé´çmodprobeç¨åºå¸®å©å®æââæç®åçæ å½¢æ¯modprobeç¨å æ ¸ä¼ è¿æ¥ç模åååä½ä¸ºåæ°è°ç¨insmodãç¨è¿ç§æ¹æ³æ¥å è½½æéè¦ç模åã
å æ ¸ä¸å¯å¨ç¨æ·ç¨åºè¿æ¯è¦éè¿execveè¿ä¸ªç³»ç»è°ç¨åå½¢ï¼åªæ¯æ¤æ¶çè°ç¨åçå¨å æ ¸ç©ºé´ï¼èä¸è¬çç³»ç»è°ç¨åå¨ç¨æ·ç©ºé´è¿è¡ãå¦æç³»ç»è°ç¨å¸¦åæ°ï¼é£å°ä¼ç¢°å°ä¸ä¸ªé®é¢ï¼å 为å¨ç³»ç»è°ç¨çå ·ä½å®ç°ä»£ç ä¸è¦æ£æ¥åæ°åæ³æ§ï¼è¯¥æ£æ¥è¦æ±ææçåæ°å¿ é¡»ä½äºç¨æ·ç©ºé´ââå°åå¤äº0x0000000ââ0xC0000000ä¹é´ï¼æ以å¦ææ们ä»å æ ¸ä¼ éåæ°ï¼å°å大äº0xC0000000ï¼,é£ä¹æ£æ¥å°±ä¼æç»æ们çè°ç¨è¯·æ±ã为äºè§£å³è¿ä¸ªé®é¢ï¼æ们å¯ä»¥å©ç¨set_fså®æ¥ä¿®æ¹æ£æ¥çç¥ï¼ä½¿å¾å 许åæ°å°å为å æ ¸å°åãè¿æ ·å æ ¸å°±å¯ä»¥ç´æ¥ä½¿ç¨è¯¥ç³»ç»è°ç¨äºã
ä¾å¦ï¼å¨kmodéè¿è°ç¨execveæ¥æ§è¡modprobeç代ç åéè¦æset_fs(KERNEL_DS):
......
set_fs(KERNEL_DS);
/* Go, go, go... */
if (execve(program_path, argv, envp) < 0)
return -errno;
ä¸è¿°ä»£ç ä¸program_path 为"/sbin/modprobe"ï¼argv为{ modprobe_path, "-s", "-k", "--", (char*)module_name, NULL }ï¼envp为{ "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }ã
ä»å æ ¸ä¸æå¼æ件åæ ·ä½¿ç¨å¸¦åæ°çopenç³»ç»è°ç¨ï¼æéçä»æ¯è¦å è°ç¨set_fså®ã
(2) å©ç¨brkç³»ç»è°ç¨æ¥å¯¼åºå æ ¸æ°æ®
å æ ¸åç¨æ·ç©ºé´ä¼ éæ°æ®ä¸»è¦æ¯ç¨get_user(ptr)åput_user(datum,ptr)ä¾ç¨ãæ以å¨å¤§é¨åéè¦ä¼ éæ°æ®çç³»ç»è°ç¨ä¸é½å¯ä»¥æ¾å°å®ä»¬ç身影ãå¯æ¯ï¼å¦ææ们ä¸æ¯éè¿ç¨æ·ç¨åºåèµ·çç³»ç»è°ç¨ââä¹å°±æ¯è¯´ï¼æ²¡ææç¡®çæä¾ç¨æ·ç©ºé´å çç¼å²åºä½ç½®ââçæ åµä¸ï¼å¦ä½åç¨æ·ç©ºé´ä¼ éå æ ¸æ°æ®å¢ï¼
æ¾ç¶ï¼æ们ä¸è½åç´æ¥ä½¿ç¨put_user()äºï¼å 为æ们没æåæ³ç»å®æå®ç®çç¼å²åºãæ以ï¼æ们è¦åç¨brkç³»ç»è°ç¨åå½åè¿ç¨ç©ºé´ï¼brkç¨äºç»è¿ç¨è®¾ç½®å 空é´ç大å°ãæ¯ä¸ªè¿ç¨æ¥æä¸ä¸ªç¬ç«çå 空é´ï¼mallocçå¨æå ååé å½æ°å ¶å®å°±æ¯è¿ç¨çå 空é´ä¸è·åå åçãæ们å°å©ç¨brkå¨å½åè¿ç¨(current process)çå 空é´ä¸æ©å±ä¸åæ°ç临æ¶ç¼å²åºï¼åç¨put_userå°å æ ¸æ°æ®å¯¼åºå°è¿ä¸ªç¡®å®çç¨æ·ç©ºé´å»ã
è¿è®°å¾åææ们å¨å æ ¸ä¸è°ç¨ç¨æ·ç¨åºçè¿ç¨åï¼å¨é£éï¼æ们æä¸ä¸ªè·³è¿åæ°æ£æ¥çæä½ï¼ç°å¨æäºè¿ç§æ¹æ³ï¼å¯ä»¥å¦è¾è¹å¾äºï¼æ们å¨å½åè¿ç¨çå ä¸æ©å±ä¸å空é´ï¼æç³»ç»è°ç¨è¦ç¨å°çåæ°éè¿put_user()æ·è´å°æ°æ©å±å¾å°çç¨æ·ç©ºé´éï¼ç¶åå¨è°ç¨execveçæ¶å以è¿ä¸ªæ°å¼è¾ç©ºé´å°åä½ä¸ºåæ°ï¼äºæ¯ï¼åæ°æ£æ¥çéç¢ä¸å¤åå¨äºã
char * program_path = "/bin/ls" ;
/* æ¾å°å½åå 顶çä½ç½®*/
mmm=current->mm->brk;
/* ç¨brkå¨å 顶ä¸åæ©å±åºä¸å256åèçæ°ç¼å²åº*/
ret = brk(*(void)(mmm+256));
/* æexecveéè¦ç¨å°çåæ°æ·è´å°æ°ç¼å²åºä¸å»*/
put_user((void*)2,program_path,strlen(program_path)+1);
/* æåæ§è¡/bin/lsç¨åºï¼*/
execve((char*)(mmm+2));
/* æ¢å¤ç°åº*/
tmp = brk((void*)mmm);
è¿ç§æ¹æ³æ²¡æä¸è¬æ§ï¼å ·ä½ç说ï¼è¿ç§æ¹æ³æè´é¢æåºåï¼ï¼åªè½ä½ä¸ºä¸ç§æå·§ï¼ä½æ们ä¸é¾åç°ï¼å¦æä½ çæå æ ¸ç»æï¼å°±å¯ä»¥åå°å¾å¤ææ³ä¸å°çäºæ ï¼
(3) 使ç¨ä¿¡å·
ä¿¡å·å¨å æ ¸éçç¨é主è¦éä¸å¨éç¥ç¨æ·ç¨åºåºç°é大é误ï¼å¼ºè¡ææ»å½åè¿ç¨ï¼è¿æ¶å æ ¸éè¿åéSIGKILLä¿¡å·éç¥è¿ç¨ç»æ¢ï¼å æ ¸åéä¿¡å·ä½¿ç¨send_sign(pid,sig)ä¾ç¨ï¼å¯ä»¥çå°ä¿¡å·åéå¿ é¡»è¦äºå ç¥éè¿ç¨åºå·ï¼pidï¼ï¼æ以è¦æ³ä»å æ ¸ä¸éè¿åä¿¡å·çæ¹å¼å¼æ¥éç¥ç¨æ·è¿ç¨æ§è¡æ项任å¡ï¼é£ä¹å¿ é¡»äºå ç¥éç¨æ·è¿ç¨çè¿ç¨å·æå¯ãèå æ ¸è¿è¡æ¶æç´¢å°ç¹å®è¿ç¨çè¿ç¨å·æ¯ä¸ªè´¹äºçå·¥ä½ï¼å¯è½è¦éåæ´ä¸ªè¿ç¨æ§å¶åé¾è¡¨ãæ以ç¨ä¿¡å·éç¥ç¹å®ç¨æ·è¿ç¨çæ¹æ³å¾ç³ç³ï¼ä¸è¬å¨å æ ¸ä¸ä¼ä½¿ç¨ãå æ ¸ä¸ä½¿ç¨ä¿¡å·çæ å½¢åªåºç°å¨éç¥å½åè¿ç¨ï¼å¯ä»¥ä»currentåéä¸æ¹ä¾¿è·å¾pidï¼åæäºéç¨æä½ï¼å¦ç»æ¢æä½çãå æ¤å¯¹å æ ¸å¼åè 该æ¹æ³ç¨å¤ä¸å¤§ã
类似æ åµè¿ææ¶æ¯æä½ãè¿éä¸ç½å¦äºã
æ»ç» ç±ç¨æ·çº§ç¨åºä¸»å¨åèµ·çä¿¡æ¯äº¤äºï¼æ 论æ¯éç¨æ åçè°ç¨æ¹å¼è¿æ¯éè¿é©±å¨ç¨åºçé¢ï¼ä¸è¬é½è¦ç¨å°ç³»ç»è°ç¨ãèç±å æ ¸ä¸»å¨åèµ·ä¿¡æ¯äº¤äºçæ åµä¸å¤ãä¹æ²¡ææ åççé¢ï¼æä½å¤§ä¸æ¹ä¾¿ãæ以ä¸è¬æ åµä¸ï¼å°½å¯è½ç¨æ¬ææè¿°çåå ç§æ¹æ³è¿è¡ä¿¡æ¯äº¤äºãæ¯ç«ï¼å¨è®¾è®¡çæ ¹æºä¸ï¼ç¸å¯¹äºå®¢æ·çº§ç¨åºï¼å æ ¸å°±è¢«å®ä¹ä¸ºä¸ä¸ªè¢«å¨çæå¡æä¾è ãå æ¤ï¼æ们èªå·±çå¼åä¹åºè¯¥å°½ééµå¾ªè¿ç§è®¾è®¡ååã
温馨提示:答案为网友推荐,仅供参考