16537:9:processed,5783:/* * 'sched.c' is the main kernel file. It contains scheduling primitives * (sleep_on, wakeup, schedule etc) as well as a number of simple system * call functions (type getpid(), which just extracts a field from * current-task */ #include #include #include #include #include #include #include #define LATCH (1193180/HZ) extern void mem_use(void); extern int timer_interrupt(void); extern int system_call(void); union task_union { struct task_struct task; char stack[PAGE_SIZE]; }; static union task_union init_task = {INIT_TASK,}; long volatile jiffies=0; long startup_time=0; struct task_struct *current = &(init_task.task), *last_task_used_math = NULL; struct task_struct * task[NR_TASKS] = {&(init_task.task), }; long user_stack [ PAGE_SIZE>>2 ] ; struct { long * a; short b; } stack_start = { & user_stack [PAGE_SIZE>>2] , 0x10 }; /* * 'math_state_restore()' saves the current math information in the * old math state array, and gets the new ones from the current task */ void math_state_restore() { if (last_task_used_math) __asm__("fnsave %0"::"m" (last_task_used_math->tss.i387)); if (current->used_math) __asm__("frstor %0"::"m" (current->tss.i387)); else { __asm__("fninit"::); current->used_math=1; } last_task_used_math=current; } /* * 'schedule()' is the scheduler function. This is GOOD CODE! There * probably won't be any reason to change this, as it should work well * in all circumstances (ie gives IO-bound processes good response etc). * The one thing you might take a look at is the signal-handler code here. * * NOTE!! Task 0 is the 'idle' task, which gets called when no other * tasks can run. It can not be killed, and it cannot sleep. The 'state' * information in task[0] is never used. */ void schedule(void) { int i,next,c; struct task_struct ** p; /* check alarm, wake up any interruptible tasks that have got a signal */ for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) if (*p) { if ((*p)->alarm && (*p)->alarm < jiffies) { (*p)->signal |= (1<<(SIGALRM-1)); (*p)->alarm = 0; } if ((*p)->signal && (*p)->state==TASK_INTERRUPTIBLE) (*p)->state=TASK_RUNNING; } /* this is the scheduler proper: */ while (1) { c = -1; next = 0; i = NR_TASKS; p = &task[NR_TASKS]; while (--i) { if (!*--p) continue; if ((*p)->state == TASK_RUNNING && (*p)->counter > c) c = (*p)->counter, next = i; } if (c) break; for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) if (*p) (*p)->counter = ((*p)->counter >> 1) + (*p)->priority; } switch_to(next); } int sys_pause(void) { current->state = TASK_INTERRUPTIBLE; schedule(); return 0; } void sleep_on(struct task_struct **p) { struct task_struct *tmp; if (!p) return; if (current == &(init_task.task)) panic("task[0] trying to sleep"); tmp = *p; *p = current; current->state = TASK_UNINTERRUPTIBLE; schedule(); if (tmp) tmp->state=0; } void interruptible_sleep_on(struct task_struct **p) { struct task_struct *tmp; if (!p) return; if (current == &(init_task.task)) panic("task[0] trying to sleep"); tmp=*p; *p=current; repeat: current->state = TASK_INTERRUPTIBLE; schedule(); if (*p && *p != current) { (**p).state=0; goto repeat; } *p=NULL; if (tmp) tmp->state=0; } void wake_up(struct task_struct **p) { if (p && *p) { (**p).state=0; *p=NULL; } } void do_timer(long cpl) { if (cpl) current->utime++; else current->stime++; if ((--current->counter)>0) return; current->counter=0; if (!cpl) return; schedule(); } int sys_alarm(long seconds) { current->alarm = (seconds>0)?(jiffies+HZ*seconds):0; return seconds; } int sys_getpid(void) { return current->pid; } int sys_getppid(void) { return current->father; } int sys_getuid(void) { return current->uid; } int sys_geteuid(void) { return current->euid; } int sys_getgid(void) { return current->gid; } int sys_getegid(void) { return current->egid; } int sys_nice(long increment) { if (current->priority-increment>0) current->priority -= increment; return 0; } int sys_signal(long signal,long addr,long restorer) { long i; switch (signal) { case SIGHUP: case SIGINT: case SIGQUIT: case SIGILL: case SIGTRAP: case SIGABRT: case SIGFPE: case SIGUSR1: case SIGSEGV: case SIGUSR2: case SIGPIPE: case SIGALRM: case SIGCHLD: i=(long) current->sig_fn[signal-1]; current->sig_fn[signal-1] = (fn_ptr) addr; current->sig_restorer = (fn_ptr) restorer; return i; default: return -1; } } void sched_init(void) { int i; struct desc_struct * p; set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt)); p = gdt+2+FIRST_TSS_ENTRY; for(i=1;ia=p->b=0; p++; p->a=p->b=0; p++; } ltr(0); lldt(0); outb_p(0x36,0x43); /* binary, mode 3, LSB/MSB, ch 0 */ outb_p(LATCH & 0xff , 0x40); /* LSB */ outb(LATCH >> 8 , 0x40); /* MSB */ set_intr_gate(0x20,&timer_interrupt); outb(inb_p(0x21)&~0x01,0x21); set_system_gate(0x80,&system_call); },8:metadata,5783:cc 1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1cccccccccccccc 1cc cccccccccccccccccccccccc ccccccccccccccccccccccccc ccccccccccccccccccc cccccccccccccccccccccc ccccccccccccccccccccccc ccccccccccccccccccc cccccccccccccccccccccccc PkkkkkkpppppppPlllllllPppP kkkkkkpkkkkppppppppPkkkkPP kkkkkkptttppppppppppppppppPkkkkPP kkkkkkptttppppppppppppPkkkkPP kkkkkppppppppppppP 1111kkkkkkpppppppppppppppppP 1111kkkkptttttPpppppppppPP PP kkkkkkpkkkkkppppppppppppppppppppppPpPpppppppppPPP kkkkpkkkkkkkkppppppppPlP kkkkpppppppppppppPlP kkkkkkpppppppppppppPppppppppPpPPpppppppppPppppPPpPppppppppppppppppppppPpppppP kkkkkkpppppppppppppPpppppPppppppppPpPpPPPpppppppppPppppPPpPP kkkkppppppppppppPppppppppppPPlpPpP kkkkkkpP 1111kkkkpPppP 1111kkkkkppP 1111PpppppppppppppPpPpPppppppppppppPpppppppppPPlPpPpllllpPP cc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1cc kkkkpppppppppppppppppppPP P 1111kkpPpppppppppppppppppppP 11111111pppppppPsssssssssssPPssspPpppppppppppppppppppPPpppPppppPPP 1111kkpPpppppppPPpppppppppP 11111111pppppppPsssssssssssPPssspPpppppppPPpppPppppPPP 1111kkkkpP 11111111pppppppPssssssssPPPP 11111111pppppppPPpppppppppPlP 1111P 1111pppppppppppppppppppPpppppppP P cc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1c 1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1ccccccccccccccccccccccccccccccccccccccc 1cc kkkkpppppppppPkkkkP P 1111tttppPppppPpP 1111kkkkkkpppppppppppppPPppP ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1111kkkPppPpPppppppppppPpppPpPpppppppppppPpPPpP 11111111kkpPPpPpP 111111111111kkpPPPpPPPppppppPPpPPpPPPppppppPppppppppPpP 11111111111111111111PPpPPPpppppppPPpPlPPPpppppppPlPPP 11111111111111111111PPpPPPppppppPplP 1111111111111111P 111111111111kkpPPPpPPPpppppppPPpPPpPPPpppppPPppppppppppppppppppP 1111111111111111PPpPPPpppppPppppppppppppP 11111111P ccccccccccccccccccccccccccccccccccc 1111kkkkkpPlPpP 11111111ppPpPlP 11111111pppppPplP 11111111ppPpppppppppP 11111111ppPpPppppPppppppppPP 11111111kkkkkpPPPpPpP 111111111111kkpPPPPPpP 1111111111111111kkkkkkkkP 111111111111kkpPPPpPPPppppppPPppppppppppppppPPpPPpPPPppppppppPppP 1111111111111111ppPpPPpPPPpppppppPppppppPppP 11111111P 11111111kkpPpPpkkkkkP 11111111kkkPppPpPppppppppppPpppPpPpppppppppppPpPPpP 111111111111kkpPPpP 1111111111111111PPpPPPppppppppPpPPPpPPPppppppppPPplPpP 111111111111111111111111PPpPPPppppppppP 1111P 1111pppppppppPppppPP P tttppppppppppPkkkkP P 1111pppppppPPppppppPpppppppppppppppppppP 1111ppppppppPPP 1111kkkkkkplP P kkkkpppppppppPkkkkkkpppppppppppppPPpP P 1111kkkkkkpppppppppppppPpppP 1111kkpPPpP 11111111kkkkkkP 1111kkpPppppppppPPpPPpppppppppPppppPP 11111111pppppPsssssssssssssssssssssssssPP 1111ppppPpPpP 1111PppPppppppppP 1111pppppppPPppppppPpppppppppppppppppppppP 1111ppppppppPPP 1111kkpPpppP 11111111pppPPpppppPlP P kkkkpppppppppppppppppppppppPkkkkkkpppppppppppppPPpP P 1111kkkkkkpppppppppppppPpppP 1111kkpPPpP 11111111kkkkkkP 1111kkpPppppppppPPpPPpppppppppPppppPP 11111111pppppPsssssssssssssssssssssssssPP 1111pppPPpP 1111PpPpppppppP ppppppPppppppppPPppppppPpppppppppppppppppppP 1111ppppppppPPP 1111kkpPPppPPpPppPPppppppppPpP 11111111PPPpPPpppppPlP 11111111kkkkpppppppP 1111P 1111PpPppppP 1111kkpPpppP 11111111pppPPpppppPlP P kkkkppppppppPkkkkkkpppppppppppppPPpP P 1111kkpPppPPpPpPpP 11111111PPPpPPpppppPlP 11111111PpPppppP 1111P P kkkkpppppppppPkkkkppppP P 1111kkpPpppP 11111111pppppppPPpppppPPP 1111kkkk 11111111pppppppPPpppppPPP 1111kkpPPPPpppppppPPpppppppPPlPpkkkkkkP 1111pppppppPPpppppppPlP 1111kkpPPpppPpkkkkkkP 1111ppppppppPPP P tttppppppppppPkkkkppppppppP P 1111pppppppPPppppppPpPpppppppPlPPPpppppppPppPpppppppPPlP 1111kkkkkkppppppppP P tttpppppppppppPkkkkP P 1111kkkkkkppppppppPPpppP P tttppppppppppppPkkkkP P 1111kkkkkkppppppppPPppppppP P tttpppppppppppPkkkkP P 1111kkkkkkppppppppPPpppP P tttppppppppppppPkkkkP P 1111kkkkkkppppppppPPppppP P tttpppppppppppPkkkkP P 1111kkkkkkppppppppPPpppP P tttppppppppppppPkkkkP P 1111kkkkkkppppppppPPppppP P tttpppppppppPkkkkppppppppppP P 1111kkpPpppppppPPppppppppPpppppppppPlP 11111111pppppppPPpppppppppPPppppppppppP 1111kkkkkkplP P tttpppppppppppPkkkkpppppppPkkkkpppppPkkkkpppppppppP P 1111kkkkppP 1111kkkkkkpPppppppPpP 11111111kkkkpppppppPpkkkkpppppppPpkkkkppppppppPpkkkkpppppppP 11111111kkkkppppppppPpkkkkppppppppPpkkkkpppppppPpkkkkppppppppP 11111111kkkkppppppppPpkkkkppppppppPpkkkkppppppppPpkkkkppppppppP 11111111kkkkppppppppP 111111111111pPPkkkkPppppppppPPppppppPppppppPlPP 111111111111pppppppPPppppppPppppppPlPpPpPppppppPpppppP 111111111111pppppppPPpppppppppppppPpPppppppPpppppppppP 111111111111kkkkkkppP 11111111kkkkkkkPpkkkkkkpPlP 1111P P kkkkpppppppppppPkkkkP P 1111tttppP 1111kkkkkkpppppppppppppPppP 1111ppppppppppppPpppPpppppppppppppppPPPpppppppppPppppPpppPPP 1111ppppppppppppPpppPpppppppppppppppPPPpppppppppPppppPpppPPP 1111ppPppppPlPpppppppppppppppP 1111kkkPpPlPpPppppppppPpPPPpP 11111111ppppPpPpPpppppP 11111111pPPpPpPPpPlP 11111111pPPP 11111111pPPpPpPPpPlP 11111111pPPP 1111P 1111pppPlPP 1111ppppPlPP 1111ppppppPllllPllllPP2ccccccccccccccccccccccccccccccccccc 1111ppppppPppppppPpllllpPpllllPP2ccccccccc 1111ppppPppppppPPplpPpllllPP2ccccccccc 1111pppppppppppppPllllPPpppppppppppppppPP 1111ppppPpppppPllllPPPllllPllllPP 1111pppppppppppppppPllllPPpppppppppppPP P,6:quotes,4921:666:
I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). Linus Torvalds Pre-release Announcement
August 26, 1991
,572:
The Finnish keyboard is hard-wired, and as I don't have a US one I cannot change it without major problems. See kernel/keyboard.s for details. If anybody is willing to make an even partial port, I'd be grateful. Shouldn't be too hard, as it's tabledriven (it's assembler though, so ...) Linus Torvalds 0.01 Release Notes
September 17, 1991
,495:

Efficient use of the possibilities offered by the 386 chip.

Minix was written on a 8088, and later ported to other machines - linux takes full advantage of the 386 (which is nice if you /have/ a 386, but makes porting very difficult)

Linus Torvalds 0.01 Release Notes
,539:

No message passing, this is a more traditional approach to unix.

System calls are just that - calls. This might or might not be faster, but it does mean we can dispense with some of the problems with messages (message queues etc). Of course, we also miss the nice features :-p. Linus Torvalds 0.01 Release Notes

,546:

Multithreaded FS - a direct consequence of not using messages.

This makes the filesystem a bit (a lot) more complicated, but much nicer. Coupled with a better scheduler, this means that you can actually run several processes concurrently without the performance hit induced by minix. Linus Torvalds 0.01 Release Notes
,690:

Interrupts aren't hidden.

Some people (among them Tanenbaum) think interrupts are ugly and should be hidden. Not so IMHO. Due to practical reasons interrupts must be mainly handled by machine code, which is a pity, but they are a part of the code like everything else. Especially device drivers are mostly interrupt routines - see kernel/hd.c etc. Linus Torvalds 0.01 Release Notes
,641:
There is no distinction between kernel/fs/mm, and they are all linked into the same heap of code. This has it's good sides as well as bad. The code isn't as modular as the minix code, but on the other hand some things are simpler. The different parts of the kernel are under different sub-directories in the source tree, but when running everything happens in the same data/code space. Linus Torvalds 0.01 Release Notes
,687:
I can (well, almost) hear you asking yourselves "why?". Hurd will be out in a year (or two, or next month, who knows), and I've already got minix. This is a program for hackers by a hacker. I've enjoyed doing it, and somebody might enjoy looking at it and even modifying it for their own needs. It is still small enough to understand, use and modify, and I'm looking forward to any comments you might have. Linus Torvalds 0.02 Release Announcement
,41:
Thanks Linus
,]}