day3.内核中断代码实现过程分析

1.trap_init

        set_trap_gate              设置的权限较高,只能由用户程序调用

        set_system_gate        设置的权限较低,能由用户和系统所有进程调用 

2.system_call

        所有的系统调用C函数放到了统一的sys_call_table

fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid };

系统进程管理

        1.系统进程的运转方式

系统时间:(giffies 系统滴答)

CPU内部有一个RTC,会在上电的时候调用mktime计算出从1970年1月1日0时所过的秒数,给mktime函数传来的结构体是由初始化时RTC(CMOS)获取的参数,转化为时间保存在一个全局变量,并给GIFFITES所用

jiffers是一个系统的时钟滴答,一个系统滴答是10ms

10ms一个时钟滴答----》每10ms引发一个定时器中断

中断服务函数中,首先进行jiffies++

        timer_interrupt

        call do_timer

调用do_timer函数

        if(cpl)                        //CPL变量是内核中用来指示被中断程序的特权  0表示内核进程 1表示被中断的是用户进程

                current->utime++;   //用户程序的运行时间

        else

                current->stime++;   //内核程序的运行时间

next_timer 是嫁接与jiffies变量的所有定时器的时间链表

current->counter  ---->进程的时间片

task_struct   一个进程 task_struct[] 进程向量表 counter

counter --在哪里用  进程的调度就是task_struct[]进程链表的检索,找时间片最大的进程对象,然后进行调用,知道时间片为0,退出 之后进行新一轮的调用。

counter --在哪里被设置  当全部的task_struct[]所有的进程的counter都为0,就进行新一轮的时间片分配
(*p)->counter=((*p)->counter>>1)+(*p)->priority;

        2.如何创建一个新的进程

        3.进程调度

        4.进程的退出

        5.进程间通信

你可能感兴趣的:(linux内核,linux)