You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
266 volume VI os16<br />
Script e sorgenti del kernel 267<br />
«<br />
1640016 | }<br />
1640017 | ram_copy (seg_d (), (unsigned int) buffer, segment, offset, size);<br />
1640018 | return (size);<br />
1640019 |}<br />
104.9 os16: «kernel/proc.h»<br />
Si veda la sezione 103.8.<br />
1650001 |#ifndef _KERNEL_PROC_H<br />
1650002 |#define _KERNEL_PROC_H 1<br />
1650003 |<br />
1650004 |#include <br />
1650005 |#include <br />
1650006 |#include <br />
1650007 |#include <br />
1650008 |#include <br />
1650009 |#include <br />
1650010 |#include <br />
1650011 |#include <br />
1650012 |#include <br />
1650013 |#include <br />
1650014 |<br />
1650015 |//----------------------------------------------------------------------<br />
1650016 |#define CLOCK_FREQUENCY_DIVISOR 65535 // [1]<br />
1650017 |//<br />
1650018 |// [1]<br />
1650019 |// Internal clock frequency is (3579545/3) Hz.<br />
1650020 |// This value is divided by 65535 (0xFFFF) giving 18.2 Hz.<br />
1650021 |// The divisor value, 65535, if fixed!<br />
1650022 |//<br />
1650023 |//----------------------------------------------------------------------<br />
1650024 |#define PROC_EMPTY 0<br />
1650025 |#define PROC_CREATED 1<br />
1650026 |#define PROC_READY 2<br />
1650027 |#define PROC_RUNNING 3<br />
1650028 |#define PROC_SLEEPING 4<br />
1650029 |#define PROC_ZOMBIE 5<br />
1650030 |//----------------------------------------------------------------------<br />
1650031 |#define MAGIC_OS16 0x6F733136L // os16<br />
1650032 |#define MAGIC_OS16_APPL 0x6170706CL // appl<br />
1650033 |#define MAGIC_OS16_KERN 0x6B65726EL // kern<br />
1650034 |//----------------------------------------------------------------------<br />
1650035 |#define PROCESS_MAX 16 // Process slots.<br />
1650036 |<br />
1650037 |typedef struct {<br />
1650038 | pid_t ppid; // Parent PID.<br />
1650039 | pid_t pgrp; // Process group ID.<br />
1650040 | uid_t uid; // Real user ID<br />
1650041 | uid_t euid; // Effective user ID.<br />
1650042 | uid_t suid; // Saved user ID.<br />
1650043 | dev_t device_tty; // Controlling terminal.<br />
1650044 | char path_cwd[PATH_MAX];<br />
1650045 | // Working directory path.<br />
1650046 | inode_t *inode_cwd; // Working directory inode.<br />
1650047 | int umask; // File creation mask.<br />
1650048 | unsigned long int sig_status; // Active signals.<br />
1650049 | unsigned long int sig_ignore; // Signals to be ignored.<br />
1650050 | clock_t usage; // Clock ticks CPU time usage.<br />
1650051 | unsigned int status;<br />
1650052 | int wakeup_events; // Wake up for something.<br />
1650053 | int wakeup_signal; // Signal waited.<br />
1650054 | unsigned int wakeup_timer; // Seconds to wait for.<br />
1650055 | addr_t address_i;<br />
1650056 | segment_t segment_i;<br />
1650057 | size_t size_i;<br />
1650058 | addr_t address_d;<br />
1650059 | segment_t segment_d;<br />
1650060 | size_t size_d;<br />
1650061 | uint16_t sp;<br />
1650062 | int ret;<br />
1650063 | char name[PATH_MAX];<br />
1650064 | fd_t fd[FOPEN_MAX];<br />
1650065 |} proc_t;<br />
1650066 |<br />
1650067 |extern proc_t proc_table[PROCESS_MAX];<br />
1650068 |//----------------------------------------------------------------------<br />
1650069 |typedef struct {<br />
1650070 | uint32_t filler0;<br />
1650071 | uint32_t magic0;<br />
1650072 | uint32_t magic1;<br />
1650073 | uint16_t segoff;<br />
1650074 | uint16_t etext;<br />
1650075 | uint16_t edata;<br />
1650076 | uint16_t ebss;<br />
1650077 | uint16_t ssize;<br />
1650078 |} header_t;<br />
1650079 |//----------------------------------------------------------------------<br />
1650080 |void _ivt_load (void);<br />
1650081 |#define ivt_load() (_ivt_load ())<br />
1650082 |void proc_init (void);<br />
1650083 |void proc_scheduler (uint16_t *sp, segment_t *segment);<br />
1650084 |void sysroutine (uint16_t *sp, segment_t *segment,<br />
1650085 | uint16_t syscallnr, uint16_t msg_off,<br />
1650086 | uint16_t msg_size);<br />
1650087 |proc_t *proc_reference (pid_t pid);<br />
1650088 |//----------------------------------------------------------------------<br />
1650089 |int proc_sys_exec (uint16_t *sp, segment_t *segment_d,<br />
1650090 | pid_t pid, const char *path,<br />
1650091 | unsigned int argc, char *arg_data,<br />
1650092 | unsigned int envc, char *env_data);<br />
1650093 |void proc_sys_exit (pid_t pid, int status);<br />
1650094 |pid_t proc_sys_fork (pid_t ppid, uint16_t sp);<br />
1650095 |int proc_sys_kill (pid_t pid_killer, pid_t pid_target,<br />
1650096 | int sig);<br />
1650097 |int proc_sys_seteuid (pid_t pid, uid_t euid);<br />
1650098 |int proc_sys_setuid (pid_t pid, uid_t uid);<br />
1650099 |sighandler_t proc_sys_signal (pid_t pid, int sig,<br />
1650100 | sighandler_t handler);<br />
1650101 |pid_t proc_sys_wait (pid_t pid, int *status);<br />
1650102 |//----------------------------------------------------------------------<br />
1650103 |void proc_dump_memory (pid_t pid, addr_t address,<br />
1650104 | size_t size, char *name);<br />
1650105 |void proc_available (pid_t pid);<br />
1650106 |pid_t proc_find (segment_t segment_d);<br />
1650107 |void proc_sch_signals (void);<br />
1650108 |void proc_sch_terminals (void);<br />
1650109 |void proc_sch_timers (void);<br />
1650110 |void proc_sig_chld (pid_t parent, int sig);<br />
1650111 |void proc_sig_cont (pid_t pid, int sig);<br />
1650112 |void proc_sig_core (pid_t pid, int sig);<br />
1650113 |int proc_sig_ignore (pid_t pid, int sig);<br />
1650114 |void proc_sig_off (pid_t pid, int sig);<br />
1650115 |void proc_sig_on (pid_t pid, int sig);<br />
1650116 |int proc_sig_status (pid_t pid, int sig);<br />
1650117 |void proc_sig_stop (pid_t pid, int sig);<br />
1650118 |void proc_sig_term (pid_t pid, int sig);<br />
1650119 |<br />
1650120 |#endif<br />
104.9.1 kernel/proc/_isr.s<br />
Si veda la sezione 103.8.1.<br />
1660001 |.extern _proc_scheduler<br />
1660002 |.extern _sysroutine<br />
1660003 |.global __ksp<br />
1660004 |.global __clock_ticks<br />
1660005 |.global __clock_seconds<br />
1660006 |.global isr_1C<br />
1660007 |.global isr_80<br />
1660008 |;-----------------------------------------------------------------------<br />
1660009 |; The kernel code segment starts at 0x10500 (segment 0x1050).<br />
1660010 |; The kernel data segments start at 0x00500 (segment 0x0050).<br />
1660011 |; To switch to the kernel data segments, DS, ES and SS are set to<br />
1660012 |; 0x0050. To identify the kernel context, the DS register is checked:<br />
1660013 |; if it is equal to 0x0050, it is the kernel.<br />
1660014 |;-----------------------------------------------------------------------<br />
1660015 |.data<br />
1660016 |;-----------------------------------------------------------------------<br />
1660017 |.align 2<br />
1660018 |proc_ss_0: .word 0x0000<br />
1660019 |proc_sp_0: .word 0x0000<br />
1660020 |proc_ss_1: .word 0x0000<br />
1660021 |proc_sp_1: .word 0x0000<br />
1660022 |proc_syscallnr: .word 0x0000<br />
1660023 |proc_msg_offset: .word 0x0000<br />
1660024 |proc_msg_size: .word 0x0000<br />
1660025 |__ksp: .word 0x0000<br />
1660026 |__clock_ticks:<br />
1660027 |ticks_lo: .word 0x0000<br />
1660028 |ticks_hi: .word 0x0000<br />
1660029 |__clock_seconds:<br />
1660030 |seconds_lo: .word 0x0000<br />
1660031 |seconds_hi: .word 0x0000<br />
1660032 |;-----------------------------------------------------------------------<br />
1660033 |.text<br />
1660034 |;-----------------------------------------------------------------------<br />
1660035 |; IRQ 0: "timer".<br />
1660036 |; IRQ 0 is associated to INT 8, and after the BIOS work is done,<br />
1660037 |; INT 1C is called. Standard INT 1C has nothing to do, but is<br />
1660038 |; useful to call extra work for the timer. As the original BIOS<br />
1660039 |; interrupts are used, the INT 1C is reprogrammed, keeping intact<br />
1660040 |; the Standard INT 8.<br />
1660041 |;-----------------------------------------------------------------------<br />
1660042 |.align 2<br />
1660043 |isr_1C:<br />
1660044 | ;-------------------------------------------------------------------<br />
1660045 | ; Inside the process stack, the CPU already put:<br />
1660046 | ;<br />
1660047 | ; [omissis]<br />
1660048 | ; push flags<br />
1660049 | ; push cs<br />
1660050 | ; push ip<br />
1660051 | ;-------------------------------------------------------------------<br />
1660052 | ;<br />
1660053 | ; Save into process stack:<br />
1660054 | ;<br />
1660055 | push es ; extra segment<br />
1660056 | push ds ; data segment<br />
1660057 | push di ; destination index<br />
1660058 | push si ; source index<br />
1660059 | push bp ; base pointer<br />
1660060 | push bx ; BX<br />
1660061 | push dx ; DX<br />
1660062 | push cx ; CX<br />
1660063 | push ax ; AX<br />
1660064 | ;<br />
1660065 | ; Set the data segments to the kernel data area,<br />
1660066 | ; so that the following variables can be accessed.<br />
1660067 | ;<br />
1660068 | mov ax, #0x0050 ; DS and ES.<br />
1660069 | mov ds, ax ;<br />
1660070 | mov es, ax ;<br />
1660071 | ;<br />
1660072 | ; Increment time counters, to keep time.<br />
1660073 | ;<br />
1660074 | add ticks_lo, #1 ; Clock ticks counter.<br />
1660075 | adc ticks_hi, #0 ;<br />
1660076 | ;<br />
1660077 | mov dx, ticks_hi ;<br />
1660078 | mov ax, ticks_lo ; DX := ticks % 18<br />
1660079 | mov cx, #18 ;<br />
1660080 | div cx ;<br />
1660081 | mov ax, #0 ; If the ticks value can be divided by 18,<br />
1660082 | cmp ax, dx ; the seconds is incremented by 1.<br />
1660083 | jnz L1 ;<br />
1660084 | add seconds_lo, #1 ;<br />
1660085 | adc seconds_hi, #0 ;<br />
1660086 | ;<br />
1660087 |L1: ; Save process stack registers into kernel data segment.<br />
1660088 | ;<br />
1660089 | mov proc_ss_0, ss ; Save process stack segment.<br />
1660090 | mov proc_sp_0, sp ; Save process stack pointer.<br />
1660091 | ;<br />
1660092 | ; Check if it is already in kernel mode.<br />
1660093 | ;<br />
1660094 | mov dx, proc_ss_0<br />
1660095 | mov ax, #0x0050 ; Kernel data area.<br />
1660096 | cmp dx, ax<br />
1660097 | je L2<br />
«