Time of Update: 2018-12-03
其實故事已經講了很久,但如果你覺得到這裡你已經把故事都看明白了,那麼你錯了。不僅僅是錯了。不信,我們就繼續看,先看512行,us->transport(),這個函數指標同樣是在storage_probe時被賦值,對於隨身碟,它遵守的是Bulk-Only協議,因此us->transport()被賦值為usb_stor_Bulk_transport()。來看usb_stor_Bulk_transport(),它同樣來自drivers/usb/storage/transport.c:941
Time of Update: 2018-12-03
usb_stor_bulk_transfer_sglist()函數有一定的“蠱惑性”,我們前面說過,之所以採用sglist,就是為了提高傳輸效率。我們更知道,sg的目的就是讓一堆不連續的buffers在一次DMA操作都傳輸出去。其實在USB的故事中,事情並非如此。不過如果你對USB
Time of Update: 2018-12-03
module_param()的學習一.module_param1.為什麼引入 在使用者態下編程可以通過main()來傳遞命令列參數,而編寫一個核心模組則可通過module_param()來傳遞命令列參數. 2. module_param宏是Linux 2.6核心中新增的,該宏被定義在include/linux/moduleparam.h檔案中,具體定義如下: /* Helper functions: type is byte, short, ushort, int, uint, long,
Time of Update: 2018-12-03
曾經以為人生就這樣了,浮躁的心拒絕再看代碼。然而來到美國兩年之後,我於本月初去了一趟拉斯維加斯,發現在那兒找個美國小姐要八百美金,而且還不是包夜。當那個金髮美女都已經走進我的房間,我卻因為價錢太貴承受不起而決定取消的時候,我覺得我的人生真是太失敗了。那晚,看她出去之後,我內心一陣鬱悶,於是開啟電腦開始看A片,怎奈看到一半電腦竟然說檔案系統崩潰了。我心想ext4檔案系統不是號稱很強大嗎,怎麼這麼容易就崩潰了呢?而且平時也不崩潰,怎麼關鍵時候就這麼坑爹啊!於是我連夜看了一晚上ext4檔案系統的代碼,
Time of Update: 2018-12-03
對於use_sg為0的情況,我們接下來再看168行,offset是函數調用傳遞進來的參數,注釋裡說得很清楚,就是用來標誌位移量的,每次複製幾個位元組它就增加幾個位元組,最大它也不能超過request_bufflen,這是顯然的。usb_stor_access_xfer_buf()這個函數所做的事情就是從srb->request_buffer往buffer裡邊複製資料,或者反過來從buffer往srb->request_buffer,然後返回複製了多少個位元組。對於offset大於等於
Time of Update: 2018-12-03
在usb_stor_Bulk_transport()中,這個函數中調用的第一個最重要的函數,那就是usb_stor_bulk_transfer_buf()。仍然是來自drivers/usb/stroage/transport.c:391 int usb_stor_bulk_transfer_buf(struct us_data*us, unsigned int pipe,392 void *buf, unsigned int length, unsigned int
Time of Update: 2018-12-03
解決了這個INQUIRY的問題,我們就可以繼續往下走了,372行,這就是真正的批量傳輸的地方,proto_handler()就是正兒八經的處理SCSI命令的函數指標。而usb_stor_control_thread之前的所有代碼就是為了判斷是不是有必要調用函數proto_handler(),比如逾時了,比如模組該卸載了,比如設定斷開flag了,比如要處理的就是這個有問題的INQUIRY等,這些情況都需要先排除了才有必要到達這裡來執行真正的命令。實際上這就是先從宏觀上來控制,保證我們走的是一條正確
Time of Update: 2018-12-03
我們繼續接著上一節往下看。fill_inquiry_response(),這個函數來自drivers/usb/storage/usb.c中。266 void fill_inquiry_response(struct us_data *us,unsigned char *data,267 unsigned int data_len)268 {269 if (data_len<36) // You lose.270 return;271272
Time of Update: 2018-12-03
有時候我也被這個問題所困擾,我不知道是我不明白,還是這世界變化太快。連Linux中都引入了到期這麼一個概念。設定一個時間,如果時間到了該做的事情還沒有做完,那麼某些事情就會發生。比如需要烤蛋糕,現在是8點30,而我們要烤45分鐘,所以希望鬧鐘9點一刻響,當時間到了,鬧鐘就如期待的一樣,響個不停。在電腦中,也需要做這樣的事情,有些事情,需要時間控制,特別是網路、通訊等,凡是涉及資料轉送,就得考慮逾時,換句話說,就是要定一個鬧鐘,你要是在這個給定的時間裡還沒做好你該做的事情,那麼停下來,別做了,肯定
Time of Update: 2018-12-03
usb_stor_control_thread()基本講完了,但是其中下面這幾行,正是高潮中的高潮。所謂的批量傳輸,所謂的Bulk-Only協議。正是在這裡體現出來的。371 /* we've got a command, let's do it! */372 else {373 US_DEBUG(usb_stor_show_command(us->srb));374 us->proto_
Time of Update: 2018-12-03
很顯然,我們是把為INQUIRY命令準備的資料儲存到了我們自己定義的一個結構體中,即structdata_ptr[36],但是我們是為了回應一個SCSI命令,最終需要知道答案的是SCSI核心層。正是它們傳遞了一個scsi_cmnd結構體下來,即srb。struct scsi_cmnd中有兩個成員,即unsigned request_bufflen和void *request_buffer,應該把data數組中的資料傳送到request_buffer中去,這樣,SCSI核心層就知道去哪裡擷取結果。
Time of Update: 2018-12-03
在講資料轉送階段之前,先解決剛才的曆史遺留問題。usb_stor_bulk_transfer_buf()中,406行,有一個很有趣的函數interpret_urb_result()被調用。這個函數同樣來自drivers/usb/storage/transport.c中:265 static int interpret_urb_result(struct us_data*us, unsigned int pipe,266 unsigned int length,
Time of Update: 2018-12-03
大致總結了一下linux下各種格式的壓縮包的壓縮、解壓方法。但是部分方法我沒有用到,也就不全,希望大家幫我補充,我將隨時修改完善,謝謝!整理:會遊泳的魚來自:www.LinuxByte.net最後更新時間:2005-2-20.tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(註:tar是打包,不是壓縮!)———————————————.gz解壓1:gunzip FileName.gz解壓2:gzip -d
Time of Update: 2018-12-03
環境RedHat Linux 9 + VWWare 8.0 + SSH
Time of Update: 2018-12-03
小白學Linux之gcc的一些常見用法1.gcc編譯器對程式的編譯,分為四個階段:1>先行編譯(pre-processing):在預先處理階段,輸入的是C語言的源檔案,通常為*.c。它們一般帶有*.h之類的標頭檔。這個階段主要處理源檔案中的#ifdef,#include,#define預先處理命令。該階段會產生一個中間檔案*.i檔案。這個階段使用命令: gcc –E tiger.c –o tiger.i它通過對源檔案tiger.c使用-E選項來產生中間檔案tiger.i2>
Time of Update: 2018-12-03
小白學Linux之編寫使用者層程式發現一些同學在學一門程式語言時,往往花很長的時間去學習如何使用一個編譯工具。 實在是令人很糾結呀。殊不只編譯工具何其多也,而且在不斷的淘汰,就我們知道的c 編譯工具就有(Turboc ,Vc ,Vim,ADS.......)如果我們花大量的時間用在如何去精通它們,那將是很大的一個悲劇。我們應該把大量的時間用在如何學會一個語言這才是至關重要的。希望大家只要對工具有個大概瞭解就行了。平時,用這些工具時如果有問題可以查查資料就行了。 一.如何在Linux下編寫程式:1
Time of Update: 2018-12-03
這幾天一直在看裝置模型,核心的代碼看得我越來越沮喪,特別是kboject、kset和ktype之間的關係。但是,裝置模型的歸納我打算先跳過這幾個重要結構體,先介紹匯流排、裝置和驅動——裝置管理的相關內容。先介紹如何使用,有機會介紹大概的原理。http://www.360doc.com/content/11/0902/12/7534118_145217834.shtmlxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Time of Update: 2018-12-03
Linux之git工具的使用我相信做過項目的人,對軟體版本管理的重要性是深有所知的。如果程式版本沒有管理好,可能對整個項目來說就是致命的打擊。所以希望大家在做項目時要注意對自己編寫的程式進行一個良好的管理。前言:Git是一個快速、可擴充的分布式版本控制系統,它具有極為豐富的命令集,對內部系統提供了進階操作和完全訪問.所謂版本控制系統(VersionControlSystem),從狹義上來說,它是軟體項目開發過程中用於儲存我們所寫的代碼所有修訂版本的軟體,但事實上我們可以將任何對項目有協助的文檔交
Time of Update: 2018-12-03
從開始寫Linux那些事兒系列文字開始,到如今已有四年多了,而從整理出版第一版到現在也已經一載有餘了。期間不斷有認識或不認識的朋友問我,怎麼會想起寫這麼多如此可愛的文字,我的回答都是:娛樂自己,娛樂大家而已!或許,大家早已經預設技術本是一個沉重或者說枯燥的話題,我們無法用一種娛樂的心態去看待它,甚至說很多人早已喪失了從中擷取樂趣的能力。但是,一切本不該如此的,對於不管什麼原因踏入這個行業的我們,願意或不願意,技術都已經是我們生命不可分割的一部分。既如此,又何不放輕鬆些,把他當成朋友,用我們自己的
Time of Update: 2018-12-03
dd命令的用法在安裝檔案系統時用到了dd命令,對它不是很熟悉,就查了下它的用法,和大家share下一.dd命令1.我們先在終端輸入命令: man dd,看以下官方的解釋:NAME dd - convert and copy a fileSYNOPSIS dd [OPERAND]... dd OPTIONDESCRIPTION Copy a file, converting and formatting according to the