日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2.6.21相比2.4.18内核机制变更

發(fā)布時間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.6.21相比2.4.18内核机制变更 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本人正在把2.4.18的網(wǎng)關(guān),防火墻,等公司的代碼從2.4.18移植到2.6.18linux內(nèi)核上去.本日志會不斷更新,希望能讓同在進行2.4到2.6內(nèi)核移植

的朋友們一些幫助.

????????????????IPMAC部分改動

1.?2.4內(nèi)核:

?????????Save_flags();保存標志

?????????cli();關(guān)閉中斷

?????????Restore_flags();還原標志打開中斷.

???在2.6內(nèi)核中由:

??????????local_irq_save(flags);

??????????local_irq_restore(flags);

取代。功能完全一樣.

要使用save_flags功能需要刪除CONFIG_SMP

/include/linux/autoconf.h?2125行定義.

2.?修改后的nf_hook_ops結(jié)構(gòu)體

static?struct?nf_hook_ops?ipmac_rcv_ops=?{

????????{NULL,?NULL},

????????my_ipmac_rcv,

????????NULL,?/2.4.18沒有這個元素,2.6.21此參數(shù)原型為:struct?module?*owner;*

????????PF_INET,

????????NF_IP_PRE_ROUTING,

????????SE_PRI_PRERT_IPMAC_BIND

};

?

3.

?

2.4?內(nèi)核下,缺省情況時模塊中的非靜態(tài)全局變量及函數(shù)在模塊加載后會輸出到內(nèi)核

空間。2.6?內(nèi)核下,缺省情況時模塊中的非靜態(tài)全局變量及函數(shù)在模塊加載后不會輸出到內(nèi)

核空間,需要顯式調(diào)用宏EXPORT_SYMBOL才能輸出。所以在2.6?內(nèi)核的模塊下,EXPORT_NO_SYMBOLS宏的調(diào)用沒有意義,是空操作。在同時支持2.42.6內(nèi)核的設(shè)備

?

驅(qū)動中,可以通過以下代碼段來輸出模塊的內(nèi)核符號


EXPORT_NO_SYMBOLS2.6.21內(nèi)核中沒有這個東西了.因為沒有必要存在了,已近刪除.

?

.

4.

(int)?*buf_p?=?IPMAC_ADD

這種類型的代碼編譯報錯了.是無法賦值的,提示左值無法賦值.

全部改為:*((int*)buf_p)?=?IPMAC_ADD此種類型

還有函數(shù)原型不帶參數(shù)聲明會帶警告,我都加了void

如下:int?get_index()改為int?get_index(void);

一些聲明了沒有初始化就使用的變量也給了警告我也都初始化了.

比如flags;

????????????PF(包過濾)改動部分

1.

???2.4內(nèi)核中,模塊自身通過?MOD_INC_USE_COUNT,?MOD_DEC_USE_COUNT宏來管理自己被使用的計數(shù)。
???2.6內(nèi)核提供了更健壯、靈活的模塊計數(shù)管理接口?try_module_get(&module),?module_put(&module)取代2.4中的模塊使用計數(shù)管理宏;模塊的使用計數(shù)不必由自身管理,而且在管理模塊使用計數(shù)時考慮到?SMPPREEMPT機制的影響。

???int?try_module_get(struct?module?*module);?用于增加模塊使用計數(shù);若返回為0,表示調(diào)用失敗,希望使用的模塊沒有被加載或正在被卸載中。
???void?module_put(struct?module?*module);?減少模塊使用計數(shù)。

???try_module_getmodule_put?的引入與使用與2.6內(nèi)核下的設(shè)備模型密切相關(guān)。模塊是用來管理硬件設(shè)備的,2.6內(nèi)核為不同類型的設(shè)備定義了struct?module?*owner?域,用來指向管理此設(shè)備的模塊。如字符設(shè)備的定義:
struct?cdev
{
????struct?kobject?kobj;
????struct?module?*owner;
????struct?file_operations?*ops;
????struct?list_head?list;
????dev_t?dev;
????unsigned?int?count;
};

????從設(shè)備使用的角度出發(fā),當需要打開、開始使用某個設(shè)備時,使用?try_module_get(dev->owner)去增加管理此設(shè)備的?owner模塊的使用計數(shù);當關(guān)閉、不再使用此設(shè)備時,使用module_put(dev->owner)減少對管理此設(shè)備的owner模塊的使用?計數(shù)。這樣,當設(shè)備在使用時,管理此設(shè)備的模塊就不能被卸載;只有設(shè)備不再使用時模塊才能被卸載。
???2.6內(nèi)核下,對于為具體設(shè)備寫驅(qū)動的開發(fā)人員而言,基本無需使用?try_module_getmodule_put,因為此時開發(fā)人員所寫的驅(qū)動通常為支持某具體設(shè)備的owner模塊,對此設(shè)備owner模塊的計數(shù)管理由內(nèi)核里更底層的代碼如總線驅(qū)動或是此類設(shè)備共用的核心模塊來實現(xiàn),從而簡化了設(shè)備驅(qū)動開發(fā)。

?

?

?

4.

??

2.4?.18內(nèi)核?:skb_linearize(skb,?GFP_ATOMIC)

2.6.21?內(nèi)核?:?skb_linearize(skb)??

?

????????????skb_is_nonlinear函數(shù)用于測試一個緩沖區(qū)是否是分片的,而skb_linearize可以把分片組合成一個單一的緩沖區(qū)。組合分片涉及到數(shù)據(jù)拷貝,它將嚴重影響系統(tǒng)性能。

?

5.

?

????EXPORT_SYMBOL_NOVERS???2.6內(nèi)核中已近沒有這個宏.我只知道EXPORT_SYMBOL是內(nèi)核模塊向其它的模塊倒出可用的函數(shù),

2.6內(nèi)核中只有EXPORT_SYMBOL這個宏,而且用的很多.

我把代碼里的

EXPORT_SYMBOL_NOVERS全部改為EXPORT_SYMBOL.

6.

?2.6內(nèi)核中沒有.for_each_task

替換為如下宏:

#define?for_each_process(p)?\

for?(p?=?&init_task?;?(p?=?next_task(p))?!=?&init_task?;?)

2.6.21內(nèi)核中定義的.

2.

2.6內(nèi)核?:Struct?sk_buff??*ip_defrag(struct?sk_buff?*skb,u32?user);

這個函數(shù)的第二個參數(shù)是2.6內(nèi)核增加的,目的好像是是說明sk_buff數(shù)據(jù)包的來源.

第二個參數(shù)的全部可取值如下,此結(jié)構(gòu)在內(nèi)核中被定義.

enum?ip_defrag_users

{

IP_DEFRAG_LOCAL_DELIVER,sk_buff代表的數(shù)據(jù)包是本機ip地址發(fā)送出去的,

IP_DEFRAG_CALL_RA_CHAIN,(在ip_call_ra_chain函數(shù)中被調(diào)用,sk_buff來源參數(shù)被設(shè)置為這個,說明這個數(shù)據(jù)包是遍歷那個什么鏈表找到的?)

IP_DEFRAG_CONNTRACK_IN,(hook節(jié)點的值為NF_IP_PRE_ROUTING,參數(shù)為這個值,不是為下面的值)

IP_DEFRAG_CONNTRACK_OUT,

IP_DEFRAG_VS_IN,hook節(jié)點值為NF_IP_LOCAL_IN,參數(shù)為這個,不是參數(shù)為NF_IP_LOCAL_FWD)

IP_DEFRAG_VS_OUT,(ip_vs_outip_vs_out_icmp里被調(diào)用,sk_buff來源參數(shù)被設(shè)置為IP_DEFRAG_VS_OUT

IP_DEFRAG_VS_FWD

};

我查找了下.內(nèi)核中對這5個參數(shù)的用法.對參數(shù)意思的總結(jié)如上.

3.

2.4內(nèi)核中,通過內(nèi)核監(jiān)聽的套接口返回套接口結(jié)構(gòu)的方法:

Struct?sock?sk2;

?sk2?=?tcp_listening_hash[i]已近行不通.

2.6內(nèi)核中?要返回監(jiān)聽端口需要;?tcp_hashinfo.listening_hash[i].first

但是返回的不是struct?sock?而是?struct?hlist_node結(jié)構(gòu)體.這個結(jié)構(gòu)體里除了下一個這個結(jié)構(gòu)的指針什么也沒.內(nèi)核中維護監(jiān)聽的套接口,是一個哈希表,每個哈希元素又是一個鏈表.

所以2.4內(nèi)核中想要通過返回的sock結(jié)構(gòu)直接取出源目的的ip以及端口在2.6內(nèi)核中已近無法做到.而且2.6內(nèi)核中的sock結(jié)構(gòu)也沒有地址端口這些信息.

想要通過監(jiān)聽列表獲得監(jiān)聽的套接口的地址端口信息必須通過,inet_sock結(jié)構(gòu).這個結(jié)構(gòu)的第一個元素為strock?sock,它封裝了sock結(jié)構(gòu),如下

struct?inet_sock?{

/*?sk?and?pinet6?has?to?be?the?first?two?members?of?inet_sock?*/

struct?sock sk;

#if?defined(CONFIG_IPV6)?||?defined(CONFIG_IPV6_MODULE)

struct?ipv6_pinfo *pinet6;

#endif

/*?Socket?demultiplex?comparisons?on?incoming?packets.?*/

__be32 daddr;

__be32 rcv_saddr;

__be16 dport;

__u16 num;

__be32 saddr;

__s16 uc_ttl;

__u16 cmsg_flags;

struct?ip_options *opt;

__be16 sport;

__u16 id;

__u8 tos;

__u8 mc_ttl;

__u8 pmtudisc;

__u8 recverr:1,

is_icsk:1,

freebind:1,

hdrincl:1,

mc_loop:1;

int mc_index;

__be32 mc_addr;

struct?ip_mc_socklist *mc_list;

struct?{

unsigned?int flags;

unsigned?int fragsize;

struct?ip_options *opt;

struct?rtable *rt;

int length;?/*?Total?length?of?all?frames?*/

__be32 addr;

struct?flowi fl;

}?cork;

};

但是想用這個結(jié)構(gòu)體加進頭文件也用不了.必須要這樣:

#undef?_INET_SOCK_H

#include?<net/inet_sock.h>

才可以使用,具體見這個頭文件里的宏開關(guān).

想要通過返回的hlist_node指針找到這個套接口的inet_sock結(jié)構(gòu)只能這樣:

Struct?hlist_node?list;

Struct?inet_sock?sk2;

...

.....

list?=?tcp_hashinfo.listening_hash[i].first;?

sk2?=??container_of(list,struct?inet_sock,sk.sk_node);

(編譯是過了...沒測試過.不保證%100...)

?

轉(zhuǎn)載于:https://blog.51cto.com/3592063/667775

總結(jié)

以上是生活随笔為你收集整理的2.6.21相比2.4.18内核机制变更的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。