<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    OS Lab 零散記錄

    Posted on 2008-10-10 15:21 ZelluX 閱讀(592) 評論(0)  編輯  收藏 所屬分類: C/C++SystemCourses
    轉自偶的內(nèi)網(wǎng)博客

    Time : 2008-08-20 21:44
    匯編文件中導出函數(shù)符號

    Linux 2.4.18的linux/linkage.h文件定義了若干相關的宏

    #define?SYMBOL_NAME(X)?X
    #ifdef?__STDC__
    #define?SYMBOL_NAME_LABEL(X)?X##:
    #else
    #define?SYMBOL_NAME_LABEL(X)?X/**/:
    #endif
    ?
    #define?__ALIGN?.align?16,0x90
    #define?__ALIGN_STR?".align?16,0x90"
    ?
    #define?ALIGN?__ALIGN
    #define?ALIGN_STR?__ALIGN_STR
    ?
    #define?ENTRY(name)?\
    ??.globl?SYMBOL_NAME(name);?\
    ??ALIGN;?\
    ??SYMBOL_NAME_LABEL(name)

    用ENTRY(name)就能定義函數(shù)了。后來發(fā)現(xiàn)Flux OSKit中本來就提供了類似功能的宏,定義在inc/asm.h中。
    使用的時候需要再寫一個c語言的wrapper function(至少2.4.18里面是這么做的)
    asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");

    Time : 2008-08-22 15:56
    OS Lab 4 debugging notes [1]
    系統(tǒng)調用 fork()

    用Simics跟蹤一條條匯編分析頁表映射、寄存器值還真是體力活啊。。

    1. 實現(xiàn)Copy On Write時,如果某一個用戶態(tài)頁面有多個進程共享,其中一個進程修改該頁面時需要創(chuàng)建一個新的頁面。一開始偶忘了把原來頁面的內(nèi)容復制到新的頁面了 =_= 另外由于新的頁面要代替老的頁面,或者說它們的物理地址不同,但虛擬地址相同,我的方法是在內(nèi)核態(tài)開辟一個大小為一個頁面的空間作為中轉。

    2. do_fork函數(shù)中,子進程復制父進程的頁表的同時會把父進程頁表項置為不可寫,注意最后要flush tlb。因為一開始沒有flush tlb,導致最后用戶態(tài)fork返回以后讀取的信息來自于tlb,直接改寫了共享頁面中fork的返回地址,導致切換到子進程時fork的返回地址丟失。這個bug讓我郁悶了兩三個小時。。

    3. 使用兩次fork時,第二次fork返回的pid會被改掉。查了下發(fā)現(xiàn)為用戶空間分配物理頁面的代碼里居然在分配好以后沒有把對應的struct置為已使用,結果導致第二個子進程COW創(chuàng)建新頁面時得到了原來的父進程頁面,改寫了父進程頁面內(nèi)容。

    Time : 2008-08-23 19:41
    OS Lab4 debugging notes [2]
    ?
    系統(tǒng)調用 exec()

    1. 清空頁表的用戶空間映射的函數(shù)一開始寫得yts,bug到處都是,比如free的時候沒使用指向內(nèi)存塊首地址的指針,記錄內(nèi)存地址的變量沒有累加。

    2. exec傳遞給內(nèi)核態(tài)的兩個參數(shù)必須先在內(nèi)核態(tài)保存一個副本,否則清空用戶態(tài)頁表后就無法得到這兩個參數(shù)信息了。

    3. 分配給用戶態(tài)的頁面必須先清零,一方面考慮到安全性,另一方面不清零會隱藏一些潛在的bug。一開始我沒有在內(nèi)核執(zhí)行exec的時候完整的復制所有的參數(shù),而是直接指向了原進程的內(nèi)存空間,由于清空頁表后再次申請新頁表時得到了原來的頁面,結果正好原來那個保存參數(shù)的頁面和新進程的該頁面重合了 =_= 于是浪費了不少時間在這個bug上

    Time : 2008-08-31 1:18
    OS Lab5 debugging notes

    還算順利,不過這個lab蠻無聊的,等有空了把syscall改成類似linux的做法,單一中斷號+寄存器選擇syscall。

    1. 最花時間的一個bug是ls返回值沒有改成應用程序數(shù),結果一開始一直以為是brk系統(tǒng)調用沒寫好,最后才發(fā)現(xiàn)問題出在這么小的地方。

    2. brk的邏輯還不是很清楚,盡管通過了簡單的測試,但是debug輸出的信息顯示brk增長的很快,經(jīng)常是一個頁一個頁漲的,看來還得查下brk的具體行為。

    3. 寫了個比MAGIC_BREAK好用一點的宏,因為用戶態(tài)的程序都是按二進制讀入的,Simics無法得到函數(shù)信息(函數(shù)名、當前行數(shù)等),利用C99的宏寫了個新的INFO_BREAK

    #define?INFO_BREAK?\
    ????
    do?{??\
    ????????lprintf_kern(
    "break?in?%s:%d",?__FUNCTION__,?__LINE__);?\
    ????????MAGIC_BREAK;?\
    ????}
    ?while?(0)?\
    主站蜘蛛池模板: 亚洲AV成人无码网天堂| 亚洲AV无码一区二区三区系列| 亚洲精品一卡2卡3卡三卡四卡| 久久九九全国免费| 亚洲色偷偷综合亚洲AVYP| 一级有奶水毛片免费看| 亚洲熟妇无码乱子AV电影| 9久久免费国产精品特黄| 亚洲中文字幕在线第六区| 在线观看免费黄色网址| 久久亚洲高清观看| 免费视频精品一区二区三区| 久久久久久亚洲精品| 120秒男女动态视频免费| 亚洲国产成AV人天堂无码| 两个人的视频高清在线观看免费| 亚洲国产视频久久| 免费可以在线看A∨网站| 91亚洲性爱在线视频| 免费可以看黄的视频s色| 亚洲av无码成人影院一区| 亚洲午夜成人精品电影在线观看| 中文字幕免费在线视频| 亚洲成人在线网站| 99久久这里只精品国产免费| 在线观看国产一区亚洲bd| 免费一级成人毛片| 在线观看免费无码视频| 亚洲导航深夜福利| 国产精品另类激情久久久免费| 夜夜爽妓女8888视频免费观看| 国产亚洲综合久久系列| 免费精品国偷自产在线在线| 国产综合成人亚洲区| 亚洲VA中文字幕无码一二三区 | 久久免费福利视频| 久久精品国产亚洲AV麻豆不卡 | 日韩a毛片免费观看| 国产亚洲AV无码AV男人的天堂| 亚欧免费视频一区二区三区| 国产AV无码专区亚洲AV蜜芽 |