Linux内核学习
文章平均质量分 69
我个人了解Linux内核的过程,包括感悟和笔记什么的,希望能够给大家以帮助
冰水比水冰
我是码农,却假装是程序员。
展开
-
读薄《Linux 内核设计与实现》(6) - 虚拟文件系统
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 VI 篇,本文主要讲了以下问题:Linux 虚拟文件系统的概念、相关接口等内容。0x00 虚拟文件系统概念虚拟文件系统(VFS)为用户空间提供了文件系统接口VFS 协同不同文件系统的工作0x01 通用文件接口VFS 使得用户可以直接使用 open(), read(), write()这样的系统调用而无需考虑具体文件系统和实际物理原创 2016-11-07 21:24:03 · 4523 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(5) - 定时器、时间管理和内存管理
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 V 篇,本文主要讲了以下问题:Linux 内核中的时间概念和时间表示,硬件时钟和定时器以及时间中断和内存管理的相关知识。原创 2016-10-23 14:00:40 · 4128 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(4) - 中断与同步
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 IV 篇,本文主要讲了以下问题:中断和中断处理程序的概念与实现原理、Linux 中的下半部以及内核同步方法。0x00 中断和中断处理程序I 中断中断是一种特殊的电信号,由硬件发向处理器,处理器接收到中断时,会马上箱操作系统反映,由操作系统进行处理。中断随时可以产生,因此,内核随时可能因为新到来的中断而被打断。不同的设备对应的中断不同原创 2016-06-30 22:14:22 · 5954 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(3) - 系统调用
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 III 篇,本文主要讲了以下问题:系统调用的概念、系统调用的实现原理与过程以及如何在 Linux 中增加一个系统调用。0x00 系统调用的概念系统调用是为了和用户空间上的进程进行交互,内核提供的一组界面。应用程序通过这组界面访问硬件和其他操作系统资源完成对硬件和资源的访问控制硬件设备的抽象(提供设备的独立性)0x01 系统调用简原创 2016-06-25 10:33:49 · 6119 阅读 · 0 评论 -
读薄「Linux 内核设计与实现」(2) - 进程管理和调度
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 II 篇,本文主要讲了以下问题:进程管理的任务、进程管理与其他模块的依赖关系、进程描述符和任务队列、进程的创建、线程的实现、进程的终止、进程调度。原创 2016-06-23 02:07:01 · 5978 阅读 · 1 评论 -
读薄「Linux 内核设计与实现」(1) - 从内核出发
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第一篇,本文主要讲了两个问题:内核编程的特点以及 GNU C 在内核开发中的特点。0x00 内核编程特点无 libc 库,不能访问标准 C 文件使用 GNU C无内存保护机制慎用浮点数计算注意同步和并发可移植性考虑:保持字节顺序、64位对齐、不假定字长和页面长度0x01 GNU C内联函数:将函数展开至调用位置,省却函数调用原创 2016-06-07 02:28:16 · 6770 阅读 · 0 评论 -
I 位向量的实现与应用
这篇文章是《读厚<编程珠玑>》系列博客的第一篇,我们在《编程珠玑》的第一章 - 开篇中就了解了位向量是什么,《编程珠玑》的作者使用位向量来解决了一个海量数据排序问题,这篇文章我们来深入的了解一下位向量的实现与应用。0x00 位向量是什么?位向量,也叫位图,是一个我们经常可以用到的数据结构,在使用小空间来处理大量数据方面有着得天独厚的优势。位向量,顾名思义就是「位构成的向量」,我们通常使用0来表示原创 2016-05-15 22:30:47 · 7515 阅读 · 0 评论 -
PART 2: 使 Shell 能读取命令
这篇文章是《动手写 Shell》系列文章的第 <2> 篇。上篇文章中,我们已经完成了我们动手 Shell 的第一步:Shell 的提示符。在这篇文章中,我们开始使得我们的 Shell 能够开始读取命令,并且做简单的分词,将命令与参数分开。原创 2016-04-23 16:08:20 · 6372 阅读 · 0 评论 -
PART 1: Shell 提示符的实现
这篇文章是《动手写 Shell》系列文章的第 <1> 篇,在这篇文章中,我们先完成一个 Shell 中最基本的功能 - Shell 提示符的实现。在这篇文章中,我会介绍一下实现的思路,以及介绍下用到的系统 API 和一些 C 语言中的库函数。Shell 提示符用过 Linux 的人都知道当我们打开终端时,在命令行中会出现一行字,后边会有光标在一直删,那一行字就是 Shell 的提示符。提示符格式我原创 2016-04-10 13:20:43 · 5693 阅读 · 0 评论 -
在 QT 中使用 libusb 检测 MAC 上的 USB 设备
最近在用 QT 做一个 MAC 上的 Kindle 批注管理软件,遇到的第一个问题就是检测 MAC 上连接的 USB 设备的状态。如果是在 Cocoa 进行开发,会有对应的系统 API 可供使用,但是由于我是在 QT 平台进行的开发,所以无形中加大了一点难度。就在这时,我发现了一个库:libusblibusb 介绍libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以原创 2016-01-27 08:44:11 · 8656 阅读 · 10 评论 -
Ashmem 对 Android 内存分配与共享的增强
Ashmem 是什么?Ashmem(Anonymous Shared Memory 匿名共享内存),是在 Android 的内存管理中提供的一种机制。它基于mmap系统调用,不同的进程可以将同一段物理内存空间映射到各自的虚拟空间,从而实现共享。mmap机制mmap系统调用是将一个打开的文件映射到进程的用户空间,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。原创 2015-12-10 22:40:25 · 6965 阅读 · 0 评论 -
分析Linux内核创建一个新进程的过程
新进程的执行源于以下前提:- dup_task_struct中为其分配了新的堆栈- 调用了sched_fork,将其置为TASK_RUNNING- copy_thread中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的- 将ret_from_fork的地址设置为eip寄存器的值最终子进程从ret_from_fork开始执行原创 2015-07-29 12:43:09 · 3839 阅读 · 3 评论 -
分析system_call中断处理过程
分析system_call中断处理过程使用gdb跟踪分析一个系统调用内核函数(以 sys_chmod为例)启动调试内核qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -Sgdb 调试另开 shellgdb(gdb) file linux-3.18.6/vmlinux #在 gdb 界面中 targ原创 2015-07-19 09:40:52 · 3091 阅读 · 0 评论 -
浅析 Linux 系统调用
浅析 Linux 系统调用用户态、内核态以及中断具有高执行级别的程序可以执行特权指令intel X86 CPU 具有4种级别:0 ~ 3Linux 只用了0和3(0表示内核态,3表示用户态)特权级的表示:使用 CS 寄存器的低2位内核态逻辑地址空间:0xc0000000以上 用户态逻辑地址空间:0x00000000 ~ 0xbfffffff中断是从用户态到内核态的一种方式,即通过系统调原创 2015-07-11 21:46:20 · 2874 阅读 · 0 评论 -
跟踪分析Linux内核的启动过程
跟踪分析Linux内核的启动过程使用 gdb 跟踪调试内核使用 qemuqemu -kernel linux-3.18.6 /arch/x86/boot/bzImage -initrd rootfs.img -s -S参数:-s:在初始化时冻结 CPU-S: 为 gdb 分配1234端口gdb 调试另开 shellgdb(gdb) file linux-3.18.6/vmlinux #在原创 2015-07-10 16:18:32 · 3076 阅读 · 0 评论 -
完成一个简单的时间片轮转多道程序内核代码(二)
完成一个简单的时间片轮转多道程序内核代码重要汇编代码分析 asm volatile( "movl %1,%%esp\n\t" "pushl %1\n\t" "pushl %0\n\t" "ret\n\t" "popl %%ebp\n\t" : : "c" (task[pid]原创 2015-07-10 10:29:37 · 3297 阅读 · 0 评论 -
完成一个简单的时间片轮转多道程序内核代码(一)
完成一个简单的时间片轮转多道程序内核代码先上代码:myPCB.h/* * linux/mykernel/mypcb.h * * describe PCB * * by Yuanhang Luo * */ #define MAX_TASK_NUM 4#define KERNEL_STACK_SIZE 1024*8struct Thread{ unsigned lon原创 2015-07-07 23:26:47 · 2970 阅读 · 0 评论 -
几种基本汇编指令详解
几种基本汇编指令详解常见寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX RDX 堆栈基指针 BP EBP RBP 变址寄存器 SI ESI RSI 堆栈顶指针 SP原创 2015-07-07 11:02:09 · 44100 阅读 · 3 评论 -
反汇编一个简单的C程序并分析
反汇编一个简单的C程序并分析C 源码:int g(int x){ return x+1;}int f(int x){ return g(x);}int main(void){ return f(2) + 3;}汇编源码:1 g:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5原创 2015-07-03 22:23:58 · 5129 阅读 · 0 评论 -
Linux-中断和中断处理
1.中断#中断使得硬件得以发出通知给处理器,本质上是一种电信号#中断随时可以产生,内核随时会被打断#不同设备的中断不同,每个中断都通过一个唯一的数字标识,称为IRQ(中断请求)2.中断处理程序#响应中断的时候,内核会执行一个函数(中断处理程序或中断服务例程)#在Linux中,中断程序为普通的C函数3.上半部和下半部原创 2015-06-26 08:18:24 · 3215 阅读 · 0 评论 -
Linux-进程控制中的函数
1.几个创建进程函数的对比 #fork(): 源码:#include#include#include#includeint main(){ pid_t pid; if((pid=fork())<0) { printf ("fork error!\n"); exit(1); } el原创 2014-11-07 21:33:54 · 3136 阅读 · 0 评论 -
Linux内核-系统调用
Linux内核-系统调用1.与内核通信#系统调用在用户空间进程和硬件设备之间增加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每个进程都运行在虚拟系统中的考虑#系统调用是用户空间访问内核的唯一手段原创 2014-10-28 10:01:28 · 2792 阅读 · 0 评论 -
Linux内核-进程调度
Linux内核-进程调度1.多任务#抢占式多任务:由调度程序来决定什么时间停止一个进程的运行#进程的时间片:分配给每个可运行进程的处理器时间段2.Linux的进程调度#O(1)调度程序#反转楼梯最后期限调度算法(RSDL)#完全公平调度算法(CFS)3.策略#I/O消耗型和处理器消耗型进程:原创 2014-10-24 17:00:40 · 3062 阅读 · 0 评论 -
Linux内核-进程管理
Linux内核-进程管理1.进程#内核调度的对象是线程,不是进程#对Linux而言,线程只是特殊的进程#进程提供两种虚拟机制:虚拟处理器、虚拟内存#创建进程通过fork()来从父进程复制创建进程2.进程描述符#任务队列:双向链表(每一项都是task_struct--->进程描述符)#Linux通过slab分配器原创 2014-10-19 13:45:11 · 3007 阅读 · 0 评论 -
16位/32位中断机制比较
16位/32位中断机制比较原理:16位中断机制:使用中断向量表32位中断机制:使用中段描述符表IDT位置:中断向量表的位置是固定的,位于内存的开始0x00000中断向量符表位置不固定,由系统设计者安排,由IDTR(IDT基地址寄存器)锁定其位置。原创 2014-07-09 00:20:57 · 3642 阅读 · 0 评论 -
int 0x13中断的参数传递
int 0x13中断向量所指向的中断服务程序实质上就是磁盘服务程序。用途:将指定扇区的代码加载到内存的指定位置。因此,在使用int 0x13中断时要将参数传递给服务程序:例如:将指定扇区和加载的内存位置传递给服务程序传递参数的方式:通过几个通用寄存器实现示例代码:load_setup: mov dx,#0x0000 ! drive原创 2014-07-08 21:53:57 · 3747 阅读 · 1 评论 -
Linux内核学习第8天
保护 保护机制是可靠地多任务运行环境所必须的,用于各个任务之间免受干扰。 可以用于分段和分页机制 *处理器寄存器的2个比特位定义了当前执行程序的特权级(CPL) *设置控制寄存器CR0的PE标志(位0)开启分段保护机制 设置控制寄存器CR0的PG标志(位31)开启分页保护机制 段级保护 分类:原创 2014-05-27 21:29:40 · 2611 阅读 · 0 评论 -
Linux内核学习第7天
分页机制*它是80X86内存管理机制的第二部分,它在分段的基础上完成虚拟(逻辑)地址到物理地址转换的过程 *通过设置控制寄存器CR0的PG位启用分页机制 (PG=0,禁用;PG=1,启用) 固定页面大小:4K(4GB线性地址空间划分为2^20原创 2014-05-14 10:01:41 · 2544 阅读 · 0 评论 -
Linux内核学习第6天
5.代码和数据段描述符类型 *当段描述符中S标志被置位(1),则该描述符用于代码或数据段。(位11决定是数据段还是代码段的描述符) A(Accessed)用于表示已访问 W(Write-Enable)可写 E(Expansion-direction)扩展方向原创 2014-05-13 20:58:16 · 2630 阅读 · 0 评论 -
Linux内核学习第5天
3.段选择符:是段的一个16位标识符 *段选择符结构: 请求特权级RPL(Requested Privilege Level):提供了段保护信息 表指示标志TI(Table Index):用来指出包含指定段描述符的段原创 2014-05-10 23:03:26 · 2653 阅读 · 0 评论 -
Linux内核学习第4天
保护模式内存管理分页机制(支持虚拟存储技术) (1)虚拟存储:是一种内存管理技术,“虚拟化”线性地址空间的方法 (2)使用分页将段划分成页面(通常为4K),页面存储于物理内存或硬盘上,操作系统通过维护页表或页目录来管理,当程序访问线性地址空间的一个地址位置时,处理器会使用页目录和页表来转换为物理地址。如果访问的页面不在物理内存上,处理器会产生一个中断原创 2014-04-30 22:11:31 · 2733 阅读 · 3 评论 -
Linux内核学习第3天
保护模式内存管理内存寻址:对存储在内存中的某个数据对象的地址进行定位 80X86CPU中,一条操作由操作码和操作数组成段:一种内存寻址技术把内存分为一个或多个线性区域(段) 80X86有6个存放段选择符的段寄存器:CS、DS、ES、SS、FS、GS CS:总是用于寻址代码段,由CS 寻址代码段称为当前代码段 SS:原创 2014-04-27 15:45:48 · 2769 阅读 · 0 评论 -
Linux内核学习第2天
80X86保护模式及其编程1. 标志寄存器:标志用于控制I/o访问、可屏蔽硬件中断、调试、任务切换、虚拟8086模式 2. 内存管理寄存器GDTR:全局描述符表寄存器IDTR:终端描述符表寄存器LDTR:局部描述符表寄存器TR:任务寄存器 3. 控制寄存器CR0:用于控制和确定处理器的操作模式以及当前执行任务的特性原创 2014-04-25 14:18:31 · 2691 阅读 · 0 评论 -
Linux内核学习第1天
内核编程语言和环境1. as86汇编器 语法: as[option] –o objfile srcfile.表示编译过程中的位置计数器Objfile分为三个段(区):正文段(.text):程序的执行代码和只读数据数据段(.data):可读/写的数据未初始化数据段(.bss) 2. GNU as汇编格式:as [option]原创 2014-04-22 21:14:33 · 2993 阅读 · 0 评论