中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網站建設學習心得愛站網seo

網站建設學習心得,愛站網seo,專業(yè),給別人做網站打電話推銷這里在實驗之前需要下載 Bochs-win32-2.6.11 作者使用的是Linux版本的,在Linux寫代碼不太舒服,所以最好在Windows上做實驗,下載好虛擬機以后還需要下載Nasm匯編器,以及GCC編譯器,為了能夠使用DD命令實現磁盤拷貝&#…

這里在實驗之前需要下載 Bochs-win32-2.6.11 作者使用的是Linux版本的,在Linux寫代碼不太舒服,所以最好在Windows上做實驗,下載好虛擬機以后還需要下載Nasm匯編器,以及GCC編譯器,為了能夠使用DD命令實現磁盤拷貝,這里你可以安裝windows 10 下面的子系統(tǒng)Ubuntu,需要使用命令時可以直接切換。

**注釋:**該系列筆記是在學習《操作系統(tǒng)真相還原》時通過閱讀后簡化并適當描述整理的學習筆記,首先,致敬作者鄭剛博士,在讀本書時能深刻的感覺到作者寫書時一絲不茍的態(tài)度,書很厚寫的,講解細致幽默,很能讓人愿意繼續(xù)讀下去,同時也不得不佩服作者計算機底層功力的深厚,轉載本文請一并附帶鄭剛版權信息。

BIOS 軟件接力第一棒

BIOS 基本輸入輸出系統(tǒng),BIOS代碼所做的工作是一成不變的,所以他是被固化到ROM中的一塊只讀區(qū)域中,在開機時此ROM會被映射到低端1MB內存的頂部,原因是系統(tǒng)在開啟時默認是實地址模式(該模式最大尋址范圍0-fffff),所以其尋址范圍也就被限制在了0xF0000-x0xFFFFF區(qū)域中,這64KB的內存就是BIOS的執(zhí)行代碼.

在開機的一瞬間,CPU的CS:IP寄存器會被強制初始化為0xF000:0xFFF0,在實地址模式下該地址需要乘以16也就是左移四位加上偏移地址得到,于是0xF000:0xFFF0就等效于0xFFFF0此處的地址距離0xFFFFF只有16個字節(jié)的空間,里面存放著一條jmp far f000:e05b = fe05b的匯編指令,該指令將跳轉到真正的BIOS開始的位置.

接著BIOS將會通過自身的代碼對硬件進行自檢測,在初始化硬件后,則開始向內存0x000-0x3ff中初始化數據結構以及拷貝中斷向量表,緊接著BIOS將會通過調用int 19h中斷,此中斷用以檢測計算機中的硬盤,如果檢測到0盤0道1扇區(qū)末尾的兩個字節(jié)是0x55,0xaa則認為此扇區(qū)確實存在,于是就會將此區(qū)域中的內容,加載到內存7c00的位置,并通過一條jmp far 0:0x7c00h的指令跳轉到該位置執(zhí)行,這樣BIOS就將CPU控制權交給了MBR了,而BIOS將會再次睡去.

MBR 收到跳轉來源,繼續(xù)執(zhí)行。

此處的7c000就是MBR代碼的開始位置,之所以是7C00是因為,DOS中要求最小內存是32KB,而MBR大小必須是512字節(jié)(1KB),所以選擇32kB中的最后1KB的位置最為合適,32KB(0x8000)-1KB(0x400)=>0x7c00,這就是7C00的由來,同時還需要保證第510-511字節(jié)必須為0x55,0xaa才可以.

保存以下匯編代碼,并使用 nasm -o mbr.bin mbr.asm編譯簡易版MBR文件.

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,Messagemov bp,ax         ; 保存字符串地址mov cx,15         ; 保存字符串長度mov ax,01301h     ; 子功能號13是顯示字符及屬性mov bx,000ch      ; 頁號位0,使用黑色為背景色,紅色為字體顏色mov dl,0int 10h           ; 10h中斷,用來顯示字符retMessage: db "hello lyshark !"
times 510-($-$$) db 0  ; 填充510字節(jié)為0
db 0x55,0xaa           ; mbr的結束標志

