ÄúµÄλÖãºÊ×Ò³ > Îĵµ > ±à³Ì¼¼Êõ >
 ÎÄÕ·ÖÀà 

Unix±à³Ì/Ó¦ÓÃÎÊ´ðÖÐÎİæ


´´½¨£º2005-10-26 16:54:02
×÷ÕߣºUnlinux
À´×Ô: http://www.Unlinux.com

Ãû³Æ -- Unix±à³Ì/Ó¦ÓÃÎÊ´ðÖÐÎİæ
°æ±¾ -- 0.03 ( 2002-03-06 Íâ·¢°æ )
ά»¤ -- СËÄ <scz@nsfocus.com>
Ö÷Ò³ -- http://www.nsfocus.com
´´½¨ -- 2001-02-05 13:49
¸üР-- 2002-03-03 17:42

¸Ðл --

¸ÐлCÓïÑԵķ¢Ã÷Õß¡¢Unix²Ù×÷ϵͳµÄ·¢Ã÷Õß¡¢¸ÐлȫÊÀ½çC³ÌÐòÔ±´´ÔìµÄUnix¹²
Ïí´«Í³ÎÄ»¯È¦£¬ËýÊÇÈç´ËÇ¿´ó¡¢³äÂú½û¼É¡¢¶øÓÖ÷ÈÁ¦ËÄÉä¡£

¸ÐлÎÒµÄÅóÓÑ£¬deepin <deepin@nsfocus.com>£¬ÔÚÕû¸öά»¤¹ý³ÌÖеÄÖ§³Ö¡¢°ï
ÖúºÍ¹ÄÀø¡£¸ÐлÎÒËùÓеÄNSFocus°²È«Ñо¿Ð¡×éµÄÅóÓÑ(tt¡¢yuange¡¢security@
nsfocus.com ... ...)£¬ÊÇËûÃÇÈÝÈÌÎÒÔÚÕâ¸ö·ÇÕýÒµÉÏ»¨·Ñʱ¼ä¡£

Ö÷ÒªÖ§³ÖÈËÔ±(×Öĸ˳Ðò) --

Andrew Gierth <andrew@erlenstar.demon.co.uk>
backend <backend@nsfocus.com>
Casper Dik <Casper.Dik@Holland.Sun.COM>
deepin <deepin@nsfocus.com>
scz <scz@nsfocus.com>
suxm <suxm@gnuchina.org>
tt <warning3@nsfocus.com>

¼ò½é --

Õâ·ÝÎĵµ²»ÊÇFAQ(Frequently Answered Question)£¬²»ÉÙÎÊÌâÊôÓÚFUQ(Freque-
ntly Unanswered Question)¡£»»¾ä»°Ëµ£¬²»Ò»¶¨ÊÇ×î³£¼ûµÄ±à³Ì¡¢Ó¦ÓÃÎʴ𣬺ܿÉ
ÄÜÆäÖеĴð°¸ÉÐÊÇÒ»¸ö¹¹Ë¼£¬»¹Ã»ÓгÉΪÏÖʵ£¬ÓÖ»òÕ߸ù±¾ÊǸö´íÎóµÄ˼Ïë»ð»¨¡£µ«
ÊÇ£¬ËýµÄÈ·ÔÚÊÔͼ»Ø´ðһЩºÜÓÐÒâÒåµÄÎÊÌ⣬Èøü¶àµÄUnix/C³ÌÐòÔ±¡¢ÏµÍ³¹ÜÀíÔ±¹²
Ïí±Ë´ËµÄÖǻۣ¬ÄÇÊÇÈýÊ®ÄêǰÎÞÊýǰ±²¾«Ó¢×öµ½¹ýµÄ£¬Ò²ÊÇÎÒÃÇÕýÊÔͼ×öµ½µÄ¡£

Q -- Question
A -- Answer
D -- Discuss

ÉùÃ÷ --

ÓÀ¾Ã¾Ü¾øÈκÎÉÌÒµÐÔÖʵÄ×ªÔØ¡¢ÕªÂ¼¡¢ÒýÓá£ÔÚ²»¶ÔËùÓÐÎÄ×Ö×öÈκÎÐÞÕýµÄǰÌá
Ï£¬ÔÊÐíÒ»ÇнÌÓýÐÔÖʵÄ×ªÔØ¡¢ÕªÂ¼¡¢ÒýÓã¬ÎÞÐëÌáǰ֪»áά»¤Õß(¾ÍÊÇme£¬faint)¡£
Ò»µ©³öÏÖÐèÒªÐÞÕýÎÄ×ÖµÄÇé¿ö£¬Ö»ÄÜͨ¹ýά»¤ÕßÐÞÕý¡£Î¬»¤Õß»áÔÚÏÂÒ»´Î°æ±¾Éý¼¶¹ý
³ÌÖÐÕýʽÔö¼ÓÕâÖÖÐÞÕý£¬±£ÁôÌṩÐÞÕýÕßÓ¦ÓÐÐÅÏ¢¡£Í¬Ê±Òâζ×ÅÌṩÐÞÕýÕßÓÀ¾Ã×ÔÔ¸
·ÅÆúÉÌÒµÐÔÖʵÄËùÓÐÈ¨Òæ¡£²»½ÓÊÜÕâÖÖÌõ¼þµÄÌṩÐÞÕýÕߣ¬Îñ±ØÌáǰ֪»áά»¤Õߣ¬´Ë
ÀàÐÞÕý½«²»³öÏÖÔÚÏÂÒ»´Î°æ±¾Éý¼¶ÖС£

ÎÄÖÐËù¸½¸÷ÖÖÔ´´úÂ룬ÔÚÑϸñÒâÒåÉÏ¿ÉÄÜ´æÔÚ°æÈ¨ÎÊÌ⣬ËùÒÔÊÂʵÉÏÕâ·ÝÎĵµ´ø
ÓÐ"°ëµØÏÂ"ÐÔÖÊ£¬Ê¹ÓÃÕßÎñ±Ø×Ô¼ºÐ¡ÐľíÈë´ËÀà¾À·×¡£

ÎÄÖм¼Êõ¿ÉÄÜÉæ¼°Î´¹«¿ªµÄ¡¢Î´Îĵµ»¯µÄ¡¢·Ç¹æ·¶µÄ±à³Ì¡¢Ó¦Óýӿڣ¬ÎĵµÌṩ
µÄÖØÔÚ˼Ï룬¶ø²»±£Ö¤ÊÇÕýÈ·¡¢¸ßЧ¡¢Î¨Ò»µÄ½â´ð¡£

ά»¤Õß²»¶ÔÎÄÖÐÈκμ¼ÊõÒýÆðµÄÈκÎÔÖÄÑÐÔºó¹û¸ºÈκη¨ÂÉÉϵġ¢µÀÒåÉϵÄÔðÈΡ£

Ok, Let's go.

¸¨Öú˵Ã÷ --

2002-03-06 12:14

¸¨Öú˵Ã÷Ö»ÔÚ"Íâ·¢°æ"ÖдæÔÚ£¬ÉÔ΢½âÊÍһϡ£

һֱûÓе¥¶À³öÒ»·ÝÍêÕûµÄ£¬Ô­ÒòºÜ¶à¡£Èç¹û¸éÔÚ1995/1996/1997ʱµÄCERNET£¬
ÕâЩԭÒò¶¼²»³ÉΪԭÒò£¬ÏÖÔÚ³ÉΪԭÒò¡£²»Ïë¶à˵Ϊʲô£¬Ã÷°×µÄ×ÔÈ»Ã÷°×£¬²»
Ã÷°×µÄµ±ÎҰ׳պÃÁË£¬·´Õý±ðÎÊÎÒ¡£

³öÓÚ"ÉùÃ÷"ÖеÄijЩÀíÓÉ£¬²»ÄÜÔÚµ¥·ÝÍêÕûÎĵµÖи½´ø¿ÉÄÜ»á´øÀ´Âé·³µÄÎÄ×Ö¡¢
´úÂ룬±ÈÈçSolaris libproc±à³Ì½Ó¿Ú¡£µ«ÊÇ£¬ÔÚɢƪÖÐÄãÄÜÕÒµ½ËüÃÇ¡£Èç¹ûÄã
Ô¸Ò⣬¿ÉÒÔ×Ô¼º½«É¢ÆªÊջص½¸ÃÎĵµÖУ¬Õ⽫ÓëÎÒÎ޹ء£Ò»ÇÐË÷Òª²Ðȱ²¿·ÖµÄÓÊ
¼þ¸Ç²»»Ø¸´¡£

±¾·ÝÎĵµµÄ¾ø´ó¶àÊýÄÚÈÝÔÚ"Öйú½ÌÓý¿ÆÑÐÍø»ªÄϵØÇøÍøÂçÖÐÐÄBBS"(bbs.gznet.
edu.cn)µÄSolaris°æ·¢²¼¹ýÁË£¬°üÀ¨ÏÂÃæ´¦ÀíµôµÄĿ¼ÁÐ±í¡£ÊǸðæÇ°°æÖ÷CPU
ʦÐÖµ±ÄêµÄ·ç·¶´ÙʹÎÒ¿ªÊ¼ÕûÀíÕâ·ÝÎĵµµÄ£¬µ±»¹ÎôÈÕÖ¸½ÌÖ®ÇéÒê¡£

¸Ã·ÝÎĵµ"ÔÊÐíÒ»ÇнÌÓýÐÔÖʵÄ×ÔÓÉ×ªÔØ¡¢ÕªÂ¼¡¢ÒýÓã¬ÎÞÐëÌáǰ֪»áά»¤Õß"¡£
ÎÒÒ²Ö»ÊÇÒåÎñά»¤Ò»Ï£¬²»¶Ô±¾ÎĵµÓµÓÐÈκÎÈ¨Òæ¡£Èç¹û²»ÐÒDZÔÚÓµÓжø¼ṳ̀ÁË
ijÖÖÐÅÄÔÚÄã¿´µ½¸Ã¸¨Öú˵Ã÷µÄͬʱ£¬ÎÒ½«×Ô¶¯·ÅÆúÕâÖÖDZÔÚ¿ÉÄÜÓµÓеÄÈ¨Òæ¡£
ͬʱÒâζ×ÅÒ»ÇÐÒò±¾Îĵµ´øÀ´µÄÂé·³£¬½«ÓÉÄã¸öÈ˳е£¡£

¼ÈÈ»À´×ÔUnix¹²Ïí´«Í³ÎÄ»¯È¦£¬¾ÍÈÃËü³¹µ×»Øµ½Unix¹²Ïí´«Í³ÎÄ»¯È¦ÖÐÈ¥°É¡£

»¶Ó­Ò»Çн¨ÉèÐԵġ¢·ÇË÷ÒªÐÔÖʵÄEmail½»Á÷¡£

--------------------------------------------------------------------------

Ŀ¼

0. Unix/C´«ÆæÎÊÌâ
0.1 Dennis Ritchie ºÍ Ken Thompson
0.2 W. Richard Stevens Ö®ËÀ

1. ϵͳ¹ÜÀíÅäÖÃÎÊÌâ
1.1 ÈçºÎ¸øSUN¹¤×÷Õ¾Ôö¼ÓeepromÓ²¼þ¿ÚÁî±£»¤
1.2 ÈçºÎÔö¼Ó½»»»¿Õ¼ä
1.3 ΪʲôÎÒ²»ÄÜÔÚ/homeĿ¼Ï´´½¨×ÓĿ¼
1.4 ÈçºÎ¸Ä±äһ̨Ö÷»úµÄlocale
1.5 Solaris 7×Ô¶¯×¢Ïú
1.6 Ò»¸öĿ¼ӵÓÐsetgidÉèÖã¬ÔõôÀí½â
1.7 ·ÇSun ConsoleÉÏÓÐÎ޵ȼÛStop-AµÄ°´¼ü
1.8 ÈçºÎÈÃÒ»¸öÓû§Ö»ÄÜftp¶øÎÞ·¨telnet
1.9
1.10 ΪʲôSun¹¤×÷Õ¾·ÇÒªÊäÈëbootÃüÁî²ÅÄÜÆô¶¯
1.11 ÈçºÎÈÃSolarisʶ±ðÐÂÔö¼ÓµÄÓ²¼þ
1.12

2. ¶ÑÕ»Ïà¹ØÎÊÌâ
2.1 ÈçºÎÀí½âpstackµÄÊä³öÐÅÏ¢
2.2
2.3 SolarisÖÐÈçºÎ»ñȡһ¸öC³ÌÐòµÄµ÷ÓÃÕ»»ØËÝ
2.4 ÈçºÎ±à³Ì»ñȡջµ×µØÖ·
2.5 ÈçºÎµÃµ½Ò»¸öÔËÐÐÖнø³ÌµÄÄÚ´æÓ³Ïñ
2.6 µ÷ÊÔÆ÷ÈçºÎ¹¤×÷µÄ
2.7 x86/LinuxÉÏÈçºÎ´¦ÀíSIGFPEÐźÅ

3. -lelf¡¢-lkvm¡¢-lkstatÏà¹ØÎÊÌâ
3.1 ÈçºÎÅжϿÉÖ´ÐÐÎļþÊÇ·ñЯ´øÁ˵÷ÊÔÐÅÏ¢
3.2 mprotectÈçºÎÓÃ
3.3 mmapÈçºÎÓÃ
3.4 getrusageÈçºÎÓÃ
3.5 setitimerÈçºÎÓÃ

4. ϵͳ×ÊÔ´Ïà¹ØÎÊÌâ
4.1 Ö÷Á÷Unix²Ù×÷ϵͳÉÏÈçºÎ±à³Ì»ñÈ¡½ø³ÌµÄÄÚ´æ¡¢CPUÀûÓÃ×´¿ö
4.2 SolarisÏÂÈçºÎ»ñÖªCPUËÙÂÊ
4.3 ÈçºÎ±à³Ì»ñÈ¡Solarisϵͳµ±Ç°ÄÚ´æ´óС

5. ¿éÉ豸Ïà¹ØÎÊÌâ
5.1 CDROMÉ豸¾¿¾¹ÔÚÄÄÀï
5.2 ÈçºÎµ¯³ö¹âÇý
5.3 ÈçºÎÀûÓ󬼶¿é½øÐлָ´¹¤×÷
5.4 Solaris Root¿ÚÁîÍü¼ÇÁË
5.5 ÈçºÎʹÓÃfmthard
5.6 ÈçºÎ´Ó¹âÅָ̻´Solaris 7µÄÒýµ¼ÉÈÇø
5.7 SolarisÖ§³ÖÀàËÆÎ¢Èíautorun.infÎļþµÄ¹¦ÄÜÂð
5.8 ÈçºÎÐÞ¸Ä/dev/nullµÄÊôÐÔ
5.9
5.10 ÈçºÎ×Ô¼ºÖÆ×÷SolarisÆô¶¯ÈíÅÌ
5.11 x86/SolarisÈçºÎ·ÃÎÊFAT32·ÖÇø

6. /etc/system¿Éµ÷×ÊÔ´ÏÞÖÆ
6.1 SolarisÏÂÈçºÎÏÞÖÆÃ¿¸öÓû§¿ÉÓµÓеÄ×î´ó½ø³ÌÊý
6.2 ÈçºÎÅäÖÃϵͳʹ֧֮³Ö¸ü¶àµÄαÖÕ¶Ë
6.3 ÈçºÎÔö¼Óÿ¸ö½ø³Ì¿É´ò¿ªÎļþ¾ä±úÊý
6.4
6.5 ×öÁËsetuid()ÕâÀàµ÷ÓõijÌÐòÈçºÎ²úÉúcore dump
6.6 ÏûÏ¢¶ÓÁе÷Õû

7. DNSÏà¹ØÎÊÌâ
7.1 ÈçºÎ½øÐÐDNSÇø´«Êä
7.2 ÈçºÎ»ñ֪ȨÍþÃû×Ö·þÎñÆ÷
7.3 ÈçºÎÅäÖÃDNSµÄίÍнâÎö
7.4 ÈçºÎ»ñÖªBINDµÄ°æ±¾ºÅ
7.5 Solaris/FreeBSD/LinuxÈçºÎÖ¸¶¨ÓòÃû½âÎöµÄ˳Ðò

