總的的來說,對核心協議棧的學習和研究,應將重點放在層間介面上,也就是資料是怎麼在層間傳遞的,這其中又可分為兩大部分,第一部分是:鏈路層網路層;其他層間的傳遞(eg:ip-->tcp,tcp->ip);其中每部分又分為收發兩部分。第一部分的傳送和接收都是通過軟中斷來實現,尤其注意網路層的接收函式是註冊在鏈路層的鍊錶中的,通過dev_add_pack()實現;第二部分的收發都是通過函式指標具體指向的函式來實現,尤其注意接收函式是通過專門的結構體中的函式指標來表示的,與第一步分的接收函式註冊方式並不相同,接收函式的組織結構也不相同。 1,
建立套接字
socket
àsys_socket
àsock_create
àinet_create
à得到套接字描述符。其中
inet_create
是建立inet
協議族套接字是呼叫的函式。這個函式在
sock_register()
中北賦值給
struct net_proto_family
中的create
函式指標,這個結構是描述協議族型別的,並根據協議族型別對
create
指標賦相應的建立函式。 2,
協議族型別操作集
linux
通過struct proto_ops
結構統一定義操作介面,上層應用程式通常呼叫的都是這裡的函式指標指向的函式,而這些函式再根據傳輸層具體的傳輸協議(如
tcp,
udp)呼叫相應的傳送或其他函式,具體的傳輸層的操作集用結構
struct_proto
結構表示,而這兩個結構(
struct proto_ops
和struct_proto
)又是通過
struct inet_protosw
聯絡起來的。那應用程式是如何呼叫套接字中的相關介面函式呢,見下面。
3,struct socket
結構。
以傳送函式
send
為例說明,當應用程式呼叫
send
(其中含有套接字描述符為引數)函式時,其實會陷入系統呼叫
sys_send()
,該函式接著呼叫函式
sys_sendto(
同樣含有套接字描述符為引數
),在該函式中會根據該描述符找到套接字
socket
的資料結構。然後呼叫
sock_sendmsg
(含struct socket
為引數)函式,該函式再呼叫
__sock_sendmsg
(含struct socket
為引數),在這個函式中最終通過語句
sock->ops->sendmsg()
呼叫inet_sendmsg.
注意這裡的
inet_sendmsg
實質上是
struct proto_ops
中的函式介面,那麼如何通過此抽象介面呼叫到具體的傳輸層協議(如
tcp,
udp)函式介面呢?原來在
struct socket
結構中有乙個
sock*
型別的sk
指標,這個指標指向具體的傳輸層套接字結構(指:
struct sock
),這樣在
inet_sendmsg
函式中通過呼叫
sk->sk_prot->sendmsg()
就呼叫到了具體的傳輸層協議的傳送函式
tcp_sendmsg.
到這裡就要問了,那麼這些函式指標又是在何處賦值的呢?其實在套接字被建立的時候根據套接字協議族型別和具體的套接字決定的。 4
,套接字協議族操作集
struct proto_ops
和具體套接字操作集
struct proto
所含函式指標的初始化。
待續... ...
點陣字型檔結構以及點陣字顯示的實現原理
點陣字型檔結構以及點陣字顯示的實現原理 2008 10 08 14 32 在 dos 下作遊戲要實現漢字或英文的輸出,一般都是使用的點陣字型檔技術。這樣可以使程式有更好的相容性。那麼我們如何在程式中使用點陣字型檔呢,這片文件將會講解這個。先講講什麼是點陣字型檔,我首先需要理解的是點陣字型檔是乙個資料...
點陣字型檔結構以及點陣字顯示的實現原理
在 dos 下作遊戲要實現漢字或英文的輸出,一般都是使用的點陣字型檔技術。這樣可以使程式有更好的相容性。那麼我們如何在程式中使用點陣字型檔呢,這片文件將會講解這個。先講講什麼是點陣字型檔,我首先需要理解的是點陣字型檔是乙個資料檔案,在這個資料檔案裡面儲存了所有文字的點陣資料。至於什麼是點陣,我想我不...
資料庫索引的實現原理以及優缺點
資料庫索引,在資料庫管理系統中是乙個排序形式的資料結構,以協助快速查詢和更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。那麼為什麼要用b 樹來實現索引而不使用二叉搜尋樹或者平衡樹或者紅黑樹呢?要知道原因首先需要了解b樹的性質 乙個 m 階的b樹滿足以下條件 每個結點至多擁有m棵子樹 根結點...