centos source命令,使用Bochs調試Linux kernel 隨筆 -- 準備

 2023-10-15 阅读 20 评论 0

摘要:一 創建虛機測試用的磁盤鏡像文件 使用bximage命令創建一個10M的hdd.img(如果沒有bximage,安裝bochs)。 當然,也可以使用dd命令來創建,這里不在贅述,可以參考man dd。 ? centos source命令。接著,創建一個連接到hdd.img 文件

一 創建虛機測試用的磁盤鏡像文件

使用bximage命令創建一個10M的hdd.img(如果沒有bximage,安裝bochs)。

當然,也可以使用dd命令來創建,這里不在贅述,可以參考man dd。

?

centos source命令。接著,創建一個連接到hdd.img 文件的loop device。

losetup /dev/loop1 hdd.img

?

在創建完loop device之后,你可以同過/dev/loop1 設備文件訪問該hdd.img 鏡像文件,如同訪問一個真正的塊設備文件一樣。 所以,我們通過fdisk來對hdd.img 進行分區。

centos7 grub,fdisk /dev/loop1

為方便,在這里僅分一個primary分區包含所有扇區,建立分區后分區表如下:

Command (m for help): p

Disk /dev/loop1: 104 MB, 104767488 bytes
255 heads, 63 sectors/track, 12 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b23eaac

????? Device Boot????? Start???????? End????? Blocks?? Id? System
/dev/loop1p1???????????? ? 1????????? 12?????? 96358+? 83? Linux

可以看到,磁盤文件hdd.img 共有CHS為12/255/63。

這里的start 和 end是以cylinder為單位的。

為了以更細的粒度來查看分區表,通過給fdisk的-ul選項,以扇區問單位查看分區表:

$ sudo fdisk -ul /dev/loop1

Disk /dev/loop1: 104 MB, 104767488 bytes
255 heads, 63 sectors/track, 12 cylinders, total 204624 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b23eaac

????? Device Boot????? Start???????? End????? Blocks?? Id? System
/dev/loop1p1????????????? 63????? 192779?????? 96358+? 83? Linux

?

接下來,在新建的分區上創建文件系統。但是當前/dev/loop1 指向的是整個hdd.img文件,而不是hdd.img的分區loop1p1,所以,需要創建另外一個loop device來指向該分區,進而可以對該分區建立文件系統,就像是多一個真正的硬盤進行的操作一樣。

從上面的輸出結果可以看到,第一個分區是從扇區63開始,硬盤每一個分區的大小512 byte,所以第一個扇區的起始位移為63*512=32256。

到這里我們就可以將一個loop device連接到hdd.img的第一個扇區。

losetup –o 33256 /dev/loop2 /dev/loop1

?

然后,就可以通過訪問/dev/loop2對hdd.img的第一個扇區進行操作。通過mkfs.ext2命令為/dev/loop2建立文件系統。

mkfs.ext2 /dev/loop2

在為/dev/loop2 創建文件系統之后,就可以將其mount到系統的掛載點,從而可以對其進行文件相關的操作。

我們將/dev/loop2 掛載到/mnt/hdd 掛載點下。

mount /dev/loop2 /mnt/hdd

?

在這里我們選用grub 0.97作為bootloader。

創建相應的grub相關的目錄

mkdir –p /mnt/hdd/boot/grub

cp –r? /usr/lib/grub/i386-pc/stage1 /usr/lib/grub/i386-pc/stage2 /mnt/hdd/boot/grub

cp –r the_kernel /mnt/hdd

接下來,到/mnt/hdd/boot/grub 目錄下,創建menu.lst 文件

default 0
timeout 10
title=YuboOS
root (hd0,0)
kernel /bzImage?

接下來,我們將安裝grub bootloader到hdd.img 的MBR中去。

grub –device-map=/dev/null

這會到grub command line界面

在grub shell的提示符下執行命令:

grub>device? (hd0) hdd.img
grub>root (hd0,0)

grub>setup (hd0)

注意,這里device的參數是hdd.img文件,而不是loop device,這是因為grub 0.97的bug原因。

到此,整個虛擬機的磁盤鏡像文件建立完畢。

你可以將hdd.img的第一個分區一直掛載在/mnt/hdd 掛載點下,這樣你就可以隨時更新kernel,然后修改menu.lst 文件,從而可以達到測試kernel的目的。

?

二 使用bochs軟件來學習調試kernel。

我們假設已經有一個創建好的hdd.img可以使用。

為了達到可以調試kernel目的,我們需要自己動手編譯bochs,以為目前一般隨linux 發行版一起的bochs沒有打開其internal debugger或沒有安裝gdb-stub。

?

在這里使用的是bochs的2.4.6版本。編譯和安裝的一般過程是./configure && make && make install。

注意,為了使用bochs的內部調試功能,需要在configure 階段加上 –enable-debugger 和—enable-disasm 選項。

?

接下來,編輯bochs虛機配置文件: bochsrc

   1:  megs: 32
   2:  romimage: file=$BXSHARE/BIOS-bochs-latest
   3:  vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
   4:  vga: extension=vbe
   5:  floppya: 1_44=a.img, status=ejected
   6:  floppyb: 1_44=b.img, status=ejected
   7:  ata0-master: type=disk, path=hdd.img, cylinders=203, heads=16, spt=63
   8:  boot: c
   9:  log: bochsout.txt
  10:  mouse: enabled=0
  11:  #ips: 15000000
  12:  clock: sync=slowdown
  13:  vga_update_interval: 150000

?

最后,使用bochs –f bochsrc 就可以運行虛機了。

轉載于:https://www.cnblogs.com/yuboyue/archive/2011/09/15/2178128.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/139451.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息