摘要: 1.块设备分区数 alloc_disk()的参数表示该磁盘设备最大可以支持多少个分区,因为实际拥有的分区根据用户如何对其进行分区来决定。如果alloc_disk()的参数是4,那么实际可以支持的最大分区数是4-1=3。 一般用fdisk对磁盘设备进行分区,而fdisk可以将磁盘设备最多分成多少个分区数是由该磁盘拥有的磁道数决定的(cylinder),传统的磁盘使用8个位表示盘面数、6个位表示每磁道扇区数、10个位表示磁道数,因此盘面、每磁道扇区、磁道的最大数值分别为255、63和1023。为了与传统磁盘兼容,对于现代磁盘,我们在访问时还是假设它具有传统的结构:所有磁盘具有最大数目的(也就... 阅读全文
posted @ 2013-10-22 23:15 IrisZhou 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 初始化定义-------------------接下来的符号定义的前提是你知道在你的机器上运行的__virt_to_phy()这个转换函数的意思。这个宏把传进来的虚拟地址转换成物理地址。通常情况下,它可以简化为: phys = virt - PAGE_OFFSET + PHYS_OFFSET解压符号-------------------ZTEXTADDR 解压代码(解压代码负责把内核镜像解压到RAM中的指定地址)的起始地址。此时谈论虚拟或者物理地址没有意义,那是因为当调用解压代码时MMU是关闭的。它不必一定处于RAM中,可以处于flash、其他的只读或可读写媒介。ZBSSADDR 解压代... 阅读全文
posted @ 2013-08-31 15:45 IrisZhou 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 第十四章块设备驱动 本章讲述的是块设备的I/O驱动。块设备的关键点是在CPU和总线读写数据所使用的时间和硬盘速度上的不同。块设备平均访问时间很高。每个操作需要几毫秒才能完成,主要因为磁盘控制器必须把磁盘头从磁盘表面移到记录数据的确切位置。然而,一旦磁盘头准确到位了,数据传输可以维持在较快的速度。 14.1 块设备处理 每个对块设备驱动的操作涉及到大量的内核组件;其中最重要的几个组件展示在图14-1。 图 14-1 一个块设备操作影响到的内核组件 VFS Disk CachesMapping L... 阅读全文
posted @ 2013-08-12 13:37 IrisZhou 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 在创建进程的时候会调用到alloc_pidmap来分配一个空闲的pid。 函数入参是pid_namespace结构体,介绍下该结构体的两个成员: int last_pid 上一个进程所使用的pid; struct pidmap pidmap[PIDMAP_ENTRIES] pid位图数组,pidmap有两个成员:nr_free,用来表征当前位图中的空闲pid个数;page指针,存储一页大小的内存的虚拟地址,也就是pid位图,一页有32768位,每一位代表一个pid,置1表示该位表征的pid已被使用。 来看具体的实现流程: 1 pid = last + 1; 2 ... 阅读全文
posted @ 2013-08-05 11:35 IrisZhou 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: Linux支持多种文件系统类型的方式和其他类Unix系统类似,通过虚拟文件系统来实现。 对每个读,写或其他操作文件系统的调用函数,内核都用实际支持各种文件系统的函数来代替。 12.1 虚拟文件系统(VFS)的角色 VFS是一个内核软件层,用来处理与标准Unix文件系统相关的全部系统调用。它主要作用是为多种文件系统提供通用接口。 VFS是一个在应用程序和(实际的)文件系统实现之间的抽象层。 VFS支持的文件系统可以分成三类: a.基于磁盘的文件系统Disk-based filesystems 管理在本地磁盘或其他模拟磁盘的设备上的可用内存空间。 b.网络文件系... 阅读全文
posted @ 2013-07-22 20:32 IrisZhou 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 首先讲一下对do_siganl_stop()函数的理解。 在内核执行do_signal()来处理信号的时候,在get_signal_to_deliver()中执行sig_kernel_stop()来判断信号的默认动作是否会让进程暂停,即是否属于暂停信号,如果是就以信号为入参执行do_signal_stop()来暂停该进程或线程组。 1 if (!sig->group_stop_count) { 2 struct task_struct *t; 3 4 if (!likely(sig->flags & SIGNAL_STOP_DEQUEUED)... 阅读全文
posted @ 2013-07-20 19:46 IrisZhou 阅读(1834) 评论(0) 推荐(0) 编辑
摘要: send_signal()函数有四个入参,sig表示要发送的信号,info表征信号的一些信息,t接收所发送信号的进程描述符,group表示是发送给描述符t所代表的单个进程还是进程描述符t所处的整个线程组,send_signal()调用__send_signal(),多了个入参from_ancestor_ns,没有过多关注。prepare()函数 __send_signal()首先调用prepare_signal(),内核对该函数的注释是“在信号产生时立即执行,而不用考虑信号是否被阻塞、忽略或者处理。对于SIGCONT信号,它真正使接收进程恢复执行,对于停止信号,该函数还不能真正停止进程。... 阅读全文
posted @ 2013-07-17 23:06 IrisZhou 阅读(3076) 评论(0) 推荐(0) 编辑
摘要: 信号在第一版的Uinx系统中被提出,用来跟用户模式进程进行交互;内核也使用信号来通知进程系统事件的发生。信号机制在近30年只有很小的变动。 11.1 信号的角色 信号是很短的一个信息,可能发送给一个进程或者进程组。发给进程的唯一的信息就是一个用来标识信号的数字。 以前缀SIG开始的宏的集合用来标识信号;比如,SIGCHLD宏,在Linux中的值是17,用来标识当子进程停止或者终止时发给父进程的信号。SIGSEGV宏,用来标识当一个进程访问无效内存时发给它的信号。 信号服务于两种目的:使进程意识到某个指定事件的发生使得一个进程执行在它代码中的信号句柄(signal handler) ... 阅读全文
posted @ 2013-07-15 22:16 IrisZhou 阅读(719) 评论(0) 推荐(0) 编辑
摘要: 3.1 进程,轻量级进程和线程 一个进程通常定义为正在执行的程序实体。你可以把它当做是用来充分描述程序已经执行到何种地步的数据结构的集合。 进程就好像人类一样:它们被生成,它们有个或多或少有点意义的生命周期,它们可以随意生成一个或多个子进程,最终它们都会死去。一个小小的区别是每个进程都只有一个父亲。尽管父进程和子进程可能共享含有程序代码的物理页,但是它们各自有份数据的拷贝(栈和堆),所以子进程对内存的修改对父进程来说是不可见的(反之亦然)。 从早期的内核观点来看,一个多线程的应用程序只是一个普通的进程,内核为其创建多个执行流,对这些执行流的处理和调度完全处于用户态。 现在linux... 阅读全文
posted @ 2013-07-09 00:53 IrisZhou 阅读(464) 评论(0) 推荐(0) 编辑
摘要: 调用platform_device_register和platform_driver_register分别注册platform_device和platform_driver,两者的名字一样(xxx_device),名字不一样调用device_attach会匹配不上,也就不会执行probe函数,在/sys目录下的文件顺序如下: /sys/devices/platform/xxx_device/ uevent subsystem power drivermodalias(bus->dev_attrs) XXX(class->dev_attrs) XXX(device_type-> 阅读全文
posted @ 2013-05-24 14:17 IrisZhou 阅读(2786) 评论(0) 推荐(0) 编辑