1
0
forked from x/ContextOS
2019-05-04 19:10:07 +08:00

5.9 KiB

linux

内核源码

lib arch init kernel include drivers ipc net mm fs

firmware security crypto sound block virt

tools scripts samples Makefile Kconfig Kbuild usr

README COPYING CREDITS Documentation MAINTAINERS REPORTING-BUGS

系统启动

startup_32() // linux-2.6.12/arch/i386/kernel/head.S:57
start_kernel() // linux-2.6.12/init/main.c:424
	sched_init()
    trap_init() // arch/i386/kernel/traps.c
	init_IRQ()
	init_timers()
	softirq_init()
    time_init() // arch/i386/kernel/time.c
        time_init_hook()
            setup_irq(0, timer_interrupt)

进程调度

schedule()

系统中断

interrupt() // arch/i386/kernel/entry.S:397
do_IRQ() // arch/i386/kernel/irq.c:51
    __do_IRQ() // kernel/irq/handle.c:107
        handle_IRQ_event()

do_softirq() // arch/i386/kernel/softirq.c:158
    __do_softirq() // kernel/softirq.c:74

tasklet_schedule() // include/linux/interrupt.h
    __tasklet_schedule() // kernel/softirq.c:223

run_workqueue() // kernel/workqueue.c:145

并发同步

atomic_add() // include/asm-i386/atomic.h
spin_lock_irq() // include/linux/spinlock.h
down_interruptible() // include/asm-i386/semaphore.h
wait_for_completion() // kernel/sched.c

时间管理

timer_interrupt() // arch/i386/kernel/time.c:292
do_timer_interrupt() // arch/i386/kernel/time.c:250
    do_timer_interrupt_hook()
        do_timer() // kernel/timer.c:925

系统调用

system_call() // arch/i386/kernel/entry.S:225
sys_call_table[] // arch/i386/kernel/syscall_table.S
	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */
	.long sys_exit() // kernel/exit.c:859
        do_exit()
        exit_mm()
        exit_sem()
        __exit_files()
        __exit_fs()
        exit_namespace()
        exit_thread()
        cpuset_exit()
        exit_keys()
        exit_notify()
        schedule()
	.long sys_fork // arch/i386/kernel/process.c:645
        do_fork() // kernel/fork.c:1192
            copy_process()
                dup_task_struct()
                copy_files()
                copy_fs()
                copy_sighand()
                copy_signal()
                copy_mm()
                sched_fork()
            wake_up_new_task()
	.long sys_read
	.long sys_write
	.long sys_open		/* 5 */
        get_unused_fd()
        filp_open()
            open_namei()
                path_lookup()
            dentry_open()
        fd_install()

	.long sys_close
	.long sys_waitpid
	.long sys_creat
	.long sys_link
	.long sys_unlink	/* 10 */
	.long sys_execve
	.long sys_chdir
	.long sys_time
...

进程管理

struct task_struct {
    // 进程状态
    state long / TASK_RUNNING // include/linux/sched.h:108

    // 线程信息
    thread_info *struct thread_info
        task *struct task_struct
        status

    // 进程树
    parent *struct task_struct
    children struct list_head
    sibling struct list_head

    mm *struct mm_struct
    binfmt *struct linux_binfmt
    thread struct thread_struct
        esp0
        eip
        esp
        fs
        gs

    fs *struct fs_struct
    files *struct files_struct
    signal *struct signal_struct

    pid pid_t
    tgit pid_t
}

Compile

linux-3.7.4/Makefile
include $(srctree)/arch/$(SRCARCH)/Makefile # linux-3.7.4/Makefile:495

sudo apt-get install libncurses5-dev make defconfig make menuconfig make make tags

GCC

gcc -E hi.c -o hi.i gcc -S hi.c gcc -c hi.c

ar -r hi.a hi.o he.o gcc -shared -fPIC -o hi.so hi.c he.c gcc -L./ -lhi main.c

nm readelf -S hi.o objdump -d hi.o hexdump -C hi.o

GRUB

内核启动

startup_32() // arch/x86/kernel/head_32.S:88
i386_start_kernel() // arch/x86/kernel/head32.c:31
start_kernel() // init/main.c:468
    mm_init()
    sched_init()
    console_init()
    signals_init()
    rest_init()
        kernel_thread(kernel_init)
            do_fork() // kernel/fork.c:1548
                copy_process()
                wake_up_new_task() // kernel/sched/core.c:1622
                    activate_task()
                        enqueue_task(rq, p)

kernel_init() // init/main.c:805
    run_init_process()
        kernel_execve() // fs/exec.c:1710
            do_execve()
                do_execve_common()
                    open_exec()
                    sched_exec() // kernel/sched/core.c:2538
                        select_task_rq()
                    bprm_mm_init()
                    prepare_binprm()
                    search_binary_handler()
                        formats[i]->load_binary()

fair_sched_class() // kernel/sched/fair.c:5308
    select_task_rq_fair()
    pick_next_task_fair()
        pick_next_entity()
            __pick_first_entity()
                rb_entry()

formats[i]->load_binary()
    load_elf_binary() // fs/binfmt_elf.c:561
        current->mm->start_stack
        set_brk(elf_bss, elf_brk)

        start_thread() // arch/x86/kernel/process_32.c:200
formats[i]->load_binary()
    load_script()
        bprm_change_interp()
        open_exec()
        prepare_binprm()
        search_binary_handler()

struct task_struct { // linux-3.7.4/include/linux/sched.h:1190
    mm *struct mm_struct
        start_code
        end_code
        start_data
        end_data
        start_brk
        brk
        mmap_base
        start_stack
        arg_start
        arg_end
        env_start
        env_end

    thread struct thread_struct
        sp0
        sp
        es
        ds
        fsindex
        gsindex
        ip
        fs
        gs

    fs *struct fs_struct
    files *struct files_struct
    pid pid_t
    tgid pit_t
}