進入Bochs目錄下執(zhí)行bximage.exe生成一個映像文件,默認是a.img,你可以改名為其他的,這里我定義為linux.img

并將編譯好的mbr.bin寫入到鏡像中

dd if=mbr.bin of=linux.img bs=512 count=1 conv=notrunc

在Bochs目錄下新建并編輯bosh.src保存,然后執(zhí)行bochs.exe -f bosh.src模擬執(zhí)行MBR代碼.

megs:32
romimage:file=$BXSHARE/BIOS-bochs-latest
vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
floppya:1_44=linux.img,status=inserted
boot:floppy
log:bochsout.txt
mouse:enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-de.map

上方屏幕會比較混亂,這里我們先來進行清屏操作,清屏中斷調用也是int10

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov ax,Messagemov bp,ax         ; 保存字符串地址mov cx,15         ; 保存字符串長度mov ax,01301h     ; 子功能號13是顯示字符及屬性mov bx,000ch      ; 頁號位0,使用黑色為背景色,紅色為字體顏色mov dl,0int 10h           ; 調用10h號中斷,用來顯示字符retMessage: db "hello lyshark !"
times 510-($-$$) db 0  ; 填充510字節(jié)為0
db 0x55,0xaa           ; mbr的結束標志

執(zhí)行結果,如下,但是,打印字符串,在底部,因為光標在底部。

設置光標到頂部,這里百度一下光標中斷,發(fā)現了。

接著改進代碼

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號mov dl,0x0        ; 設置光標行號mov bh,0x0        ; 頁碼int 0x10mov ax,Messagemov bp,ax         ; 保存字符串地址mov cx,15         ; 保存字符串長度mov ax,01301h     ; 子功能號13是顯示字符及屬性mov bx,000ch      ; 頁號位0,使用黑色為背景色,紅色為字體顏色mov dl,0int 10h           ; 調用10h號中斷,用來顯示字符retMessage: db "hello lyshark !"
times 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志

完美結果。

mbr.asm

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號mov dl,0x0        ; 設置光標行號mov bh,0x0        ; 頁碼int 0x10mov ax,Messagemov bp,ax         ; 保存字符串地址mov cx,15         ; 保存字符串長度mov ax,01301h     ; 子功能號13是顯示字符及屬性mov bx,000ch      ; 頁號位0,使用黑色為背景色,紅色為字體顏色mov dl,0int 10h           ; 調用10h號中斷,用來顯示字符hltretMessage: db "hello lyshark !"
times 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志

mbr.src

megs:32
romimage:file=./BIOS-bochs-latest
vgaromimage:file=./VGABIOS-lgpl-latest
boot:disk
mouse:enabled=0
ata0-master: type=disk, path="linux.img", mode=flat, status=inserted
keyboard: keymap=./x11-pc-de.map

填充數據

dd if=mbr.bin of=linux.img bs=512 count=1 conv=notrunc
dd if=/dev/zero of=linux.img seek=1 bs=512 count=2879

運行

bochsdbg -q -f mbr.src
vb sp:0x7c00
c

讓我們對顯卡說點什么?

上面我們通過調用BIOS提供的int 0x10中斷來實現打印字符操作,但我們在后期必須要借助顯卡來輸出圖像,而顯卡是外部設備,必須通過總線來操作。

由于CPU使用的信號是TTL電平,而外部設備都是機械設備,故他們不會使用該電平驅動,這就導致CPU與硬件設備沒有辦法實現溝通,硬件工程師們提供的方法是,在這兩者之間架起一座橋,也就是在CPU和外設之間加上一層IO接口,該接口的作用就是實現CPU和外設之間相互做協調轉換。

其次外部設備的種類也是多種多樣的,其輸出的信號可能是數字信號,也可能是模擬信號,而我們的CPU只能處理數字信號,數字信號需要經過數模轉換器<D/A>成模擬量才能送到外設來驅動硬件工作,模擬量也同樣需要經過模數轉換器<A/D>轉換成數字量才能被CPU直接處理,所以接口電路中需要包括A/D轉換器和D/A轉換器。

