鱼C论坛

 找回密码
 立即注册
查看: 2684|回复: 4

[学习笔记] 和CPU说话02

[复制链接]
发表于 2017-7-1 14:12:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
背上行囊又出发。
对windows的不满其实还是羡慕嫉妒恨。
windows那么厉害,却不教我,日她。
今天还是不写实际的内容,主要目的还是搭建自己的学习框架,明确一下学习的目的方向什么的。
万一要做的事情很傻逼,大神见了稍微指点一下,能节省很多时间呢。

听说linux是开放的系统,可是我还是不知道该怎么学,我不想学怎么去操作这个系统,
更想学的是这个系统是怎么建立起来的,或者说他的源代码到底是怎样的。
例如,linux的前身Minix,这个说是开放源代码的操作系统,(打断一下)
        **这个笔记任务还真不错,刚写到这里,就又找到点新东西学了———— Minix
        **这东西baidu能搜到,不过初步看一下就被打脸了。看不懂
        **粘贴一下我看到的东西:
  1. File: Page: 1 include/ansi.h

  2. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3.                                       include/ansi.h
  4. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  5. 00000        /* The <ansi.h> header attempts to decide whether the compiler has enough
  6. 00001         * conformance to Standard C for Minix to take advantage of.  If so, the
  7. 00002         * symbol _ANSI is defined (as 31459).  Otherwise _ANSI is not defined
  8. 00003         * here, but it may be defined by applications that want to bend the rules.
  9. 00004         * The magic number in the definition is to inhibit unnecessary bending
  10. 00005         * of the rules.  (For consistency with the new '#ifdef _ANSI" tests in
  11. 00006         * the headers, _ANSI should really be defined as nothing, but that would
  12. 00007         * break many library routines that use "#if _ANSI".)
  13. 00008       
  14. 00009         * If _ANSI ends up being defined, a macro
  15. 00010         *
  16. 00011         *      _PROTOTYPE(function, params)
  17. 00012         *
  18. 00013         * is defined.  This macro expands in different ways, generating either
  19. 00014         * ANSI Standard C prototypes or old-style K&R (Kernighan & Ritchie)
  20. 00015         * prototypes, as needed.  Finally, some programs use _CONST, _VOIDSTAR etc
  21. 00016         * in such a way that they are portable over both ANSI and K&R compilers.
  22. 00017         * The appropriate macros are defined here.
  23. 00018         */
  24. 00019       
  25. 00020        #ifndef _ANSI_H
  26. 00021        #define _ANSI_H
  27. 00022       
  28. 00023        #if __STDC__ == 1
  29. 00024        #define _ANSI           31459   /* compiler claims full ANSI conformance */
  30. 00025        #endif
  31. 00026       
  32. 00027        #ifdef __GNUC__
  33. 00028        #define _ANSI           31459   /* gcc conforms enough even in non-ANSI mode */
  34. 00029        #endif
  35. 00030       
  36. 00031        #ifdef _ANSI
  37. 00032       
  38. 00033        /* Keep everything for ANSI prototypes. */
  39. 00034        #define _PROTOTYPE(function, params)    function params
  40. 00035        #define _ARGS(params)                   params
  41. 00036       
  42. 00037        #define _VOIDSTAR       void *
  43. 00038        #define _VOID           void
  44. 00039        #define _CONST          const
  45. 00040        #define _VOLATILE       volatile
  46. 00041        #define _SIZET          size_t
  47. 00042       
  48. 00043        #else
  49. 00044       
  50. 00045        /* Throw away the parameters for K&R prototypes. */
  51. 00046        #define _PROTOTYPE(function, params)    function()
  52. 00047        #define _ARGS(params)                   ()
  53. 00048       
  54. 00049        #define _VOIDSTAR       void *
  55. 00050        #define _VOID           void
复制代码

        **这是一段Minix3 源码,学编程,很讨厌看到的就是这些定义啊宏啊什么的,你定义的是个嘛??
        **其实本人英文水平是学习编程最大的坎,羡慕那些英语母语国家的人。
        **不过关于Minix还是有些其他的资源能学一下。
        算了,jmp 打断前
       
上面说到想学linux(现在是Minix了),其实就是想知道这些“系统”是怎么操作硬件或者说芯片的。

我们面对一台没有任何操作系统的电脑,打开电源,她会寻找启动盘,如果是选择从软盘启动,
她会检查软盘0面0磁道1扇区,如果发现它以0xAA55结束,就会认为它是一个引导扇区。
一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7c00处,CPU就会跳到这里
开始执行。(选摘自《一个操作系统的实现》 于渊)
假如这个软盘的0面0磁道1扇区的代码是我写的,那么可以说我现在已经完全控制了这台电脑了。
那么问题来了,我能拿她干嘛呢???
这就是我要学习的东西,我能拿她干嘛呢???

我想要做很多很多,可是首先要了解我能干嘛。
就目前已有的装备和技能(汇编入门、C入门),这些好像仅能利用BIOS中断做一些事情嘛,
而且BIOS中断到底是什么还不了解,百度一下BIOS的源代码,几乎找不到有用的东西。
BIOS的源代码是能直接控制硬件的代码,我目前想要的就是这个。
所以目前能走的有三跳路:
        1 学习《一个操作系统的实现》
        学习这个的过程出现了一点问题,作者直接讲到了从实模式跳到保护模式,从这里开始的话,
        我发现弄不懂的东西太多了,有点学不下去,还是想在实模式这个最基本的空间里混混,毕竟
        这里只有总共1M的内存内容,我想弄明白点再继续。
       
        2 因为实模式的1M内存里就包含了BIOS中断例程,我正在试着把它反汇编,好弄懂BIOS中断例程
        是如何控制硬件的。这个工作正在进行中。
       
        3 直接学习硬件的相关知识,这条路好像不错,可是暂时还没找到学习的方法,多希望有个好老师能请教啊。
        跪求有用不?

