`
jishublog
  • 浏览: 872754 次
文章分类
社区版块
存档分类
最新评论

linux-0.11抠代码-bootsect

 
阅读更多
//bootfun.s
.global asm_message
.global asm_memmove
.global asm_readsector
.global asm_checkLBA
.code16

//extern void asm_memmove(void* src,void* des,int icount);
asm_memmove:
#源地址 ds:si 目的地址 es:di
	pushw %bp
	movw %sp,%bp
	#movw 6(%bp),%ax 第1个参数
	#movw 10(%bp),%bx 第2个参数
	#movw 14(%bp),%cx 第3个参数
1:
	movl 6(%bp),%eax
	movw %ax,%si
	movw $0,%ax
	movb $4,%cl
	shr %cl,%eax
	movw %ax,%ds
2:	
	movl 10(%bp),%eax
	movw %ax,%di
	movw $0,%ax
	movb $4,%cl
	shr %cl,%eax
	movw %ax,%es	
	movl 14(%bp),%ecx
	rep movsb
	
	movw	%bp,%sp
	popw	%bp
	ret
	
asm_checkLBA:
	movb $0x41,%ah
	movw $0x55aa,%bx
	int $0x13
	lahf 
	and $0x01,%ah
	xor $0x01,%ah
	ret
	
asm_message:
	pushl %ebp
	movl %esp,%ebp
	movl 8(%ebp),%eax
	movw %ax,%si
1:
	lodsb
	cmpb $0,%al
	je 1f
	movw $1,%bx
	movb $0xe,%ah
	int $0x10
	jmp 1b
1:
	movl	%ebp,%esp
	popl	%ebp
	ret
	
	
	#extern void asm_readsector(void* des,int driver ,int head,int track,int sector,int iCount);	
	;// 以下10行的用途是利用BIOS中断INT 13h将setup模块从磁盘第2个扇区
	;// 开始读到90200h开始处,共读4个扇区。如果读出错,则复位驱动器,并
	;// 重试,没有退路。
	;// INT 13h 的使用方法如下:
	;// ah = 02h - 读磁盘扇区到内存;al = 需要读出的扇区数量;
	;// ch = 磁道(柱面)号的低8位;  cl = 开始扇区(0-5位),磁道号高2位(6-7);
	;// dh = 磁头号;				  dl = 驱动器号(如果是硬盘则要置为7);
	;// es:bx ->指向数据缓冲区;  如果出错则CF标志置位。 
asm_readsector:
	pushw %bp
	movw %sp,%bp
1:
	movl 6(%bp),%eax
	movw %ax,%bx
	movb $4,%cl
	movw $0, %ax
	shr %cl,%eax
	movw %ax,%es
	
	movb	14(%bp),%dh			;// drive 0, head 0
	movb	10(%bp),%dl			
	
	movb	18(%bp),%ch			;// sector 2, track 0
	movb	22(%bp),%cl
	
	movb $0x02,%ah
	movb 26(%bp),%al
	
	int $0x13
	jnc 1f
	movw $0,%dx
	movw $0,%ax
	int $0x13
	jmp	1b
1:	
	movw	%bp,%sp
	popw	%bp
	ret
	
//main.c
__asm__(".code16gcc\n");
//0x7c00 
extern void asm_checkLBA();
extern int asm_message (char * str);//申明汇编函数
extern void asm_memmove(void* src,void* des,int icount);
extern void asm_readsector(void* des,int driver ,int head,int track,int sector,int iCount);
extern unsigned short asm_readDisksectors(int driver);


void entry(void)
{
	__asm__("movw $0x9000,%bx");
	__asm__("movw %bx,%ss");
	__asm__("movw $0xFF00,%bx");
	__asm__("movw %bx,%sp");
	asm_checkLBA();
	asm_message("Loading YoungOS......................");
	asm_readsector((void*)0x80200,0x80,0,0,2,4);
	
		
	__asm__("movw $0x8000,%bx");
	__asm__("movw %bx,%ds");
	__asm__("jmp $0x8000,$0x200");
}

linux.0.11 抠代码心得,实现多任务输出,这篇只是刚刚开始,只是说了引导部分~~~~~~~~还有后续心得~~~~~
代码阅读工具:scitools understand(用了这个感觉 source insight 是浮云,个人感觉,别喷)
代码编译工:起初是vmware+ubuntu,后来才知道可以直接用cygwin
自己用VS2010写的二进制写磁盘工具,bintool.exe 源文件,目标文件,目标文件偏移 (原来 linux dd命令就可以实现了,windows 有merge ,dd for windows)

虚拟机:bochs vmware

调试部分 gdb+vmware,bochs,其中gdb+vmware可以直接进行源码级调试,具体方法可以另外咨询我



先介绍几个命令

gcc -c -g -nostdinc -fno-leading-underscore -fno-builtin -fno-stack-protector

-g 保留调试信息,供gdb调试使用

-c 编译目标文件
-fno-builtin 不用自带的c/c++库函数
-fno-stack-protector 禁用堆栈保护

-fno-leading-underscore 函数导出不加下划线 ,当你申明一个test函数,导出会成_test


简化代码,把用汇编实现的都写成功能代码函数,然后供.c文件调用,知识点就是c语言和汇编互相调用



gcc -c -g -nostdinc -fno-leading-underscore -fno-builtin -fno-stack-protector main.c bootfun.s

ld --entry=entry -Ttext=0x7c00 -o ./out/boot.elf main.o bootfun.o -M >system.map //生成elf文件,此时elf带gdb调试信息 注意不要加-s,-s会删除调试信息

objcopy -I elf32-i386 -O binary ./out/boot.elf ./out/boot.bin //将elf转化成无格式的bin文件

windows 下 Bintool.exe boot.bin xxxx.img 0x000 (xxxx.img 为虚拟机的硬盘文件)// 注意 不要忘记 偏移510 511 写成55AA,我是用ultraedit写的,不然无法引导


源代码调试方法,gdb boot.elf 进入gdb命令符,然后target remote localhost:8832 这里要成功,自己网上搜一下 这么用gdb+vmware调试内核


代码部分

主要是

	asm_message("Loading YoungOS......................");
	asm_readsector((void*)0x80200,0x80,0,0,2,4);
	
		
	__asm__("movw $0x8000,%bx");
	__asm__("movw %bx,%ds");
	__asm__("jmp $0x8000,$0x200");
这几句,其他应该没用,当初测试没删掉

从磁盘2号扇区连续读4个扇区内容到0x80200处,跳转到0x80200



走过,路过,有手的捧个手场,不是撸,只要给个评论,给个赐教!!!!!!!!!!

分享到:
评论

相关推荐

    linux-0.11源代码,修改后便于使用GDB调试

    在网络上下载到linux-0.11的源代码后,首先是不断地除错,最终使其能在ubuntu12.04上编译通过,并能用bochs仿真。后来发现bochs仿真bootsect.s不方便,就改用qemu仿真了。

    linux-0.11中保护模式建立过程的分析

    linux-0.11是Linus写的比较老的一个linux版本,该版本的linux利用了很多80x86的特性,特别...所以我从我学习的角度并结合linux-0.11的三个文件bootsect.s、setup.s和head.s来说说80x86实模式和保护模式的一下工作细节。

    linux-0.11硬盘集成盘14年1月9日by chenghao0511

    linux-0.11硬盘集成盘14年1月9日by chenghao0511 2014年1月9日 by chenghao0511@gmail.com 制作方法:把bootsect 替换 原来的 make dd bs=8192 if=Image of=/dev/hd5 c h s 60 16 63 之后需要更改img的分区表,...

    Linux-0.11 [内核源代码带中文注释]

    在bootsect 程序块后紧根着加载setup 模块的代码数据。 ! 注意es 已经设置好了。(在移动代码时es 已经指向目的段地址处0x9000)。 load_setup: ! 68--77 行的用途是利用BIOS 中断INT 0x13 将setup 模块从磁盘第2 ...

    linux-0.11:这个repo用来分析linux 0.11源码及整个现代多任务操作系统实现原理

    linux-0.11 这个repo用来分析linux 0.11源码及整个现代多任务操作系统实现原理 BOIS加载磁盘第一常数bootsect.s bootsect.s加载设置程序 设置程序加载系统模块 系统模块包含head和main模块,扩展到main函数执行 ...

    带中文注释的 linux 0.11 源代码

    .....\....\bootsect.s .....\....\head.s .....\....\setup.s .....\fs .....\..\bitmap.c .....\..\block_dev.c .....\..\buffer.c .....\..\char_dev.c .....\..\exec.c .....\..\fcntl.c .....\..\...

    Linux0.11内核初始化讲解与调试

    结合bochs仿真调试工具边讲解边调试linux0.11版本内核初始化过程,通过该课程可以学习和理解关于linux内核在内存中的分布、分段及分页机制、逻辑地址线性地址及物理地址的区别,更系统的理解CPU实模式及保护模式等。...

    linux内核 0.11版本源码 带中文注释

    │ bootsect.s │ head.s │ setup.s │ ├─fs │ bitmap.c │ block_dev.c │ buffer.c │ char_dev.c │ exec.c │ fcntl.c │ file_dev.c │ file_table.c │ inode.c │ ioctl.c │ Makefile │ namei.c │ ...

    windows上可编译Linux内核

    代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释. 5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.在Link的过程中,init目录下的main.c会...

    windows下可编译linux 用insight+bochs源码级调试

    代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释. 5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.在Link的过程中,init目录下的main.c会...

    os.rar_11 S

    操作系统的boot代码有很多,并且大部分是相似的。本实验仿照Linux-0.11/boot目录下的bootsect.s和setup.s,以剪裁它们为主线

    linux 0.11 内核

    linux 0.11 内核 boot 文件:bootsect.s head.s bootsect.s

    linux0.11内核体系结构boot

    linux0.11内核体系结构boot

    BOOTSECT-GUI

    BOOTSECT-GUI就是一个BOOTSECT的图形界面的小软件。

    Linux开机过程的分析(关于bootsect.S).txt

    Linux开机过程的分析(关于bootsect.S).txt

    BootSect GUI

    Windows 7/Vista BOOTSect application to fix boot sector problem GUI

    Imagex-bootsect,vista/win7硬盘安装必备工具

    当安装备份vista/win7时可以采用微软自带的封装工具。安装.wim的系统时,先用imagex解压到目的盘,再通过bootsect修改目的盘的引导扇区,即可实现硬盘安装。懂得人都知道

    Linux内核从原理到代码详解

    Linux内核代码详解,。早期的Linux内核引导代码只有bootsect.s、setup.s、head.s这3个文件,这三个文件都是Linus在1991年左右亲手写的。后来的代码虽然进行了加固,但是原型还是这几个。

    引导程序的设计以及进程环境的建立.rar_boot16_bootsect.bin_nasm_nasm-0.98_引导程序

    源代码文件:BOOTSECT.ASM 编译方法 nasm bootsect.asm -o bootsect.bin 2、WRBOOT.COM 功能:将BOOTSECT.BIN 写到软盘的引导扇区 源代码文件:WRBOOT.ASM 编译方法 nasm wrboot.asm -o wrboot.com 使用方法:将...

    Linux0.11内核之Boot那些事

    详细介绍linux0.11版本内核boot目录下的三个启动文件:bootsect.s、setup.s和head.s。

Global site tag (gtag.js) - Google Analytics