今天学习了六个知识点总结一下:错误处理、环境变量、内存管理、进程映像、虚拟内存、内存API。
1、错误处理:表示错误的方式有两种:一种是通过函数返回值来表示错误,第二种是通过errno来表示。
函数返回值:
成功的时候可能返回这些:合法值、有效的非空的指针或者0
失败的时候可能返回这些:非法值、空指针(NULL、0xffffffff)或者-1。
有些函数时一直成功的:比如printf。
2、环境变量:环境变量是什么:是表示当前操作系统的资源配置,环境设置等相关信息
环境变量表:是以NULL结尾的字符串数组,起始位置:全局变量environ
环境变量函数:getenv:根据环境变量名,获取环境变量的值
putenv:以name=value格式来设置环境变量
setenv:根据name设置环境变量的值为value
unsetenv:删除环境变量
clearenv:清空环境变量表
3、内存管理:分为用户层和系统层
用户层:首先自动分配/释放内存(智能指针) STL里的 调用了C++中的new/delete(构造/析构)、然后new/delete调用了C的malloc/free、然后malloc/free调用了POSIX标准接口brk/sbrk、然后brk/sbrk调用了Linux系统接口mmap/muunmap、然后mmap/munmap调用了内核接口。
系统层:内核接口kmalloc/vmalloc调用了驱动,然后驱动get_free_page调用了内层汇编指令
一层层的调用
4、进程映像:什么是进程映像:就是进程在内存中的情况
从低地址到高地址依次为
text代码段:存储二进制指令、字面值常量、不可修改、强行修改会产生段错误。
data数据段:存储初始化过的全局变量和静态变量
bss静态数据段:为被初始化的全局变量和静态变量、进程一经加载此区自动清零
heap堆:程序员手动管理,动态分配内存从低地址到高地址扩展、空间大、配合指针使用,但是使用比较麻烦,可能产生内存碎片、内存泄漏。
stack栈:由操作系统管理、存储非静态的局部变量和块变量,包括了函数的返回值和参数,大小有限、不会产生内存碎片和泄露。
环境区和命令行参数:环境变量表和环境变量
5、虚拟内存:虚拟内存就是一个相互独立大小为4G的虚拟地址空间0-3G为用户空间3-4G为内核空间,用户空间的代码不可以直接访问内核空间的代码和数据,但是可以通过系统调用(类似函数调用一样)进入内核态、间接的与内核交换数据。
1、用户程序使用虚拟地址空间中的地址,永远无法直接访问实际的物理内存地址
2、保护操作系统的安全,使用比实际物理内存更大的地址空间
3、由操作系统实现动态维护
4、一个进程对应一个用户空间,进程结束用户空间也会改变
5、每个进程空间都是独立的,不同进程交换虚拟内存地址是毫无意义的
6、对于内存越界访问、或访问到没有物理内存映射的地址会产生段错误
7、虚拟内存到物理内存的映射以页为单位,通过malloc首次申请分配内存、至少分配33页。
6、内存管理API:维护一个指向内存映射的最后一个字节的下一位置的指针
brk/sbrk(权限的分配与释放、映射关系的建立和解除)映射内存/取消映射、分配和释放的是使用权、映射由mmap/munmap完成
mmap/munmap(建立和取消虚拟内存地址和物理内存地址之间的映射)
Linux操作系统从入门到精通(入土)之基础知识
最新推荐文章于 2024-04-28 03:19:33 发布