A. linux裡面編譯安裝顯卡驅動失敗求高手幫助
源碼包的位置不正確,你可以在./config 的時候指定內核源碼包位置。一般linux將內核源碼裝在了/usr/src/linux下,如果你所用的內核版本與源碼包的版本不一致,則你要更新源碼包,並重新生成生成version.h文件:
makeinclude/linux/version.h
makeinclude/asm
ls-l/lib/moles/3.x.x.x
其中3.x.x.x是你的源碼包內核版本號。
然後,你再編譯一次驅動,應該就能編譯成功了。
B. Linux進程查看的who命令
該命令主要用於查看當前在線上的用戶情況。這個命令非常有用。如果用戶想和其他用戶建立即時通訊,比如使用talk命令,那麼首先要確定的就是該用戶確實在線上,不然talk進程就無法建立起來。又如,系統管理員希望監視每個登錄的用戶此時此刻的所作所為,也要使用who命令。
who命令的常用語法格式如下:
who[imqsuwHT] [--count] [--idle] [--heading] [--help] [--message] [--mesg] [--version] [--writable] [file] [am i]
所有的選項都是可選的,也就是說可以單獨使用who命令。
不使用任何選項時,who命令將顯示以下三項內容:
login name:登錄用戶名;
terminal line:使用終端設備;
login time:登錄到系統的時間。
如果給出的是兩個非選項參數,那麼who命令將只顯示運行who程序的用戶名、登錄終端和登錄時間。通常這兩個參數是「am i」,即該命令格式為:「whoam i」。
下面對who命令的常用參數進行說明。
-m 和「whoam i」的作用一樣,顯示運行該程序的用戶名。
-q,--count 只顯示用戶的登錄帳號和登錄用戶的數量,該選項優先順序高於其他任何選項。
-s 忽略。主要是用於和其他版本的who命令兼容。
-i,-u,--idle 在登錄時間後面顯示該用戶最後一次對系統進行操作至今的時間,也就是常說的「發呆」時間。
-H,--heading 顯示一行列標題。常用的標題如表4-2所示。
表4-2who命令輸出常用標題
標 題
說 明
USER
用戶登錄帳號
LINE
用戶登錄使用終端
LOGIN-TIME
用戶登錄時間
IDLE
用戶空閑時間,即未進行操作的時間
PID
用戶登錄shell的進程ID
FROM
用戶網路地址
-w,-T--mesg,--message,--writable 和-s選項一樣,在登錄帳號後面顯示一個字元來表示用戶的信息狀態:
+:允許寫信息;
-:不允許寫信息;
?:不能找到終端設備。
--help 在標准輸出上顯示幫助信息。
--version 在標准輸出上顯示版本信息。
下面介紹who命令的一些基本用法。
如果需要查看在系統上究竟有哪些用戶,可以直接使用who命令。
[例17] 查看登錄到系統的用戶情況
$who
root tty1 Mar 17 13:49
foxytty2 Mar 17 13:49
root tty3 Mar 17 13:49
bbs ttyp0 Mar 17 13:49 (river.net)
可以看到,現在系統一共有四個用戶。第一列是登錄用戶的帳號;第二列是登錄所使用的終端;第三列是登錄時間;第四列是用戶從什麼地方登錄的網路地址,這里是域名。
一般來說,這樣就可以了解登錄用戶的大致情況了。但有時上面的顯示不是那麼直觀,因為沒有標題說明,不容易看懂,這時就需要使用-H選項了。
[例18] 查看登錄用戶的詳細情況,鍵入:
$who-uH
顯示如下:
USER LINE LOGIN-TIME IDLE FROM
root tty1 Mar 17 13:49 .
foxytty2 Mar 17 13:49 00:01
root tty3 Mar 17 13:49 00:01
bbs ttyp0 Mar 17 13:49 00:01 (river.net)
這樣一目瞭然。其中-u選項指定顯示用戶空閑時間,所以可以看到多了一項IDLE。第一個root用戶的IDLE項是一個「.」,這就說明該用戶在前1秒仍然是活動的,而其他用戶後面都有一個時間,稱為空閑時間。
最後來看看使用「whoam i」格式命令的結果:
233.river.net!root tty1 Mar 17 13:49
可見只顯示出了運行該who命令的用戶情況,當然這時候不存在空閑時間。
who命令應用起來非常簡單,可以比較准確地掌握用戶的情況,所以使用非常廣泛。
C. Linux鍛戒護-鏂囦歡綆$悊鍛戒護
linux緋葷粺鍥犲叾浼樼鐨勭ǔ瀹氭у拰瀹夊叏鎬э紝琚瓚婃潵瓚婂氱殑浼佷笟鏈嶅姟鍣ㄥ簲鐢ㄣ傞殢涔嬭屾潵鐨勮秺鏉ヨ秺澶氱殑浜哄︿範浣跨敤linux錛岃屽仛涓簂inux緋葷粺鐨勫熀紜linux鍛戒護鏇存槸蹇呭︽棤鐤戠殑錛屽皬緙栦粖澶╄窡澶у跺垎浜涓綃囧皬緙栫簿蹇冪紪杈戠殑鏂囩珷鈥渓inux鍛戒護-鏂囦歡綆$悊鍛戒護鈥濓紝甯屾湜鑳藉府鍒板ぇ閮ㄥ垎鐨刲inux鍒濆﹁呫
cat 鍔熻兘錛氭湁浠庣佺洏鍒涘緩鏂囦歡鐨勫姛鑳斤紙浣嗕笉鍏峰囩紪杈戝姛鑳斤級錛屼絾涓昏佸姛鑳借繕鏄2涓鎴栬呬互涓婃枃浠剁殑鍚堝苟銆 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細 -n 鎴--number 鐢1 寮濮嬪規墍鏈夎緭鍑虹殑琛屾暟緙栧彿銆 -b 鎴--number-nonblank 鍜-n 鐩鎬技錛屽彧涓嶈繃瀵逛簬絀虹櫧琛屼笉緙栧彿銆 浣跨敤鏂規硶錛 Cat 鈥搉 diannaob1diannaob2,鎶奷iannaob1閲岀殑鍐呭瑰姞涓婅屽彿浠ュ悗騫跺叆diannaob2銆 Cat 鈥揵 diannaob1 diannaob2diannaob3,瀵筪iannaob1鍜宒iannaob2閲岀殑鍐呭瑰姞涓婅屽彿錛堢┖鐧借屼笉鍔狅級騫跺叆diannaob3銆
chattr 鍔熻兘錛氱粰鎸囧畾鏂囦歡娣誨姞錛屽幓鎺夛紝璧嬩簣灞炴с 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細 -R 閫掑綊澶勭悊錛屽皢鎸囧畾鐩褰曚笅鐨勬墍鏈夋枃浠跺強瀛愮洰褰曚竴騫跺勭悊銆 -v鐗堟湰緙栧彿 璁劇疆鏂囦歡鎴栫洰褰曠増鏈銆 -V 鏄劇ず鎸囦護鎵ц岃繃紼嬨 +灞炴 寮鍚鏂囦歡鎴栫洰褰曠殑璇ラ」灞炴с -灞炴 鍏抽棴鏂囦歡鎴栫洰褰曠殑璇ラ」灞炴с =灞炴 鎸囧畾鏂囦歡鎴栫洰褰曠殑璇ラ」灞炴с a錛氳╂枃浠舵垨鐩褰曚粎渚涢檮鍔犵敤閫斻 b錛氫笉鏇存柊鏂囦歡鎴栫洰褰曠殑鏈鍚庡瓨鍙栨椂闂淬 c錛氬皢鏂囦歡鎴栫洰褰曞帇緙╁悗瀛樻斁銆 d錛氬皢鏂囦歡鎴栫洰褰曟帓闄ゅ湪鍊懼掓搷浣滀箣澶栥 i錛氫笉寰椾換鎰忔洿鍔ㄦ枃浠舵垨鐩褰曘 s錛氫繚瀵嗘у垹闄ゆ枃浠舵垨鐩褰曘 S錛氬嵆鏃舵洿鏂版枃浠舵垨鐩褰曘 u錛氶勯槻浠ュ栧垹闄ゃ 浣跨敤鏂規硶錛 姣斿俤iannaob1榪欎釜鏂囦歡涓轟簡鏂瑰紡琚鍏朵粬linux鐢ㄦ埛鍒犻櫎錛屽彲浠ョ粰鍏舵坊鍔犻勯槻浠ュ栧垹闄ゅ睘鎬с Chattr +u diannaob1
chgrp 鍔熻兘錛氭洿鏀圭洰褰曟垨鑰呮枃浠舵墍灞炵殑緹ょ粍銆 浣跨敤鏂規硶錛 姣斿傛妸diannaob1鏂囦歡縐誨姩鍒癲iannaob緇勯噷錛欳hgrp diannaob diannaob1
cmp 鍔熻兘錛氱敤鏉ユ瘮杈冩枃浠朵箣闂寸殑涓嶅悓錛屽傛灉鐩稿悓涓嶈繑鍥炰換浣曚俊鎮錛屼笉鍚岀殑鍦版柟鍒楀嚭瀛楃﹀拰鍒楁暟緙栧彿銆 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細 -c鎴--print-chars 銆闄や簡鏍囨槑宸寮傚勭殑鍗佽繘鍒跺瓧鐮佷箣澶栵紝涓騫舵樉紺鴻ュ瓧絎︽墍瀵瑰簲瀛楃︺ -i瀛楃︽暟鐩鎴--ignore-initial=瀛楃︽暟鐩 銆鎸囧畾涓涓鏁扮洰銆 -l鎴--verbose 銆鏍囩ず鍑烘墍鏈変笉涓鏍風殑鍦版柟銆 -s鎴--quiet鎴--silent 銆涓嶆樉紺洪敊璇淇℃伅銆 -v鎴--version 銆鏄劇ず鐗堟湰淇℃伅銆 --help 銆鍦ㄧ嚎甯鍔┿ 浣跨敤鏂規硶錛 姣斿傛瘮杈冩枃浠禿iannaob1鍜宒iannaob2鏈変粈涔堝悓 Cmp diannaob1 diannaob2閰嶅悎浣跨敤鐨勫弬鏁板姞鍦╟mp鍜屾枃浠朵箣闂淬
file 鍔熻兘錛氳鯨璇嗘枃浠剁被鍨嬨 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細 -b 銆鍒楀嚭杈ㄨ瘑緇撴灉鏃訛紝涓嶆樉紺烘枃浠跺悕縐般 -c 銆璇︾粏鏄劇ず鎸囦護鎵ц岃繃紼嬶紝渚誇簬鎺掗敊鎴栧垎鏋愮▼搴忔墽琛岀殑鎯呭艦銆 -f鍚嶇О鏂囦歡 銆鎸囧畾鍚嶇О鏂囦歡錛屽叾鍐呭規湁涓涓鎴栧氫釜鏂囦歡鍚嶇О鍛㈡劅錛岃ゝile渚濆簭杈ㄨ瘑榪欎簺鏂囦歡錛屾牸寮忎負姣忓垪涓涓鏂囦歡鍚嶇О銆 -L 銆鐩存帴鏄劇ず絎﹀彿榪炴帴鎵鎸囧悜鐨勬枃浠剁殑綾誨埆銆 -m欖旀硶鏁板瓧鏂囦歡 銆鎸囧畾欖旀硶鏁板瓧鏂囦歡銆 -v 銆鏄劇ず鐗堟湰淇℃伅銆 -z 銆灝濊瘯鍘昏В璇誨帇緙╂枃浠剁殑鍐呭廣 浣跨敤鏂規硶錛 姣斿傝佽鯨鍒玠iannaob1鐨勬枃浠剁被鍨 File diannaob1 鏂囦歡浣嶇疆
find 鍔熻兘錛氭牴鎹鍚勭嶉渶奼傦紙鍚嶇О銆佺被鍒銆佹椂闂淬佸ぇ灝忋佹潈闄愮瓑錛夊湪鎸囧畾鐨勭洰褰曞唴瀵繪壘絎﹀悎瑕佹眰鐨勬枃浠躲 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細 -mount, -xdev : 鍙媯鏌ュ拰鎸囧畾鐩褰曞湪鍚屼竴涓妗f堢郴緇熶笅鐨勬。妗堬紝閬垮厤鍒楀嚭鍏跺畠妗f堢郴緇熶腑鐨勬。妗 -amin n : 鍦ㄨ繃鍘籲 鍒嗛挓鍐呰璇誨彇榪 -anewer file : 姣旀。妗坒ile 鏇存櫄琚璇誨彇榪囩殑妗f -atime n : 鍦ㄨ繃鍘籲 澶╄繃璇誨彇榪囩殑妗f -cmin n : 鍦ㄨ繃鍘籲 鍒嗛挓鍐呰淇鏀硅繃 -cnewer file :姣旀。妗坒ile 鏇存柊鐨勬。妗 -ctime n : 鍦ㄨ繃鍘籲 澶╄繃淇鏀硅繃鐨勬。妗 -empty : 絀虹殑妗f-gid n or -group name : gid 鏄痭 鎴栨槸group 鍚嶇О鏄痭ame -ipath p, -path p : 璺寰勫悕縐扮﹀悎p 鐨勬。妗堬紝ipath 浼氬拷鐣ュぇ灝忓啓 -name name, -iname name : 妗f堝悕縐扮﹀悎name 鐨勬。妗堛俰name 浼氬拷鐣ュぇ灝忓啓 -size n : 妗f堝ぇ灝忔槸n 鍗曚綅錛宐 浠h〃512 浣嶅厓緇勭殑鍖哄潡錛宑 琛ㄧず瀛楀厓鏁幫紝k 琛ㄧずkilo bytes錛寃 鏄浜屼釜浣嶅厓緇勩-type c : 妗f堢被鍨嬫槸c 鐨勬。妗堛 d: 鐩褰 c: 瀛楀瀷瑁呯疆妗f b: 鍖哄潡瑁呯疆妗f p: 鍏峰悕璐鍒 f: 涓鑸妗f l: 絎﹀彿榪炵粨 浣跨敤鏂規硶錛 灝嗙洰鍓嶇洰褰曞強鍏跺瓙鐩褰曚笅鎵鏈夊歡浼告。鍚嶆槸c 鐨勬。妗堝垪鍑烘潵銆 find . -name "*.c" 灝嗙洰鍓嶇洰褰曞叾鍏朵笅瀛愮洰褰曚腑鎵鏈変竴鑸妗f堝垪鍑 find . -ftype f 灝嗙洰鍓嶇洰褰曞強鍏跺瓙鐩褰曚笅鎵鏈夋渶榪20 鍒嗛挓鍐呮洿鏂拌繃鐨勬。妗堝垪鍑篺ind . -ctime -20
git 鍔熻兘錛氭枃瀛楁ā寮忎笅鐨勬枃浠剁$悊鍛橈紝榪涘叆涔嬪悗錛屽彲浠ヨ繘琛屽悇縐嶆枃浠剁殑鎿嶄綔銆 甯擱厤鍚堜嬌鐢ㄥ弬鏁幫細F1 錛氭墽琛宨nfo鎸囦護錛屾煡璇㈡寚浠ょ浉鍏充俊鎮錛屼細瑕佹眰鎮ㄨ緭鍏ユ叉煡璇㈢殑鍚嶇О銆 F2 錛氭墽琛宑at鎸囦護錛屽垪鍑烘枃浠跺唴瀹廣 F3 錛氭墽琛実itview鎸囦護錛岃傜湅鏂囦歡鍐呭廣 F4 錛氭墽琛寁i鎸囦護錛岀紪杈戞枃浠跺唴瀹廣 F5 錛氭墽琛宑p鎸囦護錛屽嶅埗鏂囦歡鎴栫洰褰曪紝浼氳佹眰鎮ㄨ緭鍏ョ洰鏍囨枃浠舵垨鐩褰曘 F6 錛氭墽琛宮v鎸囦護錛岀Щ鍔ㄦ枃浠舵垨鐩褰曪紝鎴栨槸鏇存敼鍏跺悕縐幫紝浼氳佹眰鎮ㄨ緭鍏ョ洰鏍囨枃浠舵垨鐩褰曘 F7 錛氭墽琛宮kdir鎸囦護錛屽緩絝嬬洰褰曘 F8 錛氭墽琛宺m鎸囦護錛屽垹闄ゆ枃浠舵垨鐩褰曘 F9 錛氭墽琛宮ake鎸囦護錛屾壒澶勭悊鎵ц屾寚浠ゆ垨緙栬瘧紼嬪簭鏃訛紝浼氳佹眰鎮ㄨ緭鍏ョ浉鍏沖懡浠ゃ F10 錛氱誨紑git鏂囦歡綆$悊鍛樸
cut 鍔熻兘錛氱敤浜庝粠鏂囦歡鎴栬呮爣鍑嗚緭鍏ヤ腑璇誨彇鍐呭瑰苟鎴鍙栨瘡涓琛岀殑鐗瑰畾閮ㄥ垎騫墮佸埌鏍囧噯杈撳嚭銆 閰嶅悎浣跨敤鍙傛暟錛 -b 瀛楄妭錛坆ytes錛 -c 瀛楃︼紙characters錛 -f 鍩燂紙fields錛 浣跨敤鏂規硶錛 濡傛棩鏈燂細dc oct 10 21:15:54 PDT 2012 Date |cut 鈥揵 1-4 杈撳嚭dc o錛岃〃紺哄彇鍓4涓瀛楄妭錛屽叾涓絀烘牸涔熺畻涓涓瀛楄妭銆 Date |cut 鈥揷 1-4 杈撳嚭dc o錛岀湅浼艱窡-b娌℃湁鍖哄埆錛屼絾鏄濡傛灉鏃ユ湡鎹㈡垚奼夊瓧灝辨湁鍖哄埆浜嗭紝鍥犱負涓涓奼夊瓧綆3涓瀛楄妭銆 澶氫釜瀹氫綅涔嬮棿鐢ㄩ楀彿闅斿紑錛 Date |cut 鈥揵 1-4,6 杈撳嚭鍓4涓瀛楄妭鍜岀6涓瀛楄妭錛歞c ot 鍒嗗壊鍩燂細 濡傦細 service1:pts/0:Oct 9 20:27: (211.95.114.235) service2:pts/1:Oct 9 21:06: (218.80.203.242) service3:pts/2:Oct 9 14:35: (218.80.203.242) service4:pts/3:Oct 9 21:07: (218.80.213.242) service5:pts/4:Oct 9 21:07: (218.80.213.242) service6:pts/5:Oct 9 21:45: (58.31.205.19) cut 鈥揹: -f1 f.txt 鎶奻.txt榪欎釜鏂囦歡鎸夛細鍒嗗壊鎴愬煙錛屽彇鍩1 杈撳嚭錛 service1 service2 service3 service4 service5 service6 linux瀛︿範錛氬噯淇″煿璁涓蹇冿紙training.zhunxin.net錛 2.in 鍔熻兘錛氬壋寤鴻繛鎺ワ紙綾諱技浜巜indow涓嬪壋寤鴻秴閾炬帴錛 浣跨敤鏂規硶錛 鎶婂皢鐩褰/usr/menggc/mub l涓嬬殑鏂囦歡m2.c閾炬帴鍒扮洰J/usr/1iu涓嬬殑鏂囦歡a2.c In /usr/menggc/mub l/m2.c J/usr/1iu/a2.c 鏈鏉J/usr/1iu鐩褰曚笅娌℃湁a2.c鏂囦歡錛屽綋閾炬帴鎴愬姛鏃跺氨浼氬嚭鐜癮2.c鏂囦歡銆 In 閫夐」婧愭枃浠剁洰鏍囨枃浠
less 鍔熻兘錛氭煡鐪嬫枃浠 浣跨敤鏂規硶錛 Less 鏂囦歡鍚 Less鐨勪綔鐢ㄥ拰more宸涓嶅氾紝涓嶅悓鐨勬槸less 鍏佽鎬嬌鐢ㄨ呭線鍥炲嵎鍔錛屾煡鐪嬪凡緇忕湅榪囩殑閮ㄥ垎銆
鍚嶇О錛歭ocate 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛 locate [-q] [-d ] [--database=] locate [-r ] [--regexp=] locate [-qv] [-o ] [--output=] locate [-e ] [-f ] [-l ] [-c] [-U ] [-u] locate [-Vh] [--version] [--help] 璇存槑錛 locate 璁╀嬌鐢ㄨ呭彲浠ュ緢蹇閫熺殑鎼滃繪。妗堢郴緇熷唴鏄鍚︽湁鎸囧畾鐨勬。妗堛傚叾鏂規硶鏄鍏堝緩絝嬩竴涓鍖呮嫭緋葷粺鍐呮墍鏈夋。妗堝悕縐板強璺寰勭殑璧勬枡搴,涔嬪悗褰撳繪壘鏃跺氨鍙闇鏌ヨ㈣繖涓璧勬枡搴,鑰屼笉蹇呭疄闄呮繁鍏ユ。妗堢郴緇熶箣涓浜嗐傚湪涓鑸鐨刣istribution 涔嬩腑,璧勬枡搴撶殑寤虹珛閮借鏀懼湪contab 涓鑷鍔ㄦ墽琛屻 涓鑸浣跨敤鑰呭湪浣跨敤鏃跺彧瑕佺敤 # locate your_file_name 鐨勫瀷寮忓氨鍙浠ヤ簡銆傚弬鏁幫細 -u -U 寤虹珛璧勬枡搴,-u 浼氱敱鏍圭洰褰曞紑濮,-U 鍒欏彲浠ユ寚瀹氬紑濮嬬殑浣嶇疆銆 -e 灝嗘帓闄ゅ湪瀵繪壘鐨勮寖鍥翠箣澶栥 -l 濡傛灉鏄1錛庡垯鍚鍔ㄥ畨鍏ㄦā寮忋傚湪瀹夊叏妯″紡涓,浣跨敤鑰呬笉浼氱湅鍒版潈闄愭棤娉曠湅鍒扮殑妗f堛傝繖浼氬嬮熷害鍑忔參,鍥犱負locate 蹇呴』鑷沖疄闄呯殑妗f堢郴緇熶腑鍙栧緱妗f堢殑鏉冮檺璧勬枡銆 -f 灝嗙壒瀹氱殑妗f堢郴緇熸帓闄ゅ湪澶,渚嬪傛垜浠娌℃湁鍒扮悊瑕佹妸proc 妗f堢郴緇熶腑鐨勬。妗堟斁鍦ㄨ祫鏂欏簱涓銆 -q 瀹夐潤妯″紡,涓嶄細鏄劇ず浠諱綍閿欒璁鎮銆 -n 鑷沖氭樉紺轟釜杈撳嚭銆 -r 浣跨敤姝h勮繍綆楀紡鍋氬繪壘鐨勬潯浠躲 -o 鎸囧畾璧勬枡搴撳瓨鐨勫悕縐般 -d 鎸囧畾璧勬枡搴撶殑璺寰 -h 鏄劇ず杈呭姪璁鎮 -v 鏄劇ず鏇村氱殑璁鎮 -V 鏄劇ず紼嬪紡鐨勭増鏈璁鎮鑼冧緥錛 locate chdrv:瀵繪壘鎵鏈夊彨chdrv 鐨勬。妗 locate -n 100 a.out:瀵繪壘鎵鏈夊彨a.out 鐨勬。妗,浣嗘渶澶氬彧鏄劇ず100 涓 locate -u:寤虹珛璧勬枡搴
鍚嶇О錛歮ore 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛歮ore [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..] 璇存槑錛氱被浼糲at ,涓嶈繃浼氫互涓欏典竴欏電殑鏄劇ず鏂逛究浣跨敤鑰呴愰〉闃呰,鑰屾渶鍩烘湰鐨勬寚浠ゅ氨鏄鎸夌┖鐧介敭錛坰pace錛夊氨寰涓嬩竴欏墊樉紺,鎸塨 閿灝變細寰鍥烇紙back錛変竴欏墊樉紺,鑰屼笖榪樻湁鎼滃誨瓧涓茬殑鍔熻兘錛堜笌vi 鐩鎬技錛,浣跨敤涓鐨勮存槑鏂囦歡,璇鋒寜h 銆 鍙傛暟錛 -num 涓嬈℃樉紺虹殑琛屾暟 -d 鎻愮ず浣跨敤鑰,鍦ㄧ敾闈涓嬫柟鏄劇ず[Press space to continue, q to quit.] ,濡傛灉浣跨敤鑰呮寜閿欓敭,鍒欎細鏄劇ず[Press h for instructions.] 鑰屼笉鏄鍝斿0 -l 鍙栨秷閬囪佺壒孌婂瓧鍏僞L錛堥佺焊瀛楀厓錛夋椂浼氭殏鍋滅殑鍔熻兘 -f 璁$畻琛屾暟鏃,浠ュ疄闄呬笂鐨勮屾暟,鑰岄潪鑷鍔ㄦ崲琛岃繃鍚庣殑琛屾暟錛堟湁浜涘崟琛屽瓧鏁板お闀跨殑浼氳鎵╁睍涓轟袱琛屾垨涓よ屼互涓婏級 -p 涓嶄互鍗峰姩鐨勬柟寮忔樉紺烘瘡涓欏,鑰屾槸鍏堟竻闄よ悿騫曞悗鍐嶆樉紺哄唴瀹 -c 璺-p 鐩鎬技,涓嶅悓鐨勬槸鍏堟樉紺哄唴瀹瑰啀娓呴櫎鍏朵粬鏃ц祫鏂 -s 褰撻亣鍒版湁榪炵畫涓よ屼互涓婄殑絀虹櫧琛,灝變唬鎹涓轟竴琛岀殑絀虹櫧琛 -u 涓嶆樉紺轟笅寮曞彿錛堟牴鎹鐜澧冨彉鏁癟ERM 鎸囧畾鐨則erminal 鑰屾湁鎵涓嶅悓錛 +/ 鍦ㄦ瘡涓妗f堟樉紺哄墠鎼滃昏ュ瓧涓詫紙pattern錛,鐒跺悗浠庤ュ瓧涓蹭箣鍚庡紑濮嬫樉紺 +num 浠庣琻um 琛屽紑濮嬫樉紺 fileNames 嬈叉樉紺哄唴瀹圭殑妗f,鍙涓哄嶆暟涓鏁 鑼冧緥錛 more -s testfile 閫愰〉鏄劇ずtestfile 涔嬫。妗堝唴瀹,濡傛湁榪炵畫涓よ屼互涓婄┖鐧借屽垯浠ヤ竴琛岀┖鐧借屾樉紺恆 more +20 testfile 浠庣20 琛屽紑濮嬫樉紺簍estfile 涔嬫。妗堝唴瀹廣
鍚嶇О錛歮v 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛 mv [options] source dest mv [options] source... directory 璇存槑錛氬皢涓涓妗f堢Щ鑷沖彟涓妗f,鎴栧皢鏁頒釜妗f堢Щ鑷沖彟涓鐩褰曘 鍙傛暟錛-i 鑻ョ洰鐨勫湴宸叉湁鍚屽悕妗f,鍒欏厛璇㈤棶鏄鍚﹁嗙洊鏃ф。銆 鑼冧緥錛 灝嗘。妗坅aa 鏇村悕涓篵bb: mv aaa bbb 灝嗘墍鏈夌殑C璇璦紼嬪紡縐昏嚦Finished 瀛愮洰褰曚腑: mv -i *.c
鍚嶇О錛歳m 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛歳m [options] name... 璇存槑錛氬垹闄ゆ。妗堝強鐩褰曘 鎶婅: -i 鍒犻櫎鍓嶉愪竴璇㈤棶紜璁ゃ -f 鍗充嬌鍘熸。妗堝睘鎬ц句負鍞璇,浜︾洿鎺ュ垹闄,鏃犻渶閫愪竴紜璁ゃ -r 灝嗙洰褰曞強浠ヤ笅涔嬫。妗堜害閫愪竴鍒犻櫎銆 鑼冧緥錛 鍒犻櫎鎵鏈塁璇璦紼嬪紡妗o紱鍒犻櫎鍓嶉愪竴璇㈤棶紜璁: rm -i *.c 灝咶inished 瀛愮洰褰曞強瀛愮洰褰曚腑鎵鏈夋。妗堝垹闄: rm -r Finished
鍚嶇О錛歴plit 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛歴plit [OPTION] [INPUT [PREFIX]] 璇存槑錛氬皢涓涓妗f堝垎鍓叉垚鏁頒釜銆傝屼粠INPUT 鍒嗗壊杈撳嚭鎴愬滻瀹氬ぇ灝忕殑妗f,鍏舵。鍚嶄緷搴忎負PREFIXaa, PREFIXab...錛汸REFIX 棰勮懼間負`x銆傝嫢娌℃湁INPUT 妗f垨涓篳-,鍒欎粠鏍囧噯杈撳叆璇昏繘璧勬枡銆 鍖″厹: -b, --bytes=SIZE SIZE 鍊間負姣忎竴杈撳嚭妗f堢殑澶у皬,鍗曚綅涓篵yte銆 -C, --line-bytes=SIZE 姣忎竴杈撳嚭妗d腑,鍗曡岀殑鏈澶byte 鏁般 -l, --lines=NUMBER NUMBER 鍊間負姣忎竴杈撳嚭妗g殑鍒楁暟澶у皬銆 -NUMBER 涓-l NUMBER 鐩稿悓銆 --verbose 浜庢瘡涓杈撳嚭妗h寮鍚鍓,鍒楀嵃鍑轟睛閿欒祫璁鍒版爣鍑嗛敊璇杈撳嚭銆 --help 鏄劇ず杈呭姪璧勮鐒跺悗紱誨紑銆 --version 鍒楀嚭鐗堟湰璧勮鐒跺悗紱誨紑銆 SIZE 鍙鍔犲叆鍗曚綅: b 浠h〃512, k 浠h〃1K, m 浠h〃1 Meg銆 鑼冧緥錛 PostgresSQL 澶у瀷璧勬枡搴撳囦喚涓庡洖瀛橈細 鍥燩ostgres 鍏佽歌〃鏍煎ぇ榪囦綘緋葷粺妗f堢殑鏈澶у歸噺,鎵浠ヨ佸皢琛ㄦ牸mp 鍒板崟涓鐨勬。妗堝彲鑳戒細鏈夐棶棰,浣跨敤split榪涜屾。妗堝垎鍓層 % pg_mp dbname | split -b 1m - filename.mp. 閲嶆柊杞藉叆 % createdb dbname % cat filename.mp.* | pgsql dbname
鍚嶇О錛歵ouch 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛 touch [-acfm] [-r reference-file] [--file=reference-file] [-t MMDDhhmm[[CC]YY][.ss]] [-d time] [--date=time] [--time={atime,access,use,mtime,modify}] [--no-create] [--help] [--version] file1 [file2 ...] 璇存槑錛 touch 鎸囦護鏀瑰彉妗f堢殑鏃墮棿璁板綍銆俵s -l 鍙浠ユ樉紺烘。妗堢殑鏃墮棿璁板綍銆 鍙傛暟錛 a 鏀瑰彉妗f堢殑璇誨彇鏃墮棿璁板綍銆 m 鏀瑰彉妗f堢殑淇鏀規椂闂磋板綍銆 c 鍋囧傜洰鐨勬。妗堜笉瀛樺湪,涓嶄細寤虹珛鏂扮殑妗f堛備笌--no-create 鐨勬晥鏋滀竴鏍楓 f 涓嶄嬌鐢,鏄涓轟簡涓庡叾浠杣nix 緋葷粺鐨勭浉瀹規ц屼繚鐣欍 r 浣跨敤鍙傝冩。鐨勬椂闂磋板綍,涓--file 鐨勬晥鏋滀竴鏍楓 d 璁懼畾鏃墮棿涓庢棩鏈,鍙浠ヤ嬌鐢ㄥ悇縐嶄笉鍚岀殑鏍煎紡銆 t 璁懼畾妗f堢殑鏃墮棿璁板綍,鏍煎紡涓巇ate 鎸囦護鐩稿悓銆 --no-create 涓嶄細寤虹珛鏂版。妗堛 --help 鍒楀嚭鎸囦護鏍煎紡銆 --version 鍒楀嚭鐗堟湰璁鎮銆 鑼冧緥錛 鏈綆鍗曠殑浣跨敤鏂瑰紡,灝嗘。妗堢殑鏃跺欒板綍鏀逛負鐜板湪鐨勬椂闂淬傝嫢妗f堜笉瀛樺湪,緋葷粺浼氬緩絝嬩竴涓鏂扮殑妗f堛 touch file touch file1 file2 灝唂ile 鐨勬椂闂磋板綍鏀逛負5 鏈6 鏃18 鐐3 鍒,鍏鍏冧袱鍗冨勾銆傛椂闂寸殑鏍煎紡鍙浠ュ弬鑰僤ate 鎸囦護,鑷沖皯闇杈撳叆MMDDHHmm ,灝辨槸鏈堟棩鏃朵笌鍒嗐 touch -c -t 05061803 file touch -c -t 050618032000 file 灝唂ile 鐨勬椂闂磋板綍鏀瑰彉鎴愪笌referencefile 涓鏍楓 touch -r referencefile file 灝唂ile 鐨勬椂闂磋板綍鏀規垚5 鏈6 鏃18 鐐3 鍒,鍏鍏冧袱鍗冨勾銆傛椂闂村彲浠ヤ嬌鐢╝m, pm 鎴栨槸24 灝忔椂鐨勬牸寮,鏃ユ湡鍙浠ヤ嬌鐢ㄥ叾浠栨牸寮忓6 May 2000 銆 touch -d "6:03pm" file touch -d "05/06/2000" file touch -d "6:03pm 05/06/2000" file
鍚嶇О錛歝p 浣跨敤鏉冮檺錛氭墍鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡錛 cp [options] source dest cp [options] source... directory 璇存槑錛氬皢涓涓妗f堟嫹璐濊嚦鍙︿竴妗f,鎴栧皢鏁頒釜妗f堟嫹璐濊嚦鍙︿竴鐩褰曘 鎶婅: -a 灝藉彲鑳藉皢妗f堢姸鎬,鏉冮檺絳夎祫鏂欓兘鐓у師鐘朵簣浠ュ嶅埗銆 -r 鑻source 涓鍚鏈夌洰褰曞悕,鍒欏皢鐩褰曚笅涔嬫。妗堜害鐨嗕緷搴忔嫹璐濊嚦鐩鐨勫湴銆 -f 鑻ョ洰鐨勫湴宸茬粡鏈夌浉鍚屾。鍚嶇殑妗f堝瓨鍦,鍒欏湪澶嶅埗鍓嶅厛浜堜互鍒犻櫎鍐嶈屽嶅埗銆 鑼冧緥錛 灝嗘。妗坅aa 澶嶅埗(宸插瓨鍦),騫跺懡鍚嶄負bbb: cp aaa bbb 灝嗘墍鏈夌殑C璇璦紼嬪紡鎷瘋礉鑷矲inished 瀛愮洰褰曚腑: cp *.c Finished
鎸囦護鍚嶇О:ln 浣跨敤鏉冮檺:鎵鏈変嬌鐢ㄨ 浣跨敤鏂瑰紡:ln [options] source dist,鍏朵腑option 鐨勬牸寮忎負: [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [--help] [--version] [--] 璇存槑:Linux/Unix 妗f堢郴緇熶腑,鏈夋墍璋撶殑榪炵粨(link),鎴戜滑鍙浠ュ皢鍏惰嗕負妗f堢殑鍒鍚,鑰岃繛緇撳張鍙鍒嗕負涓ょ:紜榪炵粨(hard link)涓庤蔣榪炵粨(symbolic link),紜榪炵粨鐨勬剰鎬濇槸涓涓妗f堝彲浠ユ湁澶氫釜鍚嶇О,鑰岃蔣榪炵粨鐨勬柟寮忓垯鏄浜х敓涓涓鐗規畩鐨勬。妗,璇ユ。妗堢殑鍐呭規槸鎸囧悜鍙︿竴涓妗f堢殑浣嶇疆銆傜‖榪炵粨鏄瀛樺湪鍚屼竴涓妗f堢郴緇熶腑,鑰岃蔣榪炵粨鍗村彲浠ヨ法瓚婁笉鍚岀殑妗f堢郴緇熴 ln source dist 鏄浜х敓涓涓榪炵粨(dist)鍒皊ource,鑷充簬浣跨敤紜榪炵粨鎴栬蔣閾劇粨鍒欑敱鍙傛暟鍐沖畾銆 涓嶈烘槸紜榪炵粨鎴栬蔣閾劇粨閮戒笉浼氬皢鍘熸湰鐨勬。妗堝嶅埗涓浠,鍙浼氬崰鐢ㄩ潪甯稿皯閲忕殑紓佺熺┖闂淬 -f:閾劇粨鏃跺厛灝嗕笌dist 鍚屾。鍚嶇殑妗f堝垹闄-d:鍏佽哥郴緇熺$悊鑰呯‖閾劇粨鑷宸辯殑鐩褰-i:鍦ㄥ垹闄や笌dist 鍚屾。鍚嶇殑妗f堟椂鍏堣繘琛岃㈤棶-n:鍦ㄨ繘琛岃蔣榪炵粨鏃,灝哾ist 瑙嗕負涓鑸鐨勬。妗-s:榪涜岃蔣閾劇粨(symbolic link)-v:鍦ㄨ繛緇撲箣鍓嶆樉紺哄叾妗e悕-b:灝嗗湪閾劇粨鏃朵細琚瑕嗗啓鎴栧垹闄ょ殑妗f堣繘琛屽囦喚-S SUFFIX:灝嗗囦喚鐨勬。妗堥兘鍔犱笂SUFFIX 鐨勫瓧灝-V METHOD:鎸囧畾澶囦喚鐨勬柟寮--help:鏄劇ず杈呭姪璇存槑--version:鏄劇ず鐗堟湰 鑼冧緥: 灝嗘。妗坹y 浜х敓涓涓猻ymbolic link:zz ln -s yy zz 灝嗘。妗坹y 浜х敓涓涓猦ard link:zz ln yy xx
D. 如何編寫一個簡單的linux內核模塊和設備驅動程序
如何編寫Linux設備驅動程序
回想學習Linux操作系統已經有近一年的時間了,前前後後,零零碎碎的一路學習過來,也該試著寫的東西了。也算是給自己能留下一點記憶和回憶吧!由於完全是自學的,以下內容若有不當之處,還請大家多指教。
Linux是Unix操作系統的一種變種,在Linux下編寫驅動程序的原理和思想完全類似於其他的Unix系統,但它dos或window環境下的驅動程序有很大的區別。在Linux環境下設計驅動程序,思想簡潔,操作方便,功能也很強大,但是支持函數少,只能依賴kernel中的函數,有些常用的操作要自己來編寫,而且調試也不方便。
以下的一些文字主要來源於khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux a-z,還有清華bbs上的有關device driver的一些資料。
一、Linux device driver 的概念
系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統內核和機器硬體之間的介面。設備驅動程序為應用程序屏蔽了硬體的細節,這樣在應用程序看來,硬體設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬體設備進行操作。設備驅動程序是內核的一部分,它完成以下的功能:
1、對設備初始化和釋放。
2、把數據從內核傳送到硬體和從硬體讀取數據。
3、讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據。
4、檢測和處理設備出現的錯誤。
在Linux操作系統下有三類主要的設備文件類型,一是字元設備,二是塊設備,三是網路設備。字元設備和塊設備的主要區別是:在對字元設備發出讀/寫請求時,實際的硬體I/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作。塊設備是主要針對磁碟等慢速設備設計的,以免耗費過多的CPU時間來等待。
已經提到,用戶進程是通過設備文件來與實際的硬體打交道。每個設備文件都都有其文件屬性(c/b),表示是字元設備還是塊設備?另外每個文件都有兩個設備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個設備驅動程序的不同的硬體設備,比如有兩個軟盤,就可以用從設備號來區分他們。設備文件的的主設備號必須與設備驅動程序在登記時申請的主設備號一致,否則用戶進程將無法訪問到驅動程序。
最後必須提到的是,在用戶進程調用驅動程序時,系統進入核心態,這時不再是搶先式調度。也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作。如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck。
讀/寫時,它首先察看緩沖區的內容,如果緩沖區的數據未被處理,則先處理其中的內容。
如何編寫Linux操作系統下的設備驅動程序
二、實例剖析
我們來寫一個最簡單的字元設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序。
#define __NO_VERSION__
#include <linux/moles.h>
#include <linux/version.h>
char kernel_version [] = UTS_RELEASE;
這一段定義了一些版本信息,雖然用處不是很大,但也必不可少。Johnsonm說所有的驅動程序的開頭都要包含<linux/config.h>,一般來講最好使用。
由於用戶進程是通過設備文件同硬體打交道,對設備文件的操作方式不外乎就是一些系統調用,如 open,read,write,close…, 注意,不是fopen, fread,但是如何把系統調用和驅動程序關聯起來呢?這需要了解一個非常關鍵的數據結構:
struct file_operations
{
int (*seek) (struct inode * ,struct file *, off_t ,int);
int (*read) (struct inode * ,struct file *, char ,int);
int (*write) (struct inode * ,struct file *, off_t ,int);
int (*readdir) (struct inode * ,struct file *, struct dirent * ,int);
int (*select) (struct inode * ,struct file *, int ,select_table *);
int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);
int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);
int (*open) (struct inode * ,struct file *);
int (*release) (struct inode * ,struct file *);
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (struct inode * ,struct file *);
int (*revalidate) (dev_t dev);
}
這個結構的每一個成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是linux的設備驅動程序工作的基本原理。既然是這樣,則編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域。
下面就開始寫子程序。
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include<linux/config.h>
#include <linux/errno.h>
#include <asm/segment.h>
unsigned int test_major = 0;
static int read_test(struct inode *node,struct file *file,char *buf,int count)
{
int left;
if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;
for(left = count ; left > 0 ; left--)
{
__put_user(1,buf,1);
buf++;
}
return count;
}
這個函數是為read調用准備的。當調用read時,read_test()被調用,它把用戶的緩沖區全部寫1。buf 是read調用的一個參數。它是用戶進程空間的一個地址。但是在read_test被調用時,系統進入核心態。所以不能使用buf這個地址,必須用__put_user(),這是kernel提供的一個函數,用於向用戶傳送數據。另外還有很多類似功能的函數。請參考robert著的《Linux內核設計與實現》(第二版)。然而,在向用戶空間拷貝數據之前,必須驗證buf是否可用。這就用到函數verify_area。
static int write_tibet(struct inode *inode,struct file *file,const char *buf,int count)
{
return count;
}
static int open_tibet(struct inode *inode,struct file *file )
{
MOD_INC_USE_COUNT;
return 0;
}
static void release_tibet(struct inode *inode,struct file *file )
{
MOD_DEC_USE_COUNT;
}
這幾個函數都是空操作。實際調用發生時什麼也不做,他們僅僅為下面的結構提供函數指針。
struct file_operations test_fops = {
NULL,
read_test,
write_test,
NULL, /* test_readdir */
NULL,
NULL, /* test_ioctl */
NULL, /* test_mmap */
open_test,
release_test,
NULL, /* test_fsync */
NULL, /* test_fasync */
/* nothing more, fill with NULLs */
};
這樣,設備驅動程序的主體可以說是寫好了。現在要把驅動程序嵌入內核。驅動程序可以按照兩種方式編譯。一種是編譯進kernel,另一種是編譯成模塊(moles),如果編譯進內核的話,會增加內核的大小,還要改動內核的源文件,而且不能動態的卸載,不利於調試,所以推薦使用模塊方式。
int init_mole(void)
{
int result;
result = register_chrdev(0, "test", &test_fops);
if (result < 0) {
printk(KERN_INFO "test: can't get major number\n");
return result;
}
if (test_major == 0) test_major = result; /* dynamic */
return 0;
}
在用insmod命令將編譯好的模塊調入內存時,init_mole 函數被調用。在這里,init_mole只做了一件事,就是向系統的字元設備表登記了一個字元設備。register_chrdev需要三個參數,參數一是希望獲得的設備號,如果是零的話,系統將選擇一個沒有被佔用的設備號返回。參數二是設備文件名,參數三用來登記驅動程序實際執行操作的函數的指針。
如果登記成功,返回設備的主設備號,不成功,返回一個負值。
void cleanup_mole(void)
{
unregister_chrdev(test_major,"test");
}
在用rmmod卸載模塊時,cleanup_mole函數被調用,它釋放字元設備test在系統字元設備表中佔有的表項。
一個極其簡單的字元設備可以說寫好了,文件名就叫test.c吧。
下面編譯 :
$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c
得到文件test.o就是一個設備驅動程序。
如果設備驅動程序有多個文件,把每個文件按上面的命令行編譯,然後
ld -r file1.o file2.o -o molename。
驅動程序已經編譯好了,現在把它安裝到系統中去。
$ insmod –f test.o
如果安裝成功,在/proc/devices文件中就可以看到設備test,並可以看到它的主設備號。要卸載的話,運行 :
$ rmmod test
下一步要創建設備文件。
mknod /dev/test c major minor
c 是指字元設備,major是主設備號,就是在/proc/devices里看到的。
用shell命令
$ cat /proc/devices
就可以獲得主設備號,可以把上面的命令行加入你的shell script中去。
minor是從設備號,設置成0就可以了。
我們現在可以通過設備文件來訪問我們的驅動程序。寫一個小小的測試程序。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
int testdev;
int i;
char buf[10];
testdev = open("/dev/test",O_RDWR);
if ( testdev == -1 )
{
printf("Cann't open file \n");
exit(0);
}
read(testdev,buf,10);
for (i = 0; i < 10;i++)
printf("%d\n",buf[i]);
close(testdev);
}
編譯運行,看看是不是列印出全1 ?
以上只是一個簡單的演示。真正實用的驅動程序要復雜的多,要處理如中斷,dma,I/O port等問題。這些才是真正的難點。請看下節,實際情況的處理。
如何編寫Linux操作系統下的設備驅動程序
三、設備驅動程序中的一些具體問題
1。 I/O Port。
和硬體打交道離不開I/O Port,老的isa設備經常是佔用實際的I/O埠,在linux下,操作系統沒有對I/O口屏蔽,也就是說,任何驅動程序都可對任意的I/O口操作,這樣就很容易引起混亂。每個驅動程序應該自己避免誤用埠。
有兩個重要的kernel函數可以保證驅動程序做到這一點。
1)check_region(int io_port, int off_set)
這個函數察看系統的I/O表,看是否有別的驅動程序佔用某一段I/O口。
參數1:I/O埠的基地址,
參數2:I/O埠佔用的范圍。
返回值:0 沒有佔用, 非0,已經被佔用。
2)request_region(int io_port, int off_set,char *devname)
如果這段I/O埠沒有被佔用,在我們的驅動程序中就可以使用它。在使用之前,必須向系統登記,以防止被其他程序佔用。登記後,在/proc/ioports文件中可以看到你登記的I/O口。
參數1:io埠的基地址。
參數2:io埠佔用的范圍。
參數3:使用這段io地址的設備名。
在對I/O口登記後,就可以放心地用inb(), outb()之類的函來訪問了。
在一些pci設備中,I/O埠被映射到一段內存中去,要訪問這些埠就相當於訪問一段內存。經常性的,我們要獲得一塊內存的物理地址。
2。內存操作
在設備驅動程序中動態開辟內存,不是用malloc,而是kmalloc,或者用get_free_pages直接申請頁。釋放內存用的是kfree,或free_pages。 請注意,kmalloc等函數返回的是物理地址!
注意,kmalloc最大隻能開辟128k-16,16個位元組是被頁描述符結構佔用了。
內存映射的I/O口,寄存器或者是硬體設備的ram(如顯存)一般佔用F0000000以上的地址空間。在驅動程序中不能直接訪問,要通過kernel函數vremap獲得重新映射以後的地址。
另外,很多硬體需要一塊比較大的連續內存用作dma傳送。這塊程序需要一直駐留在內存,不能被交換到文件中去。但是kmalloc最多隻能開辟128k的內存。
這可以通過犧牲一些系統內存的方法來解決。
3。中斷處理
同處理I/O埠一樣,要使用一個中斷,必須先向系統登記。
int request_irq(unsigned int irq ,void(*handle)(int,void *,struct pt_regs *),
unsigned int long flags, const char *device);
irq: 是要申請的中斷。
handle:中斷處理函數指針。
flags:SA_INTERRUPT 請求一個快速中斷,0 正常中斷。
device:設備名。
如果登記成功,返回0,這時在/proc/interrupts文件中可以看你請求的中斷。
4。一些常見的問題。
對硬體操作,有時時序很重要(關於時序的具體問題就要參考具體的設備晶元手冊啦!比如網卡晶元RTL8139)。但是如果用C語言寫一些低級的硬體操作的話,gcc往往會對你的程序進行優化,這樣時序會發生錯誤。如果用匯編寫呢,gcc同樣會對匯編代碼進行優化,除非用volatile關鍵字修飾。最保險的辦法是禁止優化。這當然只能對一部分你自己編寫的代碼。如果對所有的代碼都不優化,你會發現驅動程序根本無法裝載。這是因為在編譯驅動程序時要用到gcc的一些擴展特性,而這些擴展特性必須在加了優化選項之後才能體現出來。
寫在後面:學習Linux確實不是一件容易的事情,因為要付出很多精力,也必須具備很好的C語言基礎;但是,學習Linux也是一件非常有趣的事情,它裡麵包含了許多高手的智慧和「幽默」,這些都需要自己親自動手才能體會到,O(∩_∩)O~哈哈!