Windows下编写主引导程序到系统内核
Windows下编写主引导程序、系统内核程序都比在linux平台下麻烦得多。这里给一个例子:
K_CODE_SEG = 3000h K_CODE_OFFSET = 0000h _text segment org 7c00h _start: ; es, user data segment mov dx, K_CODE_SEG mov es, dx mov ah, 02h ;mov dl, 81h ; drive 0 驱动器 00H~7FH:软盘;80H~0FFH:硬盘 mov dl, 00h ;mov dl, 0 mov dh, 0 ; head 0 磁头 mov ch, 0 ; track 柱面 mov cl, 2 ; sector 扇区,读取第2个扇区 mov al, 10 ; 指定要读取的扇区数 mov bx, 0 ; 将指定扇区读到es:bx位置 int 13h jnc read_sector_ok read_sector_error: mov si, m_read_sector_error p1: mov al, [si] add si, 1 cmp al, 00h je endl mov ah, 0eh mov bx, 0fh int 10h jmp p1 read_sector_ok: mov si, m_read_sector_ok p0: mov al, [si] add si, 1 cmp al, 00h je jmp_to mov ah, 0eh mov bx, 0fh int 10h jmp p0 jmp_to: mov bx, 8 mov ax, es:[bx] mov dx, 16 mul dx mov cl, 4 shr ax, cl add ax, word ptr offset_segment_jmp_to + 2 mov word ptr offset_segment_jmp_to + 2, ax ; jmp 3000h:0h ;db 0eah ; jmp far ;dw K_CODE_OFFSET ; offset ;dw K_CODE_SEG ; segment: K_CODE_SEG = 3000h ; jmp 3000h:0h ;db 0eah ; jmp far ;dw K_CODE_OFFSET, K_CODE_SEG ; offset, segment. segment: K_CODE_SEG = 3000h ; jmp 3000h:0h offset_segment_jmp_to: dw K_CODE_OFFSET, K_CODE_SEG mov ax, cs cmp ax, K_CODE_SEG jz _1 jmp dword ptr offset_segment_jmp_to _1: jmp dword ptr offset_segment_jmp_to - 7c00h endl: hlt jmp endl m_read_sector_ok: db 0ah, 0ah db "[ook] read sector", 0dh, 0ah db 0ah, 0ah db 00h m_read_sector_error: db 0ah, 0ah db "[err] read sector", 0dh, 0ah db 0ah, 0ah db 00h ; MBR扇区位于整个硬盘的第一个扇区. ; 硬盘扇区为512字节,所以主引导程序大小仅能也只能512字节。 db 510-($-seg _start) dup(0) ; MBR结束标志 db 85, 170 ; 0x55, 0xaa _text ends end _start
.MODEL SMALL, C extrn test_09h:near _DATA SEGMENT MESSAGE1 DB '[1] HELLO, INT 21H->09H!', 0DH, 0AH, '$' _DATA ENDS _TEXT SEGMENT ASSUME CS:_TEXT, DS:_DATA ;ORG 1000H MAIN PROC NEAR _START: ; DS = DS + CS MOV AX, _DATA MOV DX, CS ADD AX, DX MOV DS, AX MOV SI, OFFSET MESSAGE1 PRINT_MESSAGE: MOV AL, [SI] CMP AL, '$' JE ENDL MOV AH, 0EH MOV BX, 0FH INT 10H INC SI JMP PRINT_MESSAGE ;MOV DX, OFFSET MESSAGE1 ; 字符串首偏移地址放到DX中 ;MOV AH, 9 ;INT 21H ; 输出字符串 ENDL: CALL test_09h ;EXIT: ; MOV AH, 4CH ; INT 21H EXIT: HLT JMP EXIT MAIN ENDP _TEXT ENDS END MAIN
char message[] = "Hello, MASM!\r\n$"; void test_09h() { _asm mov si, offset message; loop: _asm mov al, [si]; _asm cmp al, '$'; _asm je ret; _asm mov ah, 0eh; _asm mov bx, 0fh; _asm int 10h; _asm inc si; _asm jmp loop; ret: }
相关推荐
在Windows操作系统中,引导程序的过程相对复杂,涉及到多个阶段和组件。本资源包含的是基本操作系统的引导程序源码,对于理解Windows启动流程以及进行系统级编程有着极高的学习价值。 引导程序通常分为MBR(主引导...
除此之外,你还会接触到系统调用接口,这是用户模式程序与内核交互的主要途径。学习如何使用系统调用调试工具(如kd、windbg)来分析系统行为,排查问题,是提升内核级调试技能的重要环节。 总之,《Windows内核...
本书全面解析了Windows内核的工作机制,涵盖了从系统启动、进程管理、线程调度、内存管理到设备驱动等多个核心领域,是IT从业者深入了解操作系统底层运行机制的重要参考资料。 在Windows内核中,系统启动是一个至关...
在Windows操作系统环境中,驱动程序是连接...总的来说,"Windows驱动程序编写指南"将引导读者深入了解驱动程序的工作原理,学习如何为USB和打印机设备编写高效、稳定的驱动程序,从而更好地利用Windows平台的硬件资源。
在Windows系统中,内核开发涉及到驱动程序编写、系统服务实现以及系统稳定性与性能优化。KmdKit提供了必要的工具和文档,使得开发者能够直接在内核层面上进行编程。 **汇编语言**是计算机科学的基础,特别是对于低...
Grub4dos是一款基于GRUB(Grand Unified Bootloader)的引导管理器,它允许用户在不修改MBR(主引导记录)的情况下,通过Windows系统引导其他操作系统,包括Linux。Grub4dos不仅易于使用,而且功能强大,支持命令行...
1. 观察并记录Windows系统从按下电源开关到操作系统完全启动的整个过程,分析其启动机制。 2. 编写并运行一个简单的C语言程序,包含主程序和被调用程序,以实践计算机处理用户程序的步骤。 实验步骤: 1. Windows...
在这部分的学习过程中,读者将了解到如何编写内核模式的驱动程序,掌握中断处理、系统调用、线程管理和内存管理等关键主题。这不仅能够帮助读者对操作系统的工作机制有一个更为全面的认识,还将在系统优化和调试方面...
当用户将Windows 98光盘放入光驱,电脑读取win98.bif文件后,会依据其中的指令进行一系列操作,如检测硬件、加载驱动程序、初始化操作系统内核等。win98.bif的灵活性使得它可以适应不同的硬件配置,无论是简体中文版...
1. 内核初始化:这是Linux启动的第一步,包括加载引导程序、解压内核镜像、设置内存管理、初始化中断处理等。通过注释,读者可以了解到系统如何从零开始构建整个运行环境。 2. 进程管理:内核如何创建、调度、终止...
4. **内核模式与用户模式**:在Windows系统中,内核模式拥有最高的权限,可以直接访问硬件资源,而用户模式下的应用程序则受到更多的限制,以保护系统的稳定性。在64位内核编程中,理解这两种模式之间的交互至关重要...
9. **系统初始化**:这部分源代码描述了操作系统启动过程,包括硬件检测、初始化引导加载器、加载内核、启动第一个进程等步骤。 10. **并发与同步**:在多处理器环境下,内核需要有效地管理和同步资源。这部分源...
从上到下,书中揭示了Windows的网络栈,包括映射、API、名称解析和协议驱动程序,这对于网络编程和网络安全分析尤其重要。 8. 诊断引导问题和执行崩溃分析。引导问题是操作系统启动时可能遇到的麻烦之一,而系统...
本书详细讲解了从最基础的汇编语言到复杂的Windows操作系统内核的整个学习过程,不仅包含了理论知识,还提供了大量实践案例,帮助读者在实践中加深理解。 汇编语言作为最接近硬件的编程语言,对于初学者而言可能稍...
5. **安装内核**:将编译好的内核文件和模块复制到系统目录,并更新引导加载器配置,如GRUB。 6. **重启系统**:通过引导加载器加载新的内核,完成内核重载。 在提供的文件列表中,我们看到了以下几个文件: - **...
- Windows启动过程:了解Windows如何加载引导扇区、内核、驱动程序和服务,这对于编写启动时运行的程序或系统服务至关重要。 - 进程和线程创建:学习如何使用vc++创建进程和线程,以及如何控制它们的执行顺序和...
这是一个汇编语言编写的启动程序,通常由引导加载器(bootloader)加载。在启动过程中,硬件的基本初始化已经由bootloader完成,如关闭看门狗定时器,设置PLL(锁相环)等。`startup.s`的主要任务是调用`KernelStart...
- **测试驱动程序**:在升级前,先在测试环境中验证新内核下的驱动程序是否正常工作。 - **了解内核选项**:配置内核时,理解每个选项的作用以避免不必要的功能开启,节省系统资源。 - **监控日志**:升级后密切关注...
在IT领域,引导程序是操作系统启动过程中的关键组件,它负责加载操作系统内核到内存中并启动执行。这里我们关注的是“Mbldr”引导程序,一个用于实现多重引导的工具,允许用户在一台计算机上安装和切换多个操作系统...