轉換后的數字信號,會經過總線進行傳遞,總線的別名是BUS,之所以叫做BUS是因為其是公共線路,所有硬件設備都會走此線路,但同一時刻,CPU只能和一個IO接口(寄存器/端口)通信,當有多個IO接口同時想和CPU通信時,那么IO仲裁模塊會對其進行競爭與選優(yōu),仲裁模塊固化到,輸入輸出控制中心(ICH)也就是南橋芯片上的。

多數情況下,南橋和北橋是成對出現的,南橋主要負責連接PCI,PCI-Express,AGP等低速設備,而北橋則用于鏈接高速設備,如內存等。

IO接口都是串行口,其在設計之初就是負責與CPU進行通信的,我們想要與CPU通信,其實是向這些接口中寫入數據,同時為了區(qū)別CPU中的寄存器,所以把IO接口叫做端口,某些外設可以通過內存映射來訪問,即把某些端口映射到指定內存中,訪問某個內存區(qū)域就相當于訪問了指定的端口。

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov sp,0x7c00mov ax,0xb800mov gs,axmov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號mov dl,0x0        ; 設置光標行號mov bh,0x0        ; 頁碼int 0x10mov byte [gs:0x00],'M'mov byte [gs:0x01],0xa4 ; 顯示A=綠色閃爍 4=紅色mov byte [gs:0x02],'B'mov byte [gs:0x03],0xa5mov byte [gs:0x04],'R'mov byte [gs:0x05],0xa6rettimes 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志

Bochs調試命令基礎

Bochs調試命令常用的有以下幾種.

<bochs:1> vbreak 0x0000:0x7c000      7c000設置斷點
<bochs:1> pb 0x7c000                 設置物理斷點
<bochs:1> vb sp:0x7c00               設置虛擬斷點(保護模式)
<bochs:1> info break                 顯示所有斷點狀態(tài)
<bochs:1> delete num                 刪除一個斷點<bochs:1> c              運行遇到斷點停下
<bochs:1> n              執(zhí)行下一指令
<bochs:1> r              顯示寄存器
<bochs:1> u/10           向下反匯編10條
<bochs:1> print-stack    打印堆棧x /nuf addr 查看一個線性地址的內存
xp /nuf addr 查看一個物理地址的內存n 顯示多少個字節(jié)的內存u 單位長度; one o單位fb 字節(jié)h 半字(2 字節(jié))w 字 (4 字節(jié))g 雙字 (8 字節(jié))F 打印格式:x 打印十六進制d 打印十進制u 打印無符號十進制o 打印八進制t 打印二進制

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處mov ax,csmov sp,0x7c00mov ax,0xb800mov gs,axmov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號mov dl,0x0        ; 設置光標行號mov bh,0x0        ; 頁碼int 0x10mov byte [gs:0x00],'L'mov byte [gs:0x01],0xa4 ; 顯示A=綠色閃爍 4=紅色mov byte [gs:0x02],'y'mov byte [gs:0x03],0xa5mov byte [gs:0x04],'S'mov byte [gs:0x05],0xa6mov byte [gs:0x6],'h'mov byte [gs:0x7],0xa7mov byte[gs:0x8],'a'mov byte [gs:0x9],0xa6mov byte[gs:0xa],'r'mov byte [gs:0xb],0xa5mov byte[gs:0xc],'k'mov byte [gs:0xd],0xa4hltrettimes 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志

循環(huán)顯存

_start:; 清屏和設置光標位置mov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號mov dl,0x0        ; 設置光標行號mov bh,0x0        ; 頁碼int 0x10;初始化數據段,使其指向段基址0X7C0處,即Boot代碼被加載的地方mov		ax, 0x07c0      ; 設置加載基址mov		ds, ax;將文本顯示內存段基址 放在ES中,供后面顯示字符使用mov 	ax, 0xb800      ; 設置顯存地址mov 	es, axmov		cx, msglen        ; 獲取字符串長度mov		si, message       ; 設置字符串基址xor		di, diloop_str:mov al, [si]            ; 每次取出一個字符mov [es:di], al         ; 將字符逐一賦值到顯存中inc siinc dimov byte [es:di], 0x07     ; 設置字體顏色inc diloop loop_strhlt      ; 程序在此處終止message 	db "Loading MBR..."msglen		db $ - messagetimes 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志

