Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中返回 编写中断处理程序 软中断.tasklet与工作队列 上半部与下半部 软中断 tasklet 工作队列 1 为什么要有中断 1.1 中…
Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BIOS POST 自举过程 Boot loader 主引导扇区结构 GRUB stage1 GRUB stage2 内核初始化:体系结构相关部分 内核映像结构 header.S 初始化与保护模式 自解压内核 startup_32 内核初始化:体系结构无关部分 核心数据结构初始化 设备初始化 1 Lin…
Linux源代码阅读——环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 定制安装 Ubuntu 安装工具链 编译 Linux 内核 默认编译 自定义编译 模拟执行 Linux 用 qemu 模拟 Hello World 系统 准备源码阅读环境 vim 基本设置 在 vim 中使用 cscope 在 vim 中使用 ctags 使用 taglist 显示 symbol…
Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混合编写成的XV6引导加载器.bootasm.S内的汇编代码会调用bootmain.c中的void bootmain(void):main.c主函数内部初始化各模块: 当x86 PC启动时,它执行的是一个叫BIOS的程序.BIOS存放在非易失存储器中,BIOS的作用是在启动时进行硬件的准备工作,接着把控制权交给操作系统.具体来说,BI…
78 static struct buffer_head * find_entry(struct m_inode * dir, 79 const char * name, int namelen, struct dir_entry ** res_dir) find_entry是linux文件系统中一个较为费解的函数.下面我们来分析一番. 它的第一个参数是 m_inode型,它指示了函数操作的所在根目录的inode节点.即相对路径的起始节点. name自然是想要查找的目录路径,namelen是该目…
上一篇文章说到linux文件系统中分为超级块,inode块,block块.inode块给出文件的权限,修改时间,大小等信息. 但是实际上,文件的数据是存储在block块中的.而inode块中给出了存储文件数据的block的编号.每个inode和block都有编号.文件系统一开始就将inode与block规划好了 block块,inode块,超级块在物理上并无区别.大小一致. 在linux上新建一个目录的过程: 当我们在ext2文件系统上新建一个目录时,ext2会分配一个inode与至少一块blo…
linux文件系统:   操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者.群组.时间参数等).   文件系统通常将这两部分数据存放在不同的块.权限属性放到 inode 中,实际数据放到 data block 中. 还有一个超级块(super block)会记录文件系统的整体信息,包括 inode 与block 的数量.使用量等.     inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码:   block…
高速缓冲区是文件系统访问块设备中数据的必经要道,为了访问文件系统等块设备上的数据,内核可以每次都访问块设备,进行读写操作. 为了提高系统性能,内核在内存中开辟一个高速数据缓冲区.在Linux内核中,高速缓冲区位于内核代码和主内存之间. 当需要从块设备中读取数据时,先到高速缓冲区中寻找,若找不到,就发出读块设备命令,块设备将数据写入高速缓冲区中. 高速缓冲区划分为块,每块的大小恰好和硬盘中的存储单元相同. Linux中,高速缓冲区的实际组织形式较为复杂. 首先看它的结构体: 56 struct b…
/* 77 * This function frees a continuos block of page tables, as needed 78 * by 'exit()'. As does copy_page_tables(), this handles only 4Mb blocks. 79 */ int free_page_tables(unsigned long from,unsigned long size)//size以B为单位而不是以页表为单位 { unsigned long…
/* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no free pages left, return 0. 36 */ unsigned long get_free_page(void) { register unsigned long __res asm("ax"); __asm__("std ; repne ; scasw\n\t&q…