8. SolarisÄں˱à³ÌÏà¹ØÎÊÌâ
8.1 SolarisÄÚºËÄ£¿éÖÐÈçºÎgetcwd
8.2
8.3 ÈçºÎ±ÜÃâÒ»¸öÌ×½Ó×Ö½øÈëTIME_WAIT״̬
8.4 ½á¹¹ÔÚÓÅ»¯±àÒëÖÐµÄ¶ÔÆëÎÊÌâ
8.5
8.6 ÈçºÎµÃµ½·Ç¾Ö²¿±äÁ¿Áбí
8.7
8.8 ÈçºÎµ¥¶À»ñµÃSolaris±àÒë»·¾³
8.9 ÈçºÎ»ñÈ¡SolarisÄں˿ɵ÷²ÎÊýÁбí
8.10
8.11 ÈçºÎÒ³±ß½ç¶ÔÆëʽ·ÖÅäÄÚ´æ
8.12
8.13 compile()ºÍstep()ÔõôÓÃ
8.14
8.15
8.16
8.17

9. ͼÐνçÃæÏà¹ØÎÊÌâ
9.1 ÈçºÎ±ÜÃâ½øÈëSolarisµÄͼÐνçÃæ
9.2 Solaris 7µÄËøÆÁ
9.3 ÈçºÎµ÷Õû¼üÅÌÖØ¸´ÂÊ
9.4 ÈçºÎ°Îµô¼üÅ̼ÌÐøÔËÐÐSolaris
9.5 SolarisÏÂÈçºÎÉèÖÃÏÔ¿¨·Ö±æÂÊ
9.6 SolarisÏÂÈçºÎÉèÖÃÏÔʾˢÐÂÂÊ

10. Íø¿¨Ïà¹ØÎÊÌâ
10.1 ÈçºÎÔÚ³ÌÐòÖлñÈ¡±¾»úMACµØÖ·
10.2 ÈçºÎÔÚSun¹¤×÷Õ¾Éϰ²×°3¿éÍø¿¨
10.3 ÈçºÎÔÚSolaris x86Éϰ²×°Íø¿¨Çý¶¯
10.4 Solaris µ¥Íø¿¨¶àIP(ÒÔÌ«Íø¿¨±ðÃû)
10.5 ÈçºÎÐÞ¸ÄÖ÷»úÃû(hostname)
10.6 SPARC/Solaris 2.5/2.6/7/8ÏÂÈçºÎÉèÖÃÍø¿¨100Mbȫ˫¹¤
10.7 Unix/Linux/BSDÈçºÎ¶Ô¿¹ARPÆÛÆ­¹¥»÷
10.8
10.9
10.10
10.11 x86/SolarisÈçºÎÇ¿ÖÆÉè¶¨Íø¿¨ËÙÂÊ
10.12 Solaris/FreeBSD/LinuxÈçºÎÈ·¶¨Íø¿¨Capability/Speed
10.13
10.14 tracerouteÊÇÔõôʵÏÖµÄ

11. packageÏà¹ØÎÊÌâ
11.1 SolarisÏÂÈçºÎ½«¶þ½øÖÆÈí¼þ°ü°²×°µ½Ö¸¶¨Ä¿±ê·¾¶ÏÂ
11.2 SolarisÏÂÈçºÎ×Ô¼º¶¨Öƶþ½øÖư²×°°ü
11.3 ÈçºÎ»Ö¸´/usr/bin/suµÄȱʡ°²×°ÊôÐÔ
11.4 ÈçºÎ»ñÖªÖ¸¶¨°üÓëÆäËû°üÖ®¼äµÄÒÀÀµ¹ØÏµ
11.5 LinuxÖÐÈçºÎÖªµÀifconfigÊôÓÚÄĸö°ü
11.6 SolarisÏÂÈçºÎÖªµÀij°üÖÐÓÐÄÄЩÎļþ

12. ÈÕÖ¾Ïà¹ØÎÊÌâ
12.1
12.2
12.3 ÈçºÎ¹Ø±ÕcronµÄÈÕÖ¾
12.4

13. ½ø³ÌÏà¹ØÎÊÌâ
13.1 ÈçºÎ¸ù¾Ý½ø³ÌÃû»ñµÃPID
13.2
13.3
13.4 Solaris 7/8ÏÂpsÊä³öÖеÄÎʺÅ
13.5
13.6
13.7 ¸ø¶¨Ò»¸öPID£¬ÈçºÎÖªµÀËü¶ÔÓ¦Ò»¸öÔËÐÐÖеĽø³Ì
13.8 Unix/Linux±à³ÌÖÐËùν"½©Ê¬½ø³Ì"ָʲô
13.9 x86/FreeBSD 4.3-RELEASEµÄptrace(2)ÊÖ²áÒ³
13.10 SolarisÏÂÈçºÎÖªµÀÄĸö½ø³ÌʹÓÃÁËÄĸö¶Ë¿Ú
13.11 x86/FreeBSDÈçºÎ¿ìËÙ»ñȡָ¶¨Óû§ÓµÓеĽø³ÌÊý

14. һЩС¹¤¾ßµÄʹÓÃ
14.1
14.2
14.3 Ö»ÔÚ±¾µØÎļþϵͳÉϲéÕÒ
14.4

15. 32-bit/64-bitÏà¹ØÎÊÌâ
15.1 SolarisÏÂÈçºÎʶ±ðµ±Ç°Äں˰汾
15.2 ÈçºÎÆô¶¯Solaris 32-bit/64-bitÄÚºË
15.3 gccÖ§³Ö64-bit±àÒëÂð
15.4 SolarisÆô¶¯Ê±ÄÚºËÎļþÕÒ²»µ½ÁË
15.5 64-bitÇý¶¯³ÌÐòÎÞ·¨ÔÚ8ϹØÁª£¬µ«ÔÚ7Ϲ¤×÷Õý³£

16. ¿âÏà¹ØÎÊÌâ
16.1 ÔÚSolaris 7ϱàÐ´ÍøÂç³ÌÐòÐèÒªÁ´½ÓÄÄЩ¿â
16.2
16.3 Á´½Ó¹ý³ÌÖпâµÄ˳Ðò
16.4
16.5
16.6 /usr/lib/ld.so.1Ë𻵻ò¶ªÊ§
16.7
16.8
16.9 Solaris 8ÏÂÈçºÎÅäÖÃÔËÐÐʱÁ´½Ó»·¾³

17. Îļþ²é¿´ÎÊÌâ
17.1 ÈçºÎÖ±½Ó²é¿´manÎļþ
17.2 .texÎļþÔõô¶Á
17.3 SolarisÏÂÔõô¿´.psÎļþ

18. ²¹¶¡Ïà¹ØÎÊÌâ
18.1 ÈçºÎ¸ù¾Ý²¹¶¡ºÅ´ÓSunÖ÷Õ¾ÏÂÔØ²¹¶¡
18.2
18.3
18.4 ¸øSolaris 2.6°²×°ÍƼö²¹¶¡¼¯
18.5 ÒÑÖª²¹¶¡ºÅ£¬ÈçºÎ×î¿ìÅжÏϵͳÖÐÊÇ·ñÒѾ­°²×°¸Ã²¹¶¡
18.6 ÈçºÎ°²×°²¹¶¡

19. ÖÕ¶ËÏà¹ØÎÊÌâ
19.1 ÈçºÎʹBackspace¼ü×öɾ³ý²Ù×÷£¬¶ø²»ÊÇÏÔʾ^H
19.2
19.3 ÈçºÎÇå¿ÕstdinµÄ»º³å
19.4 Linux ConsoleÏÂÒ»°´´í¼ü¾Í½Ð£¬Ôõô¹Ø

20. shell scriptÎÊÌâ
20.1 ÈçºÎ»ñȡһ¸ö×Ö·û´®µÄ³¤¶È
20.2 ¶Á³¬Ê±×Ô¶¯Ê¹ÓÃȱʡֵ
20.3
20.4 BASHÖÐÈçºÎµÃµ½Ò»¸ö×Ö·û´®µÄ×Ó´®
20.5
20.6
20.7
20.8 ʹÓÃtrÃüÁî¼ÓÃÜÎļþ
20.9 ÓÐÄÄЩÃüÁîÓÃÓÚ²éÕÒ¶¨Î»
20.10
20.11 ÈçºÎ½«´óдÎļþÃûת»»ÎªÐ¡Ð´ÎļþÃû

21. FreeBSDÏà¹ØÎÊÌâ
21.1
21.2 ÈçºÎ½«Ò»¸ö512×Ö½ÚµÄÎļþдÈëÖ÷Òýµ¼ÉÈÇø
21.3
21.4
21.5
21.6 x86/FreeBSD 4.xϲ»ÄÜcp¸²¸Ç/kernel
21.7 x86/FreeBSDÏÂÈçºÎÉèÖ÷ÓÉ
21.8
21.9 ʲôÊÇlocale
21.10 ÓÃcvsup°²×°vim
21.11 FreeBSDÏÂviÊäÈëÖÐÎÄ»áÏÔʾx??x??
21.12
21.13
21.14
21.15 UDMA ICRC errorÊÇʲôÒâ˼
21.16 Limiting closed port RST responseʲôÒâ˼
21.17
21.18
21.19
21.20

22. Linux Kernel Programming
22.1 Ö±½Ó·ÃÎÊÄÚ´æ[ÏÔ´æ]µØÖ·
22.2

23. LinuxÏà¹ØÎÊÌâ
23.1

--------------------------------------------------------------------------

0. Unix/C´«ÆæÎÊÌâ

0.1 Dennis Ritchie ºÍ Ken Thompson

Q: ÎÒÏëÖªµÀËûÃÇ£¬ÎªÊ²Ã´´ó¼Ò²»¶ÏÌáµ½ÕâÁ½¸öÃû×Ö£¿

A: All of Unix Programmers

ÎÒÃÇÒ²ÏëÖªµÀ£¬:-P

1969ÄêDennis Ritchie ºÍ Ken ThompsonÔÚ±´¶ûʵÑéÊÒ´´ÔìÐԵط¢Ã÷ÁËUnix²Ù×÷ϵͳ£¬
Ϊ´Ë1983ÄêËûÃÇ»ñµÃÁËͼÁé½±¡£

¾¡¹ÜRitchieÊÇC³ÌÐòÉè¼ÆÓïÑԵķ¢Ã÷Õߣ¬µ«ÊÇËû×îϲ»¶µÄ±à³ÌÓïÑÔÊÇAlef¡£¶ø
ThompsonÊÇÒ»ÃûÒµÓà·ÉÐÐÔ±£¬Ôøµ½ÄªË¹¿Æ¼ÝÊ»¹ýÃ׸ñ-29¡£

»¶Ó­·ÃÎÊ

http://cm.bell-labs.com/who/dmr/
http://cm.bell-labs.com/who/ken/

0.2 W. Richard Stevens Ö®ËÀ

Q: David Johns <odin@gte.net>

ÎÒÊÇËûµÄ³ç°ÝÕߣ¬ÓÃwww.google.comËÑË÷ËûµÄ¸¼¸æ£¬µ«Õâ·Ý¸¼¸æÃ»ÓÐÌá¼°ËÀÒò£¬ÓÐÈË
ÖªµÀÂð£¿

ÕæµØ½ö½öÊÇÓ¢ÄêÔçÊÅÂð£¿

A: Nithyanandham <m.nithyanandham@blr.spcnl.co.in>

ËûËÀÓÚ1999/09/01£¬¼ÒÈ˲»ÏëÈñðÈËÖªµÀËÀÒò¡£¸¼¸æÎ»ÓÚ

http://www.azstarnet.com/clips/richard_stevens.html

A: joe broz <jbroz@transarc.ibm.com>

ËÆºõÊÇÒ»³¡ÅÊÑÒʹʣ¬»òÕß»¬Ñ©Ê¹ʣ¬ÎÒ²»È·ÈÏ¡£

1. ϵͳ¹ÜÀíÅäÖÃÎÊÌâ

1.1 ÈçºÎ¸øSUN¹¤×÷Õ¾Ôö¼ÓeepromÓ²¼þ¿ÚÁî±£»¤

A: scz <scz@nsfocus.com>

man -s 1M eepromÁ˽âϸ½Ú£¬ÒªÇóµ±Ç°ÊÇrootÉí·Ý

# /usr/sbin/eeprom (ÏÔʾµ±Ç°eepromÅäÖÃ)

# /usr/sbin/eeprom security-mode=full ( ¿ÉÑ¡µÄÓÐcommand, full, none)

´Ëʱ½øÈë½»»¥Ê½ÉèÖÿÚÁî¹ý³Ì£¬×ܹ²ÊäÈëÁ½´Î£¬Èç¹ûÁ½´Î¿ÚÁîÊäÈë²»Ò»Ö£¬Ôò±¾´ÎÉè
ÖÃ×÷·Ï¡£³É¹¦ÉèÖÃÖ®ºó³ýÁËgoÃüÁîÖ®ÍâµÄÆäËûok״̬ÏÂÃüÁî¾ùÐèÒª¿ÚÁ°üÀ¨bootÃü
Áî¡£

ÉèÖóÉcommandʱ£¬Í¬Ñù½øÈë½»»¥Ê½¿ÚÁîÊäÈë¹ý³Ì¡£´Ëʱ£¬³ýÁËbootºÍgoÃüÁîÖ®ÍâµÄ
ÆäËûok״̬ÏÂÃüÁî¾ùÐèÒª¿ÚÁî¡£×¢Ò⣬Èç¹û½ö½öÊäÈëbootÃüÁ²»ÐèÒª¿ÚÁһµ©
bootÃüÁîºóÃæ´øÁ˲ÎÊý£¬±ÈÈçboot cdrom -s£¬Í¬ÑùÐèÒªÊäÈë¿ÚÁî¡£

Èç¹ûÉèÖóÉnone(ȱʡÉèÖÃ)£¬±íʾȥµôÕâÖÖ¿ÚÁî±£»¤¡£

# /usr/sbin/eeprom security-password= (µÈºÅºóÃæÎÞÆäËû×Ö·û£¬Ö±½Ó»Ø³µ)

Èç¹ûÏë¸Ä±äÇ°ÃæÉèÖõĿÚÁÓÃÕâÌõÃüÁͬÑùÊǽ»»¥Ê½ÊäÈë¹ý³Ì¡£

# /usr/sbin/eeprom security-#badlogins=3 (ȱʡÊÇ0)

ÉèÖÿÚÁîÊäÈë³¢ÊÔ´ÎÊý¡£

¾¯¸æ£ºÈç¹ûÉèÖÃÁËeepromÓ²¼þ±£»¤¿ÚÁî¶øÓÖÍü¼Ç£¬»á´øÀ´ºÜ¶àÂé·³£¬Îñ±ØÐ¡ÐÄ¡£

Ò»¸ö¿ÉÐеÄÉèÖð취ÊÇ£¬°²È«Ä£Ê½ÉèÖõ½command¶ø²»ÊÇfull£¬ÕâÑùÖÁÉÙ¿ÉÒÔÕý³£Æô
¶¯ÏµÍ³¡£ÓÚÊÇÖ»Òª¼ÇµÃroot¿ÚÁî»òÕß»¹ÓÐÆäËû»ú»á»ñµÃrootȨÏÞ(»º³åÇøÒç³ö£¿)£¬¾Í
¿ÉÒÔͨ¹ýÉèÖð²È«Ä£Ê½Îªnone¶øÍì¾È»ØÀ´¡£

µ«ÊÇÈç¹ûÉèÖóÉfullģʽȴÍü¼ÇÁËeeprom¿ÚÁÎÒÏëÊ×ÏÈÓ¦¸Ã´òµç»°¸øSUNµÄ¼¼ÊõÖ§
³Ö¡£Èç¹û³öÓÚijÖÖÀíÓÉÄã²»ÏëÕâÑù×ö£¬ÎÒ²»È·ÈÏeepromÊÇ·ñ¿ÉÒÔÈȲå°Î£¬ÏÈÓÃÒ»¸öÎÞ
¿ÚÁî±£»¤µÄeepromÆô¶¯ÏµÍ³£¬È»ºóÈȲå°Î»»ÉÏÄǸöÓпÚÁî±£»¤µÄeeprom£¬È»ºóÓÃroot
ȨÏÞĨȥeeprom¿ÚÁî¡£

