【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本
文章目錄
- 目的
- 任務(wù)
- 前言
- 一、linux內(nèi)核編譯
- 非常靠譜的兩篇參考文章:
- 補注:
- 總結(jié)
- 二、添加新的系統(tǒng)調(diào)用
- 特別靠譜的參考文章:
- 補注:
- 1. 我修改的文件:
- 2. 圖中需要敲入的全部代碼:
- 3. 編譯新內(nèi)核后可能遇到的問題:
- 三、編寫批處理程序
- 1. 任務(wù)
- 2. 代碼
- 3. 運行檢測
- 四、用NASM編寫MBR引導(dǎo)程序,在BOCHS虛擬機中測試
- 1. 提示:
- 2. 安裝nasm和bochs
- 3. 使用bochs
- 4. 可能遇到的報錯
- 5. 開始調(diào)試
- THE END
目的
1)理解操作系統(tǒng)引導(dǎo)程序/BIOS/MBR的概念和作用;
2)理解并應(yīng)用操作系統(tǒng)生成的概念和過程;
3)理解并應(yīng)用操作系統(tǒng)操作界面,系統(tǒng)調(diào)用概念
4)掌握和推廣國產(chǎn)操作系統(tǒng)(限“銀河麒麟”,加10分,直到滿分)
任務(wù)
1)用NASM編寫MBR引導(dǎo)程序,在BOCHS虛擬機中測試。
2)在Linux(建議Ubuntu或銀河麒麟)下裁剪和編譯Linux內(nèi)核,并啟用新內(nèi)核。(其他發(fā)行版本也可以)
3)為Linux內(nèi)核(建議Ubuntu或銀河麒麟)增加2個系統(tǒng)調(diào)用,并啟用新的內(nèi)核,并編寫應(yīng)用程序測試。(其他發(fā)行版本也可以)
4)在Linux (建議Ubuntu或銀河麒麟) 或Windows下,編寫腳本或批處理。在指定目錄中的全部txt文件末尾追加或更新:用戶名:日期和時間。root:2021-11-23 09:50
前言
優(yōu)麒麟下載地址:https://www.ubuntukylin.com/downloads/
任選鏡像站,去Index of /ubuntukylin-cdimage/Kylin-V10-SP1/目錄下載鏡像。
我使用的優(yōu)麒麟鏡像下載鏈接:阿里云_Kylin-Desktop-V10-SP1-Release-hwe-2107-x86_64.iso,版本是Kylin-V10-SP1。
用虛擬機直接選擇鏡像安裝。
優(yōu)麒麟是一款好好看的
linux系統(tǒng),自帶中文輸入法,UI美觀,自帶漂亮的壁紙,操作方便,沒有奇怪的bug。
一、linux內(nèi)核編譯
非常靠譜的兩篇參考文章:
看參考文章之前請先看補注!!!
- Linux內(nèi)核編譯很簡單,6步編譯一個自己的內(nèi)核
- Linux 內(nèi)核編譯步驟及配置詳解
補注:
- 虛擬機內(nèi)存請分配100GB,否則后期空間不夠,手動擴展于事無補,只能下載磁盤管理器。
同時,考慮到虛擬機需要快照,真實磁盤空間最好預(yù)留70~80GB,不快照預(yù)估60GB。內(nèi)核請分配4個或以上,建議4個。
編譯新內(nèi)核后文件占用情況(大致60GB):
- 可以先進行內(nèi)核修改(也就是第二步),再回來編譯內(nèi)核,否則修改后需要再次編譯。
- 需要提前安裝的軟件名包:
gcc gdb bison flex libncurses5-dev libssl-dev libidn11 build-essential,用sudo apt install安裝。 - 如果優(yōu)麒麟主機和虛擬機之間沒辦法復(fù)制粘貼,說明安裝虛擬機的時候安裝出錯,最好是直接重新安裝,否則之后會繼續(xù)出更多的錯。
sudo apt install無法定位軟件包解決:執(zhí)行sudo apt-get update,即可。如果還不行就多update一次。- 可以用
sudo setstatus softmode把彈出來的“是否允許未知程序執(zhí)行”關(guān)掉。 - .config文件可以不用復(fù)制/修改,先執(zhí)行
make menuconfig然后exit,會生成一個。
編譯成功并安裝的截圖:
總結(jié)
1、獲取內(nèi)核源碼,解壓至/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、設(shè)置弱保護模式(防止彈窗太多):
sudo setstatus softmode # 僅限優(yōu)麒麟
3、配置內(nèi)核特性(選擇一種方法就可以了)
make config:遍歷選擇所要編譯的內(nèi)核特性
make allyesconfig:配置所有可編譯的內(nèi)核特性
make allnoconfig:并不是所有的都不編譯
make menuconfig:這種就是打開一個文件窗口選擇菜單
make kconfig(KDE桌面環(huán)境下,并且安裝了qt開發(fā)環(huán)境)
make gconfig(Gnome桌面環(huán)境,并且安裝gtk開發(fā)環(huán)境)
4、編譯內(nèi)核 # 這一步是最耗時的
# make [-j #] : #號最多為CPU物理核心總數(shù)的兩倍,這樣會快點哦
5、安裝內(nèi)核模塊
# make modules_install
6、安裝內(nèi)核
# make install
7、驗正并測試(選擇自己內(nèi)核有的一種方法就可以了)(可跳過)
# cat /boot/grub/grub.conf
# cat /boot/grub/grub.cfg
8、查看新內(nèi)核是否已經(jīng)添加, 而后重啟系統(tǒng)并測試(任選其一)
# uname -a
# unmae -mrs
二、添加新的系統(tǒng)調(diào)用
特別靠譜的參考文章:
看參考文章之前請先看補注!!!
- Ubuntu20.04+Linux5.8.8 添加系統(tǒng)調(diào)用實現(xiàn)進程隱藏
- Kernel官網(wǎng)步驟:Adding a New System Call
補注:
1. 我修改的文件:
①系統(tǒng)調(diào)用:linux-5.10.81/kernel/sys.c
②系統(tǒng)調(diào)用函數(shù)聲明: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
重點:修改內(nèi)容見下圖:
上圖是已經(jīng)編譯完成的,能夠正常調(diào)用新增的系統(tǒng)調(diào)用,并得到輸出結(jié)果。
2. 圖中需要敲入的全部代碼:
①系統(tǒng)調(diào)用: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不改優(yōu)先級只能輸出在日志中,要用dmseg打印(如果嫌打印的東西太多了可以先sudo dmseg -C把內(nèi)核緩沖區(qū)清空一下)。
②系統(tǒng)調(diào)用函數(shù)聲明: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)
⑤系統(tǒng)調(diào)用測試: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. 編譯新內(nèi)核后可能遇到的問題:
可能找不到modules,無法啟動。
解決辦法:回到make modules_install這一步之前,重做這一步以及后面的步驟,保證內(nèi)存充足。
三、編寫批處理程序
1. 任務(wù)
- 要求:在 Ubuntu (或銀河麒麟) 或 Windows 下,編寫腳本或批處理。
- 功能:在指定目錄中全部 txt 文件的末尾追加一行,寫入用戶名,日期,時間。
- 提示: 1) 目錄通過命令行的參數(shù)來指定,不要在腳本中寫死;2) 注意檢查文件的后綴是否 txt;3) 日期和時間的寫入格式可以自己確定【例如特殊字符標(biāo)識】;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接收第一個命令行參數(shù)(目錄)。 - 用
*.txt檢查文件后綴是否為txt。 - 設(shè)置寫入格式為
#LY4E# 用戶名 日期,時間,其中特殊標(biāo)識設(shè)為#LY4E#。 - 用
grep結(jié)合特殊標(biāo)識符判斷是否已寫有日期和時間。如果未寫入,則向文件中追加寫入字符串str_insert;如果已寫入,則用sed更新字符串。
3. 運行檢測
如圖所示。
結(jié)果解釋:
- 先分別初始化
test.txt和test2.txt的內(nèi)容為1和2。 - 運行批處理文件
mysh.sh。 - 打印輸出所有
txt文件。 - 再次運行批處理文件
mysh.sh,檢查是否會重復(fù)寫入。 - 再次打印輸出所有
txt文件,從顯示時間可知,字符串被更新,而非追加。
四、用NASM編寫MBR引導(dǎo)程序,在BOCHS虛擬機中測試
1. 提示:
- 參考書:《一個操作系統(tǒng)的實現(xiàn)》前3章
- 基本功能和程序框架:屏幕顯示“Hello OS”后原地停下。
- 擴充功能:利用BIOS中斷獲取并顯示內(nèi)存大小信息。
- 開發(fā)環(huán)境:限定:Linux + Bochs + Nasm
2. 安裝nasm和bochs
sudo apt install nasm,可以。
sudo apt install bochs bximage,可直接安裝bochs、bximage。
直接用源碼安裝比較齊全,不需要另外再下載bximage或其他的。
源碼安裝的步驟如下:
①Bochs官網(wǎng)下載bochs-版本號.tar.gz。
由于源站比較慢,可以用鏡像站代替,SourceForge自帶鏡像站:
③解壓壓縮包:
tar zxvf bochs-2.7.tar.gz
④設(shè)置弱保護模式:
sudo setstatus softmode # 僅限優(yōu)麒麟
⑤編譯安裝:
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分鐘完成的操作系統(tǒng)(Bochs的使用–windows系統(tǒng)下)
將boot.bin載入生成的a.img中:
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
修改bochsrc(在你的bochs安裝目錄下面,如果沒有,則將.bochsrc復(fù)制一份成為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. 開始調(diào)試
正常情況是出現(xiàn)以下內(nèi)容:
選擇6開始調(diào)試。
然后出現(xiàn)了一個報錯:message:ata0-0:could not open hard drive image file ’30M.sample’
解決辦法:修改bochsrc文件,將ata0-master: type=disk, mode=flat, path="30M.sample"注釋掉。
然后正常情況會出現(xiàn)一片黑屏:
接下來按照原書中的指示依次輸入:
b 0x7c00
c
dump_cpu #可略
x /64xb 0x7c00 #可略
n
n
n
……直到出現(xiàn)"Hello, OS world!"
注:當(dāng)輸入dump_cpu時,顯示“syntax error at ‘dump_cpu’”,這是因為bochs 2.3.5 以上的版本沒有dump_cpu了,可以用r,fp,mmx,sse,dreg,sreg,creg命令代替。
原書結(jié)果:
原理:先用b 0x7c00設(shè)斷點,然后c指令讓代碼執(zhí)行到斷點,再一直n單步運行即可,會出現(xiàn)"Hello, OS world!"。
實際結(jié)果如下圖。
調(diào)試過程中的參考鏈接:
1.自己寫操作系統(tǒng) 2 - 安裝bochs虛擬機
2.Bochs安裝和啟動中遇到的問題解決方案
THE END
總結(jié)
以上是生活随笔為你收集整理的【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# INotifyPropertyCh
- 下一篇: codeup之A+B