Bochs 調試命令

CPU加電后,會跳轉到 0xffff0 處,我們可以反匯編這段內存地址,向下反匯編10條。

分別顯示,CPU模式,中斷,call調用源。

設置vb虛擬地址斷點,pb設置物理地址斷點。blist顯示所有斷點。

bpd禁用斷點,bpe啟用斷點。del刪除斷點。

info idt = 顯示中斷向量表 , gdt 全局描述符表,ldt 局部描述符表,tss 任務狀態(tài)段,ivt 中斷向量表

SECTION MBR vstart=0x7c00     ; 告訴編譯器加載到7c00內存處; 清屏和設置光標位置mov ax,0x600      ; 清屏范圍,也就是寬度mov bx,0x0mov cx,0x0        ; 清屏 左上角(0,0)mov dx,0x184f     ; 清屏 右下角(80=0x4f,25=0x18)int 0x10mov dh,0x0        ; 設置光標列號 左上角(0,0)mov dl,0x0        ; 設置光標行號 右下角(0,0)mov bh,0x0        ; 頁碼int 0x10; 初始化,使SP寄存器指向段基址0X7C0處,GS指向顯存基地址mov ax,csmov sp,0x7c00mov ax,0xb800mov gs,ax              ; 設置顯存地址; 設置字符串長度與字符串基地址mov cx, msglen        ; 獲取字符串長度mov si, message       ; 設置字符串基址xor di, di            ; 每次清空di寄存器loop_str:mov al, [si]            ; 每次取出一個字符mov [gs:di], al         ; 將字符逐一賦值到顯存中inc siinc dimov byte [gs:di], 000ch ; 設置字體顏色inc diloop loop_strhlt      ; 程序在此處終止;message db "Hello LyShark...",0ah,0dh
message db "Hello LyShark..."
msglen  equ $ - messagetimes 510-($-$$) db 0  ; 填充剩余的510字節(jié)的空間為0
db 0x55,0xaa           ; mbr的結束標志
http://m.risenshineclean.com/news/62908.html

相關文章:

  • 做貿易進出口要什么網站平臺網絡銷售好做嗎
  • 怎么申請 免費網站站長工具排行榜
  • 企業(yè)網站建設空間如何免費推廣網站
  • 公司網站 用 個人備案域名藝考培訓學校
  • 購買網站空間的方法南寧seo公司
  • 服務器網站怎么用360渠道推廣系統(tǒng)
  • 做外貿網站要花多少錢怎么制作網頁教程
  • 可以做動效的網站產品網絡營銷策劃方案
  • 51一起做網站0元做游戲代理
  • 做社交網站寧波企業(yè)seo推廣
  • 廈門稅務門戶網站怎么提高關鍵詞搜索排名
  • 嵊州市建設局網站武漢seo優(yōu)化服務
  • 沈陽企業(yè)自助建站系統(tǒng)營銷策略的思路
  • 網站在建設中無法訪問seo站內優(yōu)化教程
  • 搭建英文網站公關公司提供的服務有哪些
  • php網站開發(fā)api投放廣告的網站
  • 做網站怎么選云主機免費制作自己的網頁
  • 網絡公司網站首頁企業(yè)推廣宣傳文案
  • 微信網站建設費用計入什么科目邯鄲網站優(yōu)化
  • wapcms建站系統(tǒng)資源網
  • 做自己的網站能賺錢嗎軟文廣告500字
  • wordpress qq在線聊天搜索引擎優(yōu)化自然排名
  • 網站 多語言廣東新聞今日大件事
  • 怎么做網站添加二維碼網絡軟文寫作
  • 濟南專門做公司網站的公司windows優(yōu)化大師使用方法
  • 長春網站品牌seo培訓咨詢
  • 免費建設網站公司哪家好網站百度收錄
  • 個人網站做博客還是做論壇2023網站seo
  • 深圳網站建設加盟無錫網絡公司
  • 網站建設基地百度推廣員工工資怎么樣