1.2 ÈçºÎÔö¼Ó½»»»¿Õ¼ä

A: WT <wt@server.domain.top>

ÄãÎÞ·¨¸Ä±ä·ÖÇø´óС£¬µ«ÊÇ¿ÉÒÔÔö¼Ó/ɾ³ý½»»»Îļþ£¬Ð§¹ûÀàËÆ½»»»·ÖÇø¡£ÏÂÁÐÃüÁî
ÔÚ¸ùĿ¼Ï´´½¨Ò»¸ö500MBµÄ½»»»Îļþ£¬ÃûΪswapfile

# mkfile 500m /swapfile

ÏÂÁÐÃüÁʹ֮ÉúЧ

# swap -a /swapfile

ÏÖÔÚÄãÓÐÁ˶îÍâµÄ500MB½»»»¿Õ¼ä£¬ÎªÁËÿ´ÎÖØÆôºóÒÀ¾ÉÓÐЧ£¬±à¼­/etc/vfstabÎļþ
Ôö¼ÓÈçÏÂÐÐ

/swapfile - - swap - no -

# swap -l

ÕâÀï"-l"Òâζ×Å"list"£¬ÏÔʾËùÓн»»»¿Õ¼ä¡£×ÐϸÔĶÁ"swap"ºÍ"mkfile"µÄÊÖ²áÒ³¡£

1.3 ΪʲôÎÒ²»ÄÜÔÚ/homeĿ¼Ï´´½¨×ÓĿ¼

Q: Solaris 7Ï£¬rootÉí·Ý£¬µ±ÎÒÊÔͼÔÚ/homeĿ¼Ï´´½¨×ÓĿ¼ʱ£¬ÏµÍ³¾Ü¾ø£¬Îª
ʲô£¿

A: mohansundarraj

Èç¹û/etc/rc2.d/S74autofs½Å±¾ÖÐautomount(1M)ÊØ»¤½ø³ÌÒѾ­mountÁË/home£¬¾ÍÊÇ
ÕâÖÖÏÖÏ󣬶øÕ⻹ÊÇȱʡ°²×°ºóµÄÇéÐΡ£¿ÉÒÔ

# /etc/init.d/autofs stop
# umount /home

È»ºóÄã¾Í¿ÉÒÔÓÃrootÉí·ÝÔÚ/homeÏ´´½¨×ÓĿ¼£¬Ôö¼ÓÎļþÁË¡£ÎªÁËÓÀ¾ÃÈ¡Ïûautofs
ÌØÐÔ£¬¿ÉÒÔ½«/etc/rc2.d/S74autofs½Å±¾¸ÄÃû£¬²¢×¢Ê͵ô/etc/auto_home¡¢
/etc/auto_masterÁ½¸öÎļþÖеÄÈë¿Úµã¡£

SPARC/SolarisµÄȱʡÓû§Ö÷Ŀ¼ÊÇ/export/home£¬¶ø²»ÊÇ/home¡£

1.4 ÈçºÎ¸Ä±äһ̨Ö÷»úµÄlocale

Q: һ̨SPARC/Solaris 8ÔËÐÐÔÚUS locale»·¾³ÖУ¬ÏÖÔÚÎÒÃÇÏëÈÃËüÔËÐÐÔÚ
IE(Ireland) locale»·¾³ÖУ¬ÒÔ±ã¿ÉÒÔʹÓÃÅ·ÖÞÈÕÆÚ¸ñʽ£¬Ôõô°ì£¿

A: Sharad Ramachandran <estancio@hotmail.com>

ÔËÐÐsys-unconfig£¬ÔÚ´Ë֮ǰÇëman -s 1M sys-unconfig£¬:-)

A: chad schrock <chad@radix.net>

Ìì°¡£¬ÎªÁËÅÄËÀÒ»Ö»²ÔÓ¬£¬ÄãÒªÒý±¬Ô­×Óµ¯Âð£¿

Ö»ÐèÒª×öÈçϲÙ×÷£¬ÔÚÄãµÄ.cshrc/.profile/.bashrcµÈÆô¶¯½Å±¾ÖÐÉèÖÃ$LANG»·¾³±ä
Á¿µÄֵΪen_UK£¬×¢Ïú£¬ÖØÐµÇ¼¼´¿É¡£ÎªÁËʹÕâ¸öÉèÖÃÈ«¾ÖÓÐЧ£¬ÐÞ¸Ä
/etc/default/initÎļþ£¬LANG=en_UK£¬ÖØÆô¶¯¡£

--------------------------------------------------------------------------
# @(#)init.dfl 1.2 92/11/26
#
# This file is /etc/default/init. /etc/TIMEZONE is a symlink to this file.
# This file looks like a shell script, but it is not. To maintain
# compatibility with old versions of /etc/TIMEZONE, some shell constructs
# (i.e., export commands) are allowed in this file, but are ignored.
#
# Lines of this file should be of the form VAR=value, where VAR is one of
# TZ, LANG, or any of the LC_* environment variables.
#
TZ=GMT+8
LANG=zh.GBK
--------------------------------------------------------------------------

²Î¿´locale(1)ºÍlocale(5)£¬Á˽â¸ü¶à¹ØÓÚlocaleµÄÐÅÏ¢¡£ÔËÐÐ"locale -a"£¬²é¿´
µ±Ç°ÏµÍ³ËùÖ§³ÖµÄËùÓÐlocale¡£

A: Sun Microsystems 2001-06-12

ÓÐÈýÖÖ·½Ê½¸Ä±älocale¡£Ê×ÏÈÓÃ"locale -a"ÃüÁîÈ·ÈÏϵͳÖÐÒѰ²×°µÄlocale

1) ´ÓCDEµÇ¼ÆÁÄ»ÉÏÐÞ¸Älocale

Ñ¡Ôñ options -> languages -> choose the new locale

×¢Ò⣬Èç¹ûµÇ¼Óû§µÄ³õʼ»¯ÎļþÖÐÓв»Í¬µÄlocaleÉèÖ㬽«ÓÅÏÈÓÚϵͳȫ¾Ölocale
ÉèÖá£

2) ÁÙʱÉèÖÃlocale(shellÏà¹ØµÄ)

ksh : LANG=<locale>
sh : LANG=<locale>
export LANG
csh : setenv LANG <locale>
bash: export LANG=en_US(zh.GBK)

3) vi /etc/default/init

Ôö¼ÓÈçÏÂÄÚÈÝ

LANG=<locale>
LC_ALL=<locale>

ÖØÆôϵͳ¡£

ÔËÐÐ"locale"ÃüÁîÈ·ÈϸıäÉúЧ¡£

Èç¹ûÄãÏ£ÍûʹÓõÄlocale²¢Î´°²×°£¬²Î¿´ÈçÏÂÎĵµ°²×°locale

Solaris 8 : <<International Language Environments Guide>>

Solaris 7 : <<Solaris Internationalization Guide For Developers>>

Solaris 2.6: <<Solaris Internationalization Guide for Developers>>

D: scz <scz@nsfocus.com> 1998-08

SPARC/Solaris 2.5Ï£¬ÎªÁËÔÚviÖÐÕýÈ·¿´µ½ÖÐÎÄÐèÒªÉèÖû·¾³±äÁ¿

sh

LANG=C;export LANG
LC_CTYPE=iso_8859_1;export LC_CTYPE

csh

setenv LANG zh

¹ØÓÚÉèÖÃLANGÕâ¸ö»·¾³±äÁ¿Éæ¼°µ½/usr/lib/localeϵÄĿ¼ȨÏÞ¡£

1.5 Solaris 7×Ô¶¯×¢Ïú

Q: ÔõÑùÉèÖòÅÄÜ30Ãëºó×Ô¶¯×¢Ïú

A: shridhara

²»ÐÒµÄÊÇ£¬Solaris¶Ô´ËûÓÐʲôºÃµÄÖ§³Ö¡£Èç¹ûÕýÔÚʹÓÃtelnet»á»°£¬»òÐí¿ÉÒÔ¿¼
ÂÇ"logout"±äÁ¿£¬²Î¿´telnetµÄÊÖ²áÒ³¡£Ò»¸ö±äͨµÄ°ì·¨£¬Ê¹ÓÃK-Shell£¬ËüÖ§³Ö
TMOUT±äÁ¿£¬ÓÃÓÚÖ¸¶¨·Ç»î¶¯Ê±ÏÞ(ÒÔÃëΪµ¥Î»)¡£±ÈÈ磬Èç¹ûÒ»¸öshell»á»°3·ÖÖÓÄÚ
²»»î¶¯£¬ÔòÖÕÖ¹Õâ¸öshell»á»°

$ TMOUT=180;export TMOUT

¿ÉÒÔÔÚÓû§µÄ.profileÎļþÖзÅÖøÃÐС£È±µãÊÇÄãÖ»ÄÜʹÓÃksh¡£

D: scz <scz@nsfocus.com>

vi /etc/default/login

# TIMEOUT sets the number of seconds (between 0 and 900) to wait before
# abandoning a login session.
#
TIMEOUT=180

ÕâÀïµÄ³¬Ê±ÉèÖÃÕë¶ÔµÇ¼¹ý³Ì£¬¶ø²»ÊǵǼ³É¹¦ºóµÄshell»á»°³¬Ê±ÉèÖá£

1.6 Ò»¸öĿ¼ӵÓÐsetgidÉèÖã¬ÔõôÀí½â

Q: ¶ÔÒ»¸öĿ¼×öÁËsetgidÉèÖ㬿ÉÎÒ²¢Ã»Óз¢ÏÖÕâºÍÕý³£Çé¿öÓÐÊ²Ã´Çø±ð

A: John Riddoch <jr@scms.rgu.ac.uk>

ÔÚÕâÖÖĿ¼Ï´´½¨ÐÂÎļþʱ½«²ÉÓÃsetgidÉèÖöÔÓ¦µÄÊô×飬±ÈÈç

$ ls -ld b
drwxrws--- 2 jr group 512 Mar 14 17:13 b/
$ touch b/a
$ ls -l b/a
-rw------- 1 jr group 0 Mar 14 17:13 b/a
$ id
uid=178(jr) gid=10(staff)

jrµÄȱʡ×éÊÇstaff£¬¶øÏÖÔÚb/aÎļþÊô×éÊÇgroup¡£

D: СËÄ <scz@nsfocus.com>

SPARC/Solaris 7ϲâÊÔ

Èç¹ûĿ¼ӵÓÐSGIDÉèÖã¬ÄÇô¸ÃĿ¼ÏÂд´½¨µÄÎļþ½«¼Ì³Ð¸ÃĿ¼µÄÊô×飬¶ø²»ÊÇ´´
½¨ÕßËù¶ÔÓ¦µÄGID¡£

[root@ /export/home/scz]> id
uid=0(root) gid=1(other) <-- ×¢Ò⵱ǰÓû§µÄÊô×é
[root@ /export/home/scz]> mkdir groupsgid
[root@ /export/home/scz]> ls -ld groupsgid
drwxr-xr-x root other groupsgid/
[root@ /export/home/scz]> chown scz:users groupsgid
[root@ /export/home/scz]> chmod g+s groupsgid
[root@ /export/home/scz]> ls -ld groupsgid
drwxr-sr-x scz users groupsgid/ <-- Ŀ¼ӵÓÐSGIDÉèÖÃ
[root@ /export/home/scz]> cd groupsgid/
[root@ /export/home/scz/groupsgid]> touch scz_0
[root@ /export/home/scz/groupsgid]> ls -l scz_0
-rw-r--r-- root users scz_0 <-- ×¢ÒâÊô×é±ä»¯
[root@ /export/home/scz/groupsgid]> chmod g-s ../groupsgid/
[root@ /export/home/scz/groupsgid]> ls -ld ../groupsgid/
drwxr-xr-x scz users ../groupsgid/
[root@ /export/home/scz/groupsgid]> touch scz_1
[root@ /export/home/scz/groupsgid]> ls -l scz_1
-rw-r--r-- root other scz_1 <-- ×¢ÒâÊô×é±ä»¯
[root@ /export/home/scz/groupsgid]>

1.7 ·ÇSun ConsoleÉÏÓÐÎ޵ȼÛStop-AµÄ°´¼ü

A: neomilev

Èç¹ûÊDZãЯ»ú£¬³¢ÊÔalt/break »òÕß ctrl/break¡£Èç¹ûÊÇvt100ÖÕ¶Ë£¬³¢ÊÔF11 »òÕß
break

1.8 ÈçºÎÈÃÒ»¸öÓû§Ö»ÄÜftp¶øÎÞ·¨telnet

A: СËÄ <scz@nsfocus.com>

Ð޸ĸÃÓû§ÔÚ/etc/passwdÖеÄshellΪ/bin/false£¬ÔÚ/etc/shellsÎļþÖÐÔö¼Ó
/bin/false£¬´Ëʱ£¬¸ÃÓû§Ö»ÄÜftp£¬telnetʧ°Ü¡£

1.10 ΪʲôSun¹¤×÷Õ¾·ÇÒªÊäÈëbootÃüÁî²ÅÄÜÆô¶¯

Q: ÎÒÓÐ̨Sun¹¤×÷Õ¾£¬Ã¿´Î¿ª»úºóÍ£ÔÚok״̬Ï£¬ÐèÒªÊÖ¹¤ÊäÈëbootÃüÁî²ÅÄÜÆô¶¯£¬
ÏÖÔÚÏë±ÜÃâÕâÖÖЧ¹û£¬Ôõô°ì

A: /usr/sbin/eeprom auto-boot?=true
/usr/sbin/eeprom auto-boot? <-- ²éѯ

A: dengdai@SMTH

½øÈëOBP״̬

ok setenv auto-boot? true
ok setenv boot-device disk

·´Ö®

ok setenv auto-boot? false

1.11 ÈçºÎÈÃSolarisʶ±ðÐÂÔö¼ÓµÄÓ²¼þ

Q: ±ÈÈçÐÂÔö¼ÓÁËÍø¿¨¡¢Ó²ÅÌ¡¢¹âÇýʲôµÄ£¬ÈçºÎÈÃSolarisÒâʶµ½ÕâÖÖÔö¼Ó

A: spp(µÍÒôÅÚ) & suxm <suxm@gnuchina.org>

ÓÐÈýÖÖ°ì·¨

a. Stop-A½øÈëOBP״̬£¬ÊäÈëboot -r
b. sync(ÖØ¸´);reboot -- -r
c. touch /reconfigure;sync(ÖØ¸´);reboot

²Î¿´reboot(1M)¡¢boot(1M)¡¢eeprom(1M)¡¢kernel(1M)¡¢cfgadm(1M)¡¢psradm(1M)ÊÖ
²áÒ³

Q: ÎÒÐÂÔö¼ÓÁËÒ»¿éÓ²ÅÌ£¬²»Ïëboot -r¶øÁ¢¼´ÉúЧ£¬Ôõô°ì

A: ÀÏ´ó <willxu@public.cs.hn.cn> 2001-12-04 16:51

Ö±½Ó½«µÚ¶þ¿éÓ²Å̽ÓÉÏÈ¥£¬È»ºó˳ÐòÖ´ÐÐÈçÏÂÃüÁ²»ÓÃÖØÐÂÆô¶¯»úÆ÷

modunload -i 0
drvconfig(1M)
devlinks(1M)
disks(1M)

Èç¹ûÐèÒªÖØÐ¸ñʽ»¯¡¢·ÖÇø¡¢´´½¨Îļþϵͳ£¬¾Í¼ÌÐøÖ´ÐÐ

format(1M)
newfs(1M)

2. ¶ÑÕ»Ïà¹ØÎÊÌâ

2.1 ÈçºÎÀí½âpstackµÄÊä³öÐÅÏ¢

Q: 080603a7 main (1, 80479b8, 80479c0) + d53
½áβµÄd53ÊÇʲô

A: Roger A. Faulkner <raf@sunraf.Sun.COM>

ÔÚ´úÂë¶Î¾ø¶ÔµØÖ·0x080603a7´¦£¬main()µ÷ÓÃÁËÒ»¸öº¯Êý£¬0x080603a7ÕýÊÇ
main + 0xd53£¬»»¾ä»°Ëµ£¬´Ómain()º¯Êý¿ªÊ¼µÄ0xd53Æ«ÒÆ´¦¡£

