理論課:https://www.bilibili.com/video/BV1d4411v7u7
有用的參考資料( linux-0.11註釋版):https://github.com/beride/linux0.11-1
main branch為linux-0.11源碼
改寫bootsect.s 主要完成如下功能:
改寫setup.s 主要完成如下功能:
實驗指導書:https://www.lanqiao.cn/courses/115/labs/568/document/
實驗指導書:https://www.lanqiao.cn/courses/115/labs/569/document/
實驗指導書:https://www.lanqiao.cn/courses/115/labs/570/document/
原切換方式是通過tss,相當於是寄存器的快照,通過intel提供的指令直接進行現場替換,速度較慢。堆棧切換的效率更高。
實驗指導書:https://www.lanqiao.cn/courses/115/labs/571/document/
參考:https://blog.csdn.net/qq_42518941/article/details/119182097
sem_t * sem_open ( const char * name , unsigned int value );
int sem_wait ( sem_t * sem );
int sem_post ( sem_t * sem );
int sem_unlink ( const char * name );實驗指導書:https://www.lanqiao.cn/courses/115/labs/572/document/
邏輯地址-> GDT -> LDT -> 頁表-> 物理地址
由GDTR 訪問全局描述符表是通過“段選擇子”(實模式下的段寄存器)完成的
15 3 2 1 0
| index | | RPL |
段選擇子包括三部分:描述符索引(index)、TI、請求特權級(RPL)。它的index(描述符索引)部分錶示所需要的段的描述符在描述符表的位置,由這個位置再根據在GDTR中存儲的描述符表基址就可以找到相應的描述符。然後用描述符表中的段基址加上邏輯地址(SEL:OFFSET)的OFFSET就可以轉換成線性地址,段選擇子中的TI值只有一位0或1,0代表選擇子是在GDT選擇,1代表選擇子是在LDT選擇。請求特權級(RPL)則代表選擇子的特權級,共有4個特權級(0級、1級、2級、3級)。
關於特權級的說明:任務中的每一個段都有一個特定的級別。每當一個程序試圖訪問某一個段時,就將該程序所擁有的特權級與要訪問的特權級進行比較,以決定能否訪問該段。系統約定,CPU 只能訪問同一特權級或級別較低特權級的段。
例如給出邏輯地址:21h:12345678h轉換為線性地址
a. 選擇子SEL = 21h = 0000000000100 0 01(b) 代表的意思是:選擇子的index=4即0100,選擇GDT 中的第4個描述符;TI=0 代表選擇子是在GDT 選擇;最後的01代表特權級RPL=1。
b. OFFSET=12345678h若此時GDT 第四個描述符中描述的段基址為11111111h,則線性地址= 11111111h + 12345678h = 23456789h。
實驗指導書:https://www.lanqiao.cn/courses/115/labs/573/document/
實驗指導書:https://www.lanqiao.cn/courses/115/labs/574/document/
對機械磁盤的讀寫需要三個參數進行定位
block = C * ( H * S ) + H * S + S ;將幾個扇區劃分為一個block來提升磁盤io效率(linux0.11 將2個扇區劃分為一個block)對於更上層的角度而言,只需要輸入讀寫的block號即可進行磁盤io。
劃分: 引導塊| 超級塊| inode位圖| 數據位圖| inode塊| 數據塊
用FCB(linux0.11 中的inode)來存儲文件信息,其中包括不同種類的文件(例:設備文件,目錄文件...)。
struct m_inode
{
unsigned short i_mode ; // 文件类型和属性(rwx 位)。
unsigned short i_uid ; // 用户id(文件拥有者标识符)。
unsigned long i_size ; // 文件大小(字节数)。
unsigned long i_mtime ; // 修改时间(自1970.1.1:0 算起,秒)。
unsigned char i_gid ; // 组id(文件拥有者所在的组)。
unsigned char i_nlinks ; // 文件目录项链接数。
unsigned short i_zone [ 9 ]; // 直接(0-6)、间接(7)或双重间接(8)逻辑块号。
/* these are in memory also */
struct task_struct * i_wait ; // 等待该i 节点的进程。
unsigned long i_atime ; // 最后访问时间。
unsigned long i_ctime ; // i 节点自身修改时间。
unsigned short i_dev ; // i 节点所在的设备号。
unsigned short i_num ; // i 节点号。
unsigned short i_count ; // i 节点被使用的次数,0 表示该i 节点空闲。
unsigned char i_lock ; // 锁定标志。
unsigned char i_dirt ; // 已修改(脏)标志。
unsigned char i_pipe ; // 管道标志。
unsigned char i_mount ; // 安装标志。
unsigned char i_seek ; // 搜寻标志(lseek 时)。
unsigned char i_update ; // 更新标志。
}; inode裡存放著文件在磁盤中的block 號,以及其他的一些文件描述信息。可以存在多級的盤塊位置引導,分為直接索引、間接索引獲得block 位置。
根據目錄inode 找到對應數據盤塊號中的數據,其中有該目錄下存在子目錄的inode 盤塊號。一層一層查找下去就可以找到最終目標目錄的位置。
實驗指導書:https://www.lanqiao.cn/courses/115/labs/575/document/