linux内存管理 (五) 7 用户空间 内核中内存相关的系统调用

应用程序如何对内存进行操作

1个应用程序占有3G(0-3G)的内存空间,那么该应用程序如何修改这0-3G内存中的数据呢?

在 应用程序执行main函数前,0-3G的内存空间已经被内核修改了一些了,包括以下段的建立
	text data (libraries ld.so) heap stack
main函数调用之后,可以修改0-3G中的哪些空间呢?
	data 中 数据的值 , 主要是修改全局变量的值
	heap 中 数据的值 , 主要是 malloc 和 free ,mmap,以及修改malloc申请/mmap映射的内存中的数据.
	stack 中 数据的值 , 主要是函数调用压栈,局部变量压栈,函数返回弹栈

修改这些空间需要内核帮助吗?
	修改data中数据的值 不需要内核的帮助
	修改stack中数据的值 不需要内核的帮助
	修改heap中数据的值 需要内核的帮助(内核通过系统调用提供这些帮助)	

内核提供的 内存相关的系统调用有哪些

也就是 SYSCALL_DEFINE 定义了 哪些内存相关的系统调用
应用程序对内核的需求不外乎 申请内存,释放内存
grep SYSCALL_DEFINE mm/* -nr 可以搜到很多 定义, 这些就是内核空间提供给用户空间
linux-3.0.1]$ grep SYSCALL_DEFINE mm/* -nr
mm/fadvise.c:27:SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice)
mm/fadvise.c:147:SYSCALL_DEFINE(fadvise64)(int fd, loff_t offset, size_t len, int advice)
mm/filemap.c:1493:SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
mm/fremap.c:123:SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
mm/madvise.c:345:SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
mm/mempolicy.c:1240:SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
mm/mempolicy.c:1262:SYSCALL_DEFINE3(set_mempolicy, int, mode, unsigned long __user *, nmask,
mm/mempolicy.c:1281:SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
mm/mempolicy.c:1368:SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
mm/migrate.c:1281:SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
mm/mincore.c:263:SYSCALL_DEFINE3(mincore, unsigned long, start, size_t, len,
mm/mlock.c:473:SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
mm/mlock.c:503:SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
mm/mlock.c:540:SYSCALL_DEFINE1(mlockall, int, flags)
mm/mlock.c:572:SYSCALL_DEFINE0(munlockall)
mm/mmap.c:251:SYSCALL_DEFINE1(brk, unsigned long, brk)
mm/mmap.c:1088:SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
mm/mmap.c:1139:SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg)
mm/mmap.c:2112:SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
mm/mprotect.c:232:SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
mm/mremap.c:517:SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
mm/msync.c:31:SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
mm/nommu.c:485:SYSCALL_DEFINE1(brk, unsigned long, brk)
mm/nommu.c:1474:SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
mm/nommu.c:1510:SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg)
mm/nommu.c:1711:SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
mm/nommu.c:1798:SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
mm/swapfile.c:1551:SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
mm/swapfile.c:2017:SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
这么多系统调用,都是为应用程序服务的,
那么 都是做什么的呢?

brk	改变数据段空间的分配
sbrk	参见brk
mlock	内存页面加锁
munlock	内存页面解锁
mlockall	调用进程所有内存页面加锁
munlockall	调用进程所有内存页面解锁
mmap	映射虚拟内存页
munmap	去除内存页映射
mremap	重新映射虚拟内存地址
msync	将映射内存中的数据写回磁盘
mprotect	设置内存映像保护
getpagesize	获取页面大小
sync	将内存缓冲区数据写回硬盘
cacheflush	将指定缓冲区中的内容写回磁盘

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/111666285