2.3 SolarisÖÐÈçºÎ»ñȡһ¸öC³ÌÐòµÄµ÷ÓÃÕ»»ØËÝ

Q: ÎÒÏëÔÚSolaris 2.6¼«ÆäºóÐø°æ±¾ÉÏ»ñȡһ¸öC³ÌÐòµÄµ÷ÓÃÕ»»ØËÝ£¬ÀàËÆÈçÏÂÊä³ö

(10) 0x00045e08 integ + 0x408 [./two_brn.e]
(11) 0x0006468c trajcem + 0x128 [./two_brn.e]
(12) 0x00055490 fly_traj + 0xf58 [./two_brn.e]
(13) 0x0004052c top_level + 0x14 [./two_brn.e]
(14) 0x000567e4 _start + 0x34 [./two_brn.e]

ÕâÑùÎҾͿÉÒÔÖªµÀµ±³ÌÐò±ÀÀ£¡¢ËÀËøµÄʱºò´úÂëÖ´Ðе½Á˺δ¦¡£ÔÚHP-UXºÍIRIXÉÏ
¿ÉÒÔÀûÓÃU_STACK_TRACE()ºÍtrace_back_stack_and_print()£¬SolarisÉÏÄØ£¿

Q: ÓÐûÓа취ÏÔʾµ±Ç°¶ÑÕ»ÖеÄÊý¾Ý(GNU/Linuxϵͳ)£¿ÎÒÏ£Íû×Ô¼ºµÄÒì³£´¦Àí³ÌÐò
ÔÚ½ø³Ì½áÊøÇ°dumpÕû¸öÕ»Çø(stack)£¬ÒÔ±ã¹Û²ìµ½Õ»¶¥ÊÇʲôº¯Êý¡£¶ÔÓÚµ÷ÊÔÒâÏë
²»µ½µÄÔËÐÐʱ´íÎó¶øÑÔ£¬ÕâºÜÖØÒª¡£

A: Bjorn Reese <breese@mail1.stofanet.dk>

ÓÃ/usr/proc/bin/pstack [-F] <pid ...>

²Î¿´Õâ¸öÀý×Ó´úÂ룬http://home1.stofanet.dk/breese/debug/debug.tar.gz

Q: is there a way to access call stack information at run time from within
a program? i've been maintaining my own crude stack using __FUNCTION__
and linked lists but can't help but think there's gotta be a better
way...

A: Nate Eldredge <neldredge@hmc.edu>

ÕâÒÀÀµÓÚÄãµÄϵͳ£¬Èç¹ûʹÓÃglibc 2.1»ò¸üа汾£¬¿ÉÒÔʹÓÃbacktrace()º¯Êý£¬
²Î¿´<execinfo.h>£¬ÆäËûϵͳ¿ÉÄÜÓв»Í¬µÄ¼¼ÊõÖ§³Ö¡£

×¢Ò⣬ÄãËùʹÓõİ취¿ÉÄÜÊÇΨһÄܹ»±£Ö¤¿çƽ̨ʹÓõÄ

A: Andrew Gabriel <andrew@cucumber.demon.co.uk> Consultant Software Engineer

ÏÂÃæÊÇÒ»¸öbacktrace()µÄÓ¦ÓþÙÀý£¬Èç¹ûÄãʹÓÃSolaris 2.4¼°ÆäºóÐø°æ±¾£¬ÄÇ
ôÕâ¸öÀý×Ó¿ÉÒԺܺõŤ×÷¡£ºÜ¿ÉÄÜÎÞ·¨¹¤×÷ÔÚ64-bitģʽÏ£¬ÎÒûÓг¢ÊÔ¹ý£¬
ºÃÏñSolaris 7ÒѾ­ÌṩÁËÒ»¸öÀàËÆµÄÑÝʾ³ÌÐò¡£»¹¿ÉÒÔÔö¼ÓijЩ¹¦ÄÜ£¬ÎÒûÓÐʱ
¼äÁË¡£

/*
* Produce a stack trace for Solaris systems.
*
* Copyright (C) 1995-1998 Andrew Gabriel <andrew@cucumber.demon.co.uk>
* Parts derived from Usenet postings of Bart Smaalders and Casper Dik.
*
*/

/* ......................................................................... */

#include <setjmp.h>
#include <sys/types.h>
#include <sys/reg.h>
#include <sys/frame.h>
#include <dlfcn.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>

#if defined(sparc) || defined(__sparc)
#define FLUSHWIN() asm("ta 3");
#define FRAME_PTR_INDEX 1
#define SKIP_FRAMES 0
#endif

#if defined(i386) || defined(__i386)
#define FLUSHWIN()
#define FRAME_PTR_INDEX 3
#define SKIP_FRAMES 1
#endif

#if defined(ppc) || defined(__ppc)
#define FLUSHWIN()
#define FRAME_PTR_INDEX 0
#define SKIP_FRAMES 2
#endif

/* ......................................................................... */

static void print_address ( void * pc )
{
Dl_info info;

if ( dladdr( pc, &info ) == 0 )
{
/* not found */
fprintf( stderr, "*** %s:0x%xn", "??", ( unsigned int )pc );
}
else
{
/* found */
fprintf( stderr, "*** %s:%s+0x%xn", info.dli_fname, info.dli_sname,
( unsigned int )pc - ( unsigned int )info.dli_saddr );
}
return;
} /* end of print_address */

/* ......................................................................... */

static int validaddr ( void * addr )
{
static long pagemask = -1;
char c;

if ( pagemask == -1 )
{
pagemask = ~( sysconf( _SC_PAGESIZE ) - 1 );
}
addr = ( void * )( ( long )addr & pagemask );
if ( mincore( ( char * )addr, 1, &c ) == -1 && errno == ENOMEM )
{
return 0; /* invalid */
}
else
{
return 1; /* valid */
}
} /* end of validaddr */

/* ......................................................................... */

/*
* this function walks up call stack, calling print_addess
* once for each stack frame, passing the pc as the argument.
*/

static void print_stack ( void )
{
struct frame * sp;
jmp_buf env;
int i;
int * iptr;

FLUSHWIN();

setjmp( env );
iptr = ( int * )env;

sp = ( struct frame * )iptr[ FRAME_PTR_INDEX ];

for ( i = 0; i < SKIP_FRAMES && sp; i++ )
{
if ( !validaddr( sp ) || !validaddr( &sp->fr_savpc ) )
{
fprintf( stderr, "***[stack pointer corrupt]n" );
return;
}
sp = ( struct frame * )sp->fr_savfp;
}

i = 100; /* looping check */

while ( validaddr( sp ) && validaddr( &sp->fr_savpc ) && sp->fr_savpc && --i )
{
print_address( ( void * )sp->fr_savpc );
sp = ( struct frame * )sp->fr_savfp;
}
} /* end of print_stack */

/* ......................................................................... */

void backtrace( void )
{
fprintf( stderr, "***backtrace...n" );
print_stack();
fprintf( stderr, "***backtrace endsn" );
}

/* ......................................................................... */

2.4 ÈçºÎ±à³Ì»ñȡջµ×µØÖ·

Q: ËäÈ»ºÜ¶à²Ù×÷ϵͳµÄÓû§½ø³ÌÕ»µ×µØÖ·¹Ì¶¨£¬µ«ÊÇÎÒÐèҪдһ¸ö¿É¹ã·ºÒÆÖ²C³ÌÐò
»ñÈ¡Õâ¸öÕ»µ×µØÖ·¡£

A: tt <warning3@nsfocus.com> 2001-06-02 19:40

¼ÙÉè¶ÑÕ»(stack)ÏòµÍµØÖ··½ÏòÔö³¤£¬ÔòËùνջµ×Ö¸¶ÑÕ»(stack)×î¸ßµØÖ·

x86/Linux Õ»µ×ÊÇ0xc0000000( Õ»µ×ÍùµÍµØÖ·µÄ4¸ö×Ö½Ú×ÜÊÇÁã )
SPARC/Solaris 7/8 Õ»µ×ÊÇ0xffbf0000( Õ»µ×ÍùµÍµØÖ·µÄ4¸ö×Ö½Ú×ÜÊÇÁã )
SPARC/Solaris 2.6 Õ»µ×ÊÇ0xf0000000( Õ»µ×ÍùµÍµØÖ·µÄ4¸ö×Ö½Ú×ÜÊÇÁã )
x86/FreeBSD Õ»µ×ÊÇ0xbfc00000( Õ»µ×ÍùµÍµØÖ·µÄ4¸ö×Ö½Ú×ÜÊÇÁã )
x86/NetBSD 1.5 Õ»µ×ÊÇ0xbfbfe000
x86/OpenBSD 2.8 Õ»µ×ÊÇ0xdfbfe000

D: jonah

¶ÔÓÚNetBSD 1.5£¬Õ»µ×ÊÇ0xbfc00000¡£¸ù¾ÝÔ´Â룬×î¸ßÓû§µØÖ·ÊÇ0xbfbfe000£¬ÒòΪ
×îºó4MB(2^22)µÄ×îºóÁ½Ò³(0x2000×Ö½Ú£¬Ò»Ò³4096×Ö½Ú)±£ÁôÓÃ×öUÇø£¬µ«ÊÇĿǰ²»ÔÙ
ʹÓÃÕâ¿éÄÚ´æ¡£Òò´Ë£¬0xbfbfe000²ÅÊÇÕæÕýµÄÕ»µ×¡£

ttÔÚOpenBSD 2.8ÉϲâÊÔ½á¹û£¬Õ»µ×ÊÇ0xdfbfe000£¬×¢ÒâºÍNetBSD 1.5Ïà²îºÜ´ó¡£

A: tt <warning3@nsfocus.com>

--------------------------------------------------------------------------
/*
* gcc -Wall -O3 -o gstack gstack.c
*
* A simple example to get the current stack bottom address
* warning3 <warning3@nsfocus.com>
* 2001-06-01
*
* Modified by scz <scz@nsfocus.com>
* 2001-06-02
*/

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>

typedef void Sigfunc ( int ); /* for signal handlers */

Sigfunc * signal ( int signo, Sigfunc * func );
static Sigfunc * Signal ( int signo, Sigfunc * func );
static char * get_stack_bottom ( void );
static void segfault ( int signo );

static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjump = 0;
static Sigfunc *seg_handler;
static Sigfunc *bus_handler; /* for xxxBSD */

Sigfunc * signal ( int signo, Sigfunc * func )
{
struct sigaction act, oact;

act.sa_handler = func;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
if ( sigaction( signo, &act, &oact ) < 0 )
{
return( SIG_ERR );
}
return( oact.sa_handler );
} /* end of signal */

static Sigfunc * Signal ( int signo, Sigfunc * func ) /* for our signal() function */
{
Sigfunc * sigfunc;

if ( ( sigfunc = signal( signo, func ) ) == SIG_ERR )
{
exit( EXIT_FAILURE );
}
return( sigfunc );
} /* end of Signal */

static char * get_stack_bottom ( void )
{
volatile char *c; /* for autovar, must be volatile */

seg_handler = Signal( SIGSEGV, segfault );
bus_handler = Signal( SIGBUS, segfault );
c = ( char * )&c;

if ( sigsetjmp( jmpbuf, 1 ) != 0 )
{
Signal( SIGSEGV, seg_handler );
Signal( SIGBUS, bus_handler );
return( ( char * )c );
}
canjump = 1; /* now sigsetjump() is OK */
while ( 1 )
{
*c = *c;
c++;
}
return( NULL );
} /* end of get_stack_bottom */

static void segfault ( int signo )
{
if ( canjump == 0 )
{
return; /* unexpected signal, ignore */
}
canjump = 0;
siglongjmp( jmpbuf, signo ); /* jump back to main, don't return */
} /* end of segfault */

int main ( int argc, char * argv[] )
{
fprintf( stderr, "Current stack bottom is at 0x%pn", get_stack_bottom() );
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------

D: scz <scz@nsfocus.com> 2001-06-03 00:38

W. Richard StevensÔÚ<<Advanced Programming in the UNIX Environment>>ÖÐÏêϸ
½éÉÜÁËsetjmp/longjmpÒÔ¼°sigsetjmp/siglongjmpº¯Êý¡£

Õâ¸ö³ÌÐòµÄÔ­ÀíºÜ¼òµ¥£¬²»¶ÏÏòÕ»µ×·½Ïòȡֵ£¬Ô½¹ýÕ»µ×µÄµØÖ··ÃÎʻᵼÖÂSIGSEGV
Ðźţ¬È»ºóÀûÓó¤Ìø×ª»Øµ½Ö÷Á÷³Ì±¨¸æµ±Ç°cÖµ£¬×ÔÈ»¶ÔÓ¦Õ»µ×¡£

tt²âÊÔ±íÃ÷£¬ÔÚx86/FreeBSDÖе¼ÖÂSIGBUSÐźš£¾Ýjonah±¨¸æ£¬²»½ö½öÊÇFreeBSD£¬
NetBSD ÒÔ¼° OpenBSD ϵͳÖÐÉÏÊö³ÌÐòÔ½½ç·ÃÎÊÒ²µ¼ÖÂSIGBUSÐźţ¬¶ø²»ÊÇSIGSEGV
Ðźš£

·Ç¾Ö²¿×ªÒÆ£¬±ÈÈ纯Êý¼ä×ªÒÆµÄʱºò¿¼ÂÇʹÓÃsetjmp/longjmp¡£µ«ÊÇÈç¹ûÉæ¼°µ½ÐźÅ
¾ä±úÓëÖ÷Á÷³ÌÖ®¼äµÄ×ªÒÆ£¬¾Í²»ÄÜʹÓÃlongjmpÁË¡£µ±²¶×½µ½ÐźŽøÈëÐźžä±ú£¬´Ë
ʱµ±Ç°Ðźű»×Ô¶¯¼ÓÈë½ø³ÌµÄÐÅºÅÆÁ±Î×ÖÖУ¬×èÖ¹ºóÀ´²úÉúµÄÕâÖÖÐźŸÉÈÅ´ËÐźžä
±ú¡£Èç¹ûÓÃlongjmpÌø³öÐźžä±ú£¬´Ëʱ½ø³ÌµÄÐÅºÅÆÁ±Î×Ö״̬δ֪£¬ÓÐЩϵͳ×öÁË
±£´æ»Ö¸´£¬ÓÐЩϵͳûÓÐ×ö¡£¸ù¾ÝPOSIX.1£¬´ËʱӦ¸ÃʹÓÃsigsetjmp/siglongjmpº¯
Êý¡£ÏÂÃæÀ´×ÔSPARC/Solaris 7µÄsetjmp(3C)

--------------------------------------------------------------------------
#include <setjmp.h>

int setjmp ( jmp_buf env );
int sigsetjmp ( sigjmp_buf env, int savemask );
void longjmp ( jmp_buf env, int val );
void siglongjmp ( sigjmp_buf env, int val );
--------------------------------------------------------------------------

Èç¹ûsavemask·Ç0£¬sigsetjmpÔÚenvÖб£´æ½ø³Ìµ±Ç°ÐÅºÅÆÁ±Î×Ö£¬ÏàÓ¦siglongjmp»Ø
À´µÄʱºò´ÓenvÖлָ´ÐÅºÅÆÁ±Î×Ö¡£

Êý¾ÝÀàÐÍsig_atomic_tÓÉANSI C¶¨Ò壬ÔÚдʱ²»»á±»Öжϡ£ËüÒâζ×ÅÕâÖÖ±äÁ¿ÔÚ¾ßÓÐ
Ðé´æµÄϵͳÉϲ»»á¿çÔ½Ò³±ß½ç£¬¿ÉÒÔÓÃÒ»Ìõ»úÆ÷Ö¸Áî¶ÔÆä´æÈ¡¡£ÕâÖÖÀàÐ͵ıäÁ¿×ÜÊÇ
ÓëANSIÀàÐÍÐÞÊηûvolatileÒ»²¢³öÏÖ£¬·ÀÖ¹±àÒëÆ÷ÓÅ»¯´øÀ´µÄ²»È·¶¨×´Ì¬¡£

ÔÚlongjmp/siglongjmpÖУ¬È«¾Ö¡¢¾²Ì¬±äÁ¿±£³Ö²»±ä£¬ÉùÃ÷ΪvolatileµÄ×Ô¶¯±äÁ¿Ò²
±£³Ö²»±ä¡£

ÎÞÂÛÊÇ·ñʹÓÃÁ˱àÒëÓÅ»¯¿ª¹Ø£¬ÎªÁ˱£Ö¤¹ã·º¼æÈÝÐÔ£¬¶¼Ó¦¸ÃÔÚget_stack_bottom()
ÖÐÉùÃ÷cΪvolatile±äÁ¿¡£

×¢ÒâÕâÀ±ØÐëʹÓó¤Ìø×ª£¬¶ø²»ÄÜ´ÓÐźžä±úÖÐÖ±½Ó·µ»Ø¡£ÒòΪµ¼ÖÂÐźÅSIGSEGV¡¢
SIGBUS·Ö·¢µÄÓï¾äʼÖÕ´æÔÚ£¬Ö±½Ó´ÓÐźžä±úÖзµ»ØÖ÷Á÷³Ì£¬½«»Øµ½Òý·¢ÐźŵÄÔ­Ö¸
Áî´¦£¬¶ø²»ÊÇÏÂÒ»ÌõÖ¸Áî(°ÑÕâÖÖÇé¿öÀí½â³ÉÒì³££¬¶ø²»ÊÇÖжÏ)£¬ÓÚÊÇÁ¢¼´µ¼ÖÂÏÂÒ»
´ÎÐźŷַ¢£¬³öÏÖ¹ãÒåÉϵÄËÀÑ­»·£¬Ëùν³ÌÐò½©×¡¡£¿ÉÒÔ¼òµ¥ÐÞ¸ÄÉÏÊö³ÌÐò£¬²»ÀûÓÃ
³¤Ìø×ª£¬¼òµ¥¶ÔÒ»¸öÈ«¾Ö±äÁ¿×öÅжϾö¶¨ÊÇ·ñ¼ÌÐøÑ­»·µÝÔöc£¬³ÌÐò×îÖÕ½©×¡£»Èç¹û
ÔÚÐźžä±úÖÐÊä³öµ÷ÊÔÐÅÏ¢£¬ºÜÈÝÒ×·¢ÏÖÕâ¸ö¹ãÒåÉϵÄÎÞÏÞÑ­»·¡£

D: scz <scz@nsfocus.com> 2001-06-03 00:40

ÔÚx86/LinuxϵͳÖÐÓÃÈçÏÂÃüÁî¿ÉÒÔÈ·¶¨Õ»ÇøËùÔÚ

# cat /proc/1/maps <-- ¹Û²ì1ºÅ½ø³Ìinit
... ...
bfffe000-c0000000 rwxp fffff000 00:00 0
#

ÔÚSPARC/Solaris 7ÖÐÓÃ/usr/proc/bin/pmapÃüÁîÈ·¶¨Õ»ÇøËùÔÚ

# /usr/proc/bin/pmap 1 <-- ¹Û²ì1ºÅ½ø³Ìinit
... ...
FFBEC000 16K read/write/exec [ stack ]
#

16KB == 0x4000£¬0xFFBEC000 + 0x4000 == 0xFFBF0000

ÓëÇ°Ãætt½éÉܵÄ

SPARC/Solaris 7/8 Õ»µ×ÊÇ0xffbf0000( Õ»µ×ÍùµÍµØÖ·µÄ4¸ö×Ö½Ú×ÜÊÇÁã )

Ïà·ûºÏ¡£

´ËÍ⣬ÔÚSPARC/Solaris 7Ï£¬¿ÉÒÔÕâÑùÑéÖ¤Ö®

# /usr/ccs/bin/nm -nx /dev/ksyms | grep "|_userlimit"
[7015] |0x0000100546f8|0x000000000008|OBJT |GLOB |0 |ABS |_userlimit
[8051] |0x000010054700|0x000000000008|OBJT |GLOB |0 |ABS |_userlimit32
# echo "_userlimit /J" | adb -k /dev/ksyms /dev/mem
physmem 3b72
_userlimit:
_userlimit: ffffffff80000000
# skd64 0x000010054700 8
byteArray [ 8 bytes ] ---->
0000000000000000 00 00 00 00 FF BF 00 00
# ~~~~~~~~~~~ ¶ÔÓÚ32-bitÓ¦ÓóÌÐòÀ´Ëµ£¬ÕâÊÇÓû§
¿Õ¼äÉÏÏÞ

Èç¹û±àÒë64-bitÓ¦ÓóÌÐò£¬Óû§¿Õ¼äÉÏÏÞÊÇ_userlimit£¬Ò²¾ÍÊÇ0xffffffff80000000

# /opt/SUNWspro/SC5.0/bin/cc -xarch=v9 -O -o gstack gstack.c
# ./gstack
Current stack bottom is at 0xffffffff80000000
#

¶ÔÓÚSPARC/Solaris 2.6 32-bit kernel mode

# echo "_userlimit /X" | adb -k /dev/ksyms /dev/mem
physmem 3d24
_userlimit:
_userlimit: f0000000
#

2.5 ÈçºÎµÃµ½Ò»¸öÔËÐÐÖнø³ÌµÄÄÚ´æÓ³Ïñ

A: Sun Microsystems 1998-03-30

ÓÐЩʱºò±ØÐëµÃµ½Ò»¸öÔËÐÐÖнø³ÌµÄÄÚ´æÓ³Ïñ¶ø²»ÄÜÍ£Ö¹¸Ã½ø³Ì£¬SolarisϵͳÁËÕâ
ÑùµÄ¹¤¾ß£¬gcoreΪÔËÐÐÖнø³Ì´´½¨Ò»¸öcoreÎļþ¡£¼ÙÉèÎÒµÄbash½ø³ÌºÅÊÇ5347

# gcore 5347
gcore: core.5347 dumped
# file core.5347
core.5347: ELF 32-λ MSB coreÎļþ SPARC °æ±¾ 1£¬À´×Ô'bash'
#

×¢Ò⣬ֻÄÜ»ñÈ¡ÊôÖ÷ÊÇÄã×Ô¼ºµÄ½ø³ÌµÄÄÚ´æÓ³Ïñ£¬³ý·ÇÄãÊÇroot¡£

2.6 µ÷ÊÔÆ÷ÈçºÎ¹¤×÷µÄ

Q: ÎÒÏëÔÚÒ»¸ö×Ô¼º±àдµÄ³ÌÐòÖе¥²½ÔËÐÐÁíÍâÒ»¸ö³ÌÐò£¬»»¾ä»°Ëµ£¬ÄÇÊÇÒ»¸öµ÷ÊÔ
Æ÷£¬¸ÃÈçºÎ×ö£¿

A: Erik de Castro Lopo <nospam@mega-nerd.com>

ÕâÊÇÒ»¸ö²Ù×÷ϵͳÏà¹ØµÄÎÊÌâ¡£×îÒ»°ãµÄ»Ø´ðÊÇʹÓÃptrace()ϵͳµ÷Ó㬾¡¹ÜÎÒ
²»È·ÈϾ¿¾¹ÕâÓжàôÆÕ±é¡£Linux manÊÖ²áÉÏ˵SVr4¡¢SVID EXT¡¢AT&T¡¢X/OPEN
ºÍBSD 4.3¶¼Ö§³ÖËü¡£

ΪÁËʹÓÃptrace()£¬ÄãµÄ³ÌÐòÓ¦¸Ãµ÷ÓÃfork()£¬È»ºóÔÚ×Ó½ø³ÌÖÐ×öÈçϵ÷Óãº

ptrace( PTRACE_TRACEME, 0, 0, 0 );

½ÓÏÂÀ´µ÷ÓÃexec()¼Ò×åµÄº¯ÊýÖ´ÐÐÄã×îÖÕÆóͼ¸ú×ٵijÌÐò¡£

ΪÁ˵¥²½½øÈë×Ó½ø³Ì£¬ÔÚ¸¸½ø³ÌÖе÷Óãº

ptrace( PTRACE_SINGLESTEP, 0, 0, 0 );

»¹ÓÐһЩÆäËûº¯Êý×ö»Ö¸´/ÉèÖüĴæÆ÷¡¢ÄÚ´æ±äÁ¿Ò»ÀàµÄ¹¤×÷¡£

GDBµÄÔ´´úÂë×ãÒԻشðÕâ¸öÎÊÌâ¡£

2.7 x86/LinuxÉÏÈçºÎ´¦ÀíSIGFPEÐźÅ

Q: ²Î¿´ÈçϳÌÐò

--------------------------------------------------------------------------
/*
* gcc -Wall -pipe -O3 -o sigfpe_test_0 sigfpe_test_0.c
*
* ×¢ÒâÓëÏÂÃæµÄ±àÒëЧ¹û½øÐжԱȣ¬È¥µôÓÅ»¯¿ª¹Ø-O3
*
* gcc -Wall -pipe -o sigfpe_test_0 sigfpe_test_0.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>

/*
* for signal handlers
*/
typedef void Sigfunc ( int );

Sigfunc * signal ( int signo, Sigfunc *func );
static Sigfunc * Signal ( int signo, Sigfunc *func );
static void on_fpe ( int signo );

Sigfunc * signal ( int signo, Sigfunc *func )
{
struct sigaction act, oact;

act.sa_handler = func;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
if ( signo == SIGALRM )
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
#endif
}
if ( sigaction( signo, &act, &oact ) < 0 )
{
return( SIG_ERR );
}
return( oact.sa_handler );
} /* end of signal */

static Sigfunc * Signal ( int signo, Sigfunc *func )
{
Sigfunc *sigfunc;

if ( ( sigfunc = signal( signo, func ) ) == SIG_ERR )
{
perror( "signal" );
exit( EXIT_FAILURE );
}
return( sigfunc );
} /* end of Signal */

static void on_fpe ( int signo )
{
fprintf( stderr, "here is on_fpen" );
return;
} /* end of on_fpe */

int main ( int argc, char * argv[] )
{
unsigned int i;

Signal( SIGFPE, on_fpe );
i = 51211314 / 0;
/*
* ÁíÍ⣬Ôö¼ÓÕâÐкó£¬ÔٴζԱÈÓÐ-O3ºÍÎÞ-O3µÄЧ¹û
*
* fprintf( stderr, "i = %#Xn", i );
*/
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------

ÓÐ-O3¡¢ÎÞ-O3£¬ÒÔ¼°ÓÐÎÞ×îºóÄÇÌõfprintf()Óï¾ä£¬Ð§¹ûÉÏÓвî±ð£¬×ÔÐжԱȡ£Èç¹û
Êä³ö"here is on_fpe"£¬Ôò»á·¢ÏÖÓÀ²»Í£Ö¹¡£

D: СËÄ <scz@nsfocus.com> 2001-12-14 18:25

ΪÁ˱ãÓÚÌÖÂÛ£¬Ô¼¶¨Á½¸öÃû´Ê£¬ÖжϺÍÒì³£¡£ÕâÀïÖжÏÖ¸×î³£¹æµÄÖжϣ¬±ÈÈçintÖ¸
Áî´øÀ´µÄÈíÖжϡ£Òì³£µÄµäÐÍ´ú±íÓгý0´í¡£Çø±ðÔÚÓÚ£¬·¢ÉúÒ쳣ʱ£¬x86¼Ü¹¹ÉÏCPU
½«µ±Ç°EIP(Ö¸ÏòÒý·¢Òì³£µÄÖ¸Áî)ѹջ£¬·¢ÉúÖжÏʱ£¬x86¼Ü¹¹ÉÏCPU½«µ±Ç°EIPµÄºóÒ»
¸öµØÖ·(Ö¸ÏòÒý·¢ÖжϵÄÖ¸ÁîµÄºóÒ»ÌõÖ¸Áî)ѹջ¡£ÔÚÒì³£´¦Àí´úÂëÖУ¬Èç¹ûÈÏΪÄܹ»
´ÓÔÖÄÑÖлָ´£¬¿ÉÒÔ²»Ð޸ı»Ñ¹Õ»µÄEIP£¬´Ó¶ø·µ»Øµ½Òý·¢Òì³£µÄÖ¸Áî´¦¡£¸ü¶àϸ½Ú
Çë²é¿´IntelÊֲᡣ

ÕâЩÊÇ´ÓǰDOSϲÐÁôµÄ»ã±à֪ʶ£¬²»¹ýÒ²¿ìÍü¹âÁË£¬¸Õ²ÅÓÖÕÒÔª±¦±¦È·ÈÏÁËһϡ£

ÔÚÉÏÊö´úÂëÖУ¬on_fpe()Ö±½Ó·µ»ØÁË£¬µ¼ÖÂÔٴδ¥·¢Òì³££¬ËùÒÔÎÞÐÝÖ¹Êä³ö¡£ÊÂʵÉÏ
ÔÚËùÓеļÆËãÆ÷´¦Àí³ÌÐòÖУ¬¶¼»á¶ÔSIGFPEÐźÅ×öÏàÓ¦´¦Àí£¬Ç°Ð©ÈÕ×Ó¿´yacc/lexµÄ
ʱºòÓÖÅöÉϹý¡£ÕýÈ·µÄ×ö·¨ÊÇ£¬ÀûÓÃÔ¶Ìø×ª×ªÒÆ£¬ÈÿªÒý·¢Òì³£µÄÖ¸Áî¡£

´úÂëÐÞ¸ÄÈçÏÂ

--------------------------------------------------------------------------
/*
* gcc -Wall -pipe -O3 -o sigfpe_test_1 sigfpe_test_1.c
*
* ×¢ÒâÓëÏÂÃæµÄ±àÒëЧ¹û½øÐжԱȣ¬È¥µôÓÅ»¯¿ª¹Ø-O3
*
* gcc -Wall -pipe -o sigfpe_test_1 sigfpe_test_1.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>

/*
* for signal handlers
*/
typedef void Sigfunc ( int );

Sigfunc * signal ( int signo, Sigfunc *func );
static Sigfunc * Signal ( int signo, Sigfunc *func );
static void on_fpe ( int signo );

static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjump = 0;

Sigfunc * signal ( int signo, Sigfunc *func )
{
struct sigaction act, oact;

act.sa_handler = func;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
if ( signo == SIGALRM )
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
#endif
}
if ( sigaction( signo, &act, &oact ) < 0 )
{
return( SIG_ERR );
}
return( oact.sa_handler );
} /* end of signal */

static Sigfunc * Signal ( int signo, Sigfunc *func )
{
Sigfunc *sigfunc;

if ( ( sigfunc = signal( signo, func ) ) == SIG_ERR )
{
perror( "signal" );
exit( EXIT_FAILURE );
}
return( sigfunc );
} /* end of Signal */

static void on_fpe ( int signo )
{
if ( canjump == 0 )
{
return; /* unexpected signal, ignore */
}
canjump = 0;
fprintf( stderr, "here is on_fpen" );
siglongjmp( jmpbuf, signo ); /* jump back to main, don't return */
return;
} /* end of on_fpe */

