2017/5/16 -- 计算机系统基础课堂笔记

1、按下一个键,在屏幕上显示出相应的字符的详细过程。

(只是ASCII字符,暂不考虑中文字符、输入法什么的)
* 键盘上链接着控制芯片,芯片会不停的扫描键盘的电路。当按下一个键时,相应的电路上的电平就会发生改变。
* 再译码(涉及数字电路的译码器啥的),把相应的信号变成相应的编码
* 之后,把这个字符放到键盘缓冲区,并触发中断芯片
* 中断芯片向CPU发出中断信号,CPU根据中断信号,查找相应的中断处理程序(涉及到操作系统中讲到的驱动程序,这里的中断处理程序就是键盘的驱动程序)。
* 执行进程切换,PCB保存现场(寄存器的状态)。
* 加载执行中断处理程序,从键盘缓冲区拿到字符,放到屏幕缓冲区(涉及到王爽汇编中讲到的显存被当成内存管理),并触发屏幕显示的中断请求。
* ……(同上),执行屏幕显示的中断处理程序,在屏幕上显示。

2、 再谈“hello world”程序。

问:在shell命令行中敲入了“$./hello a b c”回车后,计算机到底干了什么?简答起见,hello程序编写成如下形式:
#include 
int main(int argv,char *args){
    printf("hello");
    return 0;
}

答:
* 首先,和上面处理“按键显示”一样,拿到输入的命令。
* 执行系统的shell程序,shell程序是系统级程序。
* shell程序使用系统API,fork()创建一个进程。
* 子进程复制父进程的虚拟内存空间,并且为子进程修改页表。
* 根据命令中程序的名称,加载要执行的程序到子进程中(代码段、数据段、堆栈段分好,把a、b、c参数什么的都放到栈中)。
* shell执行完毕,CPU从内核状态 回到 用户状态,开始执行子进程(可能要考虑考虑什么进程调度)。
* 子进程执行到printf()时,就要进行函数的调用。
* 把现场和返回地址压栈,(PC)转到printf的函数首地址,开始执行函数。
* 这个printf执行过程可能还要进行函数的调用……最后,要进行系统调用,为了显示hello,要把hello放到屏幕显示的缓冲区中。
* 执行屏幕的中断程序(详细过程同上),显示hello。

3、 习题一:将 (7.28125)10 转换成IEEE754格式的32位浮点数二进制形式。

  • 7 -> 111
  • .28125 -> .01001
  • 7.28125 -> 111.01001 -> 1.1101001×22
  • 阶码为移码 E=e+127 ,所以阶码为129 -> 1000 0001
  • 尾数隐藏一位有效位,尾数是0.1101001
  • 符号位为 1
  • 那么结果就是,1 1000 0001 1101 0010 0000 0000 0000 000

4、习题二:
c++语法
union:共同体,共用一块内存。
struct:结构体,内存连续。
动手实验实验。
实验过程:
编写代码:

        ```
        #include 
        using namespace std;
        struct S{
        public:
            char y;
            char z;
        };
        union U{
        public:
            int x;
            S s;
        };
        int main(){
            U *uu = new U();
            uu->s = S();
            uu->x = 6000;//0x1770

            printf("%c\n", uu->s.y);
            printf("%c\n", uu->s.z);
            return 0;
        }
    ```

观察结果:
下断点观察内存

变量的内存地址

int x的内存内容:
2017/5/16 -- 计算机系统基础课堂笔记_第1张图片

char y和char z的内容
2017/5/16 -- 计算机系统基础课堂笔记_第2张图片

结论:union共用了内存、struct的内容是连续的,并且我们可以看到到内存是使用的小端存储形式

5、机器零和数值零:
正型状态没什么好说的。
浮点状态,数值零的机器形式:
1)尾数为零时,无论阶码是什么,计算机都当做零。
2)阶码小于要表示的浮点范围,无论尾数是什么,计算机都当做零。

由此联想,整数范围内不能表示的小数被当做成零时,产生了正下溢;那么,负数范围内不能表示的小数被当成零时,产生了负上溢。
此外,向上超出阶码表示范围的就是正无穷,产生了正上溢;向下超出阶码表示范围的就是负无穷,产生了负下溢。

你可能感兴趣的:(课堂笔记,计算机基础知识)