linux内核初探
文章平均质量分 67
详细介绍本人对linux内核的理解
nginux
阿里巴巴
展开
-
写文件的流程
许多文件系统都是通过generic_file_write()函数来实现文件对象的write方法,即write(库函数)->sys_write()->generic_file_write():ssize_t generic_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)原创 2014-06-15 16:37:27 · 1654 阅读 · 0 评论 -
文件读写的理论
为了提高效率,稍微复杂一些的操作系统对文件的读写都是带缓冲的,Linux当然也不例外。所谓缓冲,就是操作系统为最近刚读写的文件内容在内核保留一份副本,以便当再次需要已经缓冲存储在副本中的内容时就不必再临时从设备上读入,而需要写的时候则可以先写到副本中,待系统较为空闲的时候再从副本写入设备。在多进程的系统中,由于同一个文件可能为多个进程所共享,缓冲的作用就更为显著。然而,怎么样实现缓冲,在哪一个原创 2014-06-14 11:17:59 · 1351 阅读 · 0 评论 -
brk系统调用实现分析
brk(addr)直接修改堆的大小。addr指定current->mm->brk的新值,返回值是线性区新的结束地址,这是一个系统调用。当用户态的进程调用brk()系统调用时,内核执行sys_brk(addr)函数。下面分析这个函数的执行流程:1:检测addr参数是否位于进程代码段所在的线性区,如果是直接返回,因为堆不能与进程代码段所在的线性区重合。mm=current->mm;down_原创 2014-06-10 10:02:24 · 5685 阅读 · 0 评论 -
Linux内核之内存管理(4)--缺页处理程序
缺页处理程序//下面函数将一页内存页面映射到指定线性地址处,它返回页面的物理地址//把一物理内存页面映射到线性地址空间指定处或者说把线性地址空间指定地址address处的页面映射到主内存区页面page上。主要工作是在相关也目录项和页表项中设置指定页面的信息。在处理缺页异常函数do_no_page中会调用这个函数。参数:address--线性地址;page--是分配的主内存区中某一页面指针st原创 2014-05-27 09:49:55 · 1794 阅读 · 0 评论 -
linux-0.12内核之内存管理(1)
1.内存分页管理机制内存分页管理是通过页目录表和内存页表所组成的二级表组成的,其中页目录表和页表的结构是一样的,表项结构也相同。页目录表中的每个表项(4B)来寻址一个页表,而每个页表项(4B)来指定一页物理内存页。因此,当指定了一个页目录项和一个页表项,我们就可以唯一地确定所对应的物理内存页。在Linux 0.12内核中,所有进程都是用一个页目录表,而每个进程都有自己的页表。内核代码和数据段长原创 2014-05-26 11:15:49 · 1420 阅读 · 0 评论 -
Linux0.12内核之内存管理(3)
本系列的第三篇文章主要来介绍与共享物理页面相关的两个函数。//在发生缺页异常的时,首先看看能否与运行同一个文件的其他进程进行页面共享处理。该函数首先判断系统中是否有另外进程也在运行与当前进程一样的执行文件。若有,则在系统当前任务中找寻这样的任务。若找到了这样的任务就尝试与其共享指定地址处的页面。判断系统中是否有另一个进程也在执行同一个可执行文件的方法是利用进程任务数据结构中的executabl原创 2014-05-27 09:22:20 · 1275 阅读 · 0 评论 -
Linux0.12内核之内存管理(2)
本文主要介绍Linux0.12内核memory.c中的函数1.void free_page(unsigned long addr)//释放物理地址addr处的一页内存。用于free_page_tables()函数void free_page(unsigned long addr){//首先判定给定物理地址的合理性。如果物理地址addr小于内存低端1M,对此不///予处理。如果a原创 2014-05-26 20:43:24 · 1371 阅读 · 0 评论 -
bootloader实现
上篇文章我们完成了一个简单的bootloader,与其说是bootloader,不如说是boot,本篇我们完成loader部分功能.loader部分是在boot部分基础上,通过到约定好的启动盘位置上读数据载入内存,达到loader的目的。到启动盘读数据是bios提供的功能调用.1. 铺垫(1)我们这次的程序分两个部分,一个部分是bootloader,boot和loader功能;一个是hea原创 2014-05-09 11:04:29 · 2087 阅读 · 0 评论 -
80x86保护模式下IDT和中断调用过程分析
1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT类似,IDT也是由8字节长度的描述符组成。IDT空描述符的存在标志位必须是0。IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。LIDT指令可以把内存中的限长值和基地址操作数加载到IDTR寄存器中,该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建原创 2014-05-11 10:02:36 · 2043 阅读 · 0 评论 -
linux0.12内核的内存组织和进程结构
进程结构Linux0.12中的每个进程都有如下的结构:在gdt中占有两项,一项是tss段描述符,一项是ldt段描述符。在task数组中占有一项,指向一页物理内存,该物理内存低端是进程控制块task_struct(里面包括tss段和ldt段),其余部分是进程的内核态堆栈。在页目录表和页表中设置有相关项。Linux0.12中,最多只有64个进原创 2014-05-24 10:26:55 · 1653 阅读 · 0 评论 -
linux系统调用原理分析
写这篇文章是看到一个as汇编器里编写的汇编代码,有一个指令int 80h没有搞懂,然后自己查资料发现不少东西,本文旨在浅显的分析linux的系统调用,主要是linux0.12内核来说!目前操作系统内核的结构模式主要分为整体式的单内核和层次式的微内核模式。而0.12内核是单内核模式。在单内核模式的系统中,操作系统提供服务的流程:应用程序使用指定的参数值执行系统调用指令(int 80h),使CPU原创 2014-05-05 10:28:48 · 1871 阅读 · 0 评论 -
linux搜索文件过程
1.文件中的数据是放在磁盘的数据区中的,而一个文件名则是通过对应的i节点与这些磁盘块联系起来,这些盘块的号码就存放在i节点的逻辑块数组i_zone[]中。在文件系统的一个目录中,其中所有文件名信息对应的目录项保存在该目录名文件的数据块中,例如,root/下的所有文件名的目录项就保存在root/目录名文件的数据块中,而文件系统根目录下的所有文件名信息则保存在指定i节点(1号节点)的数据块中,文件名的原创 2014-05-25 08:36:52 · 2041 阅读 · 0 评论 -
linux0.11内核fork实现分析(不看不知道,一看很简单)
曾几何时,只是一直在调用库函数fork,只知道它创建一个子进程,并且子进程返回值是0,父进程返回值是子进程pid。但是一直没有深究内核代码,今天终于使用gdb调试了一把fork的内核代码,下面就让我们一探究竟吧。1.创建进程的本质是什么?根据目前理解,其实就是构造了PCB,这个PCB会唯一标示一个进程的存在,并且会构建子进程的页目录和页表等等。2.为什么fork()调用会有2个返回值,原创 2014-05-19 16:18:58 · 1919 阅读 · 0 评论 -
实现多任务的内核Linux0.00分析
最近终于把实现多任务的微内核调试了一遍,我们阐述了如何在保护模式下切换任务。同时知识包括:gdt,idt,ldt,tss,时钟中断服务,特权级切换,显存编程,boot和loader功能,bios调用等等。详细知识还要在实践中摸索学习,希望大家一起进步。这篇文章仅仅做个记录,如有亲身调试过代码,可能不大好理解。接下几天重点看看0.12启动程序,多分页需要更加深入了解。;#Mode=Dos ;放在原创 2014-05-15 10:15:01 · 1803 阅读 · 0 评论 -
Linux-0.12内核打开文件过程--sys_open源码分析
上图展示了进程打开文件使用的内核数据结构,所以要打开文件,就要构造上图中的关系。int sys_open(const char *filename,int flag,int mode){ struct m_inode *inode; struct file *f; int i,fd; mode&=0777&~current->umask; //在filp数组中寻找“空闲位置”原创 2014-05-25 20:34:20 · 2598 阅读 · 0 评论 -
Linux-0.12内核sleep_on函数分析
sleep_on用于进程休眠,原型如下:void sleep_on(struct task_struct **p)当进程访问某个互斥资源时,如果资源被另外进程占用,当前进程就需要休眠。假设资源的结构如下:struct res{....struct task_struct *wait;}其实我们参考下文件系统的i节点就会发现,i节点也是一种资源,它的结构体中就有一原创 2014-05-23 10:10:57 · 2182 阅读 · 3 评论