- 浏览: 263309 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
mmap
可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址
对文件的读写可以直接用指针来作,不需要read/write函数
#include <sys/mman.h>
/*如果addr参数为NULL,内核会在进程地址空间中选择合适的地址建立映射
如果不为空,则指定从什么地址开始映射
len 指定文件的映射长度
off 是指从文件的什么位置开始映射,是页大小的整倍数(32位体系结构通常是4k)
filedes 是文件的描述符
prot 有四种取值:
PROT_EXEC 表示映射的这一段可执行,如映射共享库
PROT_READ 表示映射的这一段可读
PROT_WRITE 表示映射的这一段可写出
PROT_NONE 表示映射的这一段不可访问
flag 的常用的两种取值
MAP_SHARED 多个进程对同一个文件的映射是共享的
MAP_PRIVATE 多个进程对同一个文件的映射是不共享的
*/
/*
如果映射成功则返回首地址
出错返回MAP_FAILED
当进程终止时,映射内存会自动解除,也可以调用munmap解除映射
*/
void *mmap(void *addr,size_t len, int prot,int flag,int filedes,off_t off);
int munmap(void *addr,size_t len);
实例代码:
yuezhenhua@ubuntu:/opt/sdk/tc/mmap$ vi hello
内容为(hello)
yuezhenhua@ubuntu:/opt/sdk/tc/mmap$ od -tx1 -tc hello
0000000 68 65 6c 6c 6f 0a
h e l l o \n
0000006
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(void){
int *p;
int fd=fopen("hello",O_RDWR);
if(fd<0){
perror("open hello");
exit(1);
}
p=mmap(NULL,6,PROT_WRITE,MAP_SHARED,fd,0);
if(p==MAP_FAILED){
perror("mmap");
exit(1);
}
close();
p[0]=0x30313233;
munmap(p,6);
return 0;
}
运行以上程序后再查看文件的内容
od -tx1 -tc hello
0000000 68 65 6c 6c 6f 0a
3 2 1 0 o \n
0000006
示例代码如下:
#include <stdio.h>
int main(void){
printf("hello world\n");
return 0;
}
编译
yuezhenhua@ubuntu:/opt/sdk/tc/mmap$ gcc helloworld.c
跟踪程序执行过程中用到的所有系统调用及返回值:
yuezhenhua@ubuntu:/opt/sdk/tc/mmap$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 45 vars */]) = 0
brk(0) = 0x82b4000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb77fb000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=63389, ...}) = 0
mmap2(NULL, 63389, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb77eb000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/*这个程序要映射共享库/lib/i386-linux-gnu/libc.so.6*/
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"...,
512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0
mmap2(NULL, 1563160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) =
0x4f7000
mmap2(0x66f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,
3, 0x178) = 0x66f000
mmap2(0x672000, 10776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,
-1, 0) = 0x672000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb77ea000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb77ea8d0, limit:1048575,
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0,
useable:1}) = 0
mprotect(0x66f000, 8192, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0x8fb000, 4096, PROT_READ) = 0
munmap(0xb77eb000, 63389) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb77fa000
/*printf函数底层调用的是write*/
write(1, "hello world\n", 12hello world
) = 12
exit_group(0) = ?
发表评论
-
进程控制学习笔记一
2013-01-28 21:10 636进程控制 进程的定义: 进程是一个程序的一次执行的过程,同时也 ... -
文件I/O编程学习笔记三(linux 时间编程)
2013-01-27 17:56 863linux 时间编程 时间类型 coordinated uni ... -
文件I/O编程学习笔记二(c语言库函数访问文件)
2013-01-27 17:29 836c语言库函数访问文件 库函数是独立于操作系统平台,可移植性强 ... -
文件I/O编程学习笔记一(基于linux系统的文件编程)
2013-01-26 19:55 825文件I/O编程 1 基于linux系统的文件编程 创建文件 ... -
基础编程学习笔记一(程序的编译与调试)
2013-01-25 19:40 1040程序的编译与调试 gcc (gnu c compiler) g ... -
基础编程学习笔记二(makefile工程管理)
2013-01-25 20:11 810makefile工程管理 makefile文件描述了整个工 ... -
嵌入式linux应用开发完全手册学习笔记三(windows、linux下工具使用)
2013-01-21 20:45 1384windows\linux环境下相关工具、命令的使用 wind ... -
嵌入式linux应用开发完全手册学习笔记一(嵌入式开发概述)
2013-01-14 20:01 935嵌入式经历了 单片机(SCM)single chip micr ... -
嵌入式linux应用开发完全手册学习笔记二(嵌入式linux开发环境搭建)
2013-01-16 20:55 3242嵌入式linux开发环境搭建 硬件环境构建 ... -
linux下安装无线网卡驱动
2013-01-10 22:17 12601下载并解压 Broadcom 驱动程序的压缩档 2 mkd ... -
shell编程学习笔记二
2013-01-03 18:26 736流程控制 退出状态 有四种退出状态 最后命令退出状态 ... -
shell编程学习笔记三
2013-01-03 21:03 750case 语句 语句格式 case "$vari ... -
linux常用命令
2012-12-31 10:18 678linux常用命令 安中文显示包(server目录) 1 ... -
samba服务器的安装配置
2012-12-31 11:57 775samba服务器 实现文件共享和打印服务共享,类似于wind ... -
nfs服务器安装配置
2012-12-31 12:29 807nfs服务器 netwrok file system 网络文件 ... -
tftp服务器安装与配置
2012-12-31 12:59 1338tftp服务器 trivial file transfer ... -
ssh服务配置
2012-12-31 13:07 836ssh 检查是否安装 [root@localhost Se ... -
linux 系统编程学习笔记四
2012-12-13 21:41 855文件系统 ext2文件系统 分区的格式化工具mkfs 文 ... -
linux 系统编程学习笔记二
2012-12-06 22:15 770lseek 文件在打开时读写位置是0,如果是以O_APP ... -
linux 系统编程学习笔记一
2012-12-05 21:29 798文件与i/o 汇编程序的he ...
相关推荐
GUN/LINUX系统编程学习笔记,分享快乐。
Linux系统编程是一门专注于Linux操作系统上应用程序和工具开发的学科。它包含了广泛的领域,如文件操作、进程管理、内存管理以及网络编程等。开发者在这一领域中,从基础的文件系统交互到复杂的网络通信和多线程编程...
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
Linux Shell编程学习笔记
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭由 `FILE *` 指向的文件...
【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...
Linux是开源的操作系统,它的命令行界面,尤其是Shell编程...因此,无论你是技术小白还是希望进一步提升,这份“Linux零基础学习笔记 Shell编程-菜鸟入门”都会是你宝贵的资源。祝你在学习的道路上越走越远,不断进步!
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...
总的来说,"Linux系统编程及网络编程笔记"会详细解析上述各个方面,包括理论知识、实际示例和最佳实践,旨在帮助学习者深入理解Linux环境下的系统编程和网络编程,为开发高效、安全的系统级应用程序和网络服务打下...
netstat 命令 netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的 选项 我们常用的选项是 -an 用来显示详细的网络...的服务 我们可以调用第四个函数,相反为了得到端口号可以调用第三个函数.
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
Linux操作系统是全球众多程序员...总之,Linux操作系统的学习笔记覆盖了从系统安装到文件管理,从用户权限到进程调度,从设备管理到网络控制等多个层面的知识点,是学习Linux操作系统和提升系统管理能力的重要资源。
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...
本文档主要记录了 Linux 操作系统的学习笔记,涵盖了 Basic 的编程、VI 编辑器的使用、GCC 编译器的应用、GDB 调试工具的使用等方面的知识点。 一、编程基础 * 了解 C 语言的基本语法,例如变量声明、数据类型、...
系统信息与系统资源-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板