找回密码
 注册
关于网站域名变更的通知
查看: 415|回复: 1
打印 上一主题 下一主题

研究 linux 内核 - 内存管理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-14 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
研究 linux 内核 - 内存管理' p; ~9 y  g2 W

- ~" |$ Q' e; i  a
7 y+ |5 _6 J) |8 ^; @1,说在前面:! e$ z. r: ^6 ~

: d- _9 n4 a& v! i3 s1》内存分成一定大小的‘页’; u8 y7 j9 ^$ W: o! A( s

( t5 X( W7 U2 Q3 C2》内核以‘页’为最小单位进行管理。也就是说内核管理内存的最小单位是‘页’: c3 f- R8 B+ R) \/ N

% [8 Z& a. d/ \# p3》每个物理页对应一个页结构体 struct page
8 }$ k) W$ @; z1 j
5 n* Q+ H9 l4 g5 Z3 r# d - i6 Q0 s: l9 O+ f7 ?
2,内存管理函数->kmalloc函数:8 r0 ?, c3 d" L& w& _' Z

  q2 t; g2 G4 W: ]" dVoid *kmalloc(size_t size,int flags)
$ ^* w4 b$ t1 F9 b4 c! H5 [
' w8 b; R5 X) p/ W/ r. A# R1》 内存申请的内核函数之一
3 [& g. `9 f, V- ?7 a( ~2 g. X; V* s
2》 分配的内存的物理地址是连续的  K& o3 s2 U" }! G" d) a

2 k4 z! `4 n$ Y6 a) w2 V9 e, F3》 分配的内存的虚拟地址也是连续的: O# b/ A1 n& V

( g& Z; T- z, K% c. }; f1 ~: S4》一般用来申请以‘字节’为单位的内存3 m+ ]6 }$ I6 X0 f$ k

& l; Y* H' F2 Y, x& Y5》 flags一般是GFP_KERNEL,和GFP_ATOMIC/ H. V3 [# i+ F: Y$ c- k

3 G. }; q* K/ [0 G! q. G6》 GFP_ATOMIC不能休眠,一般用在中断处理函数里。0 }6 H) U& d# d9 x( f
0 l% I( P9 W! o' m
& t9 x7 e- ^8 R1 u+ O
3,内存管理函数->vmalloc函数:
- m* {9 H6 ?* S* f  w0 `
6 u8 C2 A1 H$ l1》 内存申请的内核函数之一
- y- E2 n, s" t0 x+ h
  n% s% K0 i: K2》 分配的内存的物理地址可能不是连续的
+ H/ V) Q3 ?2 B0 E& g* S1 e
4 S2 Q2 u5 l. N8 {5 B3》分配的内存的虚拟地址是连续的$ @4 l6 @9 F2 `, z( P
3 q; C# L4 a& S+ |0 j) J& q
4》一般用来申请比较大的内存
- G5 T# n3 [; M' o- W# B: E/ i8 t4 b; m2 K7 T
5》kmalloc的效率比vmalloc高,所以一般用kmalloc,除非你打算要很多的内存时。这时用kmalloc可能会失败,因为很可能没有连续这么大的物理内存块。$ I, W! D+ J, r! E) Q  z
: }4 J; ~* o# q/ e" `

4 ^# N. L1 _) V4,页管理函数
7 c! k: X! Y3 {, b1 {2 v2 Y0 \$ C! t8 s' h
1》 页分配函数簇, d  ~% P. n; e/ C4 z5 K

0 w# t8 d$ N2 P# p) ]. CAlloc_page(gfp_mask)6 M9 |6 ?. b- B9 ^6 O9 C3 o' [3 {

0 W! k9 H7 M6 j! AAlloc_pages(gfp_mask,order)9 s3 @& A' X  B2 p! c$ `. Q

* w$ m' Y; t% ^/ c_get_free_page(gfp_mask)
1 w1 b; t1 G: C/ Q
+ V$ }7 N! T9 Z5 j" v_get_free_pages(gfp_mask,order)4 `+ [& f' @; x2 i7 ~+ ~% M# Z. Z

2 x! {% V0 U8 w  e  i$ QGet_zeroed_page(gfp_mask)
5 a; H$ ?+ M  v5 L5 u5 A! x% q5 k/ v6 ^
2》 页释放函数簇
: ]2 i" o/ t7 L, a- F* {- p  ]- ^" o1 K9 Z. R% D
_free_pages()! S% i5 A: [7 ?5 ?8 w7 ?3 d# n

/ t2 Y' X6 a3 u& X! GFree_pages()9 T  F  e# r! I. ?

) F+ C; [' ?5 H; OFree_page()
" a- w! m6 {3 I1 c- E
( S: i, [2 n, ~( U' s( T$ R - C' O4 F2 t8 K- s* @' g
5,slab分配器
6 e1 c/ |/ @4 L, h+ i4 W6 b
$ D, L. d" d) y1 S  d. v1》为了尽量避免频繁的内存分配和释放造成很多了内存碎片而引入4 ]* ^7 {7 F$ n) N" s% w
- X2 _7 f2 @0 h5 p2 P
2》咱们自己也可创建空闲列表来优化,但是自己的没有全局控制,最好用slab  s0 R1 R  {6 T1 J0 i

! Q, }0 ^- k) W; b5 t# J3 _0 S3》 slab函数簇
8 J- j6 q$ `4 v7 y+ s; a' k5 @8 A& ]3 W2 y7 a
kmem_cache_alloc()7 f, I0 T0 d& Z# }

5 U$ z2 f$ ~* U2 q' t6 x& |( \kmem_cache_free()/ B+ G5 r& O& k- f
: B2 p& I0 e' P! B+ z; c" f
4》 在使用slab之前应首先分配高速缓存
& A' k6 I$ U/ p* o9 y. ~
/ i# S" `2 X# c7 k/ j+ SKmem_cache_create()
. l& v" T! m% j5 w! I0 m
* W- n* b; P( E/ Y" zKmem_cache_destroy()9 I! p! f3 u! Y  _+ q# I* M

8 ?7 u7 C) }9 s% ^2 e+ P' \! w( o3 i% }) ]* `% u
2 f8 S1 ~. Q$ G, {* l" g
  u3 F+ O1 f" I! m0 g
" s+ z" a' e- l9 E+ \5 D8 l
+ ~) ^! L2 \8 z" a# s
& V- H6 K) }' J* C1 G

/ N3 F* V9 I7 ~1 I$ N

该用户从未签到

2#
发表于 2019-10-14 20:58 | 只看该作者
研究一下,谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:22 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表