//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抠代码-bootsect的更多相关文章

  1. 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码

    从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...

  2. Linux 0.11下信号量的实现和应用

    Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...

  3. Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...

  4. Linux 0.11源码阅读笔记-中断过程

    Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...

  5. Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...

  6. Linux 0.11中write实现

    看了一下Linux 0.11版本号write的实现,首先它在标准头文件unistd.h中有定义 int write(int fildes, const char * buf, off_t count) ...

  7. Linux 0.11源码阅读笔记-总结

    总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...

  8. Linux 0.11源码阅读笔记-块设备驱动程序

    块设备驱动程序 块设备驱动程序负责实现对块设备数据的读写功能.内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据. 块设备的管理 块设备表 内核通过一张 ...

  9. 利用bochs调试Linux 0.11内核

    引导程序调试软件bochs,跟配套的linux0.11内核img下载地址分别是: http://sourceforge.net/projects/bochs/http://www.oldlinux.o ...

随机推荐

  1. 转:前端冷知识(~~some fun , some useful)

    前端不为人知的一面——前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Qu ...

  2. 资源文件(.RES)的应用

    资源档有什麽用处呢?最重要的有两个地方1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动            Resource档的内容,就可以用不同语言的 ...

  3. Java学习之开篇—个人随想

    现在大三上学期了,家里希望考研,不然觉得我这学校不好找工作,我自己觉得工作还是靠自己,学校就像给人第一眼感觉那样,虽然重要但也只会吸引HR多看两眼,真正留得住HR的还是要有拿的出手的技能. 当初凭着对 ...

  4. 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

    鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Fo ...

  5. cocos2dx的runAction: 反复运行,多个动作连接运行,多个动作同一时候运行的实现

    cocos2dx的 runAction,假设某个动作重复运行用cc.RepeatForever:create, 多个动作连接运行用cc.Sequence:create,多个动作同一时候运行用cc.Sp ...

  6. SWIFT学习笔记01

    1.Swift.用来推断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }els ...

  7. Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据

    关于jquery实现动态加入table tr的问题我也不多说了 上面代码非常多地方都有凝视的 关于返回的 编辑后的table 数据 我这里想说的是我直接把他保存成一个连接起来的字符串了 格式 str= ...

  8. ThinkPHP - 关联模型 - 一对多

    使用之前,先引入文件夹,否则相应的功能不能实现. 如果对thinkPHP不精通,使用或开发的时候,最好直接使用完成版本的ThinkPHP. 关系模型定义: <?php /** * 继承自 Rel ...

  9. gmake使用注意

    今天使用gmake把sgml变成html的时候出现了无法找到gmake的困惑(本人linux为ubuntu15.04),上网搜索发现: gmake是GNU Make的缩写.Linux系统环境下的mak ...

  10. grub2的/etc/default/grub文件详解

    # If you change this file, run 'update-grub' afterwards to update# /boot/grub/grub.cfg.GRUB_DEFAULT= ...