亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 漫談兼容內核之二:關于kernel-win32的對象管理.txt

?? 漫談系統內核內幕 收集得很辛苦 呵呵 大家快下在吧
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
    int err;

    *hObject = NULL;

    /* retrieve the name */
    err = fetch_oname(&oname,name);
    if (err<0)
        return ERR_PTR(err);

    /* allocate an object */
    obj = _AllocObject(clss,&oname,data);
    if (oname.name) putname(oname.name);
    if (IS_ERR(obj))
        return obj;

    /* find a handle slot */
    process = GetWineProcess(thread);
    epobj = &process->wp_handles[MAXHANDLES];
    write_lock(&process->wp_lock);
    for (ppobj=process->wp_handles; ppobj<epobj; ppobj++)
        if (!*ppobj)  goto found_handle;

    write_unlock(&process->wp_lock);
    objput(obj);
    return ERR_PTR(-EMFILE);

    found_handle:
    /* make link to object */
    objget(obj);
    *ppobj = obj;
    write_unlock(&process->wp_lock);
    ppobj++; /* don't use the NULL handle */
    *hObject = (HANDLE) ((char*)ppobj - (char*)process->wp_handles);
    return obj;
} /* end CreateObject() */[/code]

    這個函數的操作可以分成兩大部分。第一部分是對_AllocObject()的調用,旨在創建具體的對象。第二部分是將指向所創建對象的指針“安裝”在當前進程的“打開對象表”中,并將相應的下標轉換成Handle。為便于閱讀討論,我們先假定第一部分的操作業已完成,_AllocObject()已經返回所創建的Object結構的指針,先看看對于“打開對象表”的操作,這是從注釋行“/* find a handle slot */”開始的。至于putname()、objget ()、objput()一類的函數,那只是遞增或遞減數據結構中的引用計數(減到0就要釋放其占用的存儲空間),并不影響對于實質性操作的討論。
    “打開對象表”在WineProcess數據結構中,而從上面傳下來的只是個WineThread指針。所以這里要通過GetWineProcess()找到當前線程所屬的Wine進程,這其實只是從WineThread數據結構中獲取其wt_process指針而已。
    找到了所屬進程的WineProcess數據結構以后,就通過一個for循環掃描其“打開對象表”,旨在找到一個空閑的位置,指針為0就表示空閑。這也說明了為什么0不能被用作handle的值。找到以后,就把新創建對象的obj指針填寫到這個位置上。而handle數值的計算,則可以看出基本上是該指針在數組中的(字節)位移量加4,實際上就是下標加1后再乘4。注意handle的值是通過調用參數hObject返回的。
    再回到第一部分,即對象的創建,這是由_AllocObject()完成的。

[code][CreateSemaphoreA() > CreateObject() > _AllocObject()]

static Object *_AllocObject(struct ObjectClass *clss, struct oname *name, void *data)
{
    Object *obj;

    . . . . . .
    /* create and initialise an object */
    obj = (Object *) kmalloc(sizeof(Object),GFP_KERNEL);
    . . . . . .
    atomic_set(&obj->o_count,1);
    init_waitqueue_head(&obj->o_wait);
    . . . . . .
    /* name anonymous objects as "class:objaddr" if so requested */
    if (!name->name && ~clss->oc_flags&OCF_DONT_NAME_ANON) {
     . . . . . .
    }
    /* cut'n'paste the name from the caller's name buffer */
    else {
        obj->o_name.name = name->name;
        obj->o_name.nhash = name->nhash;
     name->name = NULL;
    }   

    /* attach to appropriate object class list */
    obj->o_class = clss;
    if (obj->o_name.name)
     list_add(&obj->o_objlist,
    &clss->oc_nobjs[obj->o_name.nhash&OBJCLASSNOBJSMASK]);
    else
        list_add(&obj->o_objlist,&clss->oc_aobjs);
    . . . . . .
    err = clss->constructor(obj,data); /* call the object constructor */
    if (err==0)  goto cleanup_1;

    . . . . . .
    cleanup_1:
    write_unlock(&clss->oc_lock);
    cleanup_0:
    return obj;
   } /* end _AllocObject() */[/code]

    首先是由kmalloc()為所創建的對象分配存儲空間。然后是Object結構的初始化,包括把對象名(及其hash值)拷貝到Object結構中的o_name里面。
    接著,如果有對象名,就根據其hash值把所創建的Object結構掛入所屬對象類別的相應hash隊列中,否則就掛入該類別的無名對象隊列中。
    下面就是實質性的操作了,這是通過所屬類別提供的constructor函數完成的。對于“信號量”而言,該類對象的類型數據結構是semaphore_objclass。

[code]struct ObjectClass semaphore_objclass = {
    oc_type: "SEMA ",
    constructor: SemaphoreConstructor,
    reconstructor: SemaphoreReconstructor,
    destructor: SemaphoreDestructor,
    poll:  SemaphorePoll,
    describe: SemaphoreDescribe
};[/code]

   顯然,其constructor函數是SemaphoreConstructor(),所以實際調用的就是這個函數。

[code][CreateSemaphoreA() > CreateObject() > _AllocObject() > SemaphoreConstructor()]

