<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    OS Lab 零散記錄

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

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

    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)就能定義函數了。后來發現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]
    系統調用 fork()

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

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

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

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

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

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

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

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

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

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

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

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

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

    #define?INFO_BREAK?\
    ????
    do?{??\
    ????????lprintf_kern(
    "break?in?%s:%d",?__FUNCTION__,?__LINE__);?\
    ????????MAGIC_BREAK;?\
    ????}
    ?while?(0)?\
    主站蜘蛛池模板: 风间由美在线亚洲一区| 亚洲一区二区三区高清视频| 特级毛片A级毛片免费播放| 在线观看永久免费视频网站 | 亚洲天堂一区二区| 最近国语视频在线观看免费播放 | 成人黄色免费网址| 亚洲美女视频免费| 日本三级2019在线观看免费| 亚洲人成伊人成综合网久久| 丁香花在线观看免费观看| 亚洲人成自拍网站在线观看| 无码国模国产在线观看免费| 青青草97国产精品免费观看| 亚洲日韩国产精品第一页一区| a级毛片黄免费a级毛片| 久久精品国产亚洲av日韩| 99久久精品日本一区二区免费| 亚洲乱码国产乱码精华| 亚洲国产人成中文幕一级二级| 丁香花在线观看免费观看图片| 久久亚洲熟女cc98cm| 猫咪社区免费资源在线观看| 日韩在线观看视频免费| 国产精品久久久亚洲| 免费福利网站在线观看| 免费大片av手机看片高清| 亚洲AV人人澡人人爽人人夜夜| 永久在线观看www免费视频| 亚洲AV成人无码网站| 亚洲精品无码专区在线在线播放| 91av视频免费在线观看| 在线观看亚洲免费| 亚洲av无码av制服另类专区| 成在人线AV无码免费| 三级黄色片免费看| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲一区二区三区免费观看| youjizz亚洲| 久久精品亚洲男人的天堂| 2021久久精品免费观看|