int main ( int argc, char * argv[] )
{
unsigned int i;

if ( sigsetjmp( jmpbuf, 1 ) != 0 )
{
fprintf( stderr, "c u latern" );
return( EXIT_SUCCESS );
}
/*
* now sigsetjump() is OK
*/
canjump = 1;
Signal( SIGFPE, on_fpe );
i = 51211314 / 0;
/*
* ÁíÍ⣬Ôö¼ÓÕâÐкó£¬ÔٴζԱÈÓÐ-O3ºÍÎÞ-O3µÄЧ¹û
*
* fprintf( stderr, "i = %#Xn", i );
*/
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------

¹ØÓÚ-O3µÄÌÖÂÛ£¬¶Ôgcc±àÒëÆ÷ÊìϤµÄÅóÓÑÇë¼ÌÐø£¬ºÇ£¬ÎÒ¶ÔLinuxϵÄÕâ´Ë¶«Î÷£¬Êµ
ÔÚȱ·¦ÐËȤ¡£

3. -lelf¡¢-lkvm¡¢-lkstatÏà¹ØÎÊÌâ

3.1 ÈçºÎÅжϿÉÖ´ÐÐÎļþÊÇ·ñЯ´øÁ˵÷ÊÔÐÅÏ¢

Q: ijЩʱºòÐèÒªÖªµÀ±àÒë¿ÉÖ´ÐÐÎļþʱÊÇ·ñЯ´øÁ˵÷ÊÔÐÅÏ¢(±ÈÈçÊÇ·ñÖ¸¶¨ÁË-g±àÒë
Ñ¡Ïî)¡£¼ì²é¿ÉÖ´ÐÐÎļþÖÐÊÇ·ñ°üº¬".stab" elf section£¬".stab" sectionÓÃÓÚ
±£´æÏà¹Øµ÷ÊÔÐÅÏ¢¡£

A: Sun Microsystems 2000-05-15

ÏÂÃæÕâ¸ö½Å±¾ÑÝʾÈçºÎÅжϿÉÖ´ÐÐÎļþÊÇ·ñЯ´øµ÷ÊÔÐÅÏ¢

--------------------------------------------------------------------------
#! /bin/sh
#
# Script that test whether or not a given file has been built for
# debug (-g option specified in the compilation)

if [ $# -le 0 ]
then
echo "Usage: $1 filename"
exit 1

fi

if [ ! -f $1 ]
then
echo "File $1 does not exist"
exit 1
fi

/usr/ccs/bin/dump -hv $1 | /bin/egrep -s '.stab$'
if [ $? -eq 0 ]
then
echo "File '$1' has been built for debug"
exit 0
else
echo "File '$1' has not been built for debug"
exit 1
fi
--------------------------------------------------------------------------

Èç¹û¶ÔELFÎļþ¸ñʽ²»ÊìϤ£¬Àí½âÉÏÊö´úÂë¿ÉÄÜÓеãÀ§ÄÑ£¬²Î¿´
http://www.digibel.org/~tompy/hacking/elf.txt£¬ÕâÊÇ1.1°æµÄELFÎļþ¸ñʽ¹æ·¶¡£

3.2 mprotectÈçºÎÓÃ

A: СËÄ <scz@nsfocus.com>

# truss prtconf 2>&1 | grep sysconf
sysconfig(_CONFIG_PAGESIZE) = 8192
sysconfig(_CONFIG_PHYS_PAGES) = 16384
#

ÓÉ´Ë¿ÉÖªµ±Ç°ÏµÍ³Ò³³ß´çÊÇ8192×Ö½Ú¡£

--------------------------------------------------------------------------
/*
* gcc -Wall -g -ggdb -static -o mtest mtest.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

int main ( int argc, char * argv[] )
{
char *buf;
char c;

/*
* ·ÖÅäÒ»¿éÄڴ棬ӵÓÐȱʡµÄrw-±£»¤
*/
buf = ( char * )malloc( 1024 + 8191 );
if ( !buf )
{
perror( "malloc" );
exit( errno );
}
/*
* Align to a multiple of PAGESIZE, assumed to be a power of two
*/
buf = ( char * )( ( ( unsigned int )buf + 8191 ) & ~8191 );
c = buf[77];
buf[77] = c;
printf( "okn" );
/*
* Mark the buffer read-only.
*
* ±ØÐë±£Ö¤ÕâÀïbufλÓÚÒ³±ß½çÉÏ£¬·ñÔòmprotect()ʧ°Ü£¬±¨¸æÎÞЧ²ÎÊý
*/
if ( mprotect( buf, 1024, PROT_READ ) )
{
perror( "nmprotect" );
exit( errno );
}
c = buf[77];
/*
* Write error, program dies on SIGSEGV
*/
buf[77] = c;

exit( 0 );
} /* end of main */
--------------------------------------------------------------------------

$ ./mtest
ok
¶Î´íÎó (core dumped) <-- ÄÚ´æ±£»¤Æð×÷ÓÃÁË
$

3.3 mmapÈçºÎÓÃ

A: СËÄ <scz@nsfocus.com>

ÏÂÃæÐ´Ò»¸öÍê³ÉÎļþ¸´Öƹ¦ÄܵÄС³ÌÐò£¬ÀûÓÃmmap(2)£¬¶ø²»ÊDZê×¼ÎļþI/O½Ó¿Ú¡£

--------------------------------------------------------------------------
/*
* gcc -Wall -O3 -o copy_mmap copy_mmap.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* for memcpy */
#include <strings.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define PERMS 0600

int main ( int argc, char * argv[] )
{
int src, dst;
void *sm, *dm;
struct stat statbuf;

if ( argc != 3 )
{
fprintf( stderr, " Usage: %s <source> <target>n", argv[0] );
exit( EXIT_FAILURE );
}
if ( ( src = open( argv[1], O_RDONLY ) ) < 0 )
{
perror( "open source" );
exit( EXIT_FAILURE );
}
/* ΪÁËÍê³É¸´ÖÆ£¬±ØÐë°üº¬¶Á´ò¿ª£¬·ñÔòmmap()ʧ°Ü */
if ( ( dst = open( argv[2], O_RDWR | O_CREAT | O_TRUNC, PERMS ) ) < 0 )
{
perror( "open target" );
exit( EXIT_FAILURE );
}
if ( fstat( src, &statbuf ) < 0 )
{
perror( "fstat source" );
exit( EXIT_FAILURE );
}
/*
* ²Î¿´Ç°ÃæmanÊÖ²áÖеÄ˵Ã÷£¬mmap()²»ÄÜÓÃÓÚÀ©Õ¹Îļþ³¤¶È¡£ËùÒÔÕâÀï±ØÐëÊÂ
* ÏÈÀ©´óÄ¿±êÎļþ³¤¶È£¬×¼±¸Ò»¸ö¿Õ¼Ü×ӵȴý¸´ÖÆ¡£
*/
if ( lseek( dst, statbuf.st_size - 1, SEEK_SET ) < 0 )
{
perror( "lseek target" );
exit( EXIT_FAILURE );
}
if ( write( dst, &statbuf, 1 ) != 1 )
{
perror( "write target" );
exit( EXIT_FAILURE );
}
/* ¶ÁµÄʱºòÖ¸¶¨ MAP_PRIVATE ¼´¿É */
sm = mmap( 0, ( size_t )statbuf.st_size, PROT_READ,
MAP_PRIVATE | MAP_NORESERVE, src, 0 );
if ( MAP_FAILED == sm )
{
perror( "mmap source" );
exit( EXIT_FAILURE );
}
/* ÕâÀï±ØÐëÖ¸¶¨ MAP_SHARED ²Å¿ÉÄÜÕæÕý¸Ä±ä¾²Ì¬Îļþ */
dm = mmap( 0, ( size_t )statbuf.st_size, PROT_WRITE,
MAP_SHARED, dst, 0 );
if ( MAP_FAILED == dm )
{
perror( "mmap target" );
exit( EXIT_FAILURE );
}
memcpy( dm, sm, ( size_t )statbuf.st_size );
/*
* ¿ÉÒÔ²»ÒªÕâÐдúÂë
*
* msync( dm, ( size_t )statbuf.st_size, MS_SYNC );
*/
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------

mmap()ºÃ´¦ÊÇ´¦Àí´óÎļþʱËÙ¶ÈÃ÷ÏÔ¿ìÓÚ±ê×¼ÎļþI/O£¬ÎÞÂÛ¶Áд£¬¶¼ÉÙÁËÒ»´ÎÓû§
¿Õ¼äÓëÄں˿ռäÖ®¼äµÄ¸´Öƹý³Ì¡£²Ù×÷Äڴ滹±ãÓÚÉè¼Æ¡¢ÓÅ»¯Ëã·¨¡£

ÎļþI/O²Ù×÷/proc/self/mem²»´æÔÚÒ³±ß½ç¶ÔÆëµÄÎÊÌâ¡£ÖÁÉÙLinuxµÄmmap()µÄ×îºóÒ»
¸öÐβÎoffset²¢Î´Ç¿ÖÆÒªÇóÒ³±ß½ç¶ÔÆë£¬Èç¹ûÌṩµÄֵδ¶ÔÆë£¬ÏµÍ³×Ô¶¯ÏòÉÏÉáÈëµ½
Ò³±ß½çÉÏ¡£

malloc()·ÖÅäµÃµ½µÄµØÖ·²»¼ûµÃ¶ÔÆëÔÚÒ³±ß½çÉÏ

/proc/self/memºÍ/dev/kmem²»Í¬¡£rootÓû§´ò¿ª/dev/kmem¾Í¿ÉÒÔÔÚÓû§¿Õ¼ä·ÃÎʵ½
Äں˿ռäµÄÊý¾Ý£¬°üÀ¨Æ«ÒÆ0´¦µÄÊý¾Ý£¬ÏµÍ³ÌṩÁËÕâÑùµÄÖ§³Ö¡£

ÏÔÈ»´úÂë¶Î¾­¹ý/proc/self/mem¿ÉдӳÉäºóÒѾ­¿Éд£¬ÎÞÐëmprotect()½éÈë¡£

D: scz <scz@nsfocus.com>

Solaris 2.6ϲο´getpagesize(3C)ÊÖ²áÒ³£¬¹ØÓÚÈçºÎ»ñȡҳ´óС£¬Ò»°ãÊÇ8192¡£
Linuxϲο´getpagesize(2)ÊÖ²áÒ³£¬Ò»°ãÊÇ4096¡£

3.4 getrusageÈçºÎÓÃ

A: СËÄ <scz@nsfocus.com>

ÔÚSPARC/Solaris 2.6/7ϽáÂÛÒ»Ö£¬Ö»Ö§³ÖÁËru_utimeºÍru_stime³ÉÔ±£¬ÆäËû³ÉÔ±
±»ÉèÖóÉ0¡£ÐÞ¸ÄÍ·ÎļþºóÔÚFreeBSD 4.3-RELEASEÉϲâÊÔ£¬Ôò²»Ö»Ö§³Öru_utimeºÍ
ru_stime³ÉÔ±¡£´ÓFreeBSDµÄgetrusage(2)ÊÖ²áÒ³¿ÉÒÔ¿´µ½£¬Õâ¸öº¯ÊýÔ´×Ô4.2 BSD¡£

Èç´ËÀ´Ëµ£¬ÖÁÉÙ¶ÔÓÚSPARC/Solaris 2.6/7£¬getrusage(3C)²¢ÎÞ¶à´óÒâÒå¡£

3.5 setitimerÈçºÎÓÃ

D: scz <scz@nsfocus.com>

ΪʲôҪѧϰʹÓÃsetitimer(2)£¬ÒòΪalarm(3)ÊôÓÚ±»ÌÔÌ­µÄ¶¨Ê±Æ÷¼¼Êõ¡£

A: СËÄ <scz@nsfocus.com>

ÏÂÃæÊǸöx86/FreeBSD 4.3-RELEASEϵÄÀý×Ó

--------------------------------------------------------------------------
/*
* File : timer_sample.c
* Author : Unknown (Don't ask me anything about this program)
* Complie : gcc -Wall -pipe -O3 -o timer_sample timer_sample.c
* Platform : x86/FreeBSD 4.3-RELEASE
* Date : 2001-09-18 15:18
*/

/************************************************************************
* *
* Head File *
* *
************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

/************************************************************************
* *
* Macro *
* *
************************************************************************/

typedef void Sigfunc ( int ); /* for signal handlers */

/************************************************************************
* *
* Function Prototype *
* *
************************************************************************/

static void Atexit ( void ( *func ) ( void ) );
static void init_signal ( void );
static void init_timer ( void );
static void on_alarm ( int signo );
static void on_terminate ( int signo );
static int Setitimer ( int which, const struct itimerval *value,
struct itimerval *ovalue );
Sigfunc * signal ( int signo, Sigfunc *func );
static Sigfunc * Signal ( int signo, Sigfunc *func );
static void terminate ( void );

/************************************************************************
* *
* Static Global Var *
* *
************************************************************************/

/************************************************************************/

static void Atexit ( void ( *func ) ( void ) )
{
if ( atexit( func ) != 0 )
{
perror( "atexit" );
exit( EXIT_FAILURE );
}
return;
} /* end of Atexit */

/*
* ³õʼ»¯Ðźžä±ú
*/
static void init_signal ( void )
{
int i;

Atexit( terminate );
for ( i = 1; i < 9; i++ )
{
Signal( i, on_terminate );
}
Signal( SIGTERM, on_terminate );
Signal( SIGALRM, on_alarm );
return;
} /* end of init_signal */

static void init_timer ( void )
{
struct itimerval value;

value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval = value.it_value;
Setitimer( ITIMER_REAL, &value, NULL );
} /* end of init_timer */

static void on_alarm ( int signo )
{
static int count = 0;

/*
* ÑÝʾÓã¬ÕâºÜΣÏÕ
*/
fprintf( stderr, "count = %un", count++ );
return;
}

static void on_terminate ( int signo )
{
/*
* Õâ´ÎÎÒÃÇʹÓÃatexit()º¯Êý
*/
exit( EXIT_SUCCESS );
} /* end of on_terminate */

static int Setitimer ( int which, const struct itimerval *value,
struct itimerval *ovalue )
{
int ret;

if ( ( ret = setitimer( which, value, ovalue ) ) < 0 )
{
perror( "setitimer" );
exit( EXIT_FAILURE );
}
return( ret );
} /* end of Setitimer */

Sigfunc * signal ( int signo, Sigfunc *func )
{
struct sigaction act, oact;

act.sa_handler = func;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
if ( signo == SIGALRM )
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
#endif
}
if ( sigaction( signo, &act, &oact ) < 0 )
{
return( SIG_ERR );
}
return( oact.sa_handler );
} /* end of signal */

static Sigfunc * Signal ( int signo, Sigfunc *func )
{
Sigfunc *sigfunc;

if ( ( sigfunc = signal( signo, func ) ) == SIG_ERR )
{
perror( "signal" );
exit( EXIT_FAILURE );
}
return( sigfunc );
} /* end of Signal */

static void terminate ( void )
{
fprintf( stderr, "n" );
return;
} /* end of terminate */

int main ( int arg, char * argv[] )
{
init_signal();
init_timer();
while ( 1 )
{
/*
* ÐγÉ×èÈû£¬½µµÍCPUÕ¼ÓÃÂÊ
*/
getchar();
}
return( EXIT_SUCCESS );
} /* end of main */

/************************************************************************/

--------------------------------------------------------------------------

D: scz <scz@nsfocus.com>

ÌÖÂÛÒ»¸öÎÊÌâ¡£getchar()µÄ×÷ÓÃÊǽµµÍCPUÕ¼ÓÃÂÊ£¬¿ÉÓÃtopÃüÁî²é¿´¡£

timer_sample.cÖл»ÓÃITIMER_PROF/SIGPROFºó£¬Äã»á·¢ÏÖÉÏÊö³ÌÐòÎÞÊä³ö£¬ÎҾݴË
ÈÏΪgetchar()ÐγɵÄ×èÈû²»¼ÆËãÔÚ½ø³ÌÐéÄâʱÖÓÖУ¬Ò²²»ÈÏΪϵͳÕýÔÚΪ½ø³ÌÀûÒæ
¶øÔËÐС£

Èç¹û½øÒ»²½½«getchar()È¥µô£¬Ö±½ÓÒ»¸öwhile()ÎÞÏÞÑ­»·£¬¼´Ê¹»»ÓÃ
ITIMER_PROF/SIGPROF£¬³ÌÐò»¹ÊÇÓÐÊä³ö¡£²»¹ýtopÃüÁî²é¿´µÄ½á¹ûÈÃÄãÍÂѪ£¬CPU¼¸
ºõÎÞ¿ÕÏС£

D: scz <scz@nsfocus.com>

setitimer( ITIMER_REAL, &value, NULL )µ¼Ö·ַ¢SIGALRMÐźţ¬Èç¹ûͬʱʹÓÃ
alarm()£¬ÊƱÏÔì³É³åÍ»¡£´ËÍâ×¢Òâsleep()¡¢pause()µÈº¯Êý´øÀ´µÄ³åÍ»¡£

4. ϵͳ×ÊÔ´Ïà¹ØÎÊÌâ

4.1 Ö÷Á÷Unix²Ù×÷ϵͳÉÏÈçºÎ±à³Ì»ñÈ¡½ø³ÌµÄÄÚ´æ¡¢CPUÀûÓÃ×´¿ö

Q: SolarisÏÂÈçºÎ±à³Ì»ñÖªCPUÕ¼ÓÃÂʺÍÄÚ´æÕ¼ÓÃÐÅÏ¢ÄØ£¬¿ÉÒÆÖ²Âð£¿

Q: ÎÒÏëд¸ö³ÌÐò±éÀúµ±Ç°ÔËÐÐÖеĻ½ø³Ì£¬SolarisÌṩÏàӦϵͳµ÷ÓÃÁËÂð

A: Nicholas Dronen <ndronen@io.frii.com>

²»¿ÉÒÆÖ²¡£man -s 4 proc£¬man -s 3k kstat

Èç¹û²»ÊDZà³Ì£¬¿ÉÒÔÓÃtop¡¢mpstat¡¢vmstat¡¢sar(1)µÈµÈ£¬»¹ÓÐ
/usr/ucb/ps -aux£¬¶ÔÓÚSolarisÀ´Ëµ£¬ºóÕ߸üÖ±½Ó¾«Á¶£¬top²»ÊDZê×¼ÅäÖá£

# /usr/bin/prstat (Solaris 8 prstat(1M)ÊÖ²áÒ³)
# /usr/ucb/ps -aux | head (Solaris 2.x)

Q: Ö÷Á÷Unix²Ù×÷ϵͳÉÏÈçºÎ±à³Ì»ñÈ¡½ø³ÌµÄÄÚ´æ¡¢CPUÀûÓÃ×´¿ö£¬AIX¡¢HP¡¢SUN
process memory usage
process cpu time usage

A: Nate Eldredge <neldredge@hmc.edu>
man -s 3C getrusage

D: СËÄ <scz@nsfocus.com>

ÔÚSPARC/Solaris 2.6/7ϽáÂÛÒ»Ö£¬Ö»Ö§³ÖÁËru_utimeºÍru_stime³ÉÔ±£¬ÆäËû³ÉÔ±
±»ÉèÖóÉ0¡£FreeBSD 4.3-RELEASEÉϲâÊÔ£¬Ôò²»Ö»Ö§³Öru_utimeºÍru_stime³ÉÔ±¡£´Ó
FreeBSDµÄgetrusage(2)ÊÖ²áÒ³¿ÉÒÔ¿´µ½£¬Õâ¸öº¯ÊýÔ´×Ô4.2 BSD¡£

ÖÁÉÙ¶ÔÓÚSPARC/Solaris 2.6/7£¬getrusage(3C)²¢ÎÞ¶à´óÒâÒå¡£

A: Robert Owen Thomas <robt@cymru.com>

¶ÔÓÚSolaris£¬¿ÉÒÔÀûÓÃprocfs½Ó¿Ú£¬ÏÂÃæµÄÀý×Ó»ñȡָ¶¨½ø³ÌµÄÄÚ´æÕ¼ÓÃÇé¿ö

--------------------------------------------------------------------------
/*
* @(#)memlook.c 1.0 10 Nov 1997
* Robert Owen Thomas robt@cymru.com
* memlook.c -- A process memory utilization reporting tool.
*
* gcc -Wall -O3 -o memlook memlook.c
*/
#pragma ident "@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com"

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <sys/syscall.h>
#include <sys/procfs.h>
#include <sys/param.h>
#include <unistd.h>
#include <fcntl.h>

int counter = 10;

int showUsage ( const char * );
void getInfo ( int, int );

int main ( int argc, char * argv[] )
{
int fd, pid, timeloop = 0;
char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */

switch ( argc )
{
case 2:
break;
case 3:
timeloop = atoi( argv[2] );
break;
default:
showUsage( argv[0] );
break;
} /* end of switch */
pid = atoi( argv[1] );
sprintf( pidpath, "/proc/%-d", pid ); /* -±íʾÏò×ó¿¿ */
/*
* /proc/1/ÊÇĿ¼£¬µ«ÔÚÕâÖÖÓ÷¨ÖУ¬¾ÍÊÇÖ±½Ó´ò¿ªÄ¿Â¼£¬²»ÊÇ´ò¿ªÎļþ
*/
if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )
{
perror( pidpath );
exit( 1 );
}
if ( 0 < timeloop )
{
for ( ; ; )
{
getInfo( fd, pid );
sleep( timeloop );
}
}
getInfo( fd, pid );
close( fd );
exit( 0 );
} /* end of main */

