开始

作者: Elijah_cs | 来源:发表于2019-07-03 20:41 被阅读0次

    本科学了四年计算机,感觉懵懵懂懂,c语言,数据结构,计算机组成原理等课程似懂非懂,东西可以做出来但是都感觉是七拼八凑的,感觉没有融合在一起成为一个体系,故想看看深入理解计算机系统,希望现在不会太晚。

    从hello.c开始

    一个程序例如printf("hello world!")是以ASCII标准来存储的,例如h对应104,则用一个8bit的信息来表示h,每个bit由0,1组成,则这个文本实际上也是一串字节序列来储存在文件的,每行都有"\n"来结束的。


    hello.c

    实际上,系统的所有信息,都是由一串比特表示的,区分不同数据对象的唯一方法是读到这些数据对象时的上下文,在不同的上下文中,一个同样的字节序列可能表示一个整数,浮点数或者机器指令。
    hello.c是高级语言,为了能运行它,每条c语句必须转化为一系列的低级机器语言指令,然后这些指令按照一种称之为可执行目标程序的格式打包好并存放在磁盘上,目标程序也是可执行程序
    Linux上: gcc -o hello hello.c
    过程如下:


    compiler.PNG

    运行hello程序

    键盘输入./hello后,程序将字符逐一读入到寄存器,再放入内存中,
    也可以通过DMA技术直接将数据从磁盘拷贝到内存。
    一旦目标文件hello的代码加载到内存,处理器就执行该程序的main程序的机器语言指令这个指令将“hello ,wordld\n:从朱唇中复制到寄存器,再从寄存器中复制到显示设备,最后显示在屏幕上。

    运行机制相关

    hello程序是放在一个操作系统去执行的,操作系统是一个控制硬件并向应用程序提供接口以使得它们对硬件进行操作。想hello这样的程序在操作系统上运行时,操作系统会提供一个假象,就好像系统只在运行这个程序,实际上,并不是这样的,它是作为一个进程在运行。进程时操作系统对正在运行程序的一个抽象,在一个系统可以同时的运行多个进程,即并发执行,一个进程的指令和另一个进程的指令时交错执行的CPU会切换进程,称之为上下文切换。操作系统需要保持跟踪进程运行所需要的状态信息,即上下文。
    在这个hello的运行中,有两个进程:shell和hello进程,开始只有shell,当输入./hello按下回车后,shell通过一个专门的函数,即系统调用来执行请求,系统会将控制权交给操作系统,操作系统保存shell进程的上下文,创建有个新的hello进程以及其上下文,并将控制权交给hello程序,hello进程终止后,操作系统回复shell进程的上下文,并将控制权交还给他,hello执行完毕。

    很重要的知识点-虚拟内存

    虚拟内存是一个抽象的概念,他为每个进程提供了有个假象,即每个进程都在独占地使用主存,每个进程看到的内存是一样的,如图:


    virtual memory
    • 程序代码和数据:所有的代码时从同一个位置固定的,紧接着是和C全局变量相对应的数据为准,代码和数据区时直接按照可执行文件的内容初始化的。
    • 堆 代码和数据区是固定的大小,当调用malloc等函数是,堆可以在运行的时候动态的扩张和收缩
    • 共享库: 记下来是存放C标准库和数学库这样的共享库的代码和数据的区域。
      *栈: 位于用户虚拟地址的顶部是用户栈,编译器用它来实现函数调用,用户栈在程序执行期间可以动态的阔炸和收缩,
    • 内核虚拟内存: 地址的顶部空间是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核定义的函数。

    位运算

    • 对于一个数a,有a^a = 0 ,利用这个性质我们可以得到一些有趣的东西>
    void swap(int *x,int *y)
    {
        *x = *x ^ *y;
      *y = *x ^ *y;
    *x = *x ^ *y;
    }
    
    • 移位运算:x<<k代表向左移动k位,x>>k代表右移运算,不过机器支持两种有意运算:逻辑右移和算术右移,逻辑右移的结果是在左端补k个0,算术右移的结果是在左端补k个符号位。Cy语言标准没有定义有符号数的右移,所以可能会碰到可移植性的问题,但是,实际上,几乎所有的编译器都会对有符号数使用算术右移,另一方面,对于无符号数,右移必须是逻辑右移。
      注意,移位运算符的优先级很低,甚至低于加减,所以尽量打上括号
    • 在强制类型转换的时候,机器是按照位的层级来考虑的,二进制表示不变,但是转换后数值可能发生改变。例如:
    short int v= -12345;
    unsigned short uv = (unsigned short) v;
    uv = 53191   
    

    相关文章

      网友评论

        本文标题:开始

        本文链接:https://www.haomeiwen.com/subject/cithhctx.html