的源代碼在這裏:Linux內核如何檢測內存地址是否被修改以實現COW?
這裏是一個線,寫到一個, 我設置一個斷點這裏的GDB拆機。並開始這個程序。然後使用崩潰看到物理地址的
>│0x40073a <main+154> movl $0x2c,-0x20(%rbp) //copy on write happend here │
│0x400741 <main+161> mov -0x18(%rbp),%rax │
│0x400745 <main+165> mov (%rax),%ebx
的線性地址是0x602010,所以使用VTOP,我得到這個:
我們可以看到他們指向相同的物理地址2a683010
PID: 6468
COMMAND: "a.out"
TASK: ffff88007c317300 [THREAD_INFO: ffff880016728000]
CPU: 0
STATE: TASK_TRACED|TASK_WAKEKILL
crash> vtop 0x602010
VIRTUAL PHYSICAL
602010 2a683010
PML: 24e6f000 => 2409c067
PUD: 2409c000 => 7144067
PMD: 7144018 => 19847067
PTE: 19847010 => 800000002a683065
PAGE: 2a683000
PID: 6464
COMMAND: "a.out"
TASK: ffff880036992280 [THREAD_INFO: ffff880014e38000]
CPU: 0
STATE: TASK_TRACED|TASK_WAKEKILL
crash> vtop 0x602010
VIRTUAL PHYSICAL
602010 2a683010
PML: 36df9000 => 3a654067
PUD: 3a654000 => 1a71a067
PMD: 1a71a018 => 18f2a067
PTE: 18f2a010 => 800000002a683065
PAGE: 2a683000
在類型ni in gdb(它將a的值更改爲33)後,再次使用vtop。我可以看到進程的一個物理地址已經改變。
crash> vtop 0x602010
VIRTUAL PHYSICAL
602010 5d755010
PML: 24e6f000 => 2409c067
PUD: 2409c000 => 7144067
PMD: 7144018 => 19847067
PTE: 19847010 => 800000005d755067
PAGE: 5d755000
crash> vtop 0x602010
VIRTUAL PHYSICAL
602010 2a683010
PML: 36df9000 => 3a654067
PUD: 3a654000 => 1a71a067
PMD: 1a71a018 => 18f2a067
PTE: 18f2a010 => 800000002a683065
PAGE: 2a683000
我的問題是,當CPU執行
movl $0x2c,-0x20(%rbp)
內核怎麼知道它正在改變共享內存,所以需要應對在寫之前進行發生了什麼?我猜測它正在使用諸如頁面錯誤中斷之類的東西。但是我沒有發現任何與此相關的中斷。
如果內核負責這個,請提供內核的源代碼。
*請提供內核的源代碼,如果內核負責這個。* https://github.com/torvalds/linux –
@AndrewHenle不錯的一個:-) –
我覺得這個更好,然後github https ://code.woboq.org/linux/linux/ –