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.

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

«

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

Saved successfully!

Ooh no, something went wrong!