2007.6.4.am
今天讨论到内核启动阶段对外部设备初始化的过程,于是粗略的看了一下相关代码,得到以下一些印象(未必正确,希望大家指正):
1.对外部设备初始化代码出现的地方应该是init()进程
(bootloader->start汇编->decompress->start_kernel()->rest_init()->kernel_thread()->init() )
2.init()里的do_basic_setup(),do_basic_setup()调用driver_init()和do_initcalls()
3.driver_init()初始化各种外部设备、总线等的kobject结构
4.do_initcalls()用result = (*call)();这句代码在for循环中去调用.initcall.init节中的各个驱动初始化函数指针去执行初始化。在arch/xxx/vmlinux.lds中会有对__initcall_start和__initcall_end的定义。
5.驱动程序初始化代码中会有probe函数去探测设备。
2007.6.4.pm
写时拷贝:fork时并不复制整个进程地址空间,而是让父进程与子进程共享一个拷贝,只有在需要写入的时候,数据才会被复制,这使得地址空间上页的拷贝被推迟到实际发生写入的时候。比如说fork后直接调用exec,那么就无需复制了。
fork( ):fork->clone->do_fork->copy_process和wake_up_new_task
线程在Linux上的实现:从内核的角度来说,Linux没有线程这个概念,它把所有线程都当作进程处理,线程仅仅被视为一个与其他进程共享某些资源的进程,每个线程都拥有唯一隶属于自己的task_struct。创建线程时通过clone( )传递的标志位来指明需要共享的资源。
-
CLONE_FILES 共享打开的文件
-
CLONE_SIGHAND 共享信号处理函数
-
CLONE_VM 共享地址空间