关于arm linux中kthread()中的do_exit() 2016-12-31

来自本人的旧博客: http://blog.163.com/awaken_ing/blog/static/12061319720151129103139710

1. 问题

linux-3.10.86/kernel/kthread.c

static int kthread(void *_create)
{
...
    /* we can't just return, we must preserve "self" on stack */
    do_exit(ret);
}

这里注释说不能省略do_exit(), why?

2. 解

2.1 内核创建

内核线程的park和unpark 2016-12-31

来自本人的旧博客: http://blog.163.com/awaken_ing/blog/static/120613197201511307274526

上图为smpbootregisterpercputhread(), kthreadcreateoncpu(), kthreadcreateon_node(), kthreadd()和kthread()之间的关系.

上图为cpu hotplug对内核线程的操作, 以smpbootthreadfn()为例.

内核启动时, smpbootregisterpercputhread()创建,绑定并启动primary cpu的内核线程, 并挂到链表hotplugthreads上.

linux-3.10.86/kernel/smpboot.c

smpboot_register_percpu_thread
{
    __smpboot_create_thread(plug_thread, cpu);
    smpboot_unpark_thread(plug_thread, cpu);
    list_add(&plug_thread->list, &hotplug_threads);
}

ext2 disk layout 2016-12-30

主要为了验证对ext2的 Disk Organization的理解, 诸如Block Group Descriptor, Inode Table之类.
给定一个ext2镜像, 遍历其所有文件, 并显示文件内容.
假定该镜像的文件大小都比较小, 不需要indirect pointer.

address_space和buffer_head的一些field 2016-12-30

1. 问题引入

这里从一个地址空间 到另一个地址空间, 是为啥?

generic_file_fsync
{
    struct inode *inode = file->f_mapping->host;
    ret = sync_mapping_buffers(inode->i_mapping);

}

sync_mapping_buffers(struct address_space *mapping)
{
    struct address_space *buffer_mapping = mapping->private_data;

}

2. 解

linux-3.10.86/include/linux/fs.h

读写函数中的lock_page 2016-12-30

do_generic_file_read和generic_perform_write中对锁的处理.
从磁盘读到RAM中的过程中, page需要处于lock状态.
把用户的数据拷贝到page cahe, 该过程也要处理好lock page问题.