第一篇:java-Floodlight源碼分析IOFMessageListener
package net.floodlightcontroller.core;
import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFType;
/**
*
*
* @author
*/
public interface IOFMessageListener extends IListener
/** messages
* @param sw the OpenFlow switch that sent this message
* @param msg the message
* @param* information between listeners
* @return the command to continue or stop the execution
*/
public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx);
}
IOFMessageListener接口繼承了IListener接口,協(xié)議類型為
receive方法的返回值使用了IListener中的枚舉類型,且receive方法沒(méi)有方法體,在OFMessageFilterManager中可以看到它的實(shí)現(xiàn)。
第二篇:《Linux協(xié)議棧源碼分析》讀書(shū)報(bào)告
讀 書(shū) 報(bào) 告
題目 《Linux協(xié)議棧源碼分析》
一、介紹......................................................................................................................................1.1、中斷模型......................................................................................................................-21.1.2、硬中斷...............................................................................................................-2
二、中斷處理..............................................................................................................................2.1、中斷線..........................................................................................................................-32.1.2、特性...................................................................................................................-32.2.1、硬中斷的開(kāi)關(guān)...................................................................................................-42.3、軟中斷處理..................................................................................................................-52.3.2、注冊(cè)軟中斷處理函數(shù).......................................................................................-52.4、軟中斷處理和硬中斷處理區(qū)別..................................................................................-6
三、中斷處理中數(shù)據(jù)結(jié)構(gòu)...........................................................................................................3.1、中斷描述符..................................................................................................................-63.3、中斷控制器描述符(PIC、APIC)................................................................................3.4、中斷服務(wù)例程(ISR)...................................................................................................四、總結(jié)..................................................................................................................................../ 13
二、中斷處理
2.1、中斷線
每個(gè)能夠產(chǎn)生中斷的設(shè)備或者模塊都會(huì)在內(nèi)核中注冊(cè)一個(gè)中斷服務(wù)例程(ISR),當(dāng)產(chǎn)生中斷時(shí),中斷處理程序會(huì)被執(zhí)行,在中斷處理程序中,首先會(huì)保存中斷向量號(hào)和上下文,之后執(zhí)行中斷線對(duì)應(yīng)的中斷服務(wù)例程。對(duì)于CPU來(lái)說(shuō),中斷線是非常寶貴的資源,而由于計(jì)算機(jī)的發(fā)展,外部設(shè)備數(shù)量和種類越來(lái)越多,導(dǎo)致了中斷線資源不足的情況,linux為了應(yīng)對(duì)這種情況,實(shí)現(xiàn)了兩種中斷線分配方式,分別是:共享中斷線,中斷線動(dòng)態(tài)分配。2.1.1、中斷線分配方式(1)共享中斷線
多個(gè)設(shè)備共用一條中斷線,當(dāng)此條中斷線發(fā)生中斷時(shí),因?yàn)椴豢赡茴A(yù)先知道哪個(gè)特定的設(shè)備產(chǎn)生了中斷,因此,這條中斷線上的每個(gè)中斷服務(wù)例程都會(huì)被執(zhí)行,以驗(yàn)證是哪個(gè)設(shè)備產(chǎn)生的中斷(一般的,設(shè)備產(chǎn)生中斷時(shí),會(huì)標(biāo)記自己的狀態(tài)寄存器,中斷服務(wù)例程通過(guò)檢查每個(gè)設(shè)備的狀態(tài)寄存器來(lái)查找產(chǎn)生中斷的設(shè)備),因此共享中斷線的分配方式是比較常見(jiàn)的。(2)中斷線動(dòng)態(tài)分配
一條中斷線在可能使用的時(shí)刻才與一個(gè)設(shè)備驅(qū)動(dòng)程序關(guān)聯(lián)起來(lái),這樣一來(lái),即使幾個(gè)硬件設(shè)備并不共享中斷線,同一個(gè)中斷向量也可以由這幾個(gè)設(shè)備在不同時(shí)刻運(yùn)行。2.1.2、特性
(1)中斷處理程序正在運(yùn)行時(shí),CPU會(huì)通知中斷控制器屏蔽產(chǎn)生此中斷的中斷線。此中斷線發(fā)出的信號(hào)被暫時(shí)忽略,當(dāng)中斷處理程序結(jié)束時(shí)恢復(fù)此中斷線。(2)在中斷服務(wù)例程的設(shè)計(jì)中,原則上是立即處理緊急的操作,將非緊急的操作延后處理(交給軟中斷進(jìn)行處理)。
(3)中斷處理程序是運(yùn)行在中斷上下文,但是其是代表進(jìn)程運(yùn)行的,因此它所代表的進(jìn)行必須處于TASK_RUNNING狀態(tài),否則可能出現(xiàn)僵死情況,因此在中斷處理程序中不能執(zhí)行任何阻塞過(guò)程。
/ 13
action=(struct irqaction*)Kmalloc(sizeof(struct irqaction),GFR_ATOMIC);……
此handler就是剛才介紹的handle_IRQ_event 函數(shù)中要處理的handler。action->handler=handler;action->flags=irqflags;action->maks-0;action->name=devname;action->next=NULL;action->dev_id=dev_id;retval=setup_irq(irq,action);return retval;}
2.3、軟中斷處理
2.3.1、軟中斷的開(kāi)關(guān)
禁止下半部,如softirq、tasklet和workqueue等: local_bh_disable();local_bh_enable();需要注意的是,禁止下半部時(shí)仍然可以被硬中斷搶占。軟中斷由softirq_action結(jié)構(gòu)體表示: struct softirq_action { void(*action)(struct softirq_action *);/* 軟中斷的處理函數(shù) */ };2.3.2、注冊(cè)軟中斷處理函數(shù) /** * @nr: 軟中斷的索引號(hào) * @action: 軟中斷的處理函數(shù)
*/void open_softirq(int nr, void(*action)(struct softirq_action *)){ softirq_vec[nr].action = action;} 例如:
open_softirq(NET_TX_SOFTIRQ, net_tx_action);open_softirq(NET_RX_SOFTIRQ, net_rx_action);
/ 13
函數(shù),而在do_IRQ()函數(shù)中,會(huì)根據(jù)中斷向量號(hào),從中斷描述符數(shù)組中獲取對(duì)應(yīng)的中斷描述符,如下圖: 整個(gè)中斷描述符結(jié)構(gòu)如下: struct irq_desc {
struct irq_data irq_data;/* irq的統(tǒng)計(jì)信息,在proc中可查到 */ unsigned int __percpu *kstat_irqs;/* 回調(diào)函數(shù),當(dāng)此中斷產(chǎn)生中斷時(shí),會(huì)調(diào)用handle_irq,在handle_irq中進(jìn)行遍歷irqaction鏈表
* handle_simple_irq 用于簡(jiǎn)單處理;
* handle_level_irq 用于電平觸發(fā)中斷的流控處理;
* handle_edge_irq 用于邊沿觸發(fā)中斷的流控處理;
* handle_fasteoi_irq 用于需要響應(yīng)eoi的中斷控制器;
* handle_percpu_irq 用于只在單一cpu響應(yīng)的中斷;
* handle_nested_irq 用于處理使用線程的嵌套中斷; */irq_flow_handler_t handle_irq;#ifdef CONFIG_IRQ_PREFLOW_FASTEOI irq_preflow_handler_t preflow_handler;#endif
/* 中斷服務(wù)例程鏈表 */ struct irqaction *action;
/* IRQ action list *//* 狀態(tài) */ unsigned int status_use_accessors;/* 函數(shù)調(diào)用中使用,另一個(gè)名稱為istate */ unsigned int
core_internal_state__do_not_mess_with_it;/* 嵌套深度,中斷線被激活顯示0,如果為正數(shù),表示被禁止次數(shù) */ unsigned int
depth;
/* nested irq disables */ unsigned int
wake_depth;
/* nested wake enables */ /* 此中斷線上發(fā)生的中斷次數(shù) */ unsigned int
irq_count;
/* For detecting broken IRQs */ /* 上次發(fā)生未處理中斷時(shí)的jiffies值 */ unsigned long
last_unhandled;
/* Aging timer for unhandled count */ /* 中斷線上無(wú)法處理的中斷次數(shù),如果當(dāng)?shù)?00000次中斷發(fā)生時(shí),有超過(guò)99900次是意外中斷,系統(tǒng)會(huì)禁止這條中斷線 */ unsigned int
irqs_unhandled;atomic_t
threads_handled;
/ 13
core_internal_state__do_not_mes_with_it成員是用于記錄此中斷線狀態(tài)的,中斷線狀態(tài)有如下幾種形式:
IRQS_AUTODETECT
/* 該IRQ線用來(lái)進(jìn)行硬件設(shè)備探測(cè) */ IRQS_SPURIOUS_DISABLED // 該IRQ線被禁止,是由于產(chǎn)生了欺騙性中斷
IRQS_POLL_INPROGRESS
/* 該IRQ進(jìn)行輪詢檢查是否發(fā)生中斷 */ IRQS_ONESHOT
/* 此IRQ沒(méi)有在主處理函數(shù)中進(jìn)行unmasked處理 */ IRQS_REPLAY
/* IRQ線已被禁止,但前一個(gè)出現(xiàn)的中斷還沒(méi)有被應(yīng)答 */ IRQS_WAITING
/* 進(jìn)行硬件設(shè)備探測(cè)時(shí),會(huì)將所有沒(méi)有掛載中斷服務(wù)程序的IRQ線狀態(tài)設(shè)置為IRQS_WAITING,如果該IRQ上有中斷產(chǎn)生,就清除這個(gè)狀態(tài),可以推斷哪些引腳產(chǎn)生過(guò)中斷 */ IRQS_PENDING /* IRQ已經(jīng)被應(yīng)答(掛起),但是內(nèi)核還沒(méi)有進(jìn)行處理 */ IRQS_SUSPENDED
/* 此IRQ被延遲 */
3.2、中斷描述符表和中斷描述符數(shù)組
在中斷系統(tǒng)中有兩個(gè)名字很相像的結(jié)構(gòu),就是中斷描述符表和中斷描述符數(shù)組。這里我們先說(shuō)說(shuō)中斷描述符表。一個(gè)系統(tǒng)中的中斷和異常加起來(lái)一共是256個(gè),它們以向量的形式保存在中斷描述符表中,每一個(gè)向量是8字節(jié)(整個(gè)表大小就是8 x 256=2048字節(jié)),其主要保存著權(quán)限位和向量對(duì)應(yīng)的中斷或異常處理程序的入口地址。而一般的,linux會(huì)將中斷描述符表中的0~31用于非屏蔽中斷和異常,其他的中斷用于32~255之間。CPU把中斷描述符表的向量類型分為三種類型:任務(wù)門、中斷門、陷阱門。CPU為了防止惡意程序訪問(wèn)中斷,限制了中斷門的權(quán)限,而在某些時(shí)候,用戶程序又必須使用中斷,所以Linux把中斷描述符的中斷向量類型改為了5種:中斷門,系統(tǒng)門,系統(tǒng)中斷門,陷阱門,任務(wù)門。這個(gè)中斷描述符表的基地址保存在idtr寄存器中。(1)中斷門
用戶程序不能訪問(wèn)的CPU中斷門(權(quán)限字段為0),所有的中斷處理程序都是這個(gè),被限定在內(nèi)核態(tài)執(zhí)行。會(huì)清除IF標(biāo)志,屏蔽可屏蔽中斷。
/ 13
信號(hào),將IRQ1的中斷向量號(hào)發(fā)到數(shù)據(jù)總線上,此時(shí)CPU會(huì)通過(guò)數(shù)據(jù)總線讀取IRQ1的中斷向量號(hào)。
最后,如果中斷控制器需要EOI(End of Interrupt)信號(hào),CPU則會(huì)發(fā)送,否則中斷控制器自動(dòng)將INT拉低,并清除IRQ1對(duì)應(yīng)的中斷請(qǐng)求寄存器位。
在linux內(nèi)核中,用struct irq_chip結(jié)構(gòu)體描述一個(gè)可編程中斷控制器,它的整個(gè)結(jié)構(gòu)和調(diào)度器中的調(diào)度類類似,里面定義了中斷控制器的一些操作,如下: struct irq_chip { /* 中斷控制器的名字 */ const char
*name;/* 控制器初始化函數(shù) */ unsigned int
(*irq_startup)(struct irq_data *data);/* 控制器關(guān)閉函數(shù) */ void
(*irq_shutdown)(struct irq_data *data);/* 使能irq操作,通常是直接調(diào)用irq_unmask(),通過(guò)data參數(shù)指明irq */ void
(*irq_enable)(struct irq_data *data);/* 禁止irq操作,通常是直接調(diào)用irq_mask,嚴(yán)格意義上,他倆其實(shí)代表不同的意義,disable表示中斷控制器根本就不響應(yīng)該irq,而mask時(shí),中斷控制器可能響應(yīng)該irq,只是不通知CPU */ void
(*irq_disable)(struct irq_data *data);/* 用于CPU對(duì)該irq的回應(yīng),通常表示cpu希望要清除該irq的pending狀態(tài),準(zhǔn)備接受下一個(gè)irq請(qǐng)求 */ void(*irq_ack)(struct irq_data *data);/* 屏蔽irq操作,通過(guò)data參數(shù)表明指定irq */ void
(*irq_mask)(struct irq_data *data);/* 相當(dāng)于irq_mask()+ irq_ack()*/ void
(*irq_mask_ack)(struct irq_data *data);/* 取消屏蔽指定irq操作 */ void
(*irq_unmask)(struct irq_data *data);/* 某些中斷控制器需要在cpu處理完該irq后發(fā)出eoi信號(hào) */ void
(*irq_eoi)(struct irq_data *data);/* 用于設(shè)置該irq和cpu之間的親和力,就是通知中斷控制器,該irq發(fā)生時(shí),那些cpu有權(quán)響應(yīng)該irq */ int(*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
1/ 13
void __percpu
*percpu_dev_id;
/* 鏈表中下一個(gè)中斷服務(wù)例程 */
struct irqaction
*next;
/* 進(jìn)行中斷處理的內(nèi)核線程執(zhí)行函數(shù) */
irq_handler_t
thread_fn;
/* 一個(gè)內(nèi)核線程,用于執(zhí)行中斷處理 */
struct task_struct
*thread;
/* IRQ線,IRQ號(hào) */
unsigned int
irq;
unsigned int
flags;
unsigned long
thread_flags;
unsigned long
thread_mask;
const char
*name;
/* 指向/proc/irq/n目錄的描述符 */
struct proc_dir_entry
*dir;} ____cacheline_internodealigned_in_smp;
四、總結(jié)
在CPU里,中斷和異常都會(huì)放入到一個(gè)中斷描述符表中,都需要特定的處理程序進(jìn)行處理,并且它們都是異步事件,內(nèi)核完全不知道何時(shí)會(huì)有一個(gè)異?;蛘咧袛喟l(fā)生。當(dāng)異?;蛘咧袛喟l(fā)生時(shí),進(jìn)程都會(huì)陷入內(nèi)核,在內(nèi)核中執(zhí)行相應(yīng)的處理。異常一般都是由CPU內(nèi)部或者進(jìn)程產(chǎn)生,而中斷一般都是由外部設(shè)備產(chǎn)生。異常處理過(guò)程實(shí)際上和系統(tǒng)調(diào)用沒(méi)什么區(qū)別(實(shí)際上系統(tǒng)調(diào)用是通過(guò)一個(gè)0x80異常陷入內(nèi)核當(dāng)中),而中斷的處理過(guò)程和情況就相對(duì)來(lái)說(shuō)比較復(fù)雜。
一個(gè)中斷處理分為硬中斷和軟中斷兩個(gè)部分,在中斷處理的過(guò)程中系統(tǒng)是禁止調(diào)度和搶占的,而異常處理過(guò)程中是允許的。一個(gè)中斷處理程序可以搶占其他的中斷處理程序,也可以搶占異常處理程序,相反的,異常處理程序卻不能夠搶占中斷處理程序。
3-/ 13
第三篇:最新WEB游戲源碼服務(wù)端(完整修改版).
2011WEB網(wǎng)頁(yè)游戲服務(wù)端源碼全集
webgame源碼,本人已測(cè)試,供大家下載
一、搶車位源碼
[停車大戰(zhàn)]ASP+ACCESS[帶MSSQL] 版權(quán)聲明:(停車大戰(zhàn)V1.0 FOR DVBBS AC)停車大戰(zhàn)V1.0 FOR DVBBS版本,是由NDS.西域數(shù)碼(NWDS.CN)于2008年11月開(kāi)發(fā),作者:SING_CEE 游戲演示地址 文件中,搜索“熱鬧”,并在后面加以下代碼

修改開(kāi)通牧場(chǎng)VIP等級(jí):打開(kāi) happyfarmindex.php 文件 查找 reqYellowlevel 修改 后面的數(shù)字
1、修改開(kāi)通牧場(chǎng)VIP等級(jí):
打開(kāi) happyfarmindex.php 文件 查找 reqYellowlevel 修改 后面的數(shù)字
2、名稱亂碼:
搜索:happyanimal.php 和 happyfarm.php 里的函數(shù) unicode_encodegb 替換為 unicode_encode
3、作物/動(dòng)物介紹,說(shuō)話亂碼:
打開(kāi) happyfarmmodulencini.x文明用語(yǔ),happyfarmmodulemcini.x文明用語(yǔ) 另存為utf-8 編碼格式
4、公告修改
打開(kāi) :happyfarm.php 查找:getNotice 下面 找到 : echo “{”id“:”.$_SGLOBAL['timestamp'].“,”content“:”提示:天u6C14轉(zhuǎn)冷,請(qǐng)多烤火,少上u7F51,少偷菜,愛(ài)護(hù)好自u(píng)5DF1的身體。---農(nóng)場(chǎng)管理員“,”time“:”.$_SGLOBAL['timestamp'].“,”code“:1}”;使用工具: Unicode中文互轉(zhuǎn),進(jìn)行修改
5、關(guān)于注冊(cè) 默認(rèn)VIP等級(jí) 在數(shù)據(jù)庫(kù)初始值上修改.暫時(shí)未做文本配置.6、關(guān)于裝飾反復(fù)購(gòu)買和刷經(jīng)驗(yàn)問(wèn)題 都是假像.由于還沒(méi)完成YB購(gòu)買的代碼 所以未對(duì)數(shù)據(jù)庫(kù)操作.刷新就恢復(fù)
7、.簡(jiǎn)易管理后臺(tái)如何使用
http://你的home地址/adminfarm.php 用戶UID:為數(shù)字ID 不是帳號(hào)
8、一鍵摘取時(shí)間段設(shè)置 打開(kāi) happyfarmindex.php 文件 查找 “batchStealHour” 修改后面的參數(shù).注意 按照格式
9、.home主頁(yè)動(dòng)態(tài)提示名稱顯示編碼修復(fù) 打開(kāi) happyfarm/happyfarm.php 查找 $touserspace[name] = unicode_encodegb($touserspace[name]);刪除此行
10、狗咬人的錢修改 查找:
$dog_money = $cropstype[$a][sale];$int2_temp=rand(1,10);if($int2_temp > 8)上面的8 越小,咬人的幾率越高 往下.......{ $dog_money = $dog_money + round(20 * rand(1,30)/ 5)* rand(1,2);} else { $dog_money = $dog_money + round(10 * rand(1,20)/ 5);rand是取隨機(jī)數(shù) round 是四舍五入 根據(jù)自己需要進(jìn)行調(diào)節(jié)。
可以改rand(1,20)將后面的數(shù)字縮小,或者將數(shù)字5調(diào)大 狗咬人的錢就少了!
點(diǎn)擊下載地址:仿QQ農(nóng)場(chǎng)牧場(chǎng)(源碼)最新
五、Flash斗地主源碼(網(wǎng)頁(yè)斗地主源碼)
網(wǎng)頁(yè)版的在線三人斗地主游戲,F(xiàn)lash+PHP5+Mysql5,打開(kāi)網(wǎng)頁(yè)即可直接斗地主,無(wú)需下載客戶端!
新增了提示、托管、記分牌、聲音、時(shí)鐘、好友邀請(qǐng)等功能。點(diǎn)擊下載地址:Flash斗地主源碼(網(wǎng)頁(yè)斗地主源碼)
六、停車大戰(zhàn)V1.0源碼
軟件類型:國(guó)產(chǎn)軟件 授權(quán)方式:共享軟件 界面語(yǔ)言:簡(jiǎn)體中文 軟件大?。? MB 文件類型:.rar 運(yùn)行環(huán)境:Win2003,WinXP,Win2000,Win9X 軟件等級(jí):★★★☆☆ 發(fā)布時(shí)間:2010-09-18 官方網(wǎng)址:http:// 演示網(wǎng)址:http:// 下載次數(shù):
軟件介紹 <% dim i,page,rscount,pagea page=request.QueryString(“page”)if Request(“action”)=“add” then IF not isNumeric(request.form(“pkmoney”))then response.write “” response.write “” response.end End if IF not isNumeric(request.form(“pktimemoney”))then response.write “” response.write “” response.end End if IF not isNumeric(request.form(“pktype”))then response.write “” response.write “” response.end End if if trim(request.form(“pkname”))=“" then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkgif“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkswf“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pktt“))=”“ then response.write ”“ response.write ”“ Response.End end if set rsadd=server.CreateObject(”ADODB.RecordSet“)sqladd=”select * from pk_auto“ rsadd.open sqladd,u_conn,1,3 rsadd.addnew rsadd(”autotype“)=trim(request(”pktype“))rsadd(”autoname“)=trim(request(”pkname“))rsadd(”autobrand“)=trim(request(”pkgif“))rsadd(”autoworth“)=trim(request(”pkmoney“))rsadd(”autott“)=trim(request(”pktt“))rsadd(”swfid“)=trim(request(”pkswf“))rsadd(”autotimemoney“)=trim(request(”pktimemoney“))rsadd.update
rsadd.close response.write ”“ response.write ”“ rs.close set rs=nothing end if if Request(”action“)=”addmoney“ then IF not isNumeric(request.form(”cmemoney“))then response.write ”“ response.write ”“ response.end End if IF not isNumeric(request.form(”userid“))then response.write ”“ response.write ”“ response.end End if musicconn.Execute(”UPDATE [pk_spaces] Set pkumoney = pkumoney +“&request.form(”cmemoney“)&” where pkuid = “&request.form(”userid“))response.write ”“ response.write ”“ end if if Request(”action“)=”editpost“ then IF not isNumeric(request.form(”pkmoney“))then response.write ”“
response.write ”“ response.end End if if not isNumeric(request.form(”pkid“))then response.write ”“ response.write ”“ Response.End end if IF not isNumeric(request.form(”pktimemoney“))then response.write ”“ response.write ”“ response.end End if IF not isNumeric(request.form(”pktype“))then response.write ”“ response.write ”“ response.end End if if trim(request.form(”pkname“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkgif“))=”“ then response.write ”“ response.write ”“ Response.End
end if if trim(request.form(”pkswf“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pktt“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkid“))=”“ then response.write ”“ response.write ”“ Response.End end if set rsadd=server.CreateObject(”ADODB.RecordSet“)sqladd=”select * from pk_auto where autoid=“&trim(request.form(”pkid“))&”“ rsadd.open sqladd,u_conn,1,3 rsadd(”autotype“)=trim(request(”pktype“))rsadd(”autoname“)=trim(request(”pkname“))rsadd(”autobrand“)=trim(request(”pkgif“))rsadd(”autoworth“)=trim(request(”pkmoney“))rsadd(”autott“)=trim(request(”pktt“))rsadd(”swfid“)=trim(request(”pkswf“))rsadd(”autotimemoney“)=trim(request(”pktimemoney“))rsadd.update rsadd.close
set rsadd=nothing response.write ”“ response.write ”“ end if IF Request(”del“)<>”“ Then musicconn.Execute(”Delete From pk_auto Where autoid=“&Request(”del“))response.write ”“ response.write ”“ Response.End End IF dim rspkinfo,pkid,pktype,pkname,pkgif,pkswf,pkmoney,pktimemoney,pktt if Request(”edit“)<>”“ and Request(”edit“)>0 then Set rspkinfo = musicconn.Execute(”Select * From [pk_auto] Where autoid=“&Request(”edit“)&”“)pkid=rspkinfo(”autoid“)pktype=rspkinfo(”autotype“)pkname=rspkinfo(”autoname“)pkgif=rspkinfo(”autobrand“)pkswf=rspkinfo(”swfid“)pkmoney=rspkinfo(”autoworth“)pktimemoney=rspkinfo(”autotimemoney“)pktt=rspkinfo(”autott“)rspkinfo.close set rspkinfo=nothing end if %>
添加車子
第四篇:Android源碼編譯整理總結(jié)1.必要的軟件環(huán)境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install libc6-dev sudo apt-get install patch sudo apt-get install texinfo sudo apt-get install libncurses-dev sudo apt-get install git-core gnupg sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl sudo apt-get install ncurses-dev sudo apt-get install zlib1g-dev sudo apt-get install valgrind sudo apt-get install python2.5 筆者發(fā)現(xiàn)這里已經(jīng)比較全來(lái),不過(guò)還有一些應(yīng)該是linux系統(tǒng)自帶的,如果缺少就按照提示install一下 安裝java環(huán)境,這里有必要說(shuō)一下,大家裝環(huán)境的時(shí)候很多人會(huì)一起裝,不過(guò)筆者建議java和其他的分開(kāi),因?yàn)檠bjava很可能會(huì)失敗,從而導(dǎo)致其他的也fail sudo apt-get install sun-java6-jdk 這里就說(shuō)到上面說(shuō)很多人會(huì)安裝java失敗的問(wèn)題,筆者也是從網(wǎng)上找的解決辦法現(xiàn)在一起整理出來(lái): ubuntu10.04 lucid 去掉了sun-java6-jre,sun-java6-jdk的源,所以如果是直接apt-get install 提示是 現(xiàn)在沒(méi)有可用的軟件包 sun-java6-jdk,但是它被其它的軟件包引用了。 這可能意味著這個(gè)缺失的軟件包可能已被廢棄,或者只能在其他發(fā)布源中找到 E: 軟件包 sun-java6-jdk 還沒(méi)有可供安裝的候選者 解決辦法(選擇一個(gè)即可): 1、系統(tǒng)->系統(tǒng)管理->軟件源->“其它軟件”下添加一個(gè) deb http://archive.canonical.com/ lucid partner 之后,再執(zhí)行apt-get install 如果是下載java5就添加deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse” 2、自己從sun網(wǎng)站下載相應(yīng)的Jre,JDK安裝即可 3、從新立德軟件管理器中search openJDK,用openJDK代替 注: 官方文檔說(shuō)如果用sun-java6-jdk可出問(wèn)題,得要用sun-java5-jdk。經(jīng)測(cè)試發(fā)現(xiàn),如果僅僅make(make不包括make sdk),用sun-java6-jdk是沒(méi)有問(wèn)題的。而make sdk,就會(huì)有問(wèn)題,嚴(yán)格來(lái)說(shuō)是在make doc出問(wèn)題,它需要的javadoc版本為1.5。 因此,我們安裝完sun-java6-jdk后最好再安裝sun-java5-jdk,或者 只安裝sun-java5-jdk。這里sun-java6-jdk和sun-java5-jdk都安裝,并只修改javadoc.1.gz和 javadoc。因?yàn)橹挥羞@兩個(gè)是make sdk用到的。這樣的話,除了javadoc工具是用1.5版本,其它均用1.6版本: sudo apt-get install sun-java5-jdk 修改javadoc的link cd /etc/alternatives sudo rm javadoc.1.gz sudo ln-s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz sudo rm javadoc sudo ln-s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc 2、設(shè)置環(huán)境變量 vim ~/.bashrc 在.bashrc中新增或整合PATH變量,如下 #java 程序開(kāi)發(fā)/運(yùn)行的一些環(huán)境變量 JAVA_HOME=/usr/lib/jvm/java-6-sun JRE_HOME=${JAVA_HOME}/jre export ANDROID_JAVA_HOME=$JAVA_HOME export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSP ATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin export JAVA_HOME;export JRE_HOME;export CLASSPATH;HOME_BIN=~/bin/ export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN};#echo $PATH;最后,同步這些變化: source ~/.bashr 3.安裝repo(用來(lái)更新android源碼) 創(chuàng)建~/bin目錄,用來(lái)存放repo程序,如下: $ cd ~ $ mkdir bin 并加到環(huán)境變量PATH中,在第2步中已經(jīng)加入 下載repo腳本并使其可執(zhí)行: $ curl http://android.git.kernel.org/repo >~/bin/repo $ chmod a+x ~/bin/repo 4.初始化repo repo是android對(duì)git的一個(gè)封裝,簡(jiǎn)化了一些git的操作。創(chuàng)建工程目錄: $ mkdir android $ cd android repo初始化 $ repo init-u git://android.git.kernel.org/platform/manifest.git 這里包含了android最新的源碼 在此過(guò)程中需要輸入名字和email地址。初始化成功后,會(huì)顯示: repo initialized in /android 在~/android下會(huì)有一個(gè).repo的隱藏目錄。 如果想拿某個(gè)branch而不是主線上的代碼,我們需要用-b參數(shù)制定branch名字,比如: repo init-u git://android.git.kernel.org/platform/manifest.git-b cupcake 這 里抓下來(lái)的分支是cupcake,網(wǎng)上關(guān)于編譯到文章大多是針對(duì)cupcake分支,是andoird 1.5版本,但是之前我沒(méi)有輸入后面的參數(shù),以致于下到的代碼是主線上的代碼,是android 2.1版本。兩者目錄結(jié)構(gòu)有一些差別,導(dǎo)致當(dāng)我按照網(wǎng)上的說(shuō)明步驟來(lái)執(zhí)行遇到錯(cuò)誤時(shí),不知道是版本不同的原因還是其他什么原因。因此很奇怪為什么網(wǎng)上的文 章都是說(shuō)cupcake的,而沒(méi)有怎么講主線的源代碼編譯。5.同步源代碼 $ repo sync 這一步要很久,要看個(gè)人的網(wǎng)絡(luò)速度 6.編譯android源碼,并得到~/android/out目錄 $ cd ~/andoird $ make-j2 筆者的電腦是雙核所以是-j2,以此類推8核就可以-j8 這一過(guò)程很久,主要看機(jī)器的配置 如果是cupcake,那么直接make的時(shí)候,會(huì)出現(xiàn)以下錯(cuò)誤: 1.frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY(android.policy_phone).Stop.錯(cuò)誤。 解決辦法: 在build/tools/findleaves.sh中的第89行,這一句find “${@:0:$nargs}” $findargs-type f-name “$filename”-print | 改為find “${@:1:$nargs-1}” $findargs-type f-name “$filename”-print | 2.frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not declared in this scope的錯(cuò)誤 解決辦法: 下載gcc-4.3和g++-4.3 apt-get install gcc-4.3 g++-4.3 因?yàn)閡buntu 9.10自帶到是gcc 4.4,因此需要重新下載gcc 4.3,最后設(shè)置gcc軟連接到gcc 4.3 進(jìn)入/usr/bin cd /usr/bin 建個(gè)軟連接 ln-s gcc-4.3 gcc ln-s g++-4.3 g++ 然后進(jìn)入android目錄下,執(zhí)行make,就可以了。 主線代碼則沒(méi)有此問(wèn)題 7.在模擬器上運(yùn)行編譯好的android 編譯好android之后,emulator在~/android/out/host/linux-x86/bin 下,ramdisk.img,system.img和userdata.img則在~/android/out/target/product /generic下 $ cd ~/android/out/host/linux-x86/bin 增加環(huán)境變量 $ emacs ~/.bashrc 在.bashrc中新增環(huán)境變量,如下 #java 程序開(kāi)發(fā)/運(yùn)行的一些環(huán)境變量 export ANDROID_PRODUCT_OUT=~/android/out/target/product/g eneric ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x 86/bin export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_ PRODUCT_OUT};最后,同步這些變化: $ source ~/.bashrc $ cd ~/android/out/target/product/generic $ emulator-system system.img-data userdata.img-ramdisk ramdisk.img 最后進(jìn)入android桌面,就說(shuō)明成功了。8.編譯模塊 android中的一個(gè)應(yīng)用程序可以單獨(dú)編譯,編譯后要重新生成system.img 在源碼目錄下執(zhí)行 $.build/envsetup.sh(.后面有空格)就多出一些命令: -croot: Changes directory to the top of the tree.mm: Builds all of the modules in the current directory.cgrep: Greps on all local C/C++ files.resgrep: Greps on all local res/*.xml files.-godir: Go to the directory containing a file.可以加—help查看用法 我們可以使用mmm來(lái)編譯指定目錄的模塊,如編譯聯(lián)系人: $ mmm packages/apps/Contacts/ 編完之后生成兩個(gè)文件: out/target/product/generic/data/app/ContactsTests.apk out/target/product/generic/system/app/Contacts.apk 可以使用 $ make snod 重新生成system.img,再運(yùn)行模擬器 9.編譯SDK 直接執(zhí)行make是不包括make sdk的。make sdk用來(lái)生成SDK,這樣,我們就可以用與源碼同步的SDK來(lái)開(kāi)發(fā)android了。 a)修改/frameworks/base/include/utils/Asset.h ?UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024? 改為 ?UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024? 原因是eclipse編譯工程需要大于1.3M的buffer; 這一步,筆者編譯的是主線程的,在Asset.h文件里沒(méi)找到上面的常量,所以就沒(méi)做這一步,但是也成功了。b)編譯ADT。 如果想用eclipse開(kāi)發(fā)android應(yīng)用程序,最好是安裝ADT,這樣就可以在eclipse下創(chuàng)建android的工程。 產(chǎn)生ADT eclipse plugins $ development/tools/eclipse/scripts/build_server.sh ~/adt/ 使用前建議設(shè)定一下ECLIPSE_HOME的環(huán)境變量,不然會(huì)以為沒(méi)有裝eclipse,然后幫你download下來(lái)。 這里要非常注意,本人就曾經(jīng)卡在這里,始終編譯不過(guò)。一開(kāi)始會(huì)提示eclipse的什么什么jar找不到,因此fail。這主要是因?yàn)槲业?ECLIPSE_HOME到環(huán)境變量設(shè)置錯(cuò)誤。我之前裝的eclipse只從新力得上面抓下來(lái)的,好像找不到eclipse所在到目錄是哪個(gè),結(jié)果就設(shè)置 了一個(gè)名為eclipse的文件夾作為環(huán)境變量。因此后來(lái)直接從eclipse的官網(wǎng)上下了一個(gè),以為這樣就可以。結(jié)果杯具的是下到是一個(gè)eclipse Galileo,到頭來(lái)還是提示eclipse什么什么文件找不到。最后實(shí)在沒(méi)法,索性把eclipse刪個(gè)干凈,讓程序自己去下eclipse,發(fā)現(xiàn)抓 的是eclipse ganymede。在此要鄭重說(shuō)明一下,自己去下的話應(yīng)該下載jee的ganymade,而不能是java 的ganymade,具體原因試試就知道了。 主線代碼編譯ADT的時(shí)候方法相同,但是沒(méi)有development/tools/eclipse這個(gè)目錄,而是在/sdk/eclipse這個(gè)目錄 c)執(zhí)行make sdk。 注意,這里需要的javadoc版本為1.5,所以你需要在步驟1中同時(shí)安裝sun-java5-jdk $ make sdk 編譯很慢。編譯后生成的SDK存放在out/host/linux-x86/sdk/,此目錄下有android-sdk_eng.xxx_linux-x86.zip和android-sdk_eng.xxx_linux-x86目錄。android-sdk_eng.xxx_linux-x86就是 SDK目錄 實(shí)際上,當(dāng)用mmm命令編譯模塊時(shí),一樣會(huì)把SDK的輸出文件清除,因此,最好把a(bǔ)ndroid-sdk_eng.xxx_linux-x86移出來(lái) 此后的應(yīng)用開(kāi)發(fā),就在該SDK上進(jìn)行,所以把7)對(duì)于~/.bashrc的修改注釋掉,增加如下一行: export PATH=${PATH}:~/android/out/host/linux-x86/sdk/andr oid-sdk_eng.xxx_linux-x86/tools 注意要把xxx換成真實(shí)的路徑; 同樣筆者編譯的是主線程,所以編譯完之后,發(fā)現(xiàn)~/android/out/host/linux-x86/sdk/android-sdk_eng.x xx_linux-x86/目錄下有2個(gè)文件夾一個(gè)是tools一個(gè)是platform-tools,然后用eclipse指向這個(gè)目錄的時(shí)候會(huì)提示找不到ADB,這時(shí)候只要把platform-tools下的ADB拷貝到tools文件夾就OK了 d)關(guān)于環(huán)境變量、android工具的選擇 目前的android工具有: A、我們從網(wǎng)上下載的SDK,如果你下載過(guò)的話(tools下有許多android工具,lib/images下有img映像) B、我們用make sdk編譯出來(lái)的SDK(tools下也有許多android工具,lib/images下有img映像) C、我們用make編譯出來(lái)的out目錄(tools下也有許多android工具,lib/images下有img映像) 那么我們應(yīng)該用那些工具和img呢? 首先,我們一般不會(huì)用A選項(xiàng)的工具和img,因?yàn)橐话銇?lái)說(shuō)它比較舊,也源碼不同步。其次,也不會(huì)用C選項(xiàng)的工具和img,因?yàn)檫@些工具和img沒(méi)有經(jīng)過(guò) SDK的歸類處理,會(huì)有工具和配置找不到的情況;事實(shí)上,make sdk產(chǎn)生的很多工具和img,在make編譯出來(lái)out目錄的時(shí)候,已經(jīng)編譯產(chǎn)生了,make sdk只是做了copy而已。e)安裝、配置ADT ~/adt/android-eclipse/下的文件壓縮,然后從eclipse中install就行了,當(dāng)然還有其他方法 10.編譯linux內(nèi)核映像 a)準(zhǔn)備交叉編譯工具鏈 android代碼樹(shù)中有一個(gè)prebuilt項(xiàng)目,包含了我們編譯內(nèi)核所需的交叉編譯工具。b)設(shè)定環(huán)境變量 $ emacs ~/.bashrc 增加如下兩行: export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/ arm-eabi-4.4.0/bin export ARCH=arm 保存后,同步變化: $ source ~/.bashrc c)獲得合適的內(nèi)核源代碼 $ cd ~/android 獲得內(nèi)核源代碼倉(cāng)庫(kù) $ git clone git://android.git.kernel.org/kernel/common.git kernel $ cd kernel $ git branch 顯示 * android-2.6.27 說(shuō)明你現(xiàn)在在android-2.6.27這個(gè)分支上,也是kernel/common.git的默認(rèn)主分支。顯示所有head分支: $ git branch-a 顯示 * android-2.6.27 remotes/origin/HEAD-> origin/android-2.6.27 remotes/origin/android-2.6.25 remotes/origin/android-2.6.27 remotes/origin/android-2.6.29 remotes/origin/android-goldfish-2.6.27 remotes/origin/android-goldfish-2.6.29 我們選取最新的android-goldfish-2.6.29,其中g(shù)oldfish是android的模擬器模擬的CPU。 $ git checkout-b android-goldfish-2.6.29 origin/android-goldfish-2.6.29 $ git branch 顯示 android-2.6.27 * android-goldfish-2.6.29 我們已經(jīng)工作在android-goldfish-2.6.29分支上了。d)設(shè)定交叉編譯參數(shù) 打開(kāi)kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器 CROSS_COMPILE ?= arm-eabi-把 LDFLAGS_BUILD_ID = $(patsubst-Wl$(comma)%,%, $(call ld-option,-Wl$(comma)build-id,)) 這一行注釋掉,并且添加一個(gè)空的LDFLAGS_BUILD_ID定義,如下: LDFLAGS_BUILD_ID = e)編譯內(nèi)核映像 $ cd ~/android/kernel $ make goldfish_defconfig $ make f)測(cè)試生成的內(nèi)核映像 $ emulator-avd myavd-kernel ~/android/kernel/arch/arm/boot/zImage 第五篇:VB 源碼 字符排列組合(范文)效果圖 編程界面 所有源碼 Option Explicit Private newStr As String, tempNewStr As String, cont As Long Private Sub Command1_Click() Text1.Enabled = False RichTextBox1.Enabled = False RichTextBox1.Text = “" Dim tempStr As String tempStr = Trim(Text1.Text) newStr = ”“: tempNewStr = ”“ cont = 0 If Check1.Value = 0 Then GetStr tempStr If Check1.Value = 1 Then GetStr2 tempStr, ”“ RichTextBox1.Text = newStr Frame1.Caption = ”總個(gè)數(shù):“ & cont Text1.Enabled = True RichTextBox1.Enabled = True RichTextBox1.Find End Sub Private Sub Text1_Change() RichTextBox1.Text = ”“ Frame1.Caption = ”總個(gè)數(shù):“ End Sub Private Function GetStr(ByVal str1 As String)As String str1 = Trim(str1) If str1 = ”“ Then Exit Function Dim i As Integer, tempStr As String, tempChr As String, tempLen As Integer Dim mytempStr As String mytempStr = tempNewStr For i = 1 To Len(str1) DoEvents tempChr = ”“ tempChr = Mid(str1, i, 1)'取一個(gè)字符 tempNewStr = tempNewStr & tempChr '單組組合tempStr = Left(str1, ii)'剩余新字符 If Len(tempStr)> 1 Then GetStr tempStr Else newStr = newStr & tempNewStr & tempStr & IIf((cont + 1)Mod 200 = 0, Chr(13), Chr(9))'終組組合 cont = cont + 1 Frame1.Caption = ”執(zhí)行中:“ & cont End If tempNewStr = mytempStr Next End Function Private Function GetStr2(ByVal str1 As String, ByVal str2 As String)As String Dim tempStr As String Dim i As Integer For i = 1 To Len(str1) DoEvents If Len(str2)+ 1 = Len(str1)Then newStr = newStr & str2 & Mid(str1, i, 1)& IIf((cont + 1)Mod 200 = 0, Chr(13), Chr(9)) cont = cont + 1 Frame1.Caption = ”執(zhí)行中:" & cont Else GetStr2 str1, str2 & Mid(str1, i, 1) End If Next End Function ![]() 下載java-Floodlight源碼分析IOFMessageListener.doc
將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
![]() 點(diǎn)此處下載文檔
文檔為doc格式 網(wǎng)址:http://004km.cn/a8/2019051311/3ab0e356c10f33b8.html
聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。 源碼交易平臺(tái)簡(jiǎn)介(共5篇)人文街交易平臺(tái)成立于2014年10月18日,屬于源碼素材教程共享平臺(tái)網(wǎng)站,主要內(nèi)容有:,PS素材,設(shè)計(jì)素材,視頻教程,視頻素材,APP交易平臺(tái),軟件交易等。目前已成為全國(guó)最專業(yè)、素材更...... android有關(guān)sensor的源碼總結(jié)android有關(guān)sensor的源碼總結(jié) 雖然這篇文章寫(xiě)得很差,因?yàn)橼s時(shí)間,所以就匆匆忙忙地寫(xiě)出來(lái)自己作一個(gè)筆記。但是我想對(duì)大家應(yīng)該有一點(diǎn)幫助。 1、有關(guān)sensor在Java應(yīng)用程序的編...... 軟件源碼移交保密協(xié)議系統(tǒng)源碼授權(quán)使用保密協(xié)議 ╳╳系統(tǒng) 源碼授權(quán)使用保密協(xié)議 甲方:珠海市聯(lián)進(jìn)高技術(shù)有限公司乙方: 簽訂地點(diǎn): 一、協(xié)議背景 ╳╳系統(tǒng)是珠海市聯(lián)進(jìn)高技術(shù)有限公司(以下簡(jiǎn)稱甲方)...... Ubuntu 11.10編譯Android源碼錯(cuò)誤[范文大全]Ubuntu 11.10編譯Android源碼錯(cuò)誤 問(wèn)題1: frameworks/base/libs/utils/RefBase.cpp: 在成員函數(shù) ‘void android::RefBase::weakref_type::trackMe(bool, bool)’中: framewo...... ASP學(xué)生信息管理系統(tǒng)論文+源碼ASP學(xué)生信息管理系統(tǒng)論文+源碼222.240.89.* 1樓 1緒論 1 1.1 國(guó)內(nèi)外應(yīng)用與開(kāi)發(fā)現(xiàn)狀 1 1.1.1 應(yīng)用現(xiàn)狀 1 1.1.2 系統(tǒng)開(kāi)發(fā)現(xiàn)狀 1 1.2 教師專用學(xué)生信息管理系統(tǒng)開(kāi)發(fā)背景及目標(biāo)...... 大型ASP網(wǎng)站源碼運(yùn)行說(shuō)明書(shū)大型ASP網(wǎng)站源碼運(yùn)行說(shuō)明 大型ASP網(wǎng)站源碼運(yùn)行說(shuō)明 1.1 辦公自動(dòng)化網(wǎng)站運(yùn)行說(shuō)明 辦公自動(dòng)化網(wǎng)站屬于網(wǎng)絡(luò)辦公類,工作人員可以通過(guò)使用該系統(tǒng)進(jìn)行人事管理、工作計(jì)劃管理和...... QQ空間魔力日志制作源碼教程范文合集QQ空間魔力日志制作源碼教程 魔力日志制作教程 有一種“魔力”的QQ空間日志,當(dāng)你進(jìn)入自己QQ個(gè)人中心時(shí)看到別人空間轉(zhuǎn)發(fā)了這篇日志的時(shí)候,會(huì)在上看到你的QQ號(hào),網(wǎng)名、頭像、...... Java源碼閱讀的真實(shí)體會(huì)(五篇模版)Java源碼閱讀的真實(shí)體會(huì)剛才在論壇不經(jīng)意間,看到有關(guān)源碼閱讀的帖子?;叵胱约呵皫啄?,閱讀源碼那種興奮和成就感,不禁又有一種激動(dòng)。 源碼閱讀,我覺(jué)得最核心有三點(diǎn):技術(shù)基礎(chǔ)+...... |