https://www.cnblogs.com/changefuture/archive/2011/12/22/2297716.html https://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html
struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。 在使用这个结构体和方法时,需要引入: <sys/types.h> <sys/stat.h> stat,lstat,fstat1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。函数原型#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);提供文件名字,获取文件对应属性。
int fstat(int filedes, struct stat *buf);通过文件描述符获取文件对应的属性。
int lstat(const char *restrict pathname, struct stat *restrict buf);连接文件描述命,获取文件属性。2 文件对应的属性
struct stat { mode_t st_mode; //文件对应的模式,文件,目录等 ino_t st_ino; //inode节点号 dev_t st_dev; //设备号码 dev_t st_rdev; //特殊设备号码 nlink_t st_nlink; //文件的连接数 uid_t st_uid; //文件所有者 gid_t st_gid; //文件所有者对应的组 off_t st_size; //普通文件,对应的文件字节数 time_t st_atime; //文件最后被访问的时间 time_t st_mtime; //文件内容最后被修改的时间 time_t st_ctime; //文件状态改变时间 blksize_t st_blksize; //文件内容对应的块大小 blkcnt_t st_blocks; //文件内容对应的块数量 };size_t是标准C库中定义的,应为unsigned int。 ssize_t:ssize_t是signed size_t 定义为typedef int ssize_t。 而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。 size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。
https://blog.csdn.net/linux_loajie/article/details/43916677
https://www.jianshu.com/p/755338d11865 https://baike.baidu.com/item/mmap/1322217 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。 头文件 <sys/mman.h> 函数原型 void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void* start,size_t length);
参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。
len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。
prot 参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。
flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。
offset参数一般设为0,表示从文件头开始映射。 参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。 函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。
https://cloud.tencent.com/developer/article/1543163 https://blog.csdn.net/xiaohuima_dong/article/details/44657917
/dev/mem是linux下的一个字符设备,源文件是~/drivers/char/mem.c,这个设备文件是专 门用来读写物理地址用的。里面的内容是所有物理内存的地址以及内容信息。通常只有root用户对其有读写权限。
简单来讲,/dev/mem是系统物理内存的映像文件,这里的 “物理内存” 需要进一步解释。
物理内存是指我们插在内存槽上的内存条吗?当然是,但物理内存不单单指内存条。
物理内存严格来讲应该是指 物理地址空间 ,内存条只是映射到这个地址空间的一部分,其余的还有各种PCI设备,IO端口等。
[root@localhost mem]# cat /proc/iomem 00000000-00000fff : reserved 00001000-0009fbff : System RAM 0009fc00-0009ffff : reserved 000c0000-000c7fff : Video ROM 000e2000-000ef3ff : Adapter ROM 000f0000-000fffff : reserved 000f0000-000fffff : System ROM 00100000-31ffffff : System RAM 01000000-01649aba : Kernel code 01649abb-01a74b7f : Kernel data 01c13000-01f30fff : Kernel bss 32000000-33ffffff : RAM buffer 3fff0000-3fffffff : ACPI Tables e0000000-e0ffffff : 0000:00:02.0 e0000000-e0ffffff : vesafb f0000000-f001ffff : 0000:00:03.0 f0000000-f001ffff : e1000 ... ...其中,只有RAM才是指内存条。关于物理地址空间的详细情况,请参考E820相关的资料。 明白了物理内存的构成之后,我们来看看/dev/mem里有什么。事实上,它就是一个活着的Linux系统实时映像,所有的进程taskstruct结构体,sock结构体,skbuff结构体,进程数据等等都在里面的某个位置: tu /dev/mem是一个动态的内存映像
/dev/mem是整个系统内存映像时,我们就知道整个系统的所有数据结构都在里面可以被找到,当然也包括进程链表
