x01.0s.21: print "Loading..."

来源:http://www.cnblogs.com/china_x01/archive/2016/06/30/5628976.html
-Advertisement-
Play Games

先把目標設低點,開機進入後,在屏幕上列印“Loading..."即可。由於要在 bochs 中運行,首先就是安裝 bochs。Oldlinux 中有相關資源,可自行下載。winxp 和 linux 的配置腳本如下: # for windows bochs config megs : 32 romim ...


先把目標設低點,開機進入後,在屏幕上列印“Loading..."即可。由於要在 bochs 中運行,首先就是安裝 bochs。Oldlinux 中有相關資源,可自行下載。winxp 和 linux 的配置腳本如下:

# for windows bochs config

megs : 32

romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

floppya: 1_44="a.img", status=inserted
floppyb: 1_44="b.img", status=inserted
ata0-master: type=disk, path="c.img", cylinders=365, heads=16, spt=63

boot: a

mouse: enabled=0
winxp
# for linux bochs config

display_library : sdl
megs : 32

romimage : file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage : file=/usr/share/vgabios/vgabios.bin

floppya: 1_44="a.img", status=inserted
floppyb: 1_44="b.img", status=inserted
ata0-master: type=disk, path="c.img", cylinders=365, heads=16, spt=63

boot : a

mouse : enabled=0
keyboard_mapping : enabled=1, map=/usr/share/bochs/keymaps/sdl-pc-us.map 
linux

當然,這隻是作為參考。如是 winxp,建議直接在 bochs-sls1.0 中編譯,用 dd 寫入 /dev/fd1, 即 b.img;如是 ubuntu,我使用 eclipse,貪圖智能提示而已,本質並無區別。github 中的代碼為 Ubuntu 系統。由於要求簡單,代碼自然也簡單,分別為 makefile, boot/bootsect.s, tools/build.c 如下:

# makefile

AS86 = as86 -0 -a 
LD86 = ld86 -0

AS = as 
LD = ld 
LDFLAGS = -s -x -M
CC = gcc
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -Iinclude
CPP = gcc -E -nostdinc -Iinclude

ROOT_DEV = /dev/hd1

.c.s:
    $(CC) $(CFLAGS) -S -o $*.s $<
.s.o:
    $(AS) -c -o $*.o $<
.c.o:
    $(CC) $(CFLAGS) -c -o $*.o $<
    
Image: boot/bootsect tools/build
    tools/build boot/bootsect > Image
    sync
    
boot/bootsect: boot/bootsect.s 
    $(AS86) -o boot/bootsect.o boot/bootsect.s 
    $(LD86) -o boot/bootsect boot/bootsect.o
    
tools/build: tools/build.c
    gcc -o tools/build tools/build.c
makefile
! boot/bootsect.s

.text

entry start
start:
    mov ax, #0x07c0
    mov ds, ax
    mov es, ax 
    mov ss, ax 
    mov sp, #0xff00
    
    mov cx, #18
    mov bx, #0x000c
    mov bp, #msg
    mov ax, #0x1301
    int 0x10 
    
die:
    jmp die 
    
msg:
    .byte 13,10,13,10
    .ascii "Loading..."
    .byte 13,10,13,10
    
    .org 510
    .word 0xaa55
    
boot/bootsect.s
/*
 * tools/build.c 
 */
 
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/fs.h>
#include <unistd.h>
#include <fcntl.h>

#define MINIX_HEADER        32
#define GCC_HEADER            1024
#define SYS_SIZE            0x2000
#define DEFAULT_MAJOR_ROOT    3 
#define DEFAULT_MINOR_ROOT    1 
#define SETUP_SECTS            4

void die(char* str)
{
    fprintf(stderr, "%s\n", str);
    exit(1);
}

int main(int argc, char** argv)
{
    int i, id, c;
    char buf[1024];
    char major_root, minor_root;
    
    if (argc == 5) {
    } else {
        major_root = DEFAULT_MAJOR_ROOT;
        minor_root = DEFAULT_MINOR_ROOT;
    }
    fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
    for (i = 0; i < sizeof buf; i++)
        buf[i] = 0;
        
    if ((id = open(argv[1], O_RDONLY, 0)) < 0)
        die("Unable open bootsect");
    if (read(id, buf, MINIX_HEADER) != MINIX_HEADER)
        die("Unable read Minix header");
    i = read(id, buf, sizeof buf);
    fprintf(stderr, "bootsect is %d bytes.\n", i);
    buf[508] = (char)major_root;
    buf[509] = (char)minor_root;
    if ((*(unsigned short*)(buf + 510)) != 0xaa55)
        die("boot hasn't '0xaa55' flag.");
    i = write(1, buf, 512);
    if (i != 512)
        die("write call failed.");
    close(id);
    
    return 0;
}
tools/build.c

效果圖如下:

        

源代碼:https://github.com/chinax01/Lab

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。 1.TIM1 CH1輸出PWM配置步驟 ①開啟TIM1時鐘,配置PA8為復用輸出 APB2外設時鐘使能寄存器(RCC_APB2ENR) APB1外設複位寄存器 ...
  • 1.什麼是kqueue和IO復用 kueue是在UNIX上比較高效的IO復用技術。 所謂的IO復用,就是同時等待多個文件描述符就緒,以系統調用的形式提供。如果所有文件描述符都沒有就緒的話,該系統調用阻塞,否則調用返回,允許用戶進行後續的操作。 常見的IO復用技術有select, poll, epol ...
  • 前幾天剛好同事問起在Cortex M上延時不准的問題,在網上也沒找到比較滿意的答案,乾脆自己對這個問題做一個總結。 根據我們的經驗,最容易想到的大概通過計算指令周期來解決。該思路在Cortex上並不是很適用:一方面MCU從Flash取指是有延時的,另一方面Cortex的指令集不是固定周期的,特別從M ...
  • 簡介: 1、在 Keepalived 集群中,其實並沒有嚴格意思上的主、備節點,雖然可以在 keepalived.conf 中定義 state 選項為 MASTER 狀態,但是這並不意味著此節點就一直是 MASTER 角色。控制節點角色的是 keepalived.conf 中的 priority 值 ...
  • 簡介: Keepalived 是一個基於 VRRP 協議來實現 WEB 服務高可用的解決方案,用來避免單點故障。主伺服器會發送特定的消息給備份伺服器,當備份伺服器收不到這個消息時,即主伺服器宕機的時候,備份伺服器就會接管虛擬 IP ,繼續提供服務,從而保證高可用性。 下載地址:http://www. ...
  • 簡介: Grub 常見的兩種故障:Grub.conf 文件丟失、MBR 損壞 ( 不管恢復怎麼樣,還是先備份好吧 ) 一、Grub.conf 文件丟失 ## 故障現象如下: ## 就這個樣子,無法登陸系統,下麵是解決方法 ## 0, 1, 2 代表分區編號,上面顯示有文件系統,分區類型,像 83 就 ...
  • 簡介: Extundelete 數據恢復 救命的稻草!當你在運維過程中不小心誤刪除數據時,就會用到數據恢復工具,( 都是淚,不多說了 )。 常見的開源數據恢復工具有,debugfs、R-Linux、ext3grep、extundelete 等。 ext3grep 跟 extundelete 比較常用 ...
  • 一般來講,對非法地址的訪問會導致應用程式收到由系統發送的sigsegv信號,預設情況下,函數對於這個信號的處理是退出。 但是為了方便調試,我們可以自己設置處理函數,使用signal函數。 這裡比較重要的一點是,按照流程,cpu取完一條指令時,pc會指向下一條指令,那麼如果我們指定函數對sigsegv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...