static int SemaphoreConstructor(Object *obj, void *data)
{
    struct WiocCreateSemaphoreA *args = data;
    struct WineSemaphore *semaphore;

    . . . . . .
    semaphore =
   (struct WineSemaphore *) kmalloc(sizeof(struct WineSemaphore), GFP_KERNEL);
    . . . . . .
    obj->o_private = semaphore;
    semaphore->ws_count = args->lInitialCount;
    semaphore->ws_max   = args->lMaximumCount;
    return 0;
} /* end SemaphoreConstructor() */[/code]

    程序很簡單,先分配一個WineSemaphore數據結構所需的空間,這個數據結構才是真正意義上的具體的“對象”、一個信號量。當然,還要使Object結構中的指針o_private指向這個WineSemaphore數據結構。而對于這個信號量的初始化,則只不過是把作為參數傳下來的lInitialCount和lMaximumCount填寫進去。
    顯然,kernel-win32另行實現了一個信號量機制,而不是把Windows應用程序的信號量操作“嫁接”到Linux已有的信號量機制上。對于相對而言比較簡單的信號量機制,這樣當然也是可以的(也還值得推敲)。而對于比較復雜的機制、特別是文件操作,那就只能走嫁接這“華山一條路”了,以后我們還要通過文件操作看kernel-win32是如何實現這種嫁接的。

    此外,前面曾經提到,task_ornament數據結構中有個指針to_ops,指向某個task_ornament_operations數據結構。這個數據結構的主體是一組函數指針,說明內核在close、exit、signal、execve、fork等操作時應該對上述種種附加的數據結構和對象做些什么。目前kernel-win32只定義了一種task_ornament_operations數據結構:

[code]static const struct task_ornament_operations wineserver_ornament_ops = {
    name:  "wineserver",
    owner:  THIS_MODULE,
    close:  ThreadOrnamentClose,
    exit:   ThreadOrnamentExit,
    signal:  ThreadOrnamentSignal,
    execve:  ThreadOrnamentExecve,
    fork:   ThreadOrnamentFork
};[/code]
   那么怎樣使用這個數據結構呢?與這些函數指針基本對應,kernel-win32的代碼中還有下列幾個函數:
[code]   task_ornament_notify_exit()、
   task_ornament_notify_signal()、
   task_ornament_notify_execve()、
   task_ornament_notify_fork()、[/code]
   這些函數會根據相應的函數指針調用有關的程序。對這幾個函數的調用則出現在kernel-win32對Linux內核所打的補丁中。以對于fork.c所打的補丁為例:

