日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

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

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

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

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

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

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

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

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

運動步數(shù)有氧達人2018-06-03

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

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

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

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