4-1?課堂練習4.1:段式內存管理
段式內存管理以段為單位分配內存空間,段內連續,段間可以不連續。段可以很大,比如數據段、代碼段、棧段等。本實訓分析 Linux 0.11 的段式內存管理技術。
第1關1 號進程 mynext 變量的邏輯地址與線性地址
任務描述
本關任務調試版本 1.3 內核并回答問題:
- 1 號進程的函數調用 output_char() 所對應的第一條匯編指令的地址是多少?
- 1 號進程的 mynext 變量所在的段地址和段內偏移是多少?該段地址對應到幾號描述符?存放在哪個段描述符表中(GDT/LDT)?
- 1 號進程的進程控制塊中的 ldt 數組的起始地址是多少?其中 1 號和 2 號描述符里存放的段起始地址分別是多少?
- 1 號進程的 mynext 變量所在的線性地址是多少?
相關知識
為了完成本關任務,你需要掌握: 1.如何查看 1 號進程的函數調用 output_char() 所對應的匯編指令; 2.如何計算 1 號進程的 mynext 變量的邏輯地址(段地址:段內偏移); 3.段寄存器值(如 ds )的含義是什么; 4.如何查看進程的 LDT ; 5.如何從段描述符的值計算出段的起始地址。
環境準備
本實訓 5 個關卡全部使用版本 1.3 內核進行調試,內核文件存放在/data/workspace/myshixun/exp1
下。
實驗過程及答案
實驗過程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rungdb
另開一個終端
cd os/linux-0.11-lab ./mygdb
答案
第2關0號進程 mynext 變量的邏輯地址與線性地址
任務描述
本關任務調試版本 1.3 內核回答問題:
- 0 號進程的函數調用 output_char() 所對應的第一條匯編指令的地址是多少?
- 0 號進程的 mynext 變量所在的段地址和段內偏移是多少?該段地址對應到幾號描述符?存放在哪個段描述符表中(GDT/LDT)?
- 0 號進程的進程控制塊中的ldt數組的起始地址是多少?其中 1 號和 2 號描述符里存放的段起始地址分別是多少?
- 0 號進程的 mynext 變量所在的線性地址是多少?
相關知識
為了完成本關任務,你需要掌握:
- 如何查看 0 號進程的函數調用 output_char() 所對應的匯編指令;
- 如何計算 0 號進程的 mynext 變量的邏輯地址(段地址:段內偏移);
- 段寄存器值(如 ds )的含義是什么;
- 如何查看進程的 LDT ;
- 如何從段描述符的值計算出段的起始地址。
編程要求
根據相關知識,修改版本 1.3 內核回答問題: 通過 gdb 調試查找答案,將第二關的答案填寫在/data/workspace/myshixun/第二關.txt
中。
-
0 號進程的函數調用 output_char() 所對應的第一條匯編指令的地址是多少?
-
0 號進程的 mynext 變量所在的段地址和段內偏移是多少?該段地址對應到幾號描述符?存放在哪個段描述符表中(GDT/LDT)?
-
0 號進程的進程控制塊中的 ldt 數組的起始地址是多少?其中 1 號和 2 號描述符里存放的段起始地址分別是多少?
-
0 號進程的 mynext 變量所在的線性地址是多少?
實驗過程及答案
延用第一關配置,非必要不重新配置環境
實驗過程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rungdb
另開一個終端
cd os/linux-0.11-lab ./mygdb
答案
4-2?課堂練習4.1:段式內存管理
段式內存管理以段為單位分配內存空間,段內連續,段間可以不連續。段可以很大,比如數據段、代碼段、棧段等。本實訓分析 Linux 0.11 的段式內存管理技術。
第1關0號進程和1號進程的mynext變量的取值變化
任務描述
本關任務調試版本 1.3 內核回答問題:
- 1 號進程的 output_char 函數調用會執行幾次?
- 每次調用時,1 號進程和 0 號進程的 mynext 變量的值分別是多少?
相關知識
為了完成本關任務,你需要掌握:
- 如何查看 1 號進程的函數調用 output_char() 所對應的匯編指令;
- 在 gdb 中如何正確查看 1 號進程的 mynext 變量的值;
- 如何在斷點被捕獲時自動執行一組命令;
- 段寄存器值(如 ds )的含義是什么;
- 如何查看進程的 LDT 。
編程要求
根據相關知識,修改版本 1.3 內核回答問題: 通過 gdb 調試查找答案,將第三關的答案填寫在/data/workspace/myshixun/第三關.txt
中。
- 1 號進程的 output_char 函數調用會執行幾次?
- 每次調用時,1 號進程和 0 號進程的 mynext 變量的值分別是多少?
實驗過程及答案
實驗過程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rungdb
另開一個終端
cd os/linux-0.11-lab ./mygdb
由前兩關實驗我們得到了0號進程和1號進程的線性地址
答案
第2關LDTR 寄存器
任務描述
本關任務調試版本 1.3 內核回答問題:
- 1 號進程(在用戶態)運行時,LDTR 寄存器的值是多少?它指向 GDT 中的幾號描述符?該段描述符內的段起始地址是多少?指向哪個進程的 ldt 數組?
- 0 號進程(在用戶態)運行時,LDTR 寄存器的值是多少?它指向 GDT 中的幾號描述符?該段描述符內的段起始地址是多少?指向哪個進程的 ldt 數組?
相關知識
為了完成本關任務,你需要掌握:
- 在 bochsdbg 中如何跟蹤到 1 號進程(在用戶態)運行時;
- 如何查看 1 號進程的函數調用 output_char() 所對應的匯編指令;
- 在 bochsdbg 中如何查看 LDTR 的值?其含義是什么?
- 段寄存器值(如 DS )的含義是什么;
- 如何查看進程的 LDT ;
- 如何從段描述符的值計算出段的起始地址。
編程要求
根據相關知識,修改版本 1.3 內核回答問題: 通過 gdb 調試查找答案,將第四關的答案填寫在/data/workspace/myshixun/第四關.txt
中。
- 1 號進程(在用戶態)運行時,LDTR 寄存器的值是多少?它指向 GDT 中的幾號描述符?該段描述符內存的段起始地址是多少?指向哪個進程的 ldt 數組?
- 0 號進程(在用戶態)運行時,LDTR 寄存器的值是多少?它指向 GDT 中的幾號描述符?該段描述符內存的段起始地址是多少?指向哪個進程的 ldt 數組?
實驗過程及答案
延用第一關配置,非必要不重新配置環境
實驗過程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rundbg
![]()
答案
?第3關內核代碼段和數據段的段基址
任務描述
本關任務調試版本 1.3 內核回答問題:
- 0 號進程執行到 sys_pause 時,默認數據段(CS)和默認數據段(DS)的值分別是多少?其基地址分別是多少?
- 1 號進程執行到 sys_pause 時,默認數據段(CS)和默認數據段(DS)的值分別是多少?其基地址分別是多少?
相關知識
為了完成本關任務,你需要掌握:
- 在 gdb 中如何查看全局描述符表;
- 在 Linux 0.11 中,內核程序運行時訪問的線性地址空間是什么?;
- 在 bochsdbg 中如何查看 LDTR 的值?其含義是什么?;
- 段寄存器值(如 DS )的含義是什么;
- 如何從段描述符的值計算出段的起始地址。
編程要求
根據相關知識,修改版本 1.3 內核回答問題: 通過 gdb 調試查找答案,將第五關的答案填寫在/data/workspace/myshixun/第五關.txt
中。
1.0 號進程執行到 sys_pause 時,默認數據段(CS)和默認數據段(DS)的值分別是多少?其基地址分別是多少? 2.1 號進程執行到 sys_pause 時,默認數據段(CS)和默認數據段(DS)的值分別是多少?其基地址分別是多少?
實驗過程及答案
延用第一關配置,非必要不重新配置環境
實驗過程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rungdb
另開一個終端
cd os/linux-0.11-lab ./mygdb