[code]do_fork(. . . . . .)
{
     . . . . . .
     p->p_cptr = NULL;
     init_waitqueue_head(&p->wait_chldexit);
     p->vfork_sem = NULL;
   - spin_lock_init(&p->alloc_lock);
   + rwlock_init(&p->alloc_lock);
     . . . . . .
     current->counter >>= 1;
     if (!current->counter)
         current->need_resched = 1;
   + /*
   +  * tell any ornaments to duplicate themselves
   +  */
   + INIT_LIST_HEAD(&p->ornaments);
   + task_ornament_notify_fork(current,p,clone_flags);
      . . . . . .
}[/code]
這里作的第一個修改是把spin_lock_init()換成rwlock_init()。下面實質性的修改則是將子進程(線程)的ornaments隊列頭加以初始化,然后調用task_ornament_notify_fork()。調用的目的,按注釋所述,是復制當前進程(線程)的ornaments隊列中的各個附件。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久av资源网| 成人久久18免费网站麻豆| 国产亚洲成av人在线观看导航| 成人短视频下载| 日韩av二区在线播放| 亚洲裸体在线观看| 久久精品视频一区二区三区| 欧美片网站yy| 91小视频免费观看| 国产一区二区三区四区五区美女| 亚洲国产美女搞黄色| 久久久久综合网| 日韩一级免费观看| 精品视频在线看| 色综合天天综合色综合av| 国产综合久久久久久鬼色| 天堂av在线一区| 亚洲一区二区影院| **网站欧美大片在线观看| 国产三级一区二区| 欧美成人精品3d动漫h| 这里只有精品免费| 欧美三级电影一区| 99久久精品国产导航| 懂色av中文一区二区三区| 久久99最新地址| 蜜臀av性久久久久蜜臀aⅴ| 亚洲成av人片观看| 亚洲综合图片区| 一区二区三区精密机械公司| 最新欧美精品一区二区三区| 日本一区二区三区视频视频| 国产日韩欧美精品综合| 久久综合九色欧美综合狠狠 | 麻豆成人综合网| 亚洲v中文字幕| 亚洲国产美女搞黄色| 一区二区三区四区不卡在线 | 在线观看欧美黄色| 91行情网站电视在线观看高清版| 99久久久久久99| 91蜜桃网址入口| 色综合中文字幕国产 | 亚洲欧美精品午睡沙发| 自拍偷拍亚洲激情| 国产精品激情偷乱一区二区∴| 欧美激情自拍偷拍| 成人欧美一区二区三区白人 | 欧美一级理论片| 欧美一区二区三区不卡| 欧美一级生活片| 精品久久人人做人人爽| 国产亚洲精品免费| 国产精品久线在线观看| 亚洲免费观看在线视频| 亚洲午夜久久久久久久久久久| 亚洲一区二区三区四区五区中文 | 成a人片亚洲日本久久| 91女厕偷拍女厕偷拍高清| 欧美无砖专区一中文字| 欧美一级黄色大片| 国产偷国产偷精品高清尤物| 中文字幕中文字幕在线一区| 亚洲精品视频在线观看网站| 午夜精品在线看| 国产主播一区二区三区| av资源站一区| 欧美日韩一区二区在线观看视频| 3751色影院一区二区三区| 久久综合久久综合九色| 国产精品全国免费观看高清| 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产欧美日韩另类综合| 精品一区二区三区在线观看国产| 高清国产一区二区| 欧美三级蜜桃2在线观看| 久久综合狠狠综合久久激情| 亚洲天堂久久久久久久| 日本午夜一区二区| 不卡的av在线| 91精品国产综合久久久久久| 中文字幕va一区二区三区| 夜夜精品视频一区二区| 国产一区二区三区四区五区美女 | 在线中文字幕一区| 日韩精品一区二区三区在线观看| 中文字幕中文乱码欧美一区二区| 亚洲一二三区在线观看| 国产麻豆视频精品| 欧美日韩中文字幕精品| 国产午夜亚洲精品羞羞网站| 香蕉加勒比综合久久| 不卡电影一区二区三区| 日韩一级二级三级精品视频| 亚洲日本va在线观看| 久久国产婷婷国产香蕉| 欧美午夜精品一区| 国产精品麻豆欧美日韩ww| 麻豆成人免费电影| 在线中文字幕不卡| 中文字幕av资源一区| 美女视频一区在线观看| 色一区在线观看| 国产欧美日韩麻豆91| 奇米一区二区三区| 欧美在线你懂的| 国产精品久线在线观看| 久久成人免费网| 欧美日韩免费高清一区色橹橹| 国产精品网曝门| 精品一区二区av| 欧美精品aⅴ在线视频| 综合久久久久久| 成人av免费在线| 日本一区二区视频在线观看| 久久99精品久久久久久久久久久久| 欧美调教femdomvk| 亚洲男人的天堂一区二区| 成人精品gif动图一区| 久久久99精品免费观看| 久久精品国产亚洲5555| 555夜色666亚洲国产免| 亚洲一级二级三级在线免费观看| www.欧美色图| 中文字幕精品一区二区三区精品| 韩国三级中文字幕hd久久精品| 日韩一区二区三区av| 中文字幕欧美日韩一区| 偷拍与自拍一区| 欧美三级日韩三级| 亚洲午夜精品一区二区三区他趣| 99久久99久久久精品齐齐| 国产精品嫩草影院com| 国产不卡视频在线播放| 国产精品视频看| 高清不卡一二三区| 国产精品看片你懂得| 不卡一区二区三区四区| 国产精品久久久久aaaa樱花| 波多野结衣中文一区| 中文久久乱码一区二区| 99久久99久久久精品齐齐| 亚洲三级理论片| 在线免费一区三区| 亚洲国产精品视频| 91麻豆精品国产91久久久久| 日韩高清一级片| 精品少妇一区二区| 韩国av一区二区三区在线观看| 久久人人97超碰com| 国产91丝袜在线18| 17c精品麻豆一区二区免费| 色婷婷精品久久二区二区蜜臂av | 欧美成人艳星乳罩| 国产激情偷乱视频一区二区三区| 国产日韩成人精品| 色综合久久88色综合天天| 亚洲成人一二三| 日韩女优av电影在线观看| 国产成人免费视频网站高清观看视频| 中日韩免费视频中文字幕| 色8久久人人97超碰香蕉987| 午夜精品一区二区三区免费视频| 日韩欧美国产综合一区| 国产精品香蕉一区二区三区| 亚洲三级在线看| 欧美一区二区三区四区在线观看 | 国产在线视频一区二区| 国产精品美女www爽爽爽| 欧洲一区二区三区免费视频| 日韩电影一区二区三区| 国产女人水真多18毛片18精品视频 | 精品电影一区二区三区| 不卡的av电影在线观看| 亚洲激情图片一区| 日韩精品一区二区三区老鸭窝| 国产黄色91视频| 亚洲综合色区另类av| 欧美精品一区二区三区在线| 91天堂素人约啪| 蜜桃久久久久久| 亚洲日本在线a| 精品日韩欧美在线| 91九色最新地址| 国内外成人在线视频| 亚洲综合免费观看高清完整版 | 亚洲自拍与偷拍| 精品欧美一区二区在线观看| 97超碰欧美中文字幕| 婷婷综合另类小说色区| 欧美国产精品一区| 91精品国产综合久久久久久久久久| 成人一区二区三区在线观看| 日韩—二三区免费观看av| 中文字幕中文字幕在线一区| 日韩一区二区精品| 色系网站成人免费| 成人在线一区二区三区| 久久99精品久久久| 丝袜亚洲另类欧美综合|