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

研究 linux 内核 - 内存管理

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
研究 linux 内核 - 内存管理
! N  v8 _# q: e ! Q, [0 q7 W. O5 S$ n! [8 N* V

+ T$ ~1 ~- y+ A( f& f1 L1,说在前面:; Y. Q- l& a& l* @( R
9 b4 T5 y: q( V4 x3 t8 s
1》内存分成一定大小的‘页’5 |9 v0 I& E# T8 c- y0 o

" Q% }8 b! x$ h+ S5 O1 p2》内核以‘页’为最小单位进行管理。也就是说内核管理内存的最小单位是‘页’
3 V, z# Q. I* o  w# g* g7 J- _
. m- j( q: G! ~) ~! G3》每个物理页对应一个页结构体 struct page& j- {$ N$ r8 ?2 u5 w

# i* M- h7 j& T6 \8 d# h
2 ~3 o4 a- k# r- I; H' \2,内存管理函数->kmalloc函数:  O( c" X  Q' b2 i2 X

" m, a9 J! _  Q4 A2 \Void *kmalloc(size_t size,int flags)7 a0 @6 I4 {* |& @
( d2 E0 O7 n3 D0 U* Q; A
1》 内存申请的内核函数之一  \, @8 D, Q( G4 e

& m6 ^, d  D4 C. G' p/ E/ J% U! Q: B2》 分配的内存的物理地址是连续的
5 ~" F% f8 l4 o* ?3 M9 o. B- \" P1 S7 _8 \
3》 分配的内存的虚拟地址也是连续的
) O+ M. D* ^0 T  g0 g+ m8 M
" l- c; Z" \; z4》一般用来申请以‘字节’为单位的内存
6 {# m% A/ x& b  ?' _' v* C3 s4 G7 _4 ]
5》 flags一般是GFP_KERNEL,和GFP_ATOMIC, ~- b" l: A) p3 k1 [

4 {% [* u0 U- }4 J& B% @) r: [6》 GFP_ATOMIC不能休眠,一般用在中断处理函数里。
) {2 J! S( Z% \9 G7 b& N2 d- n! k" |+ H  @# L2 H9 h2 [
! P' n6 ?, j, o- D* x
3,内存管理函数->vmalloc函数:
  T* Q) p* C/ c- H8 I+ y  G& q3 s! P
1》 内存申请的内核函数之一
( b: q( Y3 L- }2 {9 R( e. R9 [) D' Y" \5 ]. m, Q  \: ?
2》 分配的内存的物理地址可能不是连续的
( X0 z$ s( E( p) Z. ^4 |) n9 P' }( O: l# v' l2 N! e. G7 X4 |. Y
3》分配的内存的虚拟地址是连续的: m, P7 W  Z: {, K) o6 E

. ]* m: U. q- f, {0 y6 M4》一般用来申请比较大的内存+ w0 f, K" B: O' F4 }3 X! P& ]/ J

: a, S- v* O& ^+ ?# ]2 ^5》kmalloc的效率比vmalloc高,所以一般用kmalloc,除非你打算要很多的内存时。这时用kmalloc可能会失败,因为很可能没有连续这么大的物理内存块。
0 R; E3 A6 L' T9 ]& }& }! z, x+ p$ b& Z9 x

- w* B2 }' P8 v3 h9 |3 d* h( P4,页管理函数
( x; A. u! x+ f: |
9 B0 |# S' u% x1》 页分配函数簇
8 M! P- A  R  ]7 U2 _
9 G- g$ r% p9 |; S+ R/ Q' X& lAlloc_page(gfp_mask)
+ h/ P5 U, J  S2 C2 n
5 ]% j5 e# O) OAlloc_pages(gfp_mask,order)
" H+ N+ {/ p- Y' I' i1 Y+ @- N# I1 Z' V+ m
_get_free_page(gfp_mask)
' Q; _* j( |( A* ?' J2 r
8 [+ Q  J# x3 e+ N! l8 j0 K_get_free_pages(gfp_mask,order)
6 ~' l: k% d  v+ o6 I
% [& m1 J3 |- `& yGet_zeroed_page(gfp_mask)4 _( V, [$ v% n8 d% p
; f* [! e0 M4 L5 ]
2》 页释放函数簇2 g* e  A+ O) c- f6 O
* n) q- _/ C; \5 v3 z3 O
_free_pages()( i, f# `- d1 g
% }5 L- ~7 I& B3 Z5 O3 w
Free_pages()
7 z4 h% t* ~& S3 N; N  S% q$ F& r; U3 [2 D
Free_page()% m0 n! F" b% m; X

' s0 C3 G# f- q& Y " Z- Y2 |% m6 w
5,slab分配器0 S1 |, Q' a8 S5 Z% P5 B

& Q* D. E% n: ]8 G4 c1》为了尽量避免频繁的内存分配和释放造成很多了内存碎片而引入2 F$ f0 }7 k3 v- P! p

' ?& u5 L: A2 u7 s7 R2》咱们自己也可创建空闲列表来优化,但是自己的没有全局控制,最好用slab; Y! y; c7 f  N$ K/ w

* [- y0 M* n* M' M) \6 I3 A3》 slab函数簇
( m2 e9 f$ M2 k* p6 H$ d" z" I* s0 ?
kmem_cache_alloc()
6 T' L3 w# o, ?% T5 `  X
$ A3 h! r) i2 }. B8 D- N) N2 [8 pkmem_cache_free()
" _- W4 h' l/ }% v8 Z+ U& `
1 `, X  a, V* E$ j4 x7 L# x; E4》 在使用slab之前应首先分配高速缓存7 D7 x2 B4 J+ q3 U! ^

8 g7 N% w5 ~4 |) U) ]6 M& d  p2 lKmem_cache_create()
& M+ Q# _4 G- @: N! q2 V* n1 G$ P) [
Kmem_cache_destroy(). M3 i. X6 p! Q! Y0 M: X

4 T0 Y! i' F" ^4 @  i9 W. k% [7 x8 o+ u1 D5 j7 O
2 ?: G$ m+ U* \( {  [* W

( R9 K; F! d& g8 Q( [" A
! g  P; @  c& z% Q# `: i, }9 r
" F0 n5 ?( {- Z/ H: n
( D& A% K; _$ Y6 {8 O
' M* ^- J* ^9 f7 h  {

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 01:48 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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