熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

談談Linux中的存儲保護

2013-11-13 15:34:38  來源: Oracle 

  以下討論的內容是以i平台為基礎的
  
  Linux將G的地址劃分為用戶空間和內核空間兩部分在Linux內核的低版本中(X)通常G為用戶空間GG為內核空間這個分界點是可以可以改動的
  
  正是這個分界點的存在限制了Linux可用的最大內存為G而且要通過重編內核調整這個分界點才能達到
  
  實際上還可以有更好的方法來解決這個問題由於內核空間與用戶空間互不重合所以可以用段機制提供的保護功能來保護內核級代碼以下為X的部分代碼
  
  /usr/src/linux/arch/i/kernel/entryS
  
  A: quad xccaffff /* x kernel GB code at xC *
  
  B: quad xccffff /* x kernel GB data at xC *
  
  C: quad xcbfaffff /* x user GB code at x *
  
  D: quad xcbfffff /* xb user GB data at x *
  
  AB為內核代碼段及數據段的描述符CD為用戶代碼及數據段的描述符從以上我們可以清楚的看到AB的特權級為而CD的特權級為當內核存取用戶空間的內容時他借助於fs寄存器同過將FS寄存器的內容置為D來達到訪問用戶空間的目的
  
  X版的 內核對此進行了改動這樣內核空間擴張到了G所以可以直接進行拷貝了
  
  quad xcfaffff /* x kernel GB code at x *
  
  quad xcfffff /* x kernel GB data at x *
  
  quad xcffaffff /* x user GB code at x *
  
  quad xcffffff /* xb user GB data at x *
  
  從表面上看內核的基地址變為了但實際上內核通常仍在虛址G以上其中奧妙在與 不同的連接描述文件
  
  X
  
   = xC + x;
  
  _text = ; /* Text and readonly data */
  
  text : {
  
  *(text)
  
  *(fixup)
  
  *(gnuwarning)
  
  } = x
  
  textlock : { *(textlock) } /* outofline lock text */
  
  rodata : { *(rodata) }
  
  kstrtab : { *(kstrtab) }
  
  
  
  X
  
  faint內核被刪除了
  
  不管怎莫說請大家相信我X的起址為x這樣一來二者就相等了都是xC + x
  
  用戶空間在X中從直觀上變為G讓人迷惑其不是可以直接訪問內核了?其實不然 同過使用頁機制提供的保護阻止了用戶程序訪問內核空間
  
  這樣存取用戶空間實際上已不需要FSGS的支持但在內核中仍保留set_fs(X)等宏上你設的值用來驗證隨後的操作是否合適是否超過設定的X此處X不再是一個段描述符而是一個具體的值
  
  此處就有一個陷阱如果你將Set_fs的值設置為Kernel_DS而沒有將其該回去當用戶通過系統調用將一個Buffer的地址(應該在用戶空間)設置為一個內核空間而內核在訪問該地址前認為默認當前的閥值仍為User_DS事情就大大?了

From:http://tw.wingwit.com/Article/program/Oracle/201311/16958.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.