int showUsage ( const char * progname )
{
fprintf( stderr, "%s: usage: %s < PID > [time delay]n", progname, progname );
exit( 3 );
} /* end of showUsage */

void getInfo ( int fd, int pid )
{
prpsinfo_t prp;
prstatus_t prs;

if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )
{
perror( "ioctl" );
exit( 5 );
}
if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )
{
perror( "ioctl" );
exit( 7 );
}
if ( counter > 9 )
{
fprintf( stdout, "PIDtIMAGEttRSSttHEAPttSTACKn" );
counter = 0;
}
fprintf( stdout, "%ut%-9ut%-9ut%-15ut%-15un", pid,
( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,
( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );
counter++;
} /* end of getInfo */
--------------------------------------------------------------------------

4.2 SolarisÏÂÈçºÎ»ñÖªCPUËÙÂÊ

A: Philip Brown <phil+s3@bolthole.no-bots.com>

psrinfo -v

psrinfo | grep on-line | wc -l ¼òµ¥¸ø³öCPUÊýÄ¿

A: scz <scz@nsfocus.com>

# /usr/platform/`uname -i`/sbin/prtdiag -v
# /usr/platform/`uname -m`/sbin/prtdiag -v
# /usr/bin/netstat -k cpu_info0

A: Tony Walton <tony.walton@uk.sun.com>

Èç¹ûÄã×°ÁËSun Workshop£¬»¹¿ÉÒÔ³¢ÊÔfpversionÃüÁî

# /opt/SUNWspro/bin/fpversion
A SPARC-based CPU is available.
CPU's clock rate appears to be approximately 266.1 MHz.
Kernel says CPU's clock rate is 270.0 MHz.
Kernel says main memory's clock rate is 90.0 MHz.

Sun-4 floating-point controller version 0 found.
An UltraSPARC chip is available.
FPU's frequency appears to be approximately 277.1 MHz.

Use "-xtarget=ultra2i -xcache=16/32/1:256/64/1" code-generation option.

Hostid = 0x80BC3CB3.
#

4.3 ÈçºÎ±à³Ì»ñÈ¡Solarisϵͳµ±Ç°ÄÚ´æ´óС

Q: ÈçºÎ±à³Ì(»òÕßÓÐʲôÏÖ³ÉÃüÁî)»ñÈ¡Solarisϵͳµ±Ç°ÄÚ´æ´óС£¿

A: Nithyanandham <m.nithyanandham@blr.spcnl.co.in>

¼¸¸öÏÖ³ÉÃüÁî

/usr/platform/`uname -m`/sbin/prtdiag -v | grep Memory

prtconf -v | grep Memory

Èç¹û×°ÁËGNU top£¬Ò²¿ÉÒÔÖ±½ÓÓÃtopÃüÁî¿´µ½¡£

D: scz <scz@nsfocus.com>

truss prtconfµÄÊä³öÖÐÓÐÈçÏÂÄÚÈÝ

sysconfig(_CONFIG_PAGESIZE) = 8192
sysconfig(_CONFIG_PHYS_PAGES) = 16384
Memory size: 128 Megabytes

# /usr/ccs/bin/nm -nx /dev/ksyms | grep "|sysconfig$"
10626] |0x0000100ec110|0x0000000001bc|FUNC |GLOB |0 |ABS |sysconfig
# find /usr/include -type f -name "*.h" | xargs grep -l _CONFIG_PAGESIZE
/usr/include/sys/sysconfig.h
# vi -R /usr/include/sys/sysconfig.h

/*
* cmd values for _sysconfig system call.
* WARNING: This is an undocumented system call,
* therefore future compatibility can not
* guaranteed.
*/

#define _CONFIG_PAGESIZE 6 /* system page size */
#define _CONFIG_PHYS_PAGES 26 /* phys mem installed in pages */

²Î¿´sysconf(3C)ÊÖ²áÒ³¡£

_SC_PAGESIZE
_SC_PAGE_SIZE
_SC_PHYS_PAGES

A: Casper Dik <Casper.Dik@Holland.Sun.COM>

--------------------------------------------------------------------------
/*
* Program to determine the size installed physical memory on Suns.
*
* Casper Dik.
*/

#define MEGABYTE 0x00100000
#define MAXMEM 0x7ff00000
#define THEMEM "/dev/mem"

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

int main ( int argc, char * argv[] )
{
int fd = open( THEMEM, O_RDONLY );
char c;
unsigned long pos, mapstart = 0;
int totmb = 0;

if ( fd == -1 )
{
perror( THEMEM );
exit( 1 );
}
for ( pos = 0; pos < MAXMEM; pos += MEGABYTE )
{
if (lseek( fd, pos, 0 ) == -1 )
{
perror( "lseek" );
exit( 1 );
}
if ( read( fd, &c, 1 ) == -1 )
{
int size = ( pos - mapstart ) / MEGABYTE;

if ( size != 0 )
{
printf( "found %3d MB starting at 0x%pn", size, ( void * )mapstart );
totmb += size;
}
mapstart = pos + MEGABYTE; /* start of next possible mapping */
}
}
printf( "Total memory size: %d MBn", totmb );
exit( 0 );
}
--------------------------------------------------------------------------

ÓÉÓÚÐèÒª¶Á·ÃÎÊ/dev/mem£¬ÆÕͨÓû§Óû§ÎÞ·¨Ê¹ÓøóÌÐò¡£

5. ¿éÉ豸Ïà¹ØÎÊÌâ

5.1 CDROMÉ豸¾¿¾¹ÔÚÄÄÀï

Q: ΪÁËmount¹âÇý£¬ÐèÒªÄÄЩ°ü

A: SUNWvolr SUNWcstl SUNWcstlx

D: Dennis Clarke <dclarke@blastwave.com>

1) su - root
2) /etc/init.d/volmgt stop
3) ls -1 /dev/dsk/c*s2
4) mount -F hsfs -o ro /dev/dsk/c0t6d0s2 /cdrom

»òÕß

1) /etc/init.d/volmgt stop
2) /etc/init.d/volmgt start
3) volcheck
4) eject

¹Û²ì/etc/vold.conf

Q: ÈçºÎ²ÅÄÜÖªµÀÄĸöÉ豸Îļþ¶ÔÓ¦CDROM(c0t2d0s0?)¡£Èç¹ûÓÐÒ»ÕŹâÅÌÔÚCDROMÀ
¿ÉÒÔÓÃdfÃüÁî¿´µ½¶ÔÓ¦µÄÉ豸Îļþ£¬µ«ÊÇûÓйâÅÌÔÚ¹âÇýÀïµÄʱºòÄØ£¿

A: /dev/sr0 ÊÇÒ»¸öÖ¸Ïò×îÖÕÉ豸ÎļþµÄ·ûºÅÁ´½Ó£¬½ö¶ÔSPARCÓÐЧ£¬²»°üÀ¨x86

A: Logan Shaw <logan@cs.utexas.edu>

$ uname -sri
SunOS 5.8 i86pc
$ ls -l /dev/sr*
lrwxrwxrwx /dev/sr0 -> dsk/c1t0d0s2
$

ÎÒÏëx86ÏÂÊÇÒ»ÑùµÄ

Q: E420R£¬Solaris 7 11/99£¬ÎÒ´Óhttp://sunsolve.sun.com»ñµÃһЩ²¹¶¡²¢°²×°ÁË£¬
½á¹ûÏÖÔÚÎҵĹâÇý³öÎÊÌâÁË¡£Ëƺõmount³É¹¦ÁË£¬µ«ÊÇÕÒ²»µ½Îļþ£¬/etc/mnttab
ÖÐûÓÐÈκÎÓйعâÇýµÄÐÅÏ¢£¬²åÈëÒ»ÕŹâÅ̻ᵯ³öÒ»¸öÎļþ¹ÜÀíÆ÷´°¿Ú£¬µ«ÊÇû
ÓÐÎļþ¡£

A: Danny Mann <dma@wwa.com>

¼ì²éÊÇ·ñ´òÁËÈçÏÂSolaris 7Äں˲¹¶¡106541-13ºÍ -14¡£ÕâÁ½¸ö²¹¶¡ÓÐÎÊÌâ¡£½â
¾ö°ì·¨ÊǽûÖ¹vold£¬ÊÖ¹¤mount¹âÇý¡£

A: rschicht@my-deja.com <rschicht@my-deja.com>

ÊÔÊÔvolrmmount -dÃüÁî¡£ÓÃpatchadd -p¼ì²éÊÇ·ñ°²×°Á˲¹¶¡106541-14£¬·ÃÎÊÈç
ÏÂÁ´½Ó

http://sunsolve.Sun.COM/pub-cgi/show.pl?target=patches/patch-access

»ñÈ¡²¹¶¡106541-14µÄ˵Ã÷£¬ÔĶÁNOTE 15¡£

A: ²¹¶¡106541-14µÄ˵Ã÷£¬NOTE 15

1. Ê×ÏȽûÖ¹µôvoldÊØ»¤½ø³Ì
# /etc/init.d/volmgt stop

2. ÊÖ¹¤mount¹âÇý(É豸ÎļþÃû¿ÉÄܲ»Í¬)
# /etc/mount -F hsfs -o ro /dev/dsk/c0t2d0s0 /cdrom

²é¿´/etc/vfstab¡¢/dev/dskÈ·ÈϹâÇýËùÔÚÉ豸ÎļþÃû¡£

5.2 ÈçºÎµ¯³ö¹âÇý

Q: ÔÚ°²×°Oracle 8iʱ£¬ÏµÍ³Ìáʾ²åÈëµÚ¶þÕŹâÅÌ£¬µ«ÊÇ´ËʱÎÞ·¨³É¹¦ejectµÚÒ»ÕÅ
¹âÅÌ£¬ÖÕ¶Ë¹ÒÆð£¬É±µôOracle 8iµÄ°²×°½ø³ÌÒ²ÎÞ¼ÃÓÚÊ¡£Î¨Ò»µÄ°ì·¨ÊÇreset¡£

A: Sergey Kurganov <mmerfi@home.com>

ÏÂÃæµÄ²Ù×÷»òÐíÓÐËù°ïÖú

1) ÖÕÖ¹¾í¹ÜÀíÆ÷
# /etc/init.d/volmgt stop

2) unmount¹âÇý£¬ÊÖ¶¯eject

3) ÖØÆô¾í¹ÜÀíÆ÷
# /etc/init.d/volmgt start

D: plane@smth.org 2002-02-26 01:03

×°Oracle 9µÄʱºò£¬°²×°ÎĵµÌØÒâÌáÐÑÒªÓþø¶Ô·¾¶²ÅÄÜ»»ÅÌ¡£

5.3 ÈçºÎÀûÓ󬼶¿é½øÐлָ´¹¤×÷

Q: Sun¹¤×÷Õ¾ÔÚrebootʱµôµçÁË£¬Óð²×°¹âÅÌÆô¶¯½øÈëµ¥Óû§Ä£Ê½£¬Ö´ÐÐfsckÃüÁîʱ
±¨´í

Stop-A
ok boot cdrom -s

INIT: SINGLE USER MODE
# fsck -o b=32 /dev/rdsk/c0t5d0s*
Alternate super block location: 32.
** /dev/rdsk/c0t5d0s0
BAD SUPER BLOCK: MAGIC NUMBER WRONG
USE AN ALTERNATE SUPER-BLOCK TO SUPPLY NEEDED INFORMATION;
eg. fsck [-F ufs] -o b=# [special ...]
where # is the alternate super block. SEE fsck_ufs(1M).
Alternate super block location: 32.
** /dev/rdsk/c0t5d0s1
BAD SUPER BLOCK: MAGIC NUMBER WRONG
USE AN ALTERNATE SUPER-BLOCK TO SUPPLY NEEDED INFORMATION;
eg. fsck [-F ufs] -o b=# [special ...]
where # is the alternate super block. SEE fsck_ufs(1M).
Alternate super block location: 32.
** /dev/rdsk/c0t5d0s2
BAD SUPER BLOCK: MAGIC NUMBER WRONG
USE AN ALTERNATE SUPER-BLOCK TO SUPPLY NEEDED INFORMATION;
eg. fsck [-F ufs] -o b=# [special ...]
where # is the alternate super block. SEE fsck_ufs(1M).
Alternate super block location: 32.

