Linux 下的几个函数的基本了解

在对 Android 系统源码的学习过程中,总是会不可避免的查看 Linux 层的实现,那么此时总会碰到关键性的函数操作,而理解这些函数对要分析的功能模块是不可缺少的。本文为 Android 系统中常见的 Linux 函数,主要描述其作用,帮助理解。

mmap

一种内存映射文件的方法

函数原型:

1
2
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* start,size_t length);

具体描述:

  • mmap 将一个文件或者其他对象映射到内存。

  • mmap 在用户空间映射调用系统中作用很大。

  • mmap() 必须以 PAGE_SIZE 为单位进行映射,在内存也只能以页为单位进行映射。

  • mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

  • mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

  • 在内核中分配一块内存,用于存储数据。

ioctl 函数

ioctl是 设备驱动程序 中对 设备的I/O通道 进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:

1
int ioctl(int fd, ind cmd, …);

其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。

ioctl 函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对 ioctl 的支持,用户就可以在用户程序中使用 ioctl 函数来控制设备的I/O通道。