You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
268 volume VI os16<br />
Script e sorgenti del kernel 269<br />
1660098 | ;<br />
1660099 | ; If we are here, a user process was interrupted.<br />
1660100 | ; Switch to the kernel stack.<br />
1660101 | ;<br />
1660102 | mov ax, #0x0050 ; Kernel data area.<br />
1660103 | mov ss, ax<br />
1660104 | mov sp, __ksp<br />
1660105 | ;<br />
1660106 | ; Call the scheduler.<br />
1660107 | ;<br />
1660108 | push #proc_ss_0 ; &proc_ss_0<br />
1660109 | push #proc_sp_0 ; &proc_sp_0<br />
1660110 | call _proc_scheduler<br />
1660111 | add sp, #2<br />
1660112 | add sp, #2<br />
1660113 | ;<br />
1660114 | ; Restore process stack registers from kernel data segment.<br />
1660115 | ;<br />
1660116 | mov ss, proc_ss_0 ; Restore process stack segment.<br />
1660117 | mov sp, proc_sp_0 ; Restore process stack pointer.<br />
1660118 | ;<br />
1660119 |L2: ; Restore from process stack:<br />
1660120 | ;<br />
1660121 | pop ax<br />
1660122 | pop cx<br />
1660123 | pop dx<br />
1660124 | pop bx<br />
1660125 | pop bp<br />
1660126 | pop si<br />
1660127 | pop di<br />
1660128 | pop ds<br />
1660129 | pop es<br />
1660130 | ;<br />
1660131 | ; Return from interrupt: will restore CS:IP and FLAGS<br />
1660132 | ; from process stack.<br />
1660133 | ;<br />
1660134 | iret<br />
1660135 |;-----------------------------------------------------------------------<br />
1660136 |; Syscall.<br />
1660137 |;-----------------------------------------------------------------------<br />
1660138 |.align 2<br />
1660139 |isr_80:<br />
1660140 | ;-------------------------------------------------------------------<br />
1660141 | ; Inside the process stack, we already have:<br />
1660142 | ; push #message_size<br />
1660143 | ; push &message_structure ; the relative address of it<br />
1660144 | ; push #syscall_number<br />
1660145 | ; push #back_address ; made by a call to _sys function<br />
1660146 | ; push flags ; made by int #0x80<br />
1660147 | ; push cs ; made by int #0x80<br />
1660148 | ; push ip ; made by int #0x80<br />
1660149 | ;-------------------------------------------------------------------<br />
1660150 | ;<br />
1660151 | ; Save into process stack:<br />
1660152 | ;<br />
1660153 | push es ; extra segment<br />
1660154 | push ds ; data segment<br />
1660155 | push di ; destination index<br />
1660156 | push si ; source index<br />
1660157 | push bp ; base pointer<br />
1660158 | push bx ; BX<br />
1660159 | push dx ; DX<br />
1660160 | push cx ; CX<br />
1660161 | push ax ; AX<br />
1660162 | ;<br />
1660163 | ; Set the data segments to the kernel data area,<br />
1660164 | ; so that the following variables can be accessed.<br />
1660165 | ;<br />
1660166 | mov ax, #0x0050 ; DS and ES.<br />
1660167 | mov ds, ax ;<br />
1660168 | mov es, ax ;<br />
1660169 | ;<br />
1660170 | ; Save process stack registers into kernel data segment.<br />
1660171 | ;<br />
1660172 | mov proc_ss_1, ss ; Save process stack segment.<br />
1660173 | mov proc_sp_1, sp ; Save process stack pointer.<br />
1660174 | ;<br />
1660175 | ; Save some more data, from the system call.<br />
1660176 | ;<br />
1660177 | mov bp, sp<br />
1660178 | mov ax, +26[bp]<br />
1660179 | mov proc_syscallnr, ax<br />
1660180 | mov ax, +28[bp]<br />
1660181 | mov proc_msg_offset, ax<br />
1660182 | mov ax, +30[bp]<br />
1660183 | mov proc_msg_size, ax<br />
1660184 | ;<br />
1660185 | ; Check if it is already the kernel stack.<br />
1660186 | ;<br />
1660187 | mov dx, ss<br />
1660188 | mov ax, #0x0050 ; Kernel data area.<br />
1660189 | cmp dx, ax<br />
1660190 | jne L3<br />
1660191 | ;<br />
1660192 | ; It is already the kernel stack, so, the variable "_ksp" is<br />
1660193 | ; aligned to current stack pointer. This way, the first syscall<br />
1660194 | ; can work without having to set the "_ksp" variable to some<br />
1660195 | ; reasonable value.<br />
1660196 | ;<br />
1660197 | mov __ksp, sp<br />
1660198 | ;<br />
1660199 |L3: ; Switch to the kernel stack.<br />
1660200 | ;<br />
1660201 | mov ax, #0x0050 ; Kernel data area.<br />
1660202 | mov ss, ax<br />
1660203 | mov sp, __ksp<br />
1660204 | ;<br />
1660205 | ; Call the external hardware interrupt handler.<br />
1660206 | ;<br />
1660207 | push proc_msg_size<br />
1660208 | push proc_msg_offset<br />
1660209 | push proc_syscallnr<br />
1660210 | push #proc_ss_1 ; &proc_ss_1<br />
1660211 | push #proc_sp_1 ; &proc_sp_1<br />
1660212 | call _sysroutine<br />
1660213 | add sp, #2<br />
1660214 | add sp, #2<br />
1660215 | add sp, #2<br />
1660216 | add sp, #2<br />
1660217 | add sp, #2<br />
1660218 | ;<br />
1660219 | ; Restore process stack registers from kernel data segment.<br />
1660220 | ;<br />
1660221 | mov ss, proc_ss_1 ; Restore process stack segment.<br />
1660222 | mov sp, proc_sp_1 ; Restore process stack pointer.<br />
1660223 | ;<br />
1660224 | ; Restore from process stack:<br />
1660225 | ;<br />
1660226 | pop ax<br />
1660227 | pop cx<br />
1660228 | pop dx<br />
1660229 | pop bx<br />
1660230 | pop bp<br />
1660231 | pop si<br />
1660232 | pop di<br />
1660233 | pop ds<br />
1660234 | pop es<br />
1660235 | ;<br />
1660236 | ; Return from interrupt: will restore CS:IP and FLAGS<br />
1660237 | ; from process stack.<br />
1660238 | ;<br />
1660239 | iret<br />
104.9.2 kernel/proc/_ivt_load.s<br />
Si veda la sezione 103.8.2.<br />
1670001 |.extern isr_1C<br />
1670002 |.extern isr_80<br />
1670003 |.global __ivt_load<br />
1670004 |;-----------------------------------------------------------------------<br />
1670005 |.text<br />
1670006 |;-----------------------------------------------------------------------<br />
1670007 |; Load IVT.<br />
1670008 |;<br />
1670009 |; Currently, only the timer function and the syscall are loaded.<br />
1670010 |;-----------------------------------------------------------------------<br />
1670011 |.align 2<br />
1670012 |__ivt_load:<br />
1670013 | enter #0, #0 ; No local variables.<br />
1670014 | pushf<br />
1670015 | cli<br />
1670016 | pusha<br />
1670017 | ;<br />
1670018 | mov ax, #0 ; Change the DS segment to 0.<br />
1670019 | mov ds, ax ;<br />
1670020 | ;<br />
1670021 | mov bx, #112 ; Timer INT 0x08 (8) --> 0x1C<br />
1670022 | mov [bx], #isr_1C ; offset<br />
1670023 | mov bx, #114 ;<br />
1670024 | mov [bx], cs ; segment<br />
1670025 | ;<br />
1670026 | mov bx, #512 ; Syscall INT 0x80 (128)<br />
1670027 | mov [bx], #isr_80 ; offset<br />
1670028 | mov bx, #514 ;<br />
1670029 | mov [bx], cs ; segment<br />
1670030 | ;<br />
1670031 | mov ax, #0x0050 ; Put the DS segment back to the right<br />
1670032 | mov ds, ax ; value.<br />
1670033 | ;<br />
1670034 | ;<br />
1670035 | ;<br />
1670036 | popa<br />
1670037 | popf<br />
1670038 | leave<br />
1670039 | ret<br />
104.9.3 kernel/proc/proc_available.c<br />
Si veda la sezione 103.8.3.<br />
1680001 |#include <br />
1680002 |//----------------------------------------------------------------------<br />
1680003 |void<br />
1680004 |proc_available (pid_t pid)<br />
1680005 |{<br />
1680006 | proc_table[pid].ppid = -1;<br />
1680007 | proc_table[pid].pgrp = -1;<br />
1680008 | proc_table[pid].uid = -1;<br />
1680009 | proc_table[pid].euid = -1;<br />
1680010 | proc_table[pid].suid = -1;<br />
1680011 | proc_table[pid].sig_status = 0;<br />
1680012 | proc_table[pid].sig_ignore = 0;<br />
1680013 | proc_table[pid].usage = 0;<br />
1680014 | proc_table[pid].status = PROC_EMPTY;<br />
1680015 | proc_table[pid].wakeup_events = 0;<br />
1680016 | proc_table[pid].wakeup_signal = 0;<br />
1680017 | proc_table[pid].wakeup_timer = 0;<br />
1680018 | proc_table[pid].segment_i = -1;<br />
1680019 | proc_table[pid].address_i = -1L;<br />
1680020 | proc_table[pid].size_i = -1;<br />
1680021 | proc_table[pid].segment_d = -1;<br />
1680022 | proc_table[pid].address_d = -1L;<br />
1680023 | proc_table[pid].size_d = -1;<br />
1680024 | proc_table[pid].sp = 0;<br />
1680025 | proc_table[pid].ret = 0;<br />
1680026 | proc_table[pid].inode_cwd = 0;<br />
1680027 | proc_table[pid].path_cwd[0] = 0;<br />
1680028 | proc_table[pid].umask = 0;<br />
1680029 | proc_table[pid].name[0] = 0;<br />
1680030 |}<br />
«<br />
«