内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

gotoolobjdump怎么用

本篇內(nèi)容主要講解“go tool objdump怎么用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“go tool objdump怎么用”吧!

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的新密網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1.用go tool objdump,可以看到任意函數(shù)的機(jī)器碼、匯編指令、偏移。(go源碼下面有一個(gè)cmd/internal/goobj包,可以讀到.o文件的重定向信息,更好。)

2.修改里面的golang內(nèi)部函數(shù)的相對(duì)跳轉(zhuǎn),指向加載者相同的函數(shù)的地址(仍然可以用go tool objdump看到函數(shù)的初始地址),常見(jiàn)的有runtime.newobject、runtime.convT2Eslice、runtime.panicindex、runtime.morestack_noctxt等runtime系列函數(shù)。

3.修改golang類(lèi)型指針偏移(當(dāng)對(duì)象轉(zhuǎn)換成interface{}時(shí)候,需要一個(gè)類(lèi)型指針),指向加載者相同的類(lèi)型。

4.修改指向字符串,全局變量,自定義函數(shù)的偏移(一般都是相對(duì)偏移)。

5.寫(xiě)入mmap,并執(zhí)行。

整體思路是,通過(guò)修改偏移,復(fù)用加載者所用到的函數(shù)、golang內(nèi)部函數(shù)、golang類(lèi)型信息等。

缺點(diǎn):

1.可以自定義類(lèi)型,但是不能將這些類(lèi)型的對(duì)象賦值到interface{}(加載者已定義的類(lèi)型可以),比如使用fmt.Println打印這些對(duì)象(但是可以打印這些對(duì)象的成員)。因?yàn)間olang內(nèi)部的一些全局變量(比如golang類(lèi)型)可能存在指針,而且開(kāi)始就初始化了。

2.不能在函數(shù)外初始化全局變量。(可能的解決方法:定義一個(gè)入口函數(shù),在里面初始化,或者讀取main.init函數(shù),取出初始化代碼。)

優(yōu)點(diǎn):

仍然使用golang和golang編譯工具。

速度極快,體積極小。相當(dāng)于復(fù)用了golang內(nèi)部的調(diào)度器、內(nèi)存分配器、類(lèi)型系統(tǒng)等。

可以自定義。golang函數(shù)內(nèi)的匯編足夠簡(jiǎn)單,可以開(kāi)發(fā)自己的工具來(lái)實(shí)現(xiàn)上面的思路。

golang本質(zhì)就是GPM三個(gè)實(shí)體實(shí)現(xiàn)的調(diào)度。

G對(duì)應(yīng)每個(gè)任務(wù),P對(duì)應(yīng)每個(gè)processor概念(就是會(huì)包含一堆的G,比如先執(zhí)行G1,在執(zhí)行G2)M對(duì)應(yīng)系統(tǒng)線程,M(還包含系統(tǒng)棧之類(lèi)的概念)綁定一個(gè)P之后就開(kāi)始逐個(gè)運(yùn)行P里面的G。

最基本的流程圖就是雨痕給的 

后面雨痕對(duì)于GPM三者的解釋也很到位。我這里不抄襲了。

2.初始化 

首先介紹的就是schedinit()里面主要是procresize函數(shù)。

這個(gè)procresize()就是調(diào)整系統(tǒng)里面P的數(shù)量。一般就是系統(tǒng)的cpu內(nèi)核的數(shù)量,初始化時(shí)也實(shí)行多退少補(bǔ)的原則,只是退的時(shí)候要注意是否退出的P包含了當(dāng)前P,如果是就需要一大堆的細(xì)節(jié)上的處理。

這里還有個(gè)所有P的管理結(jié)構(gòu)

var allp [_MaxGomaxprocs + 1]*p

type schedt struct {

    pidle puintptr //  P  

    npidle uint32 //  P 

}

還有個(gè)提示,如果調(diào)用手動(dòng)調(diào)用并修改runtime.GOMAXPROCS就會(huì)引發(fā)stopTheWorld以及startTheWorld,這兩個(gè)動(dòng)作本身是比較好耗時(shí)的,之后在startTheWorld執(zhí)行的procresize()也是比較耗時(shí)的。

3.任務(wù) G/P 

先舉了個(gè)栗子,通過(guò)

go build -o test test.go

go tool objdump -s "main\.main" test

go add(x, y)會(huì)被匯編成類(lèi)似

 CALL runtime.newproc(SB)

這種代碼

然后就去runtime找了。

newproc(獲取pc/ip地址以及入?yún)⒌戎匾畔⒑?->newproc1

之后登場(chǎng)的G的數(shù)據(jù)結(jié)構(gòu)

