## 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 - 下载: BIOS MBR 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 } ```