亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1326 | 回復: 8
打印 上一主題 下一主題

[內(nèi)核入門] 關(guān)于fork進程中copy_files的疑問,求解答 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-03-21 09:21 |只看該作者 |倒序瀏覽
在fork進程時,當COPY_FILES flag沒有設置時,意味著繼承之后的打開的文件信息需要另立門戶,但是在如下代碼中,僅僅是遞增了file中f_count計數(shù),并沒有深度復制file機構(gòu)中的信息。舉個例子,fork后地子進程執(zhí)行seek操作,同樣也會導致父進程seek啊,不是很明白,求解惑。

struct files_struct *oldf, *newf;
struct file **old_fds, **new_fds;

......此處省略

old_fds = oldf->fd;
new_fds = newf->fd;

......此處省略

for (i = open_files; i != 0; i--) {
    struct file *f = *old_fds++;
    if (f)
        get_file(f);
        *new_fds++ = f;

}

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
2 [報告]
發(fā)表于 2016-03-21 16:41 |只看該作者
這是期望的行為吧?

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
3 [報告]
發(fā)表于 2016-03-21 16:45 |只看該作者
  1. [~]$ cat file.c
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int main()
  5. {
  6.         int fd = open("file.txt", O_WRONLY | O_TRUNC | O_CREAT);
  7.         write(fd, "1\n2\n3\n4\n", 8);
  8.         if (fork() == 0) {
  9.                 lseek(fd, 0, 0);
  10.                 write(fd, "a\n", 2);
  11.         } else {
  12.                 sleep(3);
  13.                 write(fd, "b\n", 2);
  14.         }
  15. }
  16. [~]$ cat file.txt
  17. a
  18. b
  19. 3
  20. 4
復制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2016-03-22 15:02 |只看該作者
看來書上寫的有錯啊。正確的理解應該是:
當設置CLONE_FILES,只是最頂層current->files->count ++就返回了,這就意味著子進程不僅共享父進程在fork之前已打開文件信息,還共享fork后父子進程之后打開的文件信息。
當不設置CLONE_FLAGS時,子進程僅共享fork之前父進程打開的文件。而fork之后父子進程打開的文件互不干擾。

貌似針對fork時的CLONE參數(shù),基本可以有這樣的結(jié)論:
無論CLONE參數(shù)設不設置,父子進程始終共享fork之前父進程的一些信息,而CLONE參數(shù)設置后,fork之后的行為就互不干擾了。
回復 3# nswcfd


   

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
5 [報告]
發(fā)表于 2016-03-23 11:22 |只看該作者
#define CLONE_FS        0x00000200        /* set if fs info 【shared】 between processes */
#define CLONE_FILES        0x00000400        /* set if open files 【shared】 between processes */

可以看到,某些CLONE_XXX的含義,通常是【不】做deep copy,跟字面意思正好反過來了。

但也不失絕對的,比如下面的行為跟字面就是一致的。
#define CLONE_THREAD        0x00010000        /* Same thread group? */
#define CLONE_NEWNS        0x00020000        /* New namespace group? */

論壇徽章:
0
6 [報告]
發(fā)表于 2016-03-24 15:42 |只看該作者
恩,謝謝解答。
我這邊在學習中斷的時候,看到這樣的描述,對如下紅色部分有疑問,能幫忙答疑一下嗎?是在不理解。


1.確定與中斷或異常關(guān)聯(lián)的向量i (0£i£255)。

2.籍由idtr寄存器從IDT表中讀取第i項(在下面的描述中,我們假定該IDT表項中包含的是一個中斷門或一個陷阱門)。

3.從gdtr寄存器獲得GDT的基地址,并在GDT表中查找,以讀取IDT表項中的選擇符所標識的段描述符。這個描述符指定中斷或異常處理程序所在段的基地址。



4.確信中斷是由授權(quán)的(中斷)發(fā)生源發(fā)出的。首先將當前特權(quán)級CPL(存放在cs寄存器的低兩位)與段描述符(存放在GDT中)的描述符特權(quán)級DPL比較,如果CPL小于DPL,就產(chǎn)生一個“通用保護”異常,因為中斷處理程序的特權(quán)不能低于引起中斷的程序的特權(quán)。對于編程異常,則做進一步的安全檢查:比較CPL與處于IDT中的門描述符的DPL,如果DPL小于CPL,就產(chǎn)生一個“通用保護”異常。這最后一個檢查可以避免用戶應用程序訪問特殊的陷阱門或中斷門。



