日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本

發布時間:2025/5/22 编程问答 20 如意码农
生活随笔 收集整理的這篇文章主要介紹了 【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內核編譯

非常靠譜的兩篇參考文章:

看參考文章之前請先看補注!!!

  1. Linux內核編譯很簡單,6步編譯一個自己的內核
  2. Linux 內核編譯步驟及配置詳解

補注:

  1. 虛擬機內存請分配100GB,否則后期空間不夠,手動擴展于事無補,只能下載磁盤管理器。
    同時,考慮到虛擬機需要快照,真實磁盤空間最好預留70~80GB,不快照預估60GB。內核請分配4個或以上,建議4個。
    編譯新內核后文件占用情況(大致60GB):
  2. 可以先進行內核修改(也就是第二步),再回來編譯內核,否則修改后需要再次編譯。
  3. 需要提前安裝的軟件名包:gcc gdb bison flex libncurses5-dev libssl-dev libidn11 build-essential,用sudo apt install安裝。
  4. 如果優麒麟主機和虛擬機之間沒辦法復制粘貼,說明安裝虛擬機的時候安裝出錯,最好是直接重新安裝,否則之后會繼續出更多的錯。
  5. sudo apt install無法定位軟件包解決:執行sudo apt-get update,即可。如果還不行就多update一次。
  6. 可以用sudo setstatus softmode把彈出來的“是否允許未知程序執行”關掉。
  7. .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

二、添加新的系統調用

特別靠譜的參考文章:

看參考文章之前請先看補注!!!

  1. Ubuntu20.04+Linux5.8.8 添加系統調用實現進程隱藏
  2. 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. 任務

  1. 要求:在 Ubuntu (或銀河麒麟) 或 Windows 下,編寫腳本或批處理。
  2. 功能:在指定目錄中全部 txt 文件的末尾追加一行,寫入用戶名,日期,時間。
  3. 提示: 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. $1接收第一個命令行參數(目錄)。
  2. *.txt檢查文件后綴是否為txt。
  3. 設置寫入格式為#LY4E# 用戶名 日期,時間,其中特殊標識設為#LY4E#
  4. grep結合特殊標識符判斷是否已寫有日期和時間。如果未寫入,則向文件中追加寫入字符串str_insert;如果已寫入,則用sed更新字符串。

3. 運行檢測

如圖所示。

結果解釋:

  1. 先分別初始化test.txttest2.txt的內容為12
  2. 運行批處理文件mysh.sh
  3. 打印輸出所有txt文件。
  4. 再次運行批處理文件mysh.sh,檢查是否會重復寫入。
  5. 再次打印輸出所有txt文件,從顯示時間可知,字符串被更新,而非追加。

四、用NASM編寫MBR引導程序,在BOCHS虛擬機中測試

1. 提示:

  1. 參考書:《一個操作系統的實現》前3章
  2. 基本功能和程序框架:屏幕顯示“Hello OS”后原地停下。
  3. 擴充功能:利用BIOS中斷獲取并顯示內存大小信息。
  4. 開發環境:限定: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. 可能遇到的報錯

  1. cpu directive malformed.

    解決方法:①. bochs -help cpu將顯示出所有支持的CPU類型。②. 修改.bochsrc文件中cpu: model=core2+penryn_t9600為cpu: model=上一條查到的所支持的CPU類型之一。

  2. Bochs is not compiled with lowlevel sound support

    解決方法:修改配置文件,注釋掉以下兩行
    #sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
    #speaker: enabled=1, mode=sound

  3. keyboard_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】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。