`
Michaelmatrix
  • 浏览: 208997 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Linux内核&驱动学习笔记(一)

 
阅读更多

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

进程描述符:task_struct 该结构由叫做任务队列(task list)的双向循环链表管理,该结构包含内核管理一个进程所需的所有信息(进程打开的文件、进程的地址空间、挂起的信号、进程的状态等等),linux通过slab分配器分配task_struct结构。

写时拷贝:fork时并不复制整个进程地址空间,而是让父进程与子进程共享一个拷贝,只有在需要写入的时候,数据才会被复制,这使得地址空间上页的拷贝被推迟到实际发生写入的时候。比如说fork后直接调用exec,那么就无需复制了。

fork( ):fork->clone->do_fork->copy_processwake_up_new_task

线程在Linux上的实现:从内核的角度来说,Linux没有线程这个概念,它把所有线程都当作进程处理,线程仅仅被视为一个与其他进程共享某些资源的进程,每个线程都拥有唯一隶属于自己的task_struct。创建线程时通过clone( )传递的标志位来指明需要共享的资源。

  • CLONE_FILES 共享打开的文件
  • CLONE_SIGHAND 共享信号处理函数
  • CLONE_VM 共享地址空间
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics