<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)?\
    主站蜘蛛池模板: 久久久久久久亚洲精品| 亚洲AV无码一区二区三区牛牛| 久久这里只精品国产免费10| 亚洲一区二区三区无码国产| 免费一级肉体全黄毛片| 免费视频成人片在线观看| 国产精品亚洲综合久久| 亚洲午夜福利717| 99热在线精品免费全部my| 一级中文字幕免费乱码专区 | 国产免费观看青青草原网站| 花蝴蝶免费视频在线观看高清版 | 免费在线观看毛片| 日本免费大黄在线观看| 午夜亚洲国产精品福利| 久久久久亚洲Av无码专| 亚洲精品黄色视频在线观看免费资源 | 黄色免费在线网址| 亚洲精品亚洲人成在线麻豆| 亚洲国产成人久久综合一区77| 最近中文字幕无免费| 又硬又粗又长又爽免费看 | 91亚洲国产在人线播放午夜| 国产一区视频在线免费观看| 37pao成人国产永久免费视频 | 在线观看亚洲AV日韩AV| 亚洲爆乳精品无码一区二区三区| 日韩黄色免费观看| 99视频在线精品免费| 国产高清视频免费在线观看| 亚洲欧美国产国产综合一区| 亚洲视频在线观看不卡| 最新亚洲成av人免费看| 国产女高清在线看免费观看| 免费不卡视频一卡二卡| 午夜影院免费观看| 高清永久免费观看| 成人a毛片视频免费看| 亚洲精品伦理熟女国产一区二区| 亚洲同性男gay网站在线观看| 亚洲AV无码成人精品区在线观看|