bin2yx 发表于 2017-7-1 14:12:11

和CPU说话02

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

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

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                    include/ansi.h
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

00000        /* The <ansi.h> header attempts to decide whether the compiler has enough
00001       * conformance to Standard C for Minix to take advantage of.If so, the
00002       * symbol _ANSI is defined (as 31459).Otherwise _ANSI is not defined
00003       * here, but it may be defined by applications that want to bend the rules.
00004       * The magic number in the definition is to inhibit unnecessary bending
00005       * of the rules.(For consistency with the new '#ifdef _ANSI" tests in
00006       * the headers, _ANSI should really be defined as nothing, but that would
00007       * break many library routines that use "#if _ANSI".)
00008       
00009       * If _ANSI ends up being defined, a macro
00010       *
00011       *      _PROTOTYPE(function, params)
00012       *
00013       * is defined.This macro expands in different ways, generating either
00014       * ANSI Standard C prototypes or old-style K&R (Kernighan & Ritchie)
00015       * prototypes, as needed.Finally, some programs use _CONST, _VOIDSTAR etc
00016       * in such a way that they are portable over both ANSI and K&R compilers.
00017       * The appropriate macros are defined here.
00018       */
00019       
00020        #ifndef _ANSI_H
00021        #define _ANSI_H
00022       
00023        #if __STDC__ == 1
00024        #define _ANSI         31459   /* compiler claims full ANSI conformance */
00025        #endif
00026       
00027        #ifdef __GNUC__
00028        #define _ANSI         31459   /* gcc conforms enough even in non-ANSI mode */
00029        #endif
00030       
00031        #ifdef _ANSI
00032       
00033        /* Keep everything for ANSI prototypes. */
00034        #define _PROTOTYPE(function, params)    function params
00035        #define _ARGS(params)                   params
00036       
00037        #define _VOIDSTAR       void *
00038        #define _VOID         void
00039        #define _CONST          const
00040        #define _VOLATILE       volatile
00041        #define _SIZET          size_t
00042       
00043        #else
00044       
00045        /* Throw away the parameters for K&R prototypes. */
00046        #define _PROTOTYPE(function, params)    function()
00047        #define _ARGS(params)                   ()
00048       
00049        #define _VOIDSTAR       void *
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

Rat 发表于 2017-7-1 17:55:55

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

bin2yx 发表于 2017-7-3 21:37:09

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

受教了,非常感谢你的回复~!
我也考虑过学习单片机这条路,就是因为不太了解能学到什么东西,会不会偏移我原本的学习方向,所以没有动手。
看了你的话,我就去试试吧{:10_270:}

bin2yx 发表于 2017-7-3 22:30:19

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

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

org 07c00h        ;

        mov ax,cs                        ;显示问候
        mov es,ax
        mov ax,BootMessage
        mov bp,ax
        mov cx,6
        mov dx,0
        call showgreen       
        mov ax,8000h
        mov ss,ax
        mov sp,0ffffh

        mov ch,00000000b        ;设置光标形状
        mov cl,00010000b
        mov ah,01h                        ;中断入口
        int 10h
       
        call loadf
      jmp $

loadf:                                        ;读取软盘1至7e00 可软盘内容是复制到了7e0a 前10个位置留空了,为什么?
        push es
        mov ax,07e0h
        mov es,ax
        mov bp,0h
        mov ah,2                        ;int13 入口参数
        mov al,18                        ;读取两个扇区
        mov cx,0001h                ;从第一扇区开始
        mov dx,0001h                ;1号驱动器(0~80为软驱
        int 13h
        pop es
        ret
showgreen:                                ;以绿色显示指定位置的字符串,需要设置es,bp,cx,dx
        mov ax,01301h
        mov bx,00001010b
        int 10h
        ret
BootMessage:        db "Hello!"                                ; 6byte
times 510-($-$)        db 0
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,为什么会出现这个问题

Rat 发表于 2017-7-4 05:56:32

bin2yx 发表于 2017-7-3 22:30
还想追问一下,学完单片机后能解决下面的一个问题没:




这个我还真没细研究过 不过按照理论上的东西可以的 但是实际操作起来 会有各种各样的问题 所以 没研究过 不敢给出什么结论
页: [1]
查看完整版本: 和CPU说话02