). , . - , , - . : * , , - ; . * (PS), . PS, , , , , , - .. , PS, , - PS - . PS - , - ( /). , . * , , - . - . - ( ), - . * , , - . , - 0 1 - . " " ( ) " " ( ). - , . - , , - . : * , ( 6.1) , - . * , , , - . , , , . --------------------------------------- (*) " " (user-level context), " " (register context), "- " (system-level context) " " (context layers) . 148 * , - , - , , , , . - , - , - . , . * , , - . , , . , , creat , read . , . - , . , - , , - . , . * , - , , . , - . , . - , - , . , , : , . , - , . 6.8 . - . : , ( ), , ( - ), , , (, - ). . , - . , - ; , . , - - , , , . 149 +-------------------------+ - | - | | | - | - | | +---------------------+ | | - | | | | | | - | | | | |+-------->+----------------+ | | | || - | | | | | || | 3 | | +---------------------+ || | | | || | -| | || 3| - | | || | 2 | | +---------------------+ || +----------------+ | | - | || | | | | +-++ | 2 | | | | | | | | | - | | | -| | | | | 2| - | | +---------------------+ | | 1 | +-------------------------+ +----------------+ | | | 1 | | | | -| 1| - | | 0 | +----------------+ | | | (- | 0| ) | +----------------+ 6.8. , , . . , - , , , , 5 , , , 7 : , 1 1 . 7 - , "" - , ( - ) , - . , - - , , , . , , - , , . - , . 6.4  , , 150 . , , , . - . 6.4.1  , - (, ), ( , " - ") ( - ). , - , , ( ) , , . - : 1. ( ) . 2. "" , (- , ) , - (, ). , - . , , , , - , . , 6.9. , , 2, - +-----------------------------------------+ | | | | | | | 0 clockintr | | 1 diskintr | | 2 ttyintr | | 3 devintr | | 4 softintr | | 5 otherintr | +-----------------------------------------+ 6.9. , ttyintr. 3. . , , - . , , - , - . 4. . - 151 , , . , - . , , - . +-----------------------------------------------------+ | inthand /* */ | | : | | : | | { | | ( ) | | ; | | ; | | ; | | ; | | ( ) - | | ; | | } | +-----------------------------------------------------+ 6.10. 6.10 , - . - , , , - , - . , - UNIX, -. 6.11 , (. ) . , - . , ( - ), . 6.4.2    - , . , - . - , , - . - , - . - " ". , - 152 +-------------------------------+ | 3 | | - | | | | | | - | | | | | --------+-------------------------------+ ^ | 2 | | | - | | | | | | | | | - | | | | | | | ----------+-------------------------------+ ^ | 1 | | | - | | | | | | | | | - | | | | | | | ------+-------------------------------+ ^ | | 6.11. . - - , , - - . , - , , ( 6.12). () , ( , - ) ( ). , - , . , . , - , PS - , . - , PS 0 1 - . , . - - . 153 +------------------------------------------------------------+ | syscall /* */| | : | | : | | { | | , -| | ; | | , ;| | | | ; | | | | (. 6.44); | | ; | | ( ) | | { | | - | | ; | | PS | | ; | | } | | | | 0 | | 1 ; | | } | +------------------------------------------------------------+ 6.12. , - ( 0666) 6.13. ( ) Motorola 68000. 6.14 - . - , - (0666), - " " (**). 64 creat ( 7a), - . - 6a, . creat - 0 8 (trap), - . , , - 0 (8) , creat. , , creat ; - , - . , - , - . creat , , ( ); , - PS , 0 . , 0 1 - . - --------------------------------------- (**) , , . 154 +----------------------------------------+ | char name[] = "file"; | | main() | | { | | int fd; | | fd = creat(name,0666); | | } | +----------------------------------------+ +---------------------------------------------------------------+ | , | | Motorola 68000 | | | | | | - | | - | | # | | - | | 58: mov &Ox1b6,(%sp) # 0666 | | 5e: mov &Ox204,-(%sp) # | | # " "| | # | | 64: jsr Ox7a # | | # | | - | | - | | # | | 7a: movq &Ox8,%d0 # 8 0| | 7c: trap &Ox0 # -| | # | | 7e: bcc &Ox6 <86> # , | | # 86 | | 80: jmp Ox13c # 13c | | 86: rts # | | - | | - | | # | | 13c: mov %d0,&Ox20e # | | # 0 20e ( | | # errno) | | 142: movq &-Ox1,%d0 # 0 | | # -1 | | 144: mova %d0,%a0 | | 146: rts # | +---------------------------------------------------------------+ 6.13. creat - Motorola 68000 - , PS ( 7): , 13c, errno 20, 0 -1, 64 ( ) . - -1, 155 . PS , 7 86 ( 64); 0 . +---------+ | - | | - | | - | | - | | - | | - | | -| | - | | 1| +---------+ | | | 1b6 | || | | (666 ) | | | 204 | " " | creat | | 6a | +------------------+ | | | -| +---------+<-----+ | | | -| | | 0 | | -| | |(- | | | | ) | | | - | | | 7c | - | , | +---------+ | | | 7e | | | | | | | | | v | | | PS | | | | 0 (| | 8) | | | | | | | +------------------+ 6.14. creat . , . , , - exec, execl execle, . , , , , . 6.4.3  ( 6.1), - , - : , , , , , . 2, - 156 , . , : , , - , , - , .. , , - , , . link, , , - ( ). exit, . , , - , , - . , - , , - : - , , , . - , , - . , , . . +--------------------------------------------------------+ | 1. - | | . | | 2. "" . | | 3. , ,| | , -| | 8. | | 4. . | +--------------------------------------------------------+ 6.15. , - , UNIX, , - , - , - . - , , , "" . , - . , , , , , . 6.16 . save_context - 157 1. , ( save_context) 0 . "" (A), (B) resume_context +------------------------------------------------------------+ | if (save_context()) /* | | */ | | { | | /* */ | | - | | - | | - | | resume_context(new_process); | | /* ! */ | | } | | /* */ | +------------------------------------------------------------+ 6.16. . - B; (A) , . , , A ( , , ). A , A save_context, 0 0. - A save_context, - resume_context. , A save_context 0 ( ) " ". 6.4.4  , - . , - , , - ; . - setjmp, - longjmp (***). - setjmp save_context, - , , save_context , setjmp - . , --------------------------------------- (***) - , -