【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本
文章目錄
- 目的
- 任務
- 前言
- 一、linux內核編譯
- 非常靠譜的兩篇參考文章:
- 補注:
- 總結
- 二、添加新的系統調用
- 特別靠譜的參考文章:
- 補注:
- 1. 我修改的文件:
- 2. 圖中需要敲入的全部代碼:
- 3. 編譯新內核后可能遇到的問題:
- 三、編寫批處理程序
- 1. 任務
- 2. 代碼
- 3. 運行檢測
- 四、用NASM編寫MBR引導程序,在BOCHS虛擬機中測試
- 1. 提示:
- 2. 安裝nasm和bochs
- 3. 使用bochs
- 4. 可能遇到的報錯
- 5. 開始調試
- THE END
目的
1)理解操作系統引導程序/BIOS/MBR的概念和作用;
2)理解并應用操作系統生成的概念和過程;
3)理解并應用操作系統操作界面,系統調用概念
4)掌握和推廣國產操作系統(限“銀河麒麟”,加10分,直到滿分)
任務
1)用NASM編寫MBR引導程序,在BOCHS虛擬機中測試。
2)在Linux(建議Ubuntu或銀河麒麟)下裁剪和編譯Linux內核,并啟用新內核。(其他發行版本也可以)
3)為Linux內核(建議Ubuntu或銀河麒麟)增加2個系統調用,并啟用新的內核,并編寫應用程序測試。(其他發行版本也可以)
4)在Linux (建議Ubuntu或銀河麒麟) 或Windows下,編寫腳本或批處理。在指定目錄中的全部txt文件末尾追加或更新:用戶名:日期和時間。root:2021-11-23 09:50
前言
優麒麟下載地址:https://www.ubuntukylin.com/downloads/
任選鏡像站,去Index of /ubuntukylin-cdimage/Kylin-V10-SP1/目錄下載鏡像。
我使用的優麒麟鏡像下載鏈接:阿里云_Kylin-Desktop-V10-SP1-Release-hwe-2107-x86_64.iso,版本是Kylin-V10-SP1。
用虛擬機直接選擇鏡像安裝。
優麒麟是一款好好看的
linux系統,自帶中文輸入法,UI美觀,自帶漂亮的壁紙,操作方便,沒有奇怪的bug。
一、linux內核編譯
非常靠譜的兩篇參考文章:
看參考文章之前請先看補注!!!
- Linux內核編譯很簡單,6步編譯一個自己的內核
- Linux 內核編譯步驟及配置詳解
補注:
- 虛擬機內存請分配100GB,否則后期空間不夠,手動擴展于事無補,只能下載磁盤管理器。
同時,考慮到虛擬機需要快照,真實磁盤空間最好預留70~80GB,不快照預估60GB。內核請分配4個或以上,建議4個。
編譯新內核后文件占用情況(大致60GB):
- 可以先進行內核修改(也就是第二步),再回來編譯內核,否則修改后需要再次編譯。
- 需要提前安裝的軟件名包:
gcc gdb bison flex libncurses5-dev libssl-dev libidn11 build-essential,用sudo apt install安裝。 - 如果優麒麟主機和虛擬機之間沒辦法復制粘貼,說明安裝虛擬機的時候安裝出錯,最好是直接重新安裝,否則之后會繼續出更多的錯。
sudo apt install無法定位軟件包解決:執行sudo apt-get update,即可。如果還不行就多update一次。- 可以用
sudo setstatus softmode把彈出來的“是否允許未知程序執行”關掉。 - .config文件可以不用復制/修改,先執行
make menuconfig然后exit,會生成一個。
編譯成功并安裝的截圖:
總結
1、獲取內核源碼,解壓至/usr/src
tar xf linux-5.10.81.tar.xz -C /usr/src
ln -sv /usr/src/ linux-5.10.81 /usr/src/linux
# tar xf linux-3.13.5.tar.xz -C /usr/src
# ln -sv /usr/src/linux-3.13.5 /usr/src/linux
2、設置弱保護模式(防止彈窗太多):
sudo setstatus softmode # 僅限優麒麟
3、配置內核特性(選擇一種方法就可以了)
make config:遍歷選擇所要編譯的內核特性
make allyesconfig:配置所有可編譯的內核特性
make allnoconfig:并不是所有的都不編譯
make menuconfig:這種就是打開一個文件窗口選擇菜單
make kconfig(KDE桌面環境下,并且安裝了qt開發環境)
make gconfig(Gnome桌面環境,并且安裝gtk開發環境)
4、編譯內核 # 這一步是最耗時的
# make [-j #] : #號最多為CPU物理核心總數的兩倍,這樣會快點哦
5、安裝內核模塊
# make modules_install
6、安裝內核
# make install
7、驗正并測試(選擇自己內核有的一種方法就可以了)(可跳過)
# cat /boot/grub/grub.conf
# cat /boot/grub/grub.cfg
8、查看新內核是否已經添加, 而后重啟系統并測試(任選其一)
# uname -a
# unmae -mrs
二、添加新的系統調用
特別靠譜的參考文章:
看參考文章之前請先看補注!!!
- Ubuntu20.04+Linux5.8.8 添加系統調用實現進程隱藏
- Kernel官網步驟:Adding a New System Call
補注:
1. 我修改的文件:
①系統調用:linux-5.10.81/kernel/sys.c
②系統調用函數聲明:linux-5.10.81/include/linux/syscalls.h
③ID:linux-5.10.81/arch/x86/entry/syscalls/syscall_64.tbl
④ID聲明:linux-5.10.81/include/uapi/asm-generic/unistd.h
重點:修改內容見下圖:
上圖是已經編譯完成的,能夠正常調用新增的系統調用,并得到輸出結果。
2. 圖中需要敲入的全部代碼:
①系統調用:linux-5.10.81/kernel/sys.c
SYSCALL_DEFINE2(SSD_Add,int,x,int,y){
printk("%d",x+y);
return 0;
}
SYSCALL_DEFINE3(SSD_Max,int,a,int,b,int,c){
if(a>b)b=a;
if(b>c)c=b;
printk("%d",c);
return 0;
}
注意輸出不能有’
\n’,注意是printk啊!!不是printf!!
后話:printk不改優先級只能輸出在日志中,要用dmseg打印(如果嫌打印的東西太多了可以先sudo dmseg -C把內核緩沖區清空一下)。
②系統調用函數聲明:linux-5.10.81/include/linux/syscalls.h
asmlinkage long sys_SSD_Add(int x, int y);
asmlinkage long sys_SSD_Max(int a, int b, int c);
③ID:linux-5.10.81/arch/x86/entry/syscalls/syscall_64.tbl
498 64 SSD_Add sys_SSD_Add
499 64 SSD_Max sys_SSD_Max
④ID聲明:linux-5.10.81/include/uapi/asm-generic/unistd.h
#define __NR_ssd_add 498
__SYSCALL(__NR_ssd_add, sys_SSD_Add)
#define __NR_ssd_max 499
__SYSCALL(__NR_ssd_max, sys_SSD_Max)
⑤系統調用測試:test.c
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
long ret;
ret = syscall(499,1,2,3); //Max
ret = syscall(499,7,6,5); //Max
ret = syscall(498,4,6); //Add
printf("ret:%ld\n",ret);
ret = syscall(499,7,9,8); //Max
printf("ret:%ld\n",ret);
}
輸出可能不會按序。
3. 編譯新內核后可能遇到的問題:
可能找不到modules,無法啟動。
解決辦法:回到make modules_install這一步之前,重做這一步以及后面的步驟,保證內存充足。
三、編寫批處理程序
1. 任務
- 要求:在 Ubuntu (或銀河麒麟) 或 Windows 下,編寫腳本或批處理。
- 功能:在指定目錄中全部 txt 文件的末尾追加一行,寫入用戶名,日期,時間。
- 提示: 1) 目錄通過命令行的參數來指定,不要在腳本中寫死;2) 注意檢查文件的后綴是否 txt;3) 日期和時間的寫入格式可以自己確定【例如特殊字符標識】;4) 已寫有日期和時間的文件只能更新日期和時間,不能追加。
2. 代碼
str_insert="#LY4E# $USER `date +%Y-%m-%d,%H:%M:%S`"
for ofile in $1/*.txt
do
if [ `grep -c "#LY4E#" $ofile` -eq 0 ];then
echo $str_insert >> $ofile
else
sed -i "/#LY4E#/c $str_insert" $ofile
fi
done
針對每一條提示的解釋:
- 用
$1接收第一個命令行參數(目錄)。 - 用
*.txt檢查文件后綴是否為txt。 - 設置寫入格式為
#LY4E# 用戶名 日期,時間,其中特殊標識設為#LY4E#。 - 用
grep結合特殊標識符判斷是否已寫有日期和時間。如果未寫入,則向文件中追加寫入字符串str_insert;如果已寫入,則用sed更新字符串。
3. 運行檢測
如圖所示。
結果解釋:
- 先分別初始化
test.txt和test2.txt的內容為1和2。 - 運行批處理文件
mysh.sh。 - 打印輸出所有
txt文件。 - 再次運行批處理文件
mysh.sh,檢查是否會重復寫入。 - 再次打印輸出所有
txt文件,從顯示時間可知,字符串被更新,而非追加。
四、用NASM編寫MBR引導程序,在BOCHS虛擬機中測試
1. 提示:
- 參考書:《一個操作系統的實現》前3章
- 基本功能和程序框架:屏幕顯示“Hello OS”后原地停下。
- 擴充功能:利用BIOS中斷獲取并顯示內存大小信息。
- 開發環境:限定:Linux + Bochs + Nasm
2. 安裝nasm和bochs
sudo apt install nasm,可以。
sudo apt install bochs bximage,可直接安裝bochs、bximage。
直接用源碼安裝比較齊全,不需要另外再下載bximage或其他的。
源碼安裝的步驟如下:
①Bochs官網下載bochs-版本號.tar.gz。
由于源站比較慢,可以用鏡像站代替,SourceForge自帶鏡像站:
③解壓壓縮包:
tar zxvf bochs-2.7.tar.gz
④設置弱保護模式:
sudo setstatus softmode # 僅限優麒麟
⑤編譯安裝:
cd bochs-2.7
./configure --enable-debugger --enable-disasm
make
sudo make install
書配套的代碼的bochsrc:
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
一律改成(照著自己下載的那個文件夾下的bochsrc改):
romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
bochs源碼安裝參考:Linux下Bochs,NASM安裝和使用,他寫錯了好多,也沒有提SourceForge下載艱難的事兒。
3. 使用bochs
編寫程序boot.asm:
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0
dw 0xaa55
用nasm編譯它:
nasm boot.asm -o boot.bin
運行bximage:
圖片引自簡書_10分鐘完成的操作系統(Bochs的使用–windows系統下)
將boot.bin載入生成的a.img中:
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
修改bochsrc(在你的bochs安裝目錄下面,如果沒有,則將.bochsrc復制一份成為bochsrc):
可以通過
whereis bochs找到安裝目錄。(我強烈建議直接把所有配置刪掉,只留下圖提到的這些配置。)
提示:可以用
/符號在vim中快速查找。
接下來運行:bochs -f bochsrc。
4. 可能遇到的報錯
cpu directive malformed.
解決方法:①. bochs -help cpu將顯示出所有支持的CPU類型。②. 修改.bochsrc文件中cpu: model=core2+penryn_t9600為cpu: model=上一條查到的所支持的CPU類型之一。Bochs is not compiled with lowlevel sound support
解決方法:修改配置文件,注釋掉以下兩行
#sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
#speaker: enabled=1, mode=soundkeyboard_mapping’ is deprecated - use ‘keyboard’ option instead
解決方法:keyboard_mapping那個配置注釋掉。或者參考博客修改。
5. 開始調試
正常情況是出現以下內容:
選擇6開始調試。
然后出現了一個報錯:message:ata0-0:could not open hard drive image file ’30M.sample’
解決辦法:修改bochsrc文件,將ata0-master: type=disk, mode=flat, path="30M.sample"注釋掉。
然后正常情況會出現一片黑屏:
接下來按照原書中的指示依次輸入:
b 0x7c00
c
dump_cpu #可略
x /64xb 0x7c00 #可略
n
n
n
……直到出現"Hello, OS world!"
注:當輸入dump_cpu時,顯示“syntax error at ‘dump_cpu’”,這是因為bochs 2.3.5 以上的版本沒有dump_cpu了,可以用r,fp,mmx,sse,dreg,sreg,creg命令代替。
原書結果:
原理:先用b 0x7c00設斷點,然后c指令讓代碼執行到斷點,再一直n單步運行即可,會出現"Hello, OS world!"。
實際結果如下圖。
調試過程中的參考鏈接:
1.自己寫操作系統 2 - 安裝bochs虛擬機
2.Bochs安裝和啟動中遇到的問題解決方案
THE END
總結
以上是生活随笔為你收集整理的【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# INotifyPropertyCh
- 下一篇: codeup之A+B