最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

記一個(gè)十分詭異的bug:結(jié)構(gòu)體的內(nèi)容會莫名其妙的變化。

2023-06-12 11:19 作者:豆芽Doxel  | 我要投稿

本文節(jié)選自我的實(shí)驗(yàn)報(bào)告。
北航的操作系統(tǒng)課程會在學(xué)期末布置若干個(gè)"挑戰(zhàn)性任務(wù)",任務(wù)要求是在本學(xué)期完成的系統(tǒng)內(nèi)核中增添新的功能。我選擇的挑戰(zhàn)性任務(wù)是實(shí)現(xiàn)進(jìn)程間通信的信號機(jī)制,下文記錄了我在傳輸信號結(jié)構(gòu)體時(shí)遇到的一個(gè)bug。解決這個(gè)bug的過程加深了我對系統(tǒng)編程的理解,特此記錄。

這個(gè)詭異的現(xiàn)象如下圖所示。其中s是指向struct signal結(jié)構(gòu)體的指針。

滿臉問號


明明沒有修改s->signum的值,為什么輸出結(jié)果會發(fā)生變化呢?難道是sigx自減時(shí)修改了它的值?還是說printk修改了它的值?這都不可能啊。

單看這一段代碼,我實(shí)在是摸不著頭腦。



抓耳撓腮了很久,我終于找到了問題所在,在新建信號結(jié)構(gòu)體時(shí),我是在一個(gè)函數(shù)內(nèi)部新建了一個(gè)struct signal結(jié)構(gòu)體,再將鏈表里的指針指向這個(gè)結(jié)構(gòu)體。代碼如下:

?int sys_sendsig(u_int envid, int sig) {
? ...
? struct signal s = {.signum = sig};
? TAILQ_INSERT_HEAD(&e->sig_pending, &s, sig_link);
? ...
?}
?

我在用java寫oo作業(yè)時(shí),經(jīng)常會寫出這樣的業(yè)務(wù)邏輯,并且不會出現(xiàn)bug。這種寫法很直觀,很容易理解,就是新建一個(gè)東西再放到鏈表里嘛。

但是在系統(tǒng)內(nèi)核里就不能這么寫,這么寫就會出bug。

問題就出在"在一個(gè)函數(shù)內(nèi)部新建結(jié)構(gòu)體",這只是在棧上申請了一個(gè)局部變量,當(dāng)這段空間釋放后被重新使用時(shí),這段空間原有的內(nèi)容就會被覆蓋。

為了解決這個(gè)問題,我聯(lián)想到了Env結(jié)構(gòu)體的組織方式:先使用全局變量申請固定的空間,這樣結(jié)構(gòu)體的內(nèi)容就不會被更改了。每次需要申請信號結(jié)構(gòu)體時(shí),只需要取出一份來用就可以了。代碼如下:

?// lab4-challenge
?struct signal sigs[SIG_BUFFER] __attribute__((aligned(BY2PG)));

解決這個(gè)bug的經(jīng)歷,是我這次挑戰(zhàn)性任務(wù)收獲最大的部分。

我深刻體會到,編寫系統(tǒng)內(nèi)核對內(nèi)存的操作要極其敏感,而且需要熟練掌握底層知識,讓自己的思維更加縝密。


記一個(gè)十分詭異的bug:結(jié)構(gòu)體的內(nèi)容會莫名其妙的變化。的評論 (共 條)

分享到微博請遵守國家法律
方正县| 汝城县| 天峻县| 铁力市| 安陆市| 塔河县| 扬州市| 天台县| 蓬安县| 耒阳市| 鹤壁市| 和顺县| 芒康县| 富源县| 五华县| 安吉县| 江陵县| 息烽县| 石嘴山市| 威宁| 新兴县| 自贡市| 双城市| 庆安县| 泾源县| 眉山市| 鄂托克旗| 元阳县| 尚义县| 大庆市| 邵东县| 保靖县| 宣武区| 晋宁县| 平南县| 高清| 大荔县| 探索| 鄂州市| 石楼县| 安顺市|