A: Sree Mokkapati <sree@broadcom.com>

ÕýÈ·µÄÓ÷¨¾ÍÔÚ´íÎóÌáʾÐÅÏ¢ÀÄãÓ¦¸ÃʹÓÃÁíÍâµÄ³¬¼¶¿é½øÐлָ´¹¤×÷£¬32½ö
½öÊdz£Óñ¸·Ý³¬¼¶¿éÖ®Ò»¡£

fsck -F ufs -o b=32 device_name

´ËÍâÈç¹ûÏëÖªµÀ»¹ÓÐÄÄЩ±¸·Ý³¬¼¶¿é¿ÉÓã¬Ö´ÐÐ

newfs -Nv device_name

ÏÈÓÃdfµÈÃüÁîÈ·ÈÏԭʼdevice_name¡£

D: scz <scz@nsfocus.com> 2001-10-12 17:01 ÐÞ¶©

SPARC/SolarisµÄÓ²ÅÌË𻵶à°ëÊÇÎļþϵͳ¸ùÇø±»ÆÆ»µ£¬²¢²»ÐèÒª²ðжӲÅ̵½ÆäËû
»úÆ÷ÉÏmountºófsck£¬ÕÒÒ»ÕÅSolaris°²×°¹âÅÌ

Stop-A½øÈëOBP״̬£¬ÔÚokÌáʾ·ûÏÂÊäÈë

ok> boot cdrom -s

½øÈëµ¥Óû§Ä£Ê½¡£´ËʱԭÓиùÎļþϵͳ²¢Î´mountÉÏÀ´£¬Ò²²»ÐèÒªmountÔ­ÓиùÎÄ
¼þϵͳ£¬Ö±½Ó

newfs -Nv /dev/rdsk/c0t0d0s0

ÕÒ³öÔ­¸ùÎļþϵͳËùÓб¸·Ý³¬¼¶¿éºÅ

fsck -y -F ufs -o b=<ÈÎÒ»±¸·Ý³¬¼¶¿éºÅ> /dev/rdsk/c0t0d0s0

ÕâÀï¼ÙÉèÔ­¸ùÎļþϵͳµÄԭʼÉ豸ÃûÊÇ/dev/rdsk/c0t0d0s0¡£ÆäËûÎļþϵͳµÄÔ­
ʼÉ豸Ãû¿ÉÒÔÔÚϵͳÍêºÃʱ df -k »ñÈ¡£¬»òÕß´Ó/etc/vfstabÖлñÈ¡ÐÅÏ¢¡£±ÈÈç

/dev/rdsk/c0t0d0s0 /
/dev/rdsk/c0t0d0s6 /usr
/dev/rdsk/c0t0d0s7 /export/home

vfstab(4)½âÊ͵úÜÄ£ºý£¬»ØÍ·ÎÒÉÏwww.google.comÈ¥ÕÒÕÒÆäËû×ÊÁÏ¡£

The fsck pass value of 2 means that the file system will be checked,
but not sequentially

5.4 Solaris Root¿ÚÁîÍü¼ÇÁË

Q: Íü¼ÇÁËroot¿ÚÁÔõô°ì

A: Steve Menard <opsmaster@yahoo.com>

Æô¶¯Ê±°´Stop-A½øÈëokÌáʾ·û
ok boot cdrom -s (·ÅÈëÆô¶¯°²×°¹âÅÌ)
mount /dev/dsk/c0t0d0s0 /mnt (ÕâÀïÖ¸¶¨Ô­¸ùÇø¶ÔÓ¦µÄԭʼÉ豸Ãû)
TERM=vt100;export TERM
vi /mnt/etc/shadow
ɾ³ýroot¿ÚÁî¼ÓÃÜ´®£¬±ÈÈç
root:WxzL460hohWsU:10724::::::
ɾ³ýWxzL460hohWsU£¬È·ÈÏÄ㻹ÓÐ8¸öðºÅ£¬ÖØÆô¶¯

»òÕß /usr/sbin/reboot -- "cdrom -s"

A: Philip Brown <phil+s3@bolthole.no-bots.com>

ʹÓÃviÓкܶàÂé·³µÄµØ·½£¬¿ÉÒÔ¿¼ÂÇsed
mount /dev/dsk/c0t0d0s0 /mnt
sed 's/:WxzL460hohWsU:/::/' /mnt/etc/shadow > s
mv s /mnt/etc/shadow

»òÕßʹÓÃed
mount /dev/dsk/c0t0d0s0 /mnt
ed /mnt/etc/shadow
1s/root:[^:]*:/root::/ (×¢Òâ£¬Ç°ÃæÊÇ1£¬²»ÊÇl)
w
q

5.5 ÈçºÎʹÓÃfmthard

A: Se¨¢n Boran <sean@boran.com>

Èç¹ûÏ£Íû¶ÔµÚ¶þ¿éÎïÀíÓ²Å̵ķÖÇøÓëµÚÒ»¿éÎïÀíÓ²ÅÌÒ»Ñù£¬¿¼ÂÇfmthardºÍprtvtocµÄ
½áºÏʹÓã¬Òª±ÈÊÖ¹¤format¿ìµÃ¶à¡£±ÈÈ磬µÚÒ»¿éÎïÀíÓ²ÅÌÊÇtarget 3£¬µÚ¶þ¿éÎïÀí
Ó²ÅÌÊÇtarget 1£¬ÎÒÃÇÏ£ÍûµÚ¶þ¿éÎïÀíÓ²ÅÌ´ÅÅ̾í±êÊÇ"mirror"£¬×öÈçϲÙ×÷£º

/usr/sbin/prtvtoc /dev/rdsk/c0t3d0s2 | /usr/sbin/fmthard -n mirror -s - /dev/rdsk/c0t1d0s2

man -s 1M fmthardÁ˽â¸ü¶àϸ½Ú¡£

5.6 ÈçºÎ´Ó¹âÅָ̻´Solaris 7µÄÒýµ¼ÉÈÇø

A: paranoid@bbs.tsinghua.edu.cn

ÔÚ°²×°ÅÌÀïÓÐÒ»¸ötoolsĿ¼£¬½øÈ¥ºóÓÐÒ»¸öÃüÁî½Ð×öinstallboot

A: melonm@bbs.tsinghua.edu.cn

±ÈÈç
installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c0t1d0s0

5.7 SolarisÖ§³ÖÀàËÆÎ¢Èíautorun.infÎļþµÄ¹¦ÄÜÂð

Q: ÎÒ×Ô¼ºÖÆ×÷ÁËÒ»ÕŹâÅÌ£¬Í¬Ê±ÓÃÓÚSolarisºÍWindows¡£ÔÚWindows»·¾³Ï£¬¿ÉÒÔÀû
ÓÃautorun¹¦ÄÜ£¬µ±²åÈë¹âÅ̵Äʱºò×Ô¶¯µ÷ÓÃϲ°®µÄä¯ÀÀÆ÷´ò¿ªÒ»¸öÎļþ¡£²»ÖªµÀ
Solaris 7/8ÏÂÊÇ·ñ´æÔÚÀàËÆ¹¦ÄÜ¡£

A: hakteng

Êǵ쬴ÓSolaris 8(CDE version 1.4)¿ªÊ¼Ö§³ÖÀàËÆ¹¦ÄÜÁË

o ´´½¨Ò»¸öÃûΪ"volstart"µÄ½Å±¾Îļþ£¬±ÈÈç

--------------------------------------------------------------------------
#! /bin/ksh
#
# This is a CD volume start script. This start script is designed
# to be automatically run when the CD is inserted into a Solaris
# system's CDrom drive.
#
# Note: not all Solaris systems have an auto volstart ability. If this
# CD is inserted into a CDrom drive of a Solaris system without the
# volstart ability, volstart can also be run manually by executing it
# from either the desktop's file manager or from a Unix command line.
full_name=$0
dir_name=`/usr/bin/dirname $full_name`
if [[ -x /usr/dt/bin/dtaction ]]; then
# Run the CDrom's installer program
/usr/dt/bin/dtaction Run $dir_name/installer
fi
--------------------------------------------------------------------------

o ½«"volstart"Îļþ·ÅÔÚ¹âÅ̸ùĿ¼ÏÂ

o /usr/dt/bin/sdtvolcheck½Å±¾ÖдæÔÚÈçÏÂÓï¾ä
if [[ -x $mountPt/volstart ]];then exec $mountPt/volstart;
ÓÚÊÇ£¬µ±²åÈë¹âÅ̵Äʱºòvolstart½Å±¾±»Ö´ÐУ¬¶ÔÓÚÉÏÀý£¬×îÖÕµ¼ÖÂinstaller±»
Ö´ÐÐ

5.8 ÈçºÎÐÞ¸Ä/dev/nullµÄÊôÐÔ

Q: /devices/pseudo/mm@0:nullµÄÊôÐÔÊÇ0620 root tty£¬ÎÒÏë
chmod 666 /devices/pseudo/mm@0:null £¬µ«ÊǼ¸·ÖÖÓºó£¬ÊôÐÔ±»Ð޸ĻØ
0620 root tty£¬Ôõô°ì

A: Markus Mayer <mmayer@iname.com>

²é¿´/etc/minor_permÎļþ£¬

# grep -s null /etc/minor_perm
mm:null 0620 root tty

Ð޸ĸÃÎļþÖеÄÕâÒ»ÐгÉ"mm:null 0666 root sys"¼´¿É¡£

5.10 ÈçºÎ×Ô¼ºÖÆ×÷SolarisÆô¶¯ÈíÅÌ

Q: ÎÒÖªµÀ¿ÉÒÔÈ¥
http://soldc.sun.com/support/drivers/dca_diskettes/
ÏÂÔØÆô¶¯ÈíÅ̵ÄÓ³ÏóÎļþ£¬¿ÉÎÒ»¹ÏëÖªµÀËü×î³õÊÇÈçºÎÖÆ×÷³öÀ´µÄ

A: СËÄ <scz@nsfocus.com>

1) ÓÃfdformt¸ñʽ»¯ÈíÅÌ

2) ÓÃnewfsÔÚÈíÅÌÉÏ´´½¨ÐµÄÎļþϵͳ

3) ½«ÈíÅÌmountÉÏÀ´

4) ÓÃcpÃüÁî¸´ÖÆthe second-level disk booter(boot»òÕßufsboot)µ½ÈíÅÌ£¬±ÈÈç
/platform/sun4u/ufsboot¡£²Î¿´installboot(1M)¡¢boot(1M)ÊÖ²áÒ³

5) ÓÃinstallbootÃüÁî°²×°boot blockµ½ÈíÅÌ£¬±ÈÈç
installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1t0d0s0

6) ÓÃcpÃüÁî¸´ÖÆ±ØÒªµÄ¹¤¾ßÎļþµ½ÈíÅÌ

7) unmountÈíÅÌ

8) ÓÃejectÃüÁ³öÈíÅÌ

5.11 x86/SolarisÈçºÎ·ÃÎÊFAT32·ÖÇø

A: Dan Anderson <dan@drydog.com>

mount -F pcfs /dev/dsk/c0t0d0p0:1 /mnt/<...> # SCSI
mount -F pcfs /dev/dsk/c0d0p0:1 /mnt/<...> # ATAPI

c0 ¿ØÖÆÆ÷ID
t0 SCSI ID (¶ÔÓÚATAPIÊ¡ÂÔ)
d0 ¶ÔÓÚSCSI×ÜÊÇ0£¬¶ÔÓÚATAPIÊÇÓ²Å̺Å
p0 p0¶ÔÓ¦µÚÒ»¸öÖ÷·ÖÇø±íÏî
:1 ¶ÔÓ¦Âß¼­Çý¶¯Æ÷(c - z »ò 1 - 24)

ÓÐЩ±¨¸æËµÈç¹ûFAT32·ÖÇø²»¶ÔÓ¦µÚÒ»¸öÖ÷·ÖÇø±íÏmountʧ°Ü£¬¸Ð¾õx86/Solaris
¶ÔpcfsÖ§³Ö»ìÂÒ¡£

A: spp(µÍÒôÅÚ)

ÔÚSPARC/Solaris 7ÉÏdf -k

# df -k
/dev/dsk/c0t0d0s0 /
/dev/dsk/c0t0d0s6 /usr
/dev/dsk/c0t0d0s7 /export/home

ÔÚx86/Solaris 8ÉÏdf -k

# df -k
/dev/dsk/c0d0s0 /
/dev/dsk/c0d0s7 /export/home

c Ó²ÅÌ¿ØÖÆÆ÷µÄλÖ㬱ÈÈçÖ÷°åµÚ¶þ¸öIDE½Ó¿ÚÉϵĵÚÒ»¸öÓ²ÅÌ(Ö÷ÅÌ)¶ÔÓ¦c1d0
t Ö»SPARCÓУ¬SCSI ID
d ijһȷ¶¨Ó²ÅÌ¿ØÖÆÆ÷(c²ÎÊý¾ö¶¨)ÉÏÓ²ÅÌλÖÃ
p Ö»x86ÓУ¬¶ÔÓ¦MSϵͳµÄPartition¸ÅÄî
s sliceºÅ£¬SolarisϵͳµÄ¸ÅÄ²»Ì«ºÃ½âÊÍ£¬Èç¹ûºÍpÒ»Æð³öÏÖ£¬¿ÉÒÔÀí½â³ÉÀàËÆ
MSÂß¼­Çý¶¯Æ÷µÄ¸ÅÄî

¼ÙÉèx86¼Ü¹¹ÉÏijӲÅÌÔÚÖ÷Òýµ¼ÉÈÇøÓÐÁ½¸öÖ÷·ÖÇø±íÏµÚÒ»¸öΪFAT32·ÖÇø£¬µÚ¶þ¸ö
ΪSolaris·ÖÇø£¬Solaris·ÖÇøÉÏ»®·ÖÁËÁ½¸öslice£¬Ò»¸öΪ¸ùÎļþϵͳ/¡¢Ò»¸öΪswap
Çø£¬Ôò·Ö±ð±íʾΪ/dev/dsk/c1d0p0:1(FAT32)¡¢/dev/dsk/c1d0p1s0(/)¡¢
/dev/dsk/c1d0p1s1(swap)

ÔÚmount FAT32·

×ªÔØ×Ô£ºhttp://www.unlinux.com/doc/program/20051026/2426.html

¡¾ÆÀÂÛ¡¿ ¡¾¼ÓÈëÊղؼС¿ ¡¾´ó ÖРС¡¿ ¡¾´òÓ¡¡¿ ¡¾¹Ø±Õ¡¿
 *  Çë×ðÖØÎÒÃǵÄÀͶ¯£¬×ªÔØÇë×¢Ã÷³ö×ÔUnLinux.Com¼°×÷ÕßÃû * 

¡ù Ïà¹ØÁ´½Ó
 ¡¤ÔÚUnixÏÂÓÃC±àдcurses³ÌÐòµÄһЩ³£ÓÃÄ£¿é  (2005-10-26 16:54:01)
 ¡¤linux/Unix»·¾³ÏµÄmakeºÍmakefileÏê½â  (2005-10-26 16:53:59)
 ¡¤UnixϵͳϹâÅ̼̿  (2005-10-26 16:53:49)
 ¡¤UNIXϵͳ¹Ø»ú·½·¨ÎåÖÖ  (2005-10-26 13:57:00)
 ¡¤UNIXµÄÆô¶¯ºÍ¹Ø»ú¹ý³Ì  (2005-10-26 13:56:19)
 ¡¤UNIXµÄÆô¶¯ºÍ¹Ø»ú¹ý³Ì  (2005-10-26 13:56:19)
 ¡¤ÓÃDOSÃüÁîÆÆ³ýUNIXϵͳ¹ÜÀíÔ±¿ÚÁî  (2005-10-26 13:56:18)
 ¡¤grubÄÜÒýµ¼sco unix505Âð  (2005-10-26 13:56:14)
 ¡¤¿ÉÒÔÓÃÒÔÏÂWindowsÈí¼þѧϰLinux/UNIX  (2005-10-26 03:50:09)
 ¡¤×¢½â¸ß¶ËUNIX·þÎñÆ÷Ö®¼¼Êõ  (2005-10-26 03:50:09)

Copyright © 2005 UnLinux.Com All Rights Reserved