语言这个东西,看不出人的差别,你说你会,别人花上几个月,也就会了,主要看出差别的是:操作系统,的理解。
《程序员的自我修养》1,2,3,4,6,10
《深入理解计算机系统》5,6,7,8,9
现代操作系统/操作系统设计与精髓原理pdf
虚拟内存 进程管理以及通信 网络 虚拟文件系统
程序的运行要加载到内存里面。程序从内存中取东西比从磁盘上取东西要快得多。
cpu 内存 I/O:操作系统为了屏蔽底层硬件的差异,
I/O:VFS
内存+I/O:虚拟内存
CPU+内存+I/O:进程
CPU是用来运算数据的,ALU算术逻辑单元数据宽度,数据总线的条数。
程序都是运行在虚拟内存上的。
虚拟内存是IBM提出的。虚拟内存不存在,虚拟地址空间
数据总线的位数决定了cpu的寻址能力。
每一个程序运行起来,操作系统都会给它分配一个4G的内存空间。
局部变量不是数据,是指令。
当不带参数时,程序会带上一个默认的参数,就是当前程序的绝对路径。
libc.so c动态库
libc++.so c++动态库
汇编两种:inter:*86 Linux:AT&T汇编。
objdump可以查看二进制可重定位目标文件:objdump -h main.o
.c表示c源文件,用c编译器编译。
初始化了的就是强符号、未初始化的时弱符号。
弱符号给程序带来的不可预知的结果。
当出现同名符号:会用强符号去替代弱符号,当弱符号占用内存比强符号大时,弱符号替代强符号。
静态函数和静态变量,链接时只对所有全局符号进行处理,静态的本地符号,连接器不做任何处理。
在编译目标文件时,所有的数据符号都用0地址表示。函数地址用与下一条指令的偏移地址表示。
cpu运行那一条指令,由PC寄存器决定。
可执行文件要按页合并(4K)
许多目标文件合并时,所有相同属性的段组织到一个页面上。(按属性合并,不是按名字),调整段偏移地址和段的长度,合并符号表,进行符号解析,给符号分配内存空间,
手动链接两个目标文件,ld mian.o sun.o -o run
objdump -h run查看
程序的运行:进程
./a.out
1.创建虚拟地址空间到物理内存的映射(创建内核地址映射结构体),创建页目录和页表。
2.加载代码段和数据段
3.把可执行文件的入口地址写到cpu的pc寄存器中。
objdump -h a.out
readelf -S run 把段全部打印出来。
可执行文件是以页面组织的。
readelf -l run 查看内存页。
不表文件不能执行的原因:没有program head 没有load装载指令。
可执行文件本身的存储还是按照段存储的,加载的时候有两个load指令。
2:14:39
/*****************2018.07.26*****************/
从C语言过来就是一个不断深入的过程。
《算法导论》没看过3、4遍不能算是理解。
将磁盘页往内存上加载的时候,加载到虚拟地址空间中。