[26468] 2021-07-05_内核线程的创建和运行

文档创建者:s7ckTeam
浏览次数:4
最后更新:2025-01-19
2021-07-05_内核线程的创建和运行 线 L i n u x   2 0 2 1 - 0 7 - 0 5   P e t e r / 线 线   p s   2 线 2   k t h r e a d d 1 绿   i n i t 0 0 1 2 线 0 线 线 l i n u x   0   t a s k _ s t r u c t     i n i t _ t a s k   . P e t e r   L i u N X P C S D N A R M L i n u x A n d r o i d
. t h r e a d _ i n f o         =   I N I T _ T H R E A D _ I N F O ( i n i t _ t a s k ) ,               t a s k _ s t r u c t , t h r e a d _ i n f o     s p     . s t a c k                 =   i n i t _ s t a c k ,                           i n i t _ s t a c k   / *   i n c l u d e / l i n u x / i n i t _ t a s k . h   * / # d e f i n e   I N I T _ T A S K _ C O M M   " s w a p p e r " / *   i n i t / i n i t _ t a s k . c   * / s t r u c t   t a s k _ s t r u c t   i n i t _ t a s k # i f d e f   C O N F I G _ A R C H _ T A S K _ S T R U C T _ O N _ S T A C K                 _ _ i n i t _ t a s k _ d a t a # e n d i f                 _ _ a l i g n e d ( L 1 _ C A C H E _ B Y T E S ) =   { # i f d e f   C O N F I G _ T H R E A D _ I N F O _ I N _ T A S K                 . t h r e a d _ i n f o         =   I N I T _ T H R E A D _ I N F O ( i n i t _ t a s k ) ,                 . s t a c k _ r e f c o u n t   =   R E F C O U N T _ I N I T ( 1 ) , # e n d i f                 . s t a t e                     =   0 ,                 . s t a c k                     =   i n i t _ s t a c k ,                 . u s a g e                     =   R E F C O U N T _ I N I T ( 2 ) ,                 . f l a g s                     =   P F _ K T H R E A D ,                 . p r i o                       =   M A X _ P R I O   -   2 0 ,                 . s t a t i c _ p r i o         =   M A X _ P R I O   -   2 0 ,                 . n o r m a l _ p r i o         =   M A X _ P R I O   -   2 0 ,                 . p o l i c y                   =   S C H E D _ N O R M A L ,                 . c p u s _ p t r               =   & i n i t _ t a s k . c p u s _ m a s k ,                 . c p u s _ m a s k             =   C P U _ M A S K _ A L L ,                 . n r _ c p u s _ a l l o w e d =   N R _ C P U S ,                 . m m                           =   N U L L ,                 . a c t i v e _ m m             =   & i n i t _ m m ,     . . . . . .                 . c o m m                       =   I N I T _ T A S K _ C O M M ,                 . t h r e a d                   =   I N I T _ T H R E A D ,                 . f s                           =   & i n i t _ f s ,                 . f i l e s                     =   & i n i t _ f i l e s ,     . . . . . . } ; E X P O R T _ S Y M B O L ( i n i t _ t a s k ) ;
_ _ s t a r t _ i n i t _ t a s k   0 _ _ e n d _ i n i t _ t a s k   0 _ _ s t a r t _ i n i t _ t a s k   =   i n i t _ t h r e a d _ u n i o n   =   i n i t _ t a s k . c o m m                 =   I N I T _ T A S K _ C O M M ,     0   s w a p p e r   L i n u x     _ _ p r i m a r y _ s w i t c h e d   0 1 .   i n i t _ t h r e a d _ u n i o n   0 2 .     s p     +   T H R E A D _ S I Z E   s p   3 .     l i n u x   0 0   i d l e     s w a p p e r   0   i d l e     C P U     i d l e     i d l e     C P U   A R M W F I 1 线 线 / *   i n c l u d e / a s m - g e n e r i c / v m l i n u x . l d s . h   * / # d e f i n e   I N I T _ T A S K _ D A T A ( a l i g n )                                                                                                       .   =   A L I G N ( a l i g n ) ;                                                                                                               _ _ s t a r t _ i n i t _ t a s k   =   . ;                                                                                                     i n i t _ t h r e a d _ u n i o n   =   . ;                                                                                                     i n i t _ s t a c k   =   . ;                                                                                                                   K E E P ( * ( . d a t a . . i n i t _ t a s k ) )                                                                                               K E E P ( * ( . d a t a . . i n i t _ t h r e a d _ i n f o ) )                                                                                 .   =   _ _ s t a r t _ i n i t _ t a s k   +   T H R E A D _ S I Z E ;                                                                         _ _ e n d _ i n i t _ t a s k   =   . ; / *   a r c h / a r m 6 4 / k e r n e l / h e a d . S   * / S Y M _ F U N C _ S T A R T _ L O C A L ( _ _ p r i m a r y _ s w i t c h e d )                 a d r p         x 4 ,   i n i t _ t h r e a d _ u n i o n                 - - - - - - ( 1 )                 a d d           s p ,   x 4 ,   # T H R E A D _ S I Z E                   - - - - - - ( 2 )                 a d r _ l       x 5 ,   i n i t _ t a s k                 m s r           s p _ e l 0 ,   x 5                                             / /   S a v e   t h r e a d _ i n f o                 . . . . . .                 b               s t a r t _ k e r n e l S Y M _ F U N C _ E N D ( _ _ p r i m a r y _ s w i t c h e d )                           - - - - - - ( 3 )
a s m l i n k a g e   _ _ v i s i b l e   v o i d   _ _ i n i t   _ _ n o _ s a n i t i z e _ a d d r e s s   s t a r t _ k e r n e l ( v o i d ) {     . . . . . .     a r c h _ c a l l _ r e s t _ i n i t ( ) ;     . . . . . . } v o i d   _ _ i n i t   _ _ w e a k   a r c h _ c a l l _ r e s t _ i n i t ( v o i d ) {                 r e s t _ i n i t ( ) ; } n o i n l i n e   v o i d   _ _ r e f   r e s t _ i n i t ( v o i d ) {                 s t r u c t   t a s k _ s t r u c t   * t s k ;                 i n t   p i d ;                 r c u _ s c h e d u l e r _ s t a r t i n g ( ) ;                 p i d   =   k e r n e l _ t h r e a d ( k e r n e l _ i n i t ,   N U L L ,   C L O N E _ F S ) ;                 r c u _ r e a d _ l o c k ( ) ;                 t s k   =   f i n d _ t a s k _ b y _ p i d _ n s ( p i d ,   & i n i t _ p i d _ n s ) ;                 s e t _ c p u s _ a l l o w e d _ p t r ( t s k ,   c p u m a s k _ o f ( s m p _ p r o c e s s o r _ i d ( ) ) ) ;                 r c u _ r e a d _ u n l o c k ( ) ;                 n u m a _ d e f a u l t _ p o l i c y ( ) ;                 p i d   =   k e r n e l _ t h r e a d ( k t h r e a d d ,   N U L L ,   C L O N E _ F S   |   C L O N E _ F I L E S ) ;                 r c u _ r e a d _ l o c k ( ) ;                 k t h r e a d d _ t a s k   =   f i n d _ t a s k _ b y _ p i d _ n s ( p i d ,   & i n i t _ p i d _ n s ) ;                 r c u _ r e a d _ u n l o c k ( ) ;                 s y s t e m _ s t a t e   =   S Y S T E M _ S C H E D U L I N G ;                 c o m p l e t e ( & k t h r e a d d _ d o n e ) ;                 s c h e d u l e _ p r e e m p t _ d i s a b l e d ( ) ;                 / *   C a l l   i n t o   c p u _ i d l e   w i t h   p r e e m p t   d i s a b l e d   * /                 c p u _ s t a r t u p _ e n t r y ( C P U H P _ O N L I N E ) ; }
1 2 线 p i d   =   k e r n e l _ t h r e a d ( k e r n e l _ i n i t ,   N U L L ,   C L O N E _ F S ) ; p i d   =   k e r n e l _ t h r e a d ( k t h r e a d d ,   N U L L ,   C L O N E _ F S   |   C L O N E _ F I L E S ) ; k e r n e l _ t h r e a d     d o _ f o r k   线 d o _ f o r k   线   k e r n e l _ t h r e a d ( k e r n e l _ i n i t ,   N U L L ,   C L O N E _ F S )   1   k e r n e l _ i n i t   k e r n e l _ i n i t     e x e c v e i n i t i n i t   1 线 i n i t   k e r n e l _ i n i t   1 2 线 线     k e r n e l _ t h r e a d ( k t h r e a d d ,   N U L L ,   C L O N E _ F S   |   C L O N E _ F I L E S )   2 线 2 线   k t h r e a d d k t h r e a d d   p i d _ t   k e r n e l _ t h r e a d ( i n t   ( * f n ) ( v o i d   * ) ,   v o i d   * a r g ,   u n s i g n e d   l o n g   f l a g s ) {   r e t u r n   _ d o _ f o r k ( f l a g s | C L O N E _ V M | C L O N E _ U N T R A C E D ,   ( u n s i g n e d   l o n g ) f n ,     ( u n s i g n e d   l o n g ) a r g ,   N U L L ,   N U L L ,   0 ) ; } s t a t i c   i n t   _ _ r e f   k e r n e l _ i n i t ( v o i d   * u n u s e d ) {                 i n t   r e t ;                 k e r n e l _ i n i t _ f r e e a b l e ( ) ;                 . . . . . .                 i f   ( ! t r y _ t o _ r u n _ i n i t _ p r o c e s s ( " / s b i n / i n i t " )   | |                         ! t r y _ t o _ r u n _ i n i t _ p r o c e s s ( " / e t c / i n i t " )   | |                         ! t r y _ t o _ r u n _ i n i t _ p r o c e s s ( " / b i n / i n i t " )   | |                         ! t r y _ t o _ r u n _ i n i t _ p r o c e s s ( " / b i n / s h " ) )                                 r e t u r n   0 ;                 p a n i c ( " N o   w o r k i n g   i n i t   f o u n d .     T r y   p a s s i n g   i n i t =   o p t i o n   t o   k e r n e l .   "                             " S e e   L i n u x   D o c u m e n t a t i o n / a d m i n - g u i d e / i n i t . r s t   f o r   g u i d a n c e . " ) ; }
1 .     t a s k _ s t r u c t     c o m m   使 " k t h r e a d d " 2 .     T A S K _ I N T E R R U P T I B L E i n t   k t h r e a d d ( v o i d   * u n u s e d ) {                 s t r u c t   t a s k _ s t r u c t   * t s k   =   c u r r e n t ;                 / *   S e t u p   a   c l e a n   c o n t e x t   f o r   o u r   c h i l d r e n   t o   i n h e r i t .   * /                 s e t _ t a s k _ c o m m ( t s k ,   " k t h r e a d d " ) ;                                   - - - - - - ( 1 )                 i g n o r e _ s i g n a l s ( t s k ) ;                 s e t _ c p u s _ a l l o w e d _ p t r ( t s k ,   h o u s e k e e p i n g _ c p u m a s k ( H K _ F L A G _ K T H R E A D ) ) ;                 s e t _ m e m s _ a l l o w e d ( n o d e _ s t a t e s [ N _ M E M O R Y ] ) ;                 c u r r e n t - > f l a g s   | =   P F _ N O F R E E Z E ;                 c g r o u p _ i n i t _ k t h r e a d d ( ) ;                 f o r   ( ; ; )   {                                 s e t _ c u r r e n t _ s t a t e ( T A S K _ I N T E R R U P T I B L E ) ;     - - - - - - ( 2 )                                 i f   ( l i s t _ e m p t y ( & k t h r e a d _ c r e a t e _ l i s t ) )                                                       s c h e d u l e ( ) ;                                           - - - - - - ( 3 )                                 _ _ s e t _ c u r r e n t _ s t a t e ( T A S K _ R U N N I N G ) ;                                 s p i n _ l o c k ( & k t h r e a d _ c r e a t e _ l o c k ) ;                                 w h i l e   ( ! l i s t _ e m p t y ( & k t h r e a d _ c r e a t e _ l i s t ) )   {                                                 s t r u c t   k t h r e a d _ c r e a t e _ i n f o   * c r e a t e ;                                                 c r e a t e   =   l i s t _ e n t r y ( k t h r e a d _ c r e a t e _ l i s t . n e x t ,                                                                                         s t r u c t   k t h r e a d _ c r e a t e _ i n f o ,   l i s t ) ;                                                 l i s t _ d e l _ i n i t ( & c r e a t e - > l i s t ) ;                                                 s p i n _ u n l o c k ( & k t h r e a d _ c r e a t e _ l o c k ) ;                                                 c r e a t e _ k t h r e a d ( c r e a t e ) ;                   - - - - - - ( 4 )                                                 s p i n _ l o c k ( & k t h r e a d _ c r e a t e _ l o c k ) ;                                 }                                 s p i n _ u n l o c k ( & k t h r e a d _ c r e a t e _ l o c k ) ;                 }                 r e t u r n   0 ; }
3 .     k t h r e a d _ c r e a t e _ l i s t   线 s c h e d u l e   4 .   w h i l e   c r e a t e _ k t h r e a d   线 2 线   k t h r e a d d     c r e a t e _ k t h r e a d   线 线   L i n u x   线 0 线 0 线 线 1 线 2 线 1 i n i t i n i t 2 线 0 1 2 1 2 线 k t h r e a d     k t h r e a d d   线   k t h r e a d _ c r e a t e _ l i s t 线   c r e a t e _ k t h r e a d 线   k t h r e a d d   线 线   k t h r e a d s t a t i c   v o i d   c r e a t e _ k t h r e a d ( s t r u c t   k t h r e a d _ c r e a t e _ i n f o   * c r e a t e ) {                 i n t   p i d ; # i f d e f   C O N F I G _ N U M A                 c u r r e n t - > p r e f _ n o d e _ f o r k   =   c r e a t e - > n o d e ; # e n d i f                 / *   W e   w a n t   o u r   o w n   s i g n a l   h a n d l e r   ( w e   t a k e   n o   s i g n a l s   b y   d e f a u l t ) .   * /                 p i d   =   k e r n e l _ t h r e a d ( k t h r e a d ,   c r e a t e ,   C L O N E _ F S   |   C L O N E _ F I L E S   |   S I G C H L D ) ;                 i f   ( p i d   <   0 )   {                                 / *   I f   u s e r   w a s   S I G K I L L e d ,   I   r e l e a s e   t h e   s t r u c t u r e .   * /                                 s t r u c t   c o m p l e t i o n   * d o n e   =   x c h g ( & c r e a t e - > d o n e ,   N U L L ) ;                                 i f   ( ! d o n e )   {                                                 k f r e e ( c r e a t e ) ;                                                 r e t u r n ;                                 }                                 c r e a t e - > r e s u l t   =   E R R _ P T R ( p i d ) ;                                 c o m p l e t e ( d o n e ) ;                 } } s t a t i c   i n t   k t h r e a d ( v o i d   * _ c r e a t e ) {
                / *   C o p y   d a t a :   i t ' s   o n   k t h r e a d ' s   s t a c k   * /                 s t r u c t   k t h r e a d _ c r e a t e _ i n f o   * c r e a t e   =   _ c r e a t e ;             - - - - - - ( 1 )                 i n t   ( * t h r e a d f n ) ( v o i d   * d a t a )   =   c r e a t e - > t h r e a d f n ;         - - - - - - ( 2 )                 v o i d   * d a t a   =   c r e a t e - > d a t a ;                                                   - - - - - - ( 3 )                 s t r u c t   c o m p l e t i o n   * d o n e ;                 s t r u c t   k t h r e a d   * s e l f ;                 i n t   r e t ;                 s e l f   =   k z a l l o c ( s i z e o f ( * s e l f ) ,   G F P _ K E R N E L ) ;                   - - - - - - ( 4 )                 s e t _ k t h r e a d _ s t r u c t ( s e l f ) ;                 / *   I f   u s e r   w a s   S I G K I L L e d ,   I   r e l e a s e   t h e   s t r u c t u r e .   * /                 d o n e   =   x c h g ( & c r e a t e - > d o n e ,   N U L L ) ;                                     - - - - - - ( 5 )                 i f   ( ! d o n e )   {                                 k f r e e ( c r e a t e ) ;                                 d o _ e x i t ( - E I N T R ) ;                 }                 i f   ( ! s e l f )   {                                 c r e a t e - > r e s u l t   =   E R R _ P T R ( - E N O M E M ) ;                                 c o m p l e t e ( d o n e ) ;                                 d o _ e x i t ( - E N O M E M ) ;                 }                 s e l f - > t h r e a d f n   =   t h r e a d f n ;                                                   - - - - - - ( 6 )                 s e l f - > d a t a   =   d a t a ;                                                                   - - - - - - ( 7 )                 i n i t _ c o m p l e t i o n ( & s e l f - > e x i t e d ) ;                 i n i t _ c o m p l e t i o n ( & s e l f - > p a r k e d ) ;                 c u r r e n t - > v f o r k _ d o n e   =   & s e l f - > e x i t e d ;                 / *   O K ,   t e l l   u s e r   w e ' r e   s p a w n e d ,   w a i t   f o r   s t o p   o r   w a k e u p   * /                 _ _ s e t _ c u r r e n t _ s t a t e ( T A S K _ U N I N T E R R U P T I B L E ) ;                   - - - - - - ( 8 )                 c r e a t e - > r e s u l t   =   c u r r e n t ;                                                     - - - - - - ( 9 )                 / *                   *   T h r e a d   i s   g o i n g   t o   c a l l   s c h e d u l e ( ) ,   d o   n o t   p r e e m p t   i t ,                   *   o r   t h e   c r e a t o r   m a y   s p e n d   m o r e   t i m e   i n   w a i t _ t a s k _ i n a c t i v e ( ) .                   * /                 p r e e m p t _ d i s a b l e ( ) ;                 c o m p l e t e ( d o n e ) ;                                                                         - - - - - - ( 1 0 )                 s c h e d u l e _ p r e e m p t _ d i s a b l e d ( ) ;                                               - - - - - - ( 1 1 )                 p r e e m p t _ e n a b l e ( ) ;                                                                     - - - - - - ( 1 2 )
1 .   线 2 .   线 3 .   线 4 .     k t h r e a d   5 .     d o n e   6 .     s e l f - > t h r e a d f n   线 7 .     s e l f - > d a t a   线 8 .   线   T A S K _ U N I N T E R R U P T I B L E 9 .     t s k 1 0 .     d o n e   1 1 .   1 2 .   1 3 .     s e l f - > f l a g s     K T H R E A D _ S H O U L D _ S T O P   k t h r e a d _ s t o p   1 4 .   线 1 5 .   退 线 线   k t h r e a d d     k t h r e a d _ c r e a t e _ l i s t     c r e a t e _ k t h r e a d   线 k t h r e a d d   线 线 线   k t h r e a d _ c r e a t e _ l i s t   线   p e t e r   线                 r e t   =   - E I N T R ;                 i f   ( ! t e s t _ b i t ( K T H R E A D _ S H O U L D _ S T O P ,   & s e l f - > f l a g s ) )   { - - - - - - ( 1 3 )                                 c g r o u p _ k t h r e a d _ r e a d y ( ) ;                                 _ _ k t h r e a d _ p a r k m e ( s e l f ) ;                                 r e t   =   t h r e a d f n ( d a t a ) ;                                             - - - - - - ( 1 4 )                 }                 d o _ e x i t ( r e t ) ;                                                                             - - - - - - ( 1 5 ) }
  k t h r e a d _ c r e a t e   线   w a k e _ u p _ p r o c e s s   线 使   k t h r e a d d 线 k t h r e a d _ c r e a t e k t h r e a d _ c r e a t e   k t h r e a d _ c r e a t e - > k t h r e a d _ c r e a t e _ o n _ n o d e - > _ _ k t h r e a d _ c r e a t e _ o n _ n o d e i n t   m y _ k e r n e l _ t h r e a d ( v o i d   * a r g )     {       p r i n t k ( " % s :   % d n " ,   _ _ f u n c _ _ ) ;         r e t u r n   0 ;     }     s t a t i c   i n t   _ _ i n i t   t e s t _ i n i t _ m o d u l e ( v o i d )     {       p r i n t k ( " % s : n " ,   _ _ f u n c _ _ ) ;         p e t e r   =   k t h r e a d _ c r e a t e ( m y _ k e r n e l _ t h r e a d ,   N U L L ,   " p r a c t i c e   t a s k " ) ;     - - - - - - ( 1 )     i f ( ! I S _ E R R ( p e t e r ) )         w a k e _ u p _ p r o c e s s ( p e t e r ) ;                                                                                     - - - - - - ( 2 )     r e t u r n   0 ;     }         s t a t i c   v o i d   _ _ e x i t   t e s t _ e x i t _ m o d u l e ( v o i d )     {       p r i n t k ( " % s : n " ,   _ _ f u n c _ _ ) ;       k t h r e a d _ s t o p ( p e t e r ) ;     }         m o d u l e _ i n i t ( t e s t _ i n i t _ m o d u l e ) ;     m o d u l e _ e x i t ( t e s t _ e x i t _ m o d u l e ) ;     s t r u c t   t a s k _ s t r u c t   * _ _ k t h r e a d _ c r e a t e _ o n _ n o d e ( i n t   ( * t h r e a d f n ) ( v o i d   * d a t a ) ,                                                                                                         v o i d   * d a t a ,   i n t   n o d e ,                                                                                                         c o n s t   c h a r   n a m e f m t [ ] ,                                                                                                         v a _ l i s t   a r g s ) {                 D E C L A R E _ C O M P L E T I O N _ O N S T A C K ( d o n e ) ;                                                               - - - - - - ( 1 )                 s t r u c t   t a s k _ s t r u c t   * t a s k ;                 s t r u c t   k t h r e a d _ c r e a t e _ i n f o   * c r e a t e   =   k m a l l o c ( s i z e o f ( * c r e a t e ) ,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则