亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言
雖然我們很多人都是在linux系統上做應用程序開發,一般接觸不到Linux內核代碼,但是了解Linux內核的底層實現機制,對應用程序的開發,尤其是性能方面的優化提升會有很大的幫助。
研究Linux內核,我們可以看看源碼,并且把內核代碼給跑起來,通過gdb來調試它。下面我們來具體實操看一下Linux內核的編譯以及調試方法。
 
1 編譯Linux內核
 
1.1 下載Linux內核源碼并解壓
cd /usr/srcwget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.11.tar.xztar -xf linux-6.4.11.tar.xzcd  /usr/src/linux-6.4.11
 
1.2 安裝依賴庫
  • sudo apt install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev dwarves
 
1.3 修改Linux內核編譯參數
執行 sudo make menuconfig 點擊save保存,生成.config文件,在vim .config修改如下內核參數配置:
CONFIG_DEBUG_INFO=y      #在內核和內核模塊中包含調試信息CONFIG_FRAME_POINTER=y   #將調用幀信息保存在寄存器或堆棧上的不同位置,使gdb在調試內核時可以更準確地構造堆棧回溯跟蹤(stack back traces)。CONFIG_GDB_SCRIPTS=y     CONFIG_KGDB=y            #啟用內置的內核調試器,該調試器允許進行遠程調試CONFIG_DEBUG_INFO_REDUCED=nCONFIG_RANDOMIZE_BASE=n  #KASLR會更改引導時放置內核代碼的基地址, 無法從gdb設置斷點CONFIG_SYSTEM_TRustED_KEYS=""CONFIG_SYSTEM_REVOCATION_KEYS=""
如果CONFIG_SYSTEM_TRUSTED_KEYS和CONFIG_SYSTEM_REVOCATION_KEYS沒有修改,會報如下錯誤:
  • No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
 
1.4 開始編譯Linux內核
使用make編譯
sudo make -j8 sudo make bzImage          #編譯內核映像文件sudo make modules          #編譯模塊sudo make modules_install  #安裝模塊sudo make install          #安裝內核
安裝內核后,確認/boot/grub/grub.cfg中是否已增加了剛剛編譯的新的內核選項
重啟虛擬機。在GRUB界面選擇 Ubuntu 高級選項,選擇剛剛的內核版本linux-6.4.11進去,就可以進入了新的內核。
可以看到,Ubuntu虛擬機原來的內核版本是5.4.0-156,這里給它升級了新的內核版本6.4.11:
至此,新的linux內核已經編譯完成。
 
2 制作文件系統
2.1 編譯文件系統制作工具busybox
下載busybox源碼并解壓:
wget https://busybox.NET/downloads/busybox-1.36.1.tar.bz2 tar -xvf busybox-1.36.1.tar.bz2
修改.config編譯參數:先執行make defconfig,在.config文件中添加CONFIG_STATIC=y
 
編譯安裝busybox:
  • make busybox install
 
2.2 制作文件系統rootfs.gz
拷貝相關文件到文件系統目錄:
mkdir rootfscd rootfs/cp -r ../busybox-1.36.1/_install/bin/ .cp -r ../busybox-1.36.1/_install/sbin/ .cp -r ../busybox-1.36.1/_install/usr/ .mkdir dev proc syscd ..chmod 777 -R rootfs/cd rootfs/touch init
制作init文件,把如下內容寫入init文件
#!/bin/sh
dmesg -n 1mount -t devtmpfs none /devmount -t proc none /procmount -t sysfs none /syssetsid cttyhack /bin/sh
制作生成文件系統rootfs.gz:
  • chmod 777 initfind . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz
 
3 調試Linux內核
Linux內核有多種調試方式,這里我們采用的是通過QEMU虛擬機加gdb遠程調試的方式。
調試環境如下:
物理機:windows系統調試機:   Ubuntu 20.04.5 LTS虛擬機,安裝在VMware上,內核版本為5.4.0-156被調試機:QEMU虛擬機,使用新編譯的內核6.4.11版本和自制的簡易文件系統
 
3.1 安裝QEMU虛擬機
  • apt install qemu qemu-utils qemu-kvm virt-manager libvirt-daemon-system libvirt-clients bridge-utils
 
3.2 啟動QEMU虛擬機
這里需要指定上面我們編譯linux內核時產生的內核映像文件bzImage和剛剛制作的rootfs.gz文件系統:
  • qemu-system-x86_64 -kernel /usr/src/linux-6.4.11/arch/x86_64/boot/bzImage -initrd /home/kernel/rootfs.gz -Append "nokaslr console=ttyS0" -s -S -nographic
我們也可以先不加-s和-S參數,測試驗證一下編譯的Linux內核是否能正常啟動:
  • qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -nographic
QEMU虛擬機啟動參數說明如下:
-kernel ./bzImage:指定啟用的內核鏡像;-initrd ./rootfs.img:指定啟動的內存文件系統;-append "nokaslr console=ttyS0":附加參數,其中 參數必須添加進來,防止內核起始地址隨機化,這樣會導致 gdb 斷點不能命中;參數說明可以參見這里。nokaslr-s:監聽在 gdb 1234 端口;-S:表示啟動后就掛起,等待 gdb 連接((CPU 初始化之前凍結起來);-nographic:不啟動圖形界面,調試信息輸出到終端與參數 組合使用;console=ttyS
如果要退出QEMU虛擬機,可以先按ctrl + a鍵,然后再按x鍵,即可退出QEMU。
 
3.3 gdb調試Linux內核
編譯Linux內核時,會生成一個vmlinux文件,vmlinux是Linux內核編譯出來的原始的內核文件,可以用來進行調試內核和定位內核問題。
gdb開始調試,設置遠程調試的端口1234:
  • cd /usr/src/linux-6.4.11/gdb vmlinuxtarget remote :1234
跟gdb調試普通程序一樣,我們可以設置一下斷點,然后按c鍵繼續運行:
  • b start_kernelb rest_initc
可以看到gdb在start_kernel和rest_init兩個函數斷點處停住了,按c鍵后,QMUE虛擬機成功進入了系統。start_kernel是Linux內核啟動時C代碼開始的地方,研究內核啟動過程就可以從start_kernel開始看。

分享到:
標簽:Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定