arcopen的大體流程我們看過了。大致分為這幾步
1. 函式會嘗試找到檔案所在分割槽的裝置控制代碼,如果還沒有對應的控制代碼。那麼使用device.
functable中的open函式開啟裝置,並為這個裝置分配控制代碼。
2. 開啟裝置後條用***mount識別分割槽格式,識別成功返回另外的functable,儲存到裝置的filedata.filefunctable域。
3. 為檔案分配乙個控制代碼,在對應的filedata.deviceid為上面建立裝置控制代碼,filedata.functable為裝置的filedata.filefunctable。
4. 最後呼叫檔案的filedata.functable.open函式開啟檔案。
掛載分割槽時做了什麼
之前我們忽略了***mount函式。現在來讀讀比較簡單的fatmount (freeldr/freeldr/fs/fat.c)。
const devvtbl*fatmount(ulong deviceid)ret=arcread(deviceid, buffer, sizeof(buffer),&count);if(ret!=esuccess||count!=sizeof(buffer))// 判斷是否有fat分割槽標誌
if(!rtlequalmemory(bootsector->filesystemtype, "fat12 ", 8)&&!rtlequalmemory(bootsector->filesystemtype, "fat16 ", 8)&&!rtlequalmemory(bootsector32->filesystemtype, "fat32 ", 8)&&!rtlequalmemory(bootsectorx->filesystemtype, "fatx", 4))// 獲得分割槽大小等資訊
ret=arcgetfileinformation(deviceid,&fileinformation);if(ret!=esuccess)sectorcount.highpart=fileinformation.endingaddress.highpart;sectorcount.lowpart=fileinformation.endingaddress.lowpart;sectorcount.quadpart/=sector_size;volume->deviceid=deviceid;// 開啟分割槽
if(!fatopenvolume(volume, bootsector, sectorcount.quadpart))// 儲存fat_volume_info結構
fatvolumes[deviceid]=volume;// 返回fat檔案讀寫的functable
return&fatfunctable;}
函式中的deviceid是裝置的控制代碼。
生成fat_volume_info結構。這個結構裡面儲存了fat分割槽的基本資訊。包括扇區大小,每個簇的扇區數等等。
typedef
struct _fat_volume_info
fat_volume_info;
讀取第乙個山區,判斷是否有fat標誌。如果沒有直接返回,掛載失敗。之後使用arcgetfileinformation獲得分割槽大小。arcgetfileinformation裡面呼叫了filedata.functable.getfileinformation。因為當前deviceid是裝置控制代碼,所以他實際呼叫的是diskgetfileinformation(freeldr/freeldr/arch/i386/hardware.c)。這個函式很簡單,通過fileinformation返回分割槽開始和結束的位址,這裡就不列出了。
這裡的**用
fileinformation.endingaddress / sector_size計算出了該分割槽的扇區數sectorcount。這裡應該bug。因為endingaddress是分割槽結束位址,真的扇區數應該是 (分割槽開始位址 - endingaddress ) / sector_size。好在sectorcount只是判斷fat分割槽的乙個依據,而且一般c盤計算出的sectorcount誤差不會很大,影響不大。
最後執行fatopenvolume真正執行分割槽的掛載、初始化。初始化結束後將生成的volume放到fat.c維護的全域性陣列fatvolumes裡,之後對fat分割槽進行操作(讀寫)時,通過裝置的deviceid就可以找到對應的fat_volume_info結構。
最後函式返回fatfunctable函式陣列
const devvtbl fatfunctable=;
使用者可以通過這些函式就讀寫改fat分割槽啦。
那麼fatopenvolume都幹了什麼呢。
這個函式簡單來說就是根據分割槽內容填寫了volume結構,已經算是乙個分割槽的具體實現細節了,和整體架構無關,不多說了。這個函式在freeldr/freeldr/fs/fat.c中。
開啟檔案時做了什麼
long fatopen(char*path, openmode openmode, ulong*fileid)
磁鏈 磁通 磁勢F
1.磁鏈 導電線圈或電流迴路所鏈環的磁通量。磁鏈等於導電線圈匝數n與穿過該線圈各匝的平均磁通量 的乘積,故又稱磁通匝。當只有一匝線圈的時候,磁鏈跟磁通量是相等的。當有n匝線圈的時候,因為電壓的累加關係。由定義式就有 n 的關係 n 2.磁通 設在磁感應強度為b的勻強磁場中,有乙個面積為s且與磁場方向...
每週一磁 表磁 表場 中心表磁
表磁是指磁體表面某一點上的磁感應強度,單位是高斯gs或特斯拉t 1t 10000gs 磁體表面不同位置的表磁並不相同,一般情況下人們說的 表磁 是指磁體工作面的中心表磁。表磁是日常最容易直接測量得到的磁體效能引數,用高斯計就可以直接測量,非常方便。在磁體形狀和尺寸一定時,人們往往會通過比較表磁來判斷...
磁珠 符號 磁珠基礎知識大全,如何選擇磁珠
磁珠有很高的電阻率和磁導率,他等效於電阻和電感串聯,但電阻值和電感值都隨頻率變化。他比普通的電感有更好的高頻濾波特性,在高頻時呈現阻性,所以能在相當寬的頻率範圍內保持較高的阻抗,從而提高調頻濾波效果。作為電源濾波,可以使用電感。磁珠的電路符號就是電感但是型號上可以看出使用的是磁珠在電路功能上,磁珠和...