成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從貓蛇之戰三看內核戲CPU

商務辦公
小時候曾經目睹過貓與蛇戰斗,面對昂首發威的毒蛇,小貓不慌不忙,揮舞前爪,沉著冷靜,看準時機進攻,膽大心細。

小時候曾經目睹過貓與蛇戰斗,面對昂首發威的毒蛇,小貓不慌不忙,揮舞前爪,沉著冷靜,看準時機進攻,膽大心細。

在網上搜一下,可以看到很多貓蛇戰斗的照片,看來貓蛇之戰是很多人都喜歡看的“精彩節目”。

[[260574]]

(照片來自搜索引擎)

再來一張更清晰一些的。

 

[[260575]]

(照片來自搜索引擎)

之所以想到貓蛇之戰,是因為今天在“格友會講”群里一位同行問了一個很有深度的問題。

(前方內容只適合技術控,其他讀者止步)

簡單說問題是,調試器是如何訪問不能訪問的內存的。

看了這個問題,我立刻覺得這位同行是有功力的。因為普通的程序員是問不出這樣的問題的。

要理解這個問題,必須有些底層的基礎。

***個基礎是要有保護模式的概念。很多同行都知道,今天的CPU是運行在所謂的保護模式中,軟件訪問的內存空間都是虛擬空間。而且這個虛擬空間中的內容是分三六九等的,是分平民區和富人區的,是分道路和深坑的。因為此,訪問內存時是要小心的,有些地方可以訪問,有些地方一訪問就可能出大問題的,爆炸崩潰甚至“死亡”的。

大多數的應用程序崩潰和系統藍屏都是因為訪問了不該訪問的地方。

第二個基礎是對調試器有比較深的認識,知道在調試器里可以放心大膽地想訪問哪里就訪問哪里,不用那么小心。

舉例來說,在普通程序里,如果訪問空地址,那么不死也傷半條命(處理不好,就被系統殺了)。但是在調試器里,dd 0沒有問題,調試器會給出一串串可愛的問號,代表不可訪問,子虛烏有。

  1. 6: kd> dd 0 
  2. 00000000`00000000  ???????? ???????? ???????? ???????? 
  3. 00000000`00000010  ???????? ???????? ???????? ???????? 
  4. 00000000`00000020  ???????? ???????? ???????? ???????? 
  5. 00000000`00000030  ???????? ???????? ???????? ???????? 
  6. 00000000`00000040  ???????? ???????? ???????? ???????? 
  7. 00000000`00000050  ???????? ???????? ???????? ???????? 
  8. 00000000`00000060  ???????? ???????? ???????? ???????? 
  9. 00000000`00000070  ???????? ???????? ???????? ???????? 

那么問題來了,為啥普通程序一碰就爆炸,而調試器訪問卻安然無恙呢?

坦率說,***次在腦海中出現這個問題時,也令我困惑了一陣。直到后來發現了內核中的一個神秘機制。這個機制是跨操作系統的,Windows中有,Linux也有,而且都是相同的名字,叫Probe。

有點令人詫異的是,連函數名很類似,比如Windows(NT內核)中的兩個函數為:

  1. 6: kd> x nt!probe* 
  2. fffff800`06581d70 nt!ProbeForWrite (void) 
  3. fffff800`06518ad0 nt!ProbeForRead (<no parameter info>) 

而Linux內核中的兩個函數為:

  1. root@gedu-VirtualBox:/home/gedu/labs/linux-source-4.8.0# sudo cat /proc/kallsyms | grep "\bprobe_ke" 
  2. ffffffff811a5f00 W probe_kernel_read 
  3. ffffffff811a5fc0 W probe_kernel_write 

搜一下KDB/KGDB的源代碼,可以看到很多地方調用了上面兩個函數:

 

簡單來說,內核里封裝了兩個特殊的函數,提供給包括調試器在內的一些特殊客戶使用。

接下來的問題是,probe函數內部是如何做的呢?有關的源代碼如下。

 

(更完整的請見https://elixir.bootlin.com/linux/v4.8/source/mm/maccess.c#L23 )

其中的關鍵是在__copy動作前后分別有:

  1. pagefault_disable(); 
  2. pagefault_enable(); 

也就是先禁止了pagefault,訪問好之后再啟用。這有點像是在耍蛇之前,先把它的毒牙包上。

繼續深挖,在目前的Linux內核實現中,是維護一個計數器:pagefault_disabled。

 

(https://elixir.bootlin.com/linux/v5.0-rc8/source/include/linux/uaccess.h)

在處理頁錯誤的do_page_fault函數中,會判斷這個標志,如果發現禁止條件,則忽略這次訪問錯誤。

講到這里,問題說清了一半,要繼續深追的話,還有一些細節,今天有點晚了,改日再敘。

責任編輯:武曉燕 來源: 格友
相關推薦

2021-06-26 07:04:24

Epoll服務器機制

2013-08-01 15:56:37

2021-07-07 23:38:05

內核IOLinux

2021-06-18 06:02:24

內核文件傳遞

2022-03-03 08:01:41

阻塞與非阻塞同步與異步Netty

2025-04-02 04:33:00

CPU服務器時鐘頻率

2017-01-15 23:46:37

2021-04-08 09:32:17

鴻蒙HarmonyOS應用

2016-09-20 15:21:35

LinuxInnoDBMysql

2013-02-22 09:32:13

2020-06-08 09:11:47

Linux 內核Linux內核

2020-08-04 16:07:16

華為蘋果三星

2019-09-27 10:25:39

5G浪潮云計算

2011-09-11 18:21:11

筆記本常見問題

2017-06-30 09:00:40

共享單車物聯網

2011-09-13 13:15:54

2009-04-30 10:31:07

2012-04-23 17:36:40

ES8000三星智能電視

2024-07-08 12:03:41

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999久久久久久久久6666 | 久久一| 日韩欧美在线观看 | 精品久久国产老人久久综合 | 久久成人一区 | 国产精品无码专区在线观看 | 91资源在线观看 | 国产精品免费一区二区三区四区 | 毛片.com| 狠狠综合久久av一区二区老牛 | 一级毛片成人免费看a | 91视频一88av| 黄色av大片 | 羞羞视频免费在线观看 | 日韩精品久久一区二区三区 | 国产精品美女久久久久久免费 | 欧美激情精品久久久久久 | 久久亚洲国产精品 | 久久久精品视频免费看 | 免费黄色av | 日韩在线观看一区二区三区 | 国产精品久久久久久久久久久久 | 一区二区三区四区在线视频 | 久久鲁视频 | 精品国产一区二区三区久久久蜜月 | 免费一区二区三区 | 国产精品视频播放 | 久久中文字幕一区 | 伊人激情网 | 亚洲视频在线观看 | 黄色欧美视频 | 夜久久| 精品成人免费一区二区在线播放 | 亚洲综合首页 | 91麻豆精品国产91久久久久久久久 | 国产精品久久久久久久久久久久冷 | 亚洲精品二区 | 亚洲三区视频 | 日日噜 | 国产精品一区二区三区在线 | 免费av直接看|