type g struct {

    stack stack  //執(zhí)行棧

    sched gobuf  //用于保存執(zhí)行現(xiàn)場(chǎng)

    goid  int64  //唯一序號(hào)

    gopc  uintptr //調(diào)用者 PC/IP

    startpc uintptr //任務(wù)函數(shù)

}

newproc1一開(kāi)始就處理各種處理創(chuàng)建G,測(cè)試G,對(duì)齊地址,拷貝棧,保存現(xiàn)場(chǎng)的各種雜活兒。然后一個(gè)runqput(p, newg, true),被put進(jìn)去了。

runqput有可能把g作為P.runnext,也可能放在末尾,也有可能丟到全局隊(duì)列。

稍微介紹了g通過(guò)p然后進(jìn)行二級(jí)緩存復(fù)用的邏輯,類(lèi)似cache/object,central的做法。分別對(duì)應(yīng)gfget, gfput兩個(gè)函數(shù)。

所有的g 還有個(gè)全局應(yīng)用allgs/allg,用來(lái)索引所有的G方便回收和shrinkstack。

補(bǔ)充了個(gè)細(xì)節(jié)只有本地的P隊(duì)列堆滿了才會(huì)丟到全局隊(duì)列,而且一次會(huì)丟本地隊(duì)列長(zhǎng)度的一半,保證效率和多核均勻調(diào)度。

4.線程 M 

當(dāng)結(jié)束runqput之后,開(kāi)始wakep了, 

wake->startm->newm創(chuàng)建/或者notewakeup(&mp.park) 

newm->newosproc->linux調(diào)用

clone(cloneFlags,stk,unsafe.Pointer(mp),unsafe.Pointer(mp.g0),unsafe.Pointer(funcPC(mstart))) 開(kāi)啟系統(tǒng)線程,并且入口函數(shù)是mstart

所有m會(huì)被添加到allm鏈表,不會(huì)被釋放,超過(guò)10000崩潰。

最后補(bǔ)充了兩個(gè)細(xì)節(jié)1:m也是有復(fù)用的,mput&mget使用1級(jí)緩存。

然后說(shuō)不要?jiǎng)?chuàng)建太多m啊,time.Sleep比C.sleep(1)要好,之類(lèi)的。

5.執(zhí)行 

上面說(shuō)到newm的時(shí)候會(huì)注冊(cè)系統(tǒng)線程并把mstart作為入口函數(shù)。

然后這里就講mstart

mstart -> 

mstart1 aquirep綁定p ->

schedule()兼顧幫助垃圾回收標(biāo)記之類(lèi)的各種雜活,findrunable,->

調(diào)用execute->

各種準(zhǔn)備好棧JMP入函數(shù)入口地址PC->

各種調(diào)用結(jié)束后RET指令把預(yù)先壓入的goexit地址恢復(fù)到PC/IP->

將G返回服用鏈表->

重新schedule()

然后介紹了一下findrunable的主干:

1.通過(guò)runqget拿本地的P的東西, 

2.globrunqget 

3.檢查netpoll任務(wù) 

4.嘗試偷取其他P的任務(wù)。(基于CAS和atomicset弄的Work-Stealing算法)

… 

5.這后還會(huì)進(jìn)行各種嘗試,如果實(shí)在沒(méi)有就stopm了。

Lockedg 

這是cgo的一個(gè)特定調(diào)用方式,會(huì)把當(dāng)前的g和m綁定,而且只有在結(jié)束調(diào)用的時(shí)候才會(huì)松開(kāi)。

一個(gè)m在調(diào)用schedule() 如果發(fā)現(xiàn)它是被某個(gè)G綁定的則會(huì)暫時(shí)休息。如果發(fā)現(xiàn)自己將要調(diào)用的G,是被別的m綁定的,則會(huì)將它喚醒,然后自己休眠。

所以每個(gè)cgo routine在調(diào)用完成之前都會(huì)有自己專(zhuān)屬的一個(gè)G調(diào)用。cgo因此會(huì)產(chǎn)生大量的m。

到此,相信大家對(duì)“go tool objdump怎么用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站題目:gotoolobjdump怎么用
當(dāng)前路徑:http://m.rwnh.cn/article42/iggshc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、外貿(mào)網(wǎng)站建設(shè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、品牌網(wǎng)站制作定制開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)
陈巴尔虎旗| 萨嘎县| 屏南县| 江城| 七台河市| 固阳县| 孟村| 建德市| 公主岭市| 安岳县| 宜黄县| 安岳县| 竹山县| 鹤山市| 西安市| 磴口县| 南澳县| 印江| 久治县| 定州市| 尤溪县| 唐河县| 封丘县| 崇仁县| 井研县| 高淳县| 昔阳县| 收藏| 庆安县| 洛扎县| 和政县| 平塘县| 大姚县| 临清市| 栖霞市| 锡林郭勒盟| 遂平县| 临高县| 延庆县| 宁夏| 平谷区|