免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香
打印 上一主题 下一主题

linux内存管理讨论——欢迎大家围观! [复制链接]

论坛徽章:
0
61 [报告]
发表于 2012-04-03 20:17 |只看该作者
传份我写的灯片给大家 参考下,有任何问题可以+ q 752070534 交流

ARM_Linux_Course_17_Kernel_Memory_Management.PDF

496.02 KB, 下载次数: 122

论坛徽章:
0
62 [报告]
发表于 2012-04-04 08:33 来自手机 |只看该作者
问个问题, Linux驱动模块是不是运行在 核心空间?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
63 [报告]
发表于 2012-04-04 11:23 |只看该作者
回复 62# titer1
问个问题, Linux驱动模块是不是运行在 核心空间?

是的。
   

论坛徽章:
0
64 [报告]
发表于 2012-04-04 17:49 |只看该作者
本帖最后由 titer1 于 2012-04-04 17:56 编辑

谢谢版主热心解答。
不过我在看 moniskiller 的pdf看见:



上图来源
ARM_Linux_Course_17_Kernel_Memory_Management.PDF


那么 同时请教下,瀚海书香 和 moniskiller,图中

    TASK_SIZE 到  PAGE_0FFSET -1 区域是 Kernel module space ,这里应该是个bug吧。请确认?
顺便补充我的想法,我觉得应该那个区间是动态共享库的位置

至于这个空间分布,我觉得arm .x86应该是一致的哈。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
65 [报告]
发表于 2012-04-04 20:30 |只看该作者
回复 64# titer1
TASK_SIZE 到  PAGE_0FFSET -1 区域是 Kernel module space ,这里应该是个bug吧。请确认?
顺便补充我的想法,我觉得应该那个区间是动态共享库的位置

对应arm架构来说就是这样的,这块空间按Document的描述来说,的确是用于kernel module的

在x86下,#define TASK_SIZE PAGE_OFFSET
在arm下,#defeine TASK_SIZE (UL(CONFIG_PAGE_OFFSET) - UL(0x1000000))

论坛徽章:
0
66 [报告]
发表于 2012-04-04 20:31 |只看该作者
本帖最后由 titer1 于 2012-04-04 20:31 编辑

再谈自己 关于 进程 线程 与内存的一些关系:

1.不同进程虚存空间是独立的,唯一例外的就是: share memory 是可以共享的。
2.用户线程共享 进程的 用户空间,但是核心空间 堆栈是各自独立的
3. 核心线程只拥有内核堆栈,没有用户空间说法。

论坛徽章:
0
67 [报告]
发表于 2012-04-04 21:09 |只看该作者
本帖最后由 ljzbq123 于 2012-04-04 21:12 编辑

在arm系统中,modules是放置在3G-16M~3G之间,如下linux 2.6.35的定义。

Memory.h (kernel\arch\arm\include\asm)       
#define TASK_SIZE                (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))

#define MODULES_VADDR                (PAGE_OFFSET - 16*1024*1024)

另外本人研究linux内存管理也有一段时间了,对active_list和inactive_list还有些问题没有完全弄清楚,哪位大侠可以讲讲active_list和inactive_list具体是怎么产生的?目前对 active_list和inactive_list的一些理解如下:
1. 这2个list只针对可以回收的内存。
  1)文件读写操作过程中用于缓冲数据的页面
  2)用户地址空间中用于文件内存映射的页面
  3)匿名页面:进程用户模式下的堆栈或者是使用 mmap 匿名映射的内存区
  4)特殊的用于 slab 分配器的缓存,比如用于缓存文件目录结构 dentry 的 cache,以及用于缓存索引节点 inode 的 cache)
2. 只针对应用进程,内核内存不涉及到这两个list。
3. active_list和inactive_list和buffer、cache的关系。buffer+cache作为最大可使用“准空闲”内存,而inactive_list也具有这种可转化为空闲内存的能力,2者之间肯定有一定的联系,比如一个page即链接在inactive_list中,又链接在buffer+cache中,从下面的meminfo接口中,我大概可以得出如下的一种关系:
Inactive( 107076 kB)<  buffer+cache(23864 +126840 )<Inactive( 107076 kB)< +Active(203992 kB).

上面3点是本人的一些初步理解,希望哪位大侠能够把理解不够或错误的地方指出来,同时抛砖引玉,继续深入阐释active_list和inactive_list和buffer、cache的关系。



MemTotal:         446684 kB
MemFree:           30748 kB
Buffers:             23864 kB
Cached:           126840 kB
SwapCached:            0 kB
Active:            203992 kB
Inactive:         107076 kB
Active(anon):     160556 kB
Inactive(anon):      416 kB
Active(file):      43436 kB
Inactive(file):   106660 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        160360 kB
Mapped:            40612 kB
Shmem:               624 kB
Slab:              13504 kB
SReclaimable:       3432 kB
SUnreclaim:        10072 kB
KernelStack:        3728 kB
PageTables:        11380 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      223340 kB
Committed_AS:    1755684 kB
VmallocTotal:     491520 kB
VmallocUsed:      107460 kB
VmallocChunk:     367620 kB
#

论坛徽章:
0
68 [报告]
发表于 2012-04-04 21:20 |只看该作者
JVM进行调优
  1. if [ "${together}" = "MNAOM" ];then   
  2.             nohup $JRE_HOME/bin/java -Duser.timezone=UTC -server -Xms256m -Xmx1024m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=512m -cp $JAVACP ${SPGPROC_ID} $BOARD_FRAME $BOARD_SLOT>/dev/null 2>&1 &
  3.         elif [ "${together}" = "SPSPG" ]; then
  4.             nohup $JRE_HOME/bin/java -Duser.timezone=UTC -server -Xms256m -Xmx2048m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=512m -cp $JAVACP ${SPGPROC_ID} $BOARD_FRAME $BOARD_SLOT>/dev/null 2>&1 &
  5.         else
  6.             echo "Only base board can excute."
  7.             rm $FLAG_STARTING_FILE >> $LOGFILE
  8.             exit 1;
  9.         fi
复制代码

论坛徽章:
0
69 [报告]
发表于 2012-04-04 22:44 |只看该作者
一直在win下用ramdisk避免临时文件的实际写盘导致的慢和磨损(虽然:有缓存,很多人说ramdisk没必要,但是写一次盘还是。。。。)
不知道linux下,ramdisk是不是真的没必要了

看到过linux下曾有一种ramdisk,比如8G内存,它占了1G,但是如果它上面的文件超过1G了,还可以直接拿真正的硬盘扩充自己,以便应用继续写,而不会直接报错:空间不足
这个功能好像win下一直没实现过

论坛徽章:
0
70 [报告]
发表于 2012-04-05 14:27 |只看该作者
ljzbq123 发表于 2012-04-04 21:09
在arm系统中,modules是放置在3G-16M~3G之间,如下linux 2.6.35的定义。

Memory.h (kernel\arch\arm\inc ...


关于active_list和inactive_list和buffer、cache的关系。有篇好的帖子:
看看这个吧,我也在学习:
Linux Cache 机制探究

http://www.penglixun.com/tech/system/linux_cache_discovery.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP