Linux操作系统从入门到精通(入土)之基础知识

今天学习了六个知识点总结一下:错误处理、环境变量、内存管理、进程映像、虚拟内存、内存API。
	1、错误处理:表示错误的方式有两种:一种是通过函数返回值来表示错误,第二种是通过errno来表示。
		函数返回值: 
				成功的时候可能返回这些:合法值、有效的非空的指针或者0
				失败的时候可能返回这些:非法值、空指针(NULL0xffffffff)或者-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(建立和取消虚拟内存地址和物理内存地址之间的映射)

你可能感兴趣的:(笔记,C/C++,linux,内核,操作系统)