2017.7.1

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-1 17:55:55 | 显示全部楼层
看了楼主的 学习笔记 深有感触啊 !写的很好 。楼主说想学习硬件 我可以给你大概缕一下学习硬件的思路。确实学习硬件就是学习  电子 这门技术 首先你需要学习模拟电路 和数字电路 这类书籍有很多 可以上网查一下相关书籍   等这两门学精通了以后 楼主就可以进军  单片机了    单片机就是一个微型的计算机 虽然小了些但是  电脑有的东西它全都有   楼主有C语言的基础 相信单片机编程肯定没什么问题  学会了单片机楼主自然就知道了  计算机的内部功能结构 和一些 什么时钟啊  定时器啊  堆栈啊 指针啊  什么的 楼主学习过 汇编想必  堆栈  指针 都听过 但是 不一定能真的理解 到底是什么 怎么执行的 在硬件上能反映出什么   所以 强烈建议楼主学习一下 以上我介绍的学习硬件的 路径    那就是    先学习  模拟电路  其次 数字电路 最后就是单片机了   希望对楼主有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 21:37:09 | 显示全部楼层
Rat 发表于 2017-7-1 17:55
看了楼主的 学习笔记 深有感触啊 !写的很好 。楼主说想学习硬件 我可以给你大概缕一下学习硬件的思路。确 ...

受教了,非常感谢你的回复~!
我也考虑过学习单片机这条路,就是因为不太了解能学到什么东西,会不会偏移我原本的学习方向,所以没有动手。
看了你的话,我就去试试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 22:30:19 | 显示全部楼层
Rat 发表于 2017-7-1 17:55
看了楼主的 学习笔记 深有感触啊 !写的很好 。楼主说想学习硬件 我可以给你大概缕一下学习硬件的思路。确 ...

还想追问一下,学完单片机后能解决下面的一个问题没:

  1. org 07c00h        ;

  2.         mov ax,cs                        ;显示问候
  3.         mov es,ax
  4.         mov ax,BootMessage
  5.         mov bp,ax
  6.         mov cx,6
  7.         mov dx,0
  8.         call showgreen       
  9.         mov ax,8000h
  10.         mov ss,ax
  11.         mov sp,0ffffh

  12.         mov ch,00000000b        ;设置光标形状
  13.         mov cl,00010000b
  14.         mov ah,01h                        ;中断入口
  15.         int 10h
  16.        
  17.         call loadf
  18.         jmp $

  19. loadf:                                        ;读取软盘1至7e00 可软盘内容是复制到了7e0a 前10个位置留空了,为什么?
  20.         push es
  21.         mov ax,07e0h
  22.         mov es,ax
  23.         mov bp,0h
  24.         mov ah,2                        ;int13 入口参数
  25.         mov al,18                        ;读取两个扇区
  26.         mov cx,0001h                ;从第一扇区开始
  27.         mov dx,0001h                ;1号驱动器(0~80为软驱
  28.         int 13h
  29.         pop es
  30.         ret
  31. showgreen:                                ;以绿色显示指定位置的字符串,需要设置es,bp,cx,dx
  32.         mov ax,01301h
  33.         mov bx,00001010b
  34.         int 10h
  35.         ret
  36. BootMessage:        db "Hello!"                                ; 6byte
  37. times 510-($-$)        db 0
  38. dw 0xaa55
复制代码


思路:

1        电脑启动后,会进入实模式,从0000:0000处创建中断向量表;
2        BIOS中断程序被加载到了内存中;
3        CPU跳至0000:7c00处执行引导程序。

        因此,我用汇编写好引导程序,加入写软盘功能,将0000:0000~FFFF:FFFF的内存全部写入到软盘,然后利用反汇编工具对其反汇编以得到BIOS中断程序的汇编代码。
        
        
行动步骤:

1        用虚拟机(VirtualBox)创建一台电脑;
2        虚拟两个软驱;
3        在linux下利用nasm编译引导程序(boot),生成.bin文件,然后使用linux的dd命令(如dd if=boot.bin of=boot.img)将其虚拟成软盘镜像。
4        继续使用dd命令创建一个空白软盘镜像(dd if=/dev/zero of=blank.img bs=1474560 count=1)。bs的作用是限制大小,1474560=1.44m软盘(不知道对不对)
5        分别将两个镜像装进软驱,从0号软盘启动虚拟电脑。出现问候后按回车执行写软盘程序。
6        将0000:0000~FFFF:FFFF的内存全部写入到1号软盘。

问题是:
读软盘的程序有问题,本想把软盘内容读到0000:7e00处,可直接将es=0000h,bx=7e00h的话程序会卡死,将es=07e0h,bp=0的话可以读,但是读到的内存位置变成了07e0:000a,为什么会出现这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-4 05:56:32 | 显示全部楼层
bin2yx 发表于 2017-7-3 22:30
还想追问一下,学完单片机后能解决下面的一个问题没:

这个我还真没细研究过 不过按照理论上的东西可以的 但是  实际操作起来 会有各种各样的问题 所以 没研究过 不敢给出什么结论  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 15:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表