24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!