Fedora 8安裝過後的核心版本是2.6.23.1-42.fc8-i686,想構建一個核心樹,其實原因有幾點,聽說發行版本的核心很多都經過特別配置,所以某些方面不太適合Linux模組的編寫等,而且能多動手也是不錯的。選擇的核心版本和發行版本的一樣,2.6.23.1,有些建議編譯個新一點的,但就怕那些工具不適合,所以編譯和發行版本相近的估計錯誤較少。1.下載linux-2.6.23.1.tar.bz2,儲存在/usr/src/kernel/中2.tar -xjvf linux-2.6.23.1.
1.在windows下建立一個檔案夾,比如d:/share,把這個檔案夾設定為共用資料夾2.查看windows下IP地址(不是VMware Network Adapter VMnet1/8的IP地址,是windowsIP地址),比如192.168.1.23.查看windows系統的電腦名稱,即電腦系統屬性中的電腦名稱中的完整的電腦名稱,比如PC-2011020901284.在qnx系統下運行fs-cifs -l //PC-201102090128:192.168.1.2:/share /tmp5
首先,這裡會用到一個結構體,先把這個結構體整理出來 struct socket {{short type;/*通訊端所用的流類型,可取值SOCK_RAW,SOCK_DGRAM,SOCK_STREAM,SOCK_SEQPACKET,SOCK_PACKET,其中SOCK_STREAM 就是通常所說的TCP協議所用*/socket_state state;/*通訊端狀態,可取值SS_FREE ,SS_UNCONNECTED ,SS_CONNECTING
開啟兩個終端,在第一個終端先執行fifo_read,建立有名管道,並且等待輸入端輸入之後,再在第二個終端執行fifo_write,之後,fifo_write將向管道寫入資料,此時,輸出管道將有資料可讀,因此被喚醒,從管道中讀出資料,並顯示出來。/*fifo_read.c*/#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include
Tcp層把資料從傳輸層下傳到網路層,之後,網路層將對下傳的資料進行處理。 首先,要對下傳的資料進行排列。經過TCP層的處理,現在的資料已經被放置到skb_buff結構體中的資料空間部分,TP層就要對這個skb_buff進行必要的排列,使得資料有個先來後到的順序,從而達到公平。對skb_buff的排列,是通過skb_buff對應的sock結構體成員sock->send_tail , sock->send_head 和skb_buff->link3
訊號的處理是當前進程在中斷時,從核心態返回到使用者態時要處理的第一件事,進程在從核心態返回使用者態時,先檢查進程是否有需要處理的訊號(就是判斷當前進程的進程式控制制塊中的signal訊號位元影像,和blocked阻止位元影像的相與),如果訊號位元影像與阻止位元影像相與後,發現有置位的位,就說明當前進程有訊號需要處理。此時,先判斷是32種訊號中的哪種,然後核心會把這個訊號的處理函數的地址,作為核心返回使用者態時的EIP,因此,當返回使用者態後,使用者態的執行流程就從訊號處理函數開始執行,當執行完了
你應用程式命令 #io-usb 之後,應該將你的虛擬機器菜單下的"VM”裡面有"removable Device” 將列出的裝置中你插入的usb裝置選擇"connect",之後在vmare右下角會有usb裝置插入的標誌。 此時你再使用 #usb 會顯示你插入的usb裝置的類型資訊,很長,並不是你打出的 USB 0 (UHCI) v1.10, v1.01 DDK, v1.01 HCD Control, Interrupt, Bulk, Isoch, Low speed 接下來
#include <stdio.h>#include <stdlib.h>#include <string.h>struct single_link{ int data; struct single_link *next;};int main(void){ struct single_link *head=NULL,*tail=NULL,*tmp=NULL,*i_d_tmp=NULL; int
client代碼中,第一個被調用的函數是socket(),在這個函數被調用之前,系統做了什麼事情,讓socket()可以正常調用? 首先,socket函數實際上是一個系統調用,它是核心中的代碼,我們應用程式層通過系統調用,調用了系統的函數。其次,在系統啟動時,已經調用sock_init()對socket進行了初始化,在我們調用socket函數之前,socket的初始化部分已經為我們的調用做好的鋪墊了。void sock_init(void){ int i; ......
我們的應用程式在調用了socket()函數,bind()函數之後,只是在本地建立了socket結構體,sock結構體,並把socket,sock這兩個結構體跟I節點,檔案控制代碼結合起來,在把socket建立時所指定的協議的操作集關聯到sock結構體上,用於在socket指定了協議之後,使用這個操作集來完成相關的操作;之後的bind()函數則把本地的一個未被使用的連接埠號碼(一般大於1024,因為0~1024是知名連接埠號碼,保留下來做已知的特定用途,如連接埠號碼不是營養程式指定的,則尋找閒置
參考說明文檔, 第一是看看標頭檔有沒有少。 第二是用到的庫添加了沒有。如socket要增加libsock.so的庫。 增加方法,如果你用IDE,可在工程->Properties->QNX C/C++ Project->Linker Category=Extra Libraries 增加 sock 就可以了。前後不要。(通過qnx target來選擇庫檔案//////C:\QNX650\target\qnx6\x86\lib\libusbdi.sos) 如數學庫加 m 就可以了。
正常的情況下,socket函數的調用,只要有足夠的記憶體用於分配socket結構體,sock結構體,以及閒置I節點和當前進程有閒置檔案表項,就會返回分配給當前進程分配此I節點的檔案表項的序號,即檔案控制代碼,通過這個檔案控制代碼,可以找到對應的檔案表項,通過檔案表項可以找到對應的I節點,通過I節點可以找到socket通訊端,通過通訊端可以找到對以的sock結構體,而這個結構體就是我們資料的信使了,注意,只是信使哦。 當應用程式調用socket建立完通訊端後,一般情況下,接下來就會調用bind()
BOOTUP=value- 設定開機時顯示啟動訊息的模式,可以為:color - 標準彩色顯示,Red Hat 6.0 開始使用的顯示模式,裝置和服務啟動時使用不同顏色標示啟動成功還是失敗。verbose - 舊方式顯示,除標示置和服務啟動成功與否,提供更詳細啟動資訊。其他 - 新顯示,但沒有 ANSI 格式RES_COL=行號 - 設定在螢幕第幾行 (column) 開始顯示狀態標 ([ OK ]),預設為 60。MOVE_TO_COL=termseq - 輸出令終端機跳至 RES_COL
QNX是加拿大QNX軟體系統有限公司(QSSL)開發的建立在微核心和完全地址空間保護基礎之上的即時作業系統,具有即時、分布式多任務、模組化可裁剪等特點,符合POSIX標準,是少數支援圖形化使用者介面的即時作業系統之一。QNX核心只提供作業系統最基本服務,通過基於訊息傳遞的任務間通訊將工作群組織起來構成完整的系統。經過20多年的發展QNX已非常強大。有關它的初步介紹可參考wiki。通過對QNX幾年的使用,積累了一些經驗和教訓,寫在這裡希望對QNX感興趣的朋友能有所協助,也希望能多多交流共同進步。1
Connect函數之分解1.首先,connect函數從參數獲得遠端的IP,把這個地址賦值給對應的sock結構體的對應變數,並設定了sock結構體中的一些其他變數後,首先分配(skb_buff+使用者空間)大小記憶體,這兩部分是通過調用kmalloc(sizeof(struct
最近因工作需要寫一個網卡驅動,暈倒,沒有任何網路知識,就寫網路驅動!可是,為了五鬥米糊口,不得不從啊於是,打算從網路通訊協定棧開始,把網路搞一搞。我們常常知道socket的用法(其實我還沒有真正的寫過socket代碼,常常都是指那些socket高手了^-^),因此,打算從一個常用的執行個體開始,把網路通訊協定棧整理一下,即把自己的學習經過進行記錄,看看菜鳥的軌跡,是如何拐彎,顛簸。通常的socket編程分兩部分吧(錯了別怪我,我不是高手),一是client部分,二是server部分,而更通常的情
Skb_buff資料包從IP層下傳到鏈路層後,鏈路層開始對資料包進行處理 首先,判斷skb_buff資料包是不是不在skb_buff鏈表中,如果還在(即skb_buff->next!=NULL),則說明上面的處理有問題,代碼要避開(人為的避開,代碼還是有問題),即不能發送這個資料包,處理方式是,指定發送資料包的裝置被指定為NULL,即資料包沒有裝置真實發送。 第二步,判斷是否已知下一跳的MAC地址,即skb->arp=1,如果不是,則需要調用arp_find來尋找IP地址對應的MAC
鏈路層經過對資料包的優先順序進行排隊後,把本次需要發送的資料包從優先順序最高的隊列的頭部抽取出來,並下傳給網路卡驅動程式的資料發送函數,一般命名為xxx_hard_xmit(),由於硬體各個不同,寫法也會各個不同,無法抽象出一個標準的寫法,但其流程、目的是不變的,是可以抽像出來的,大致的流程如下:1.通過裝置結構體net_device中的tbusy(transmit
在Linux底下寫過driver模組的對這個宏一定不會陌生。module_init宏在MODULE宏有沒有定義的情況下展開的內容是不同的,如果這個宏沒有定義,基本上表明閣下的模組是要編譯進核心的(obj-y)。1.在MODULE沒有定義這種情況下,module_init定義如下:#define module_init(x) __initcall(x);因為#define __initcall(fn)
1、外設都是通過讀寫裝置上的寄存器來進行的,外設寄存器也稱為“I/O連接埠”,而IO連接埠有兩種編址方式:獨立編址和統一編製。而具體採用哪一種則取決於CPU的體繫結構。 如,PowerPC、m68k等採用統一編址,而X86等則採用獨立編址。但對於Linux核心而言,它可能用於不同的CPU,所以它必須都要考慮這兩種方式,於是它採用一種新的方法,將基於I/O映射方式的或記憶體映射方式的I/O連接埠通稱為“I/O地區”(I/O