虚拟地址空间由硬盘提供, 映射到实际内存, 代表内存可用的最大数据量, 实际使用以内存实际占用量为准.
动态库存放在虚拟地址空间的共享库段, 其位置无关(PIC)指哪里空闲加载到哪里(使用相对地址). 静态库每次运行都存放在代码段的同一位置, 使用绝对地址, 位置相关.
全局变量未初始化时为0, 局部变量未初始化时为随机值
栈向下生长, 堆向上增长.
ELF(可执行程序部分)大体分为4段: .bss和.data分别是未初始化和已初始化的全局变量/静态局部变量, 可读写, 统称为全局数据区. .rodata(只读数据段)和.text(代码段)一般是只读, 该部分还包括符号段. 这四段可以被放在一个页中, 大小4k.
使用fopen创建的FILE*对象结构体中存在的文件描述符(FD)就放在PCB中.
一个进程最多打开1024-3个文件. 012为标准输入输出和错误, 1号标准输出就是作为fd输出到屏幕上, 如write(1, buf, sizeof(buf))
. 012对应的是同一个文件/dev/tty, 只是输出不同. tty是虚拟终端, 由linux多用户共享.
标准C库函数(getc, putc)自带一个缓冲区, 每次读满了才执行一次写操作, 其内部调用的仍是系统层的read和write, 所以速度要比每个字节都调用一次系统的read和write要快.
用户态进入内核态
通过软中断(产生0x80编程异常)的方式, 查询中断向量表, 然后通过system_call()函数查询系统调用表. 系统调用函数的参数保存在寄存器中.
线程共享和独享
线程共享进程地址空间, 代码段, data段, 文件描述符
线程独享栈, 寄存器, 程序计数器, 线程的信号屏蔽字(阻塞信号集)
网友评论