5.檢查是否發(fā)生了特權(quán)級的變化,也就是說, CPL是否不同于所選擇的段描述符的DPL。如果是,控制單元必須開始使用與新的特權(quán)級相關(guān)的棧。通過執(zhí)行以下步驟來做到這點:
a.讀tr寄存器,以訪問運行進程的TSS段。
b.用與新特權(quán)級相關(guān)的棧段和棧指針的正確值裝載ss和esp寄存器。這些值可以在TSS中找到(參見第三章的“任務狀態(tài)段”一節(jié))。
c.在新的棧中保存ss和esp以前的值,這些值定義了與舊特權(quán)級相關(guān)的棧的邏輯地址。// 到這里ss和esp寄存器已經(jīng)是新特權(quán)的棧了,怎么知道以前的esp值?



    6.如果故障已發(fā)生,用引起異常的指令地址裝載cs和eip寄存器,從而使得這條指令能再次被執(zhí)行。

    7.在棧中保存eflag、cs及eip的內(nèi)容。 // 同理這里cs還是沒變化過,可以保存,但經(jīng)過上述一系列步驟,eip也在隨著變化啊,eip已經(jīng)不是中斷前的eip了啊

8.如果異常產(chǎn)生了一個硬錯誤碼,則將它保存在棧中。

9.裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量域。這些值給出了中斷或者異常處理程序的第一條指令的邏輯地址。//在這之前還一直在用戶態(tài),但棧已經(jīng)切換到內(nèi)核,之前保存現(xiàn)場的操作是在用戶特權(quán)級下操作內(nèi)核地址空間,這樣沒問題嗎?


回復 4# allkillers


   

論壇徽章:
0
7 [報告]
發(fā)表于 2016-03-24 15:43 |只看該作者
恩,謝謝解答。
我這邊在學習中斷的時候,看到這樣的描述,對如下紅色部分有疑問,能幫忙答疑一下嗎?是在不理解。


1.確定與中斷或異常關(guān)聯(lián)的向量i (0£i£255)。

2.籍由idtr寄存器從IDT表中讀取第i項(在下面的描述中,我們假定該IDT表項中包含的是一個中斷門或一個陷阱門)。

3.從gdtr寄存器獲得GDT的基地址,并在GDT表中查找,以讀取IDT表項中的選擇符所標識的段描述符。這個描述符指定中斷或異常處理程序所在段的基地址。



4.確信中斷是由授權(quán)的(中斷)發(fā)生源發(fā)出的。首先將當前特權(quán)級CPL(存放在cs寄存器的低兩位)與段描述符(存放在GDT中)的描述符特權(quán)級DPL比較,如果CPL小于DPL,就產(chǎn)生一個“通用保護”異常,因為中斷處理程序的特權(quán)不能低于引起中斷的程序的特權(quán)。對于編程異常,則做進一步的安全檢查:比較CPL與處于IDT中的門描述符的DPL,如果DPL小于CPL,就產(chǎn)生一個“通用保護”異常。這最后一個檢查可以避免用戶應用程序訪問特殊的陷阱門或中斷門。



5.檢查是否發(fā)生了特權(quán)級的變化,也就是說, CPL是否不同于所選擇的段描述符的DPL。如果是,控制單元必須開始使用與新的特權(quán)級相關(guān)的棧。通過執(zhí)行以下步驟來做到這點:
a.讀tr寄存器,以訪問運行進程的TSS段。
b.用與新特權(quán)級相關(guān)的棧段和棧指針的正確值裝載ss和esp寄存器。這些值可以在TSS中找到(參見第三章的“任務狀態(tài)段”一節(jié))。
c.在新的棧中保存ss和esp以前的值,這些值定義了與舊特權(quán)級相關(guān)的棧的邏輯地址。// 到這里ss和esp寄存器已經(jīng)是新特權(quán)的棧了,怎么知道以前的esp值?



    6.如果故障已發(fā)生,用引起異常的指令地址裝載cs和eip寄存器,從而使得這條指令能再次被執(zhí)行。

    7.在棧中保存eflag、cs及eip的內(nèi)容。 // 同理這里cs還是沒變化過,可以保存,但經(jīng)過上述一系列步驟,eip也在隨著變化啊,eip已經(jīng)不是中斷前的eip了啊

8.如果異常產(chǎn)生了一個硬錯誤碼,則將它保存在棧中。

9.裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量域。這些值給出了中斷或者異常處理程序的第一條指令的邏輯地址。//在這之前還一直在用戶態(tài),但棧已經(jīng)切換到內(nèi)核,之前保存現(xiàn)場的操作是在用戶特權(quán)級下操作內(nèi)核地址空間,這樣沒問題嗎?



    回復 5# nswcfd


   

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
8 [報告]
發(fā)表于 2016-03-25 11:01 |只看該作者
這是ULK里關(guān)于異常或中斷的描述吧,看英文版的更清楚一些。

問題9,英文版寫的很清楚,這里的cs/ip來自IDT中的Gate Descriptor(也就是第2步讀的東西)

問題5c,cpu當然知道了……甚至可以假設到這一步cs/ip還沒有被改變呢(直到第9步才發(fā)生變化)。

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
9 [報告]
發(fā)表于 2016-03-25 11:02 |只看該作者
PS,如果對細節(jié)感興趣的話,可以看一下鄧志的《x86/x64體系探索及編程》。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP