lba,全稱logic block address (即扇區的邏輯塊位址)
為什麼引入
lba概念?
首先,由於int13的限制,三維位址c/h/s的最大值只能為1024/16/63,容量最大只能到1024x16x63 byte=528482304 byte=504 m。其次,在系統管理檔案時記錄繁瑣的c/h/s也很吃力,效率較低,使用邏輯扇區後,可在硬碟讀寫操作時脫離柱面,磁頭等硬體引數的制約。
在lba模式下,系統把所有的物理扇區都按照某種方式或規則看做是一線性編號的扇區,即從0到某個最大值方式排列,並連成一條線,把lba作為乙個整體來對待,而不再是具體到實際的c/h/s值,這樣只用乙個序數就能確定乙個唯一的物理扇區,這就是線性位址的由來,顯然線性位址是物理扇區的邏輯位址。
線性位址如何和實際的
c/h/s
位址的轉換關係
首先要了解線性位址的編碼規則:把第一柱面(0柱面)第一磁頭(0面)第一扇區(1扇區)編為邏輯「0」扇區。。。。。。直到第一柱面(0柱面)第一磁頭(0面)的第63扇區(63扇區),將其編為第「63」扇區,這樣編碼。
(1)從c/h/s到lba
用c表示當前柱面號,h表示當前磁頭號,s表示當前扇區號,cs表示起始柱面號,hs表示起始磁頭號,ss表示起始扇區號,ps表示每磁軌有多少個扇區,ph表示每柱面有多少個磁軌,計算公式如下:
lba = ( c – cs ) * ph * ps + ( h – hs ) * ps + ( s – ss )
例如:
c/h/s=0/01 則lba = 0
c/h/s=0/0/63 則lba = 62
c/h/s=0/1/1 則lba = 63
c/h/s=0/5/1 則lba = 315
c/h/s=100/0/1 則lba = 1606500
c/h/s=100/1/1 則lba = 1606563
c/h/s=139/52/48 則lba = 2236358
c/h/s=220/156/18則lba = 3544145
(2)從lba到c/h/s
變數命名依然同上,則計算公式如下
c = lba div ( ph * ps ) + cs
h = ( lba div ps ) mod ph + hs
s = lba mod ps + ss
如果不執行mod運算子,只用div運算子,則:
c = lba div ( ph * ps ) + cs
h = lba div ps – ( c – cs ) * ph + hs
s = lba – ( c – cs ) * ph * ps – h – hs)* ps + ss
例如:lba=0 則c/h/s = 0/0/1
lba=62 則c/h/s = 0/0/63
lba=63 則c/h/s = 0/1/1
lba=315 則c/h/s = 0/5/1
lba=1606500 則c/h/s = 100/0/1
lba=2236358 則c/h/s = 139/52/48
lba=3544145 則c/h/s = 220/156/18
線性位址 2
linux核心對整個系統的物理記憶體是通過型別為struct page的陣列mem map來管理的。系統中的夥伴系統分配演算法最終是通過操作這個陣列來記錄物理記憶體的分配 等操作。在這裡不要被系統的高階記憶體 低端記憶體等概念搞混淆了,高 低端記憶體的分類主要在於區分物理記憶體位址是否可以直接對映到...
線性位址的管理
eprocess中 為什麼採用二叉樹的方式管理線性位址空間呢?最主要的原因是使用二叉樹查詢的效能會更好 涉及資料結構 這個startin pn和這個endin pn是以頁為單位也就是 4kb 0x1000 在startin pn這個位址後新增3個0,也就是這個結點描述的線性位址的起始位址 endin...
線性位址和實體地址
在保護模式下32位 還是採用段機制訪問記憶體 初始化臨時的要進入到ia 32e模式的gdt資料結構 label gdt64 dq 0x0000000000000000 label desc code64 dq 0x0020980000000000 label desc data64 dq 0x000...