bochs64編譯
① 編譯UEFI版本Grub2引導多系統文件efi
官網源碼地址
首先要從grub官網下在grub2,grub2中包含所有grub2相關的命令,可以用來生成grub2引導,這里著重介紹製作UEFI版本的grub2
內置配置文件為:grub.cfg,內置配源余置文件搜索鎮裂磨/EFI/grub/compile.cfg 文件,並將其設定為配置文件。
將其御斗保存在grub2解壓的壓縮目錄下,內容如下:
在grub2壓縮包下面解壓目錄下打開命令行,輸入以下命令:下面是編譯64的文件
以上生成完畢,在文件夾下會出現一個bootx64.efi文件,BOOTIA32.efi 文件夾,
將其和x86_64-efi、locale文件夾、unicode.pf2一起拷貝到第一個fat/fat32分區,並新建一個grub.cfg。
其中,x86_64-efi為模塊目錄,locale為地區語言,unicode.pf2為字體,grub.cfg為引導載入的配置文件
目錄如下:
FAT/FAT32
#########################
/EFI/Boot/bootx64.efi
/EFI/Boot/BOOTIA32.efi
/EFI/grub/grub.cfg
/EFI/grub/unicode.pf2
/EFI/grub/x86_64-efi/
/EFI/grub/locale/
#####################
x64.cfg內容示例:
[plain] view plain
function load_video {
if [ x$feature_all_video_mole = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
insmod part_gpt
insmod fat
set root='hd0,gpt1'
font="/EFI/grub/unicode.pf2"
if loadfont prefix/locale
set lang=zh_CN
insmod gettext
fi
terminal_output gfxterm
insmod jpeg
if background_image /EFI/grub/background.jpg; then
true
else
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 255,255,155,0; then
clear
fi
fi
set default=0
set timeout_style=menu
set timeout=5
menuentry "啟動 delta win7" --class windows --class os {
insmod ntfs
set root='(hd0,gpt2)'
}
menuentry "local win7" --class windows --class os {
insmod ntfs
set root='(hd0,gpt3)'
}
menuentry "ubuntu16.04 x86" --class ubuntu --class os {
insmod ext2
set root='(hd0,gpt5)'
linux /vmlinuz ro root=/dev/sda5
initrd /initrd.img
echo "Start Ubuntu 16.04"
}
menuentry "ubuntu16.04 x64" --class ubuntu --class os {
insmod ext2
set root='(hd0,gpt6)'
linux /vmlinuz ro root=/dev/sda6
initrd /initrd.img
echo "Start Ubuntu 16.04"
}
menuentry "-------------------" --class ubuntu --class os{
set root=(hd0,gpt1)
}
menuentry "ubuntu-efi" --class ubuntu --class os {
insmod ext2
set root='(hd0,gpt5)'
chainloader /efi/grub.efi
}
menuentry "install ubuntu" --class ubuntu --class os {
insmod ext2
insmod loopback
set root=(hd0,gpt4)
set isofile=/OS/linux/ubuntu-16.04.2-desktop-amd64.iso
loopback loop isofile
initrd (loop)/casper/initrd.lz
}
menuentry "-------------------" --class ubuntu --class os{
set root=(hd0,gpt1)
}
menuentry "reboot" --class windows --class os{
insmod reboot
reboot
}
menuentry "halt" --class windows --class os{
insmod halt
halt
}
https://wiki.archlinux.org/index.php/GRUB_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://help.ubuntu.com/community/UEFIBooting
http://ftp.gnu.org/gnu/grub/
http://ftp.gnu.org/gnu/grub/grub-2.02-for-windows.zip
https://www.gnu.org/software/grub/manual/grub.html
http://jingyan..com/article/c85b7a640cd7d6003bac95f8.html
https://packages.ubuntu.com/source/trusty/grub2
https://www.kernel.org/pub/linux/utils/boot/syslinux/
http://www.jinbuguo.com/linux/grub.cfg.html
http://blog.csdn.net/listener_ri/article/details/45621947
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385353
在進入grub界面如果出現
問題出在引導配置文件沒有找到.
那麼如何調試呢?
可以嘗試列印變數的方法,輸入C進入命令模式
輸入gettext $prefix
我們發現還是提示(hd0,gp1)/EFI/grub
說明目錄並沒有被更改,我們可以驗證一下放到此目錄在跑起來.
發現果然又可以了,後面原因就是便宜目錄的compile.cfg裡面的目錄並沒有修改到根目錄。
打開cfg文件查看是不是配置了語言文件,但是目錄不存在
如果依然亂碼,修改文件編碼為utf-8
在④步驟中,已經生成BIOS模式所需的內核文件Core.img,其大小是86.5 KB
生成的只是單單BIOS模式的內核文件,還無法引導Grub2,還需要個啟動文件Boot.img,該文件很小,只有512Byte,位於i386-pc文件夾,該文件的作用是啟動Grub2,然後載入內核文件Core.img
所以這里的最後壹步就是把啟動文件Boot.img和內核文件Core.img以二進制形式合並,合並後的文件我個人稱呼為扇區文件G2ldr(不知道這個文件有沒標準的名稱),因為可以直接導入到扇區,來引導啟動Grub2,也可以由GRUB4DOS直接載入這個扇區文件來啟動Grub2。
老樣子,先給出命令(如果命令行的路徑不是Grub2包所在的路徑,就先要修改命令行的路徑,前面有提到)
Copy /B i386-pc\Boot.img+Core.img G2ldr
用bootice 導入扇區
恢復扇區數改成63不能大於63的
之所以會超過是定製問題, 那麼這個不會
學習uefi和bios所使用的啟動器模擬
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=335197
具體教程來自 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411&extra=page%3D1
: qq5274202
我的cmd批處理定製
那麼bios載入方式如何啟動呢。
出現這個錯誤,說明文件系統是不支持引導此分區,可以一個一個測試
輸入 ls
出現了(hd0) (hd0,msdos2) (hd0,msdos1)
(hd1)
出現了msdos的都可以引導bios,
嘗試輸入了ls (hd0,msdos2)顯示的是存儲盤的內容,
嘗試輸入(hd0,msdos1)顯示的是uefi分區內容.
而輸入 其他的都顯示未知的系統,也驗證了bios只識別mbr分區表.
於是我把grub移動到了uefi分區 也就是(hd0,msdos1) 然後輸入如下內容
後依次輸入如下內容:
成功載入菜單.
② 安卓手機端如何運行iso鏡像文件
親,你指的是刷機包吧?
安卓手機也跟電腦類似,需要進入一個預安裝環境。
電腦(winPE),手機叫Recovery模式,在這個環境下進行讀取刷機包,並進行刷機。
需注意的是,刷機以後,資料會丟失,最好備份。
還有,不同的刷機包,可能存在兼容性問題,也有很多風險,所以需謹慎操作。
③ 安卓手機怎麼設置鏡像模式
1.在手機【桌面】找到【相機】進入。
(3)bochs64編譯擴展閱讀
防止把照片拍反就不用使用鏡像模式了。
1.使用手機前置攝像頭進行拍攝,那麼左右是相反的,用自拍鏡像功能,就可以使其恢復正常的。也就是可用於自拍的前置攝像頭。可以使用使用景象相機這款軟體把照片放正。
2.Mirrord有11個不同的鏡面反射,在實時拍攝照片或選擇一個現有的圖片鏡像濾波器。一旦被捕獲的圖像可以調整鏡子「反射」以及變更鏡像濾波器的位置。然後,您可以將圖像保存到您的畫廊,使用另一個應用程序添加更多的效果,或分享你的圖像與社交媒體,如Facebook,Twitter和Instagram的應用程序。
④ 怎麼用gdb和bochs調試內核
gdbstub可以使得Bochs程序在本地1234網路埠偵聽接收gdb的命令,並且向gdb發送命令執行結果。從而我們可以利用gdb對Linux 0.11內核進行C語言級的調試。當然,Linux 0.11內核也需要進行使用-g選項重新編譯。
14.13.1 編譯帶gdbstub的Bochs系統{.j,
Bochs用戶手冊中介紹了自行編譯Bochs系統的方法。這里我們給出編譯帶gdbstub的Bochs系統的方法和步驟。首先從下面網站下載最新Bochs系統源代碼(例如:bochs-2.2.tar.gz):U
使用tar對軟體包解壓後會在當前目錄中生成一個bochs-2.2子目錄。進入該子目錄後帶選項「--enable-gdb-stub」運行配置程序configure,然後運行make和make install即可,見如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stubI0B%
checking build system type... i686-pc-linux-gnu7.tY.
checking host system type... i686-pc-linux-gnuQ
checking target system type... i686-pc-linux-gnu{
...©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。M
[root@plinux bochs-2.2]# makeQ
[root@plinux bochs-2.2]# make installN?
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。ufVz
若在運行./configure時我們碰到一些問題而不能生成編譯使用的Makefile文件,那麼這通常是由於沒有安裝X window開發環境軟體或相關庫文件造成的。此時我們就必須先安裝這些必要的軟體。>1z<z
14.13.2 編譯帶調試信息的Linux 0.11內核"jmg
通過把Bochs的模擬運行環境與gdb符號調試工具聯系起來,我們既可以使用Linux 0.11系統下編譯的帶調試信息的內核模塊來調試,也可以使用在RedHat 9環境下編譯的0.11內核模塊來調試。這兩種環境下都需要對0.11內核源代碼目錄中所有Makefile文件進行修改,即在其中編譯標志行上添加-g標志,並去掉鏈接標志行上的-s選項:2
LDFLAGS = -M -x // 去掉 -s 標志。XJFU)Y
CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 標志。iMN
進入內核源代碼目錄後,利用find命令我們可以找到以下所有需要修改的Makefile文件:_6
[root@plinux linux-0.11]# find ./ -name MakefileSn^
./fs/Makefile-
./kernel/Makefile/"`p%
./kernel/chr_drv/Makefile(pyM
./kernel/math/MakefileV
./kernel/blk_drv/Makefiles/CDu
./lib/Makefile[x~
./Makefile980
./mm/Makefile/zb
[root@plinux linux-0.11]#S9/Q
另外,由於此時編譯出的內核代碼模塊中含有調試信息,因此system模塊大小可能會超過寫入內核代碼映像文件的默認最大值SYSSIZE = 0x3000(定義在boot/bootsect.s文件第6行)。我們可以按以下方法修改源代碼根目錄中的Makefile文件中產生Image文件的規則,即把內核代碼模塊system中的符號信息去掉後再寫入Image文件中,而原始帶符號信息的system模塊保留用作gdb調試器使用。注意,目標的實現命令需要以一個製表符(TAB)作為一行的開始。pP
Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system system.tmp=-&a
strip system.tmphQ6n0S
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)
rm -f system.tmpY3w[/@
sync9=P2n
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。KuEo
當然,我們也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000來處理這種情況。a?g4
14.13.3 調試方法和步驟;M]3!
下面我們根據在現代Linux系統(例如RedHat 9)系統上和運行在Bochs中Linux 0.11系統上編譯出的內核代碼分別來說明調試方法和步驟。
1 調試現代Linux系統上編譯出的Linux 0.11內核?E
假設我們的Linux 0.11內核源代碼根目錄是linux-rh9-gdb/,則我們首先在該目錄中按照上面方法修改所有Makefile文件,然後在linux-rh9-gdb/目錄下創建一個bochs運行配置文件並下載一個配套使用的根文件系統映像文件。我們可以直接從網站下載已經設置好的如下軟體包來做實驗:
使用命令「tar zxvf linux-gdb-rh9-050619.tar.gz」解開這個軟體包後,可以看到其中包含以下幾個文件和目錄:MX{-
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。X
[root@plinux linux-gdb-rh9]# ll'*5tfq
total 1600bJT~Q
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrcf%J2s
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-0.11-for-orig8EIChk
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f
這里的bochs配置文件與其他Linux 0.11配置文件的主要區別是在文件頭部添加有以下一行內容,表示當bochs使用這個配置文件運行時將在本地網路埠1234上偵聽gdb調試器的命令:NhL
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6
運行這個實驗的基本步驟如下:@EkQ
(1).啟動X window系統後打開兩個終端窗口;(mPN
(2).在一個窗口中,把工作目錄切換進linux-gdb-rh9/目錄中,並運行程序「./run」,此時該窗口中會顯示一條等待gdb來連接的信息:「Wait for gdb connection on localhost:1234」,並且系統會創建一個Bochs主窗口(此時無內容);1P=VI<
(3).在另一個窗口中,我們把工作目錄切換到內核源代碼目錄中linux-gdb-rh9/linux/,並運行命令:「gdb tools/system」;iDqm8
(4).在運行gdb的窗口中鍵入命令「break main」和「target remote localhost:1234」,此時gdb會顯示已經連接到Bochs的信息;p
(5).在gdb環境中再執行命令「cont」,稍過一會gdb會顯示程序停止在init/main.c的main()函數處。v3L2
下面是運行gdb和在其中執行的一些命令示例。[2;jS
[root@plinux linux]# gdb tools/system hI/
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)!mC}
Copyright 2003 Free Software Foundation, Inc.|3
GDB is free software, covered by the GNU General Public License, and you areC$NY4
welcome to change it and/or distribute copies of it under certain conditions.boNdAL
Type "show ing" to see the conditions.3[nfHW
There is absolutely no warranty for GDB. Type "show warranty" for details.'1-V
This GDB was configured as "i386-redhat-linux-gnu"...Oq&*[
(gdb) break main }<;
Breakpoint 1 at 0x6621: file init/main.c, line 110.+%!.]{
(gdb) target remote localhost:12342 .yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481(
481 namei.c: No such file or directory.5QU
in namei.c&%P'
(gdb) cont Pv'/S$
Continuing.P:O_{
Breakpoint 1, main () at init/main.c:110 *
110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD
(gdb) list 5XT
105 { /* The startup routine assumes (well, ...) this */2L$
106 /*_c
107 * Interrupts are still disabled. Do necessary setups, then)Z0k
108 * enable themjZ@+wn
109 */u
110 ROOT_DEV = ORIG_ROOT_DEV;d&!*`
111 drive_info = DRIVE_INFO;#yRW,
112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw
113 memory_end &= 0xfffff000;`v8fAR
114 if (memory_end > 16*1024*1024)lA#
(gdb) next DH.zM
111 drive_info = DRIVE_INFO;X
(gdb) next ?+S:q
112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt
(gdb) print /x ROOT_DEV <W<
$3 = 0x21d }{%Q
(gdb) quit |
The program is running. Exit anyway? (y or n) yt
[root@plinux linux]#lixBs
=====================================================
14.1 利用bochs調試內核%UU
Bochs具有非常強大的操作系統內核調試功能。這也是本文選擇Bochs作為首選實驗環境的主要原因之一。有關Bochs調試功能的說明參見前面14.2節,這里基於Linux 0.11內核來說明Windows環境下Bochs系統調試操作的基本方法。m[2
14.1.1 運行Bochs調試程序.g8O
我們假設Bochs系統已被安裝在目錄「C:/Program Files/Bochs-2.1.1/」中,並且Linux 0.11系統的Bochs配置文件名稱是bochsrc-hd.bxrc。現在在包含內核Image文件的目錄下建立一個簡單的批處理文件run.bat,其內容如下:R
"C:/Program Files/Bochs-2.1.1/bochsdbg" -q -f bochsrc-hd.bxrcjFypV+
其中bochsdbg是Bochs系統的調試執行程序。運行該批處理命令即可進入調試環境。此時Bochs的主顯示窗口空白,而控制窗口將顯示以下類似內容:D8v~
C:/Documents and Settings/john1/桌面/Linux-0.11>"C:/Program Files/Bochs-2.1.1/boRW6RNY
chsdbg" -q -f bochsrc-hd.bxrc2
========================================================================`)2?os
Bochs x86 Emulator 2.1.13$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hd.bxrcq4
00000000000i[ ] installing win32 mole as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified.1dsv
00000000000i[ ] using log file bochsout.txtmM
Next at t=0*
(0) context not implemented because BX_HAVE_HASH_MAP=0c
[0x000ffff0] f000:fff0 (unk. ctxt): jmp f000:e05b ; ea5be000f0g$
<bochs:1>i/
此時Bochs調試系統已經准備好開始運行,CPU執行指針已指向ROM BIOS中地址0x000fffff0處的指令處。其中'<bochs:1>'是命令輸入提示符,其中的數字表示當前的命令序列號。在命令提示符'<bochs:1>'後面鍵入'help'命令,可以列出調試系統的基本命令。若要了解某個命令的具體使用方法,可以鍵入'help'命令並且後面跟隨一個用單引號括住的具體命令,例如:「help 'vbreak'」,如下面所示。V7
<bochs:1> help@n{L(
help - show list of debugger commands5&6^
help 'command'- show short command description~B
-*- Debugger control -*-e!/;l
help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J
record, playback, load-symbols, slistr2:
-*- Execution control -*-pOHjE
c|cont, s|step|stepi, p|n|next, modebpj
-*- Breakpoint management -*-|EQ
v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI
bpe, bpd, d|del|deleteyR%|
-*- CPU and memory contents -*-xsMy
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, mp_cpu,@|'p
set_cpu, ptime, print-stack, watch, unwatch, ?|calc7
<bochs:2> help 'vbreak'_t*<#o
help vbreak/?
vbreak seg:off - set a virtual address instruction breakpoint0
<bochs:3>flx+
為了讓Bochs直接模擬執行到Linux的引導啟動程序開始處,我們可以先使用斷點命令在0x7c00處設置一個斷點,然後讓系統連續運行到0x7c00處停下來。執行的命令序列如下:.Xfk
<bochs:3> vbreak 0x0000:0x7c00hDzuWy
<bochs:4> cfMH/'X
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&
Next at t=4409138<-0m5
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0 ; b8c007b 03*
<bochs:5>3R28Q
此時,CPU執行到boot.s程序開始處的第1條指令處,Bochs主窗口將顯示出「Boot From floppy...」等一些信息。現在,我們可以利用單步執行命令's'或'n'(不跟蹤進入子程序)來跟蹤調試程序了。在調試時可以使用Bochs的斷點設置命令、反匯編命令、信息顯示命令等來輔助我們的調試操作。下面是一些常用命令的示例:J'P
<bochs:8> u /10 # 反匯編從當前地址開始的10條指令。,S/2
00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl
00007c03: ( ): mov ds, ax ; 8ed8)1f*
00007c05: ( ): mov ax, 0x9000 ; b80090WmD1
00007c08: ( ): mov es, ax ; 8ec0(`|
00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1
00007c0d: ( ): sub si, si ; 29f6ze_QZY
00007c0f: ( ): sub di, di ; 29ffZStl
00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF
00007c13: ( ): jmp 9000:0018 ; ea18000090!s?PR9
00007c18: ( ): mov ax, cs ; 8cc8(
<bochs:9> info r # 查看當前CPU寄存器的內容aM>/D
eax 0xaa55 436057a@`_
ecx 0x110001 1114113/$3$K"
edx 0x0 00j3G?
ebx 0x0 0gE
esp 0xfffe 0xfffee7{
ebp 0x0 0x0]*lX
esi 0x0 0m
edi 0xffe4 65508TD}Zo
eip 0x7c00 0x7c00e
eflags 0x282 642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R;%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D*)}n{
⑤ 安卓怎麼運行exe文件
我們知道安卓手機是arm平台,windows是x86平台,指令集完全不同,但在這里要教給大家的是靠軟體模擬一個x86環境,來運行原來只能運行在x86平台的系統,也就是模擬器虛擬機。經過一番嘗試,成功運行起win98、winxp、debian
linux,理論上也能運行其它pc系統。例如win7甚至win8.
在教給大家如何運行windows之前先簡單介紹下bochs。
bochs是一種十分輕便的使用c++編寫的開源ia-32(x86)電腦模擬器,可以運行在最受歡迎的平台上。它模擬英特爾x86
cpu、常見的i/o設備、和定製的bios。目前,bochs可以被編譯模擬386、486、pentium/pentiumii/pentiumiii/pentium4或x86-64位的cpu,包括可選的mmx,ssex和3dnow指令。在bochs模擬環境里能夠運行許多操作系統,比如linux、dos、windows
95/98/nt/2000/xp或者windows
vista。bochs是由凱文·勞頓編寫的,目前由bochs項目組維護。
bochs可以被編譯運用在多種模式下,其中有些仍處於發展中。bochs的典型應用是提供x86
pc的完整模擬,包括x86處理器、硬體設備、和存儲器。這讓您在您的工作站上的模擬器里運行操作系統和軟體,就像你有一台機器內的機器。例如,bochs還將允許您在安裝x11的solaris機上運行windows應用程序。
首先說下需要的東西:
1模擬器主程序(就是一個apk程序文件)
2配置文件(已經打包好在附件里)
3系統鏡像
步驟1:安裝模擬器主程序(這個就不用多說了,和普通安卓應用一樣)
步驟2:將裝有配置文件的sdl文件夾拷貝到機身內存根目錄中(沒有機身內存的手機請拷貝到sd卡中,不清楚拷貝到哪裡的就用re管理器拷貝到手機根目錄顯示sdcard的文件夾里)
步驟3:將系統鏡像文件改名為c.img,拷貝到步驟2中的sdl文件夾(要用什麼系統就拷貝相應的鏡像)
步驟4:運行安裝好的模擬器主程序,沒有問題的話就會開機運行操作系統了
望採納