【linux内核的一些知识点(上)】教程文章相关的互联网学习教程文章

《Linux内核设计与实现》读书笔记(十五)- 进程地址空间(kernel 2.6.32.60)【代码】【图】

进程地址空间也就是每个进程所使用的内存,内核对进程地址空间的管理,也就是对用户态程序的内存管理。主要内容:地址空间(mm_struct)虚拟内存区域(VMA)地址空间和页表 1. 地址空间(mm_struct)地址空间就是每个进程所能访问的内存地址范围。这个地址范围不是真实的,是虚拟地址的范围,有时甚至会超过实际物理内存的大小。 现代的操作系统中进程都是在保护模式下运行的,地址空间其实是操作系统给进程用的一段连续的虚拟内存空间。...

Linux内核TCP/IP参数分析与调优【图】

转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/167.html?1456482565 如下图展示的是TCP的三个阶段.1,TCP三次握手. 2,TCP数据传输. 3,TCP的四次挥手。SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立的时候有效。表示一个新的TCP连接请求。 ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同事提示对端系统已经成功连接所有数据。 FIN(结束标志,Finish)用来结束一个TCP会话...

Linux内核设计的艺术-进程2的创建及执行

1、打开标准输入设备 代码路径:init/main.c 目前处于进程1的3特权级void init(void) {int pid,i;setup((void *) &drive_info);(void) open("/dev/tty0",O_RDWR,0);(void) dup(0);(void) dup(0);... } open同样调用int 0x80进入进程1的0特权级,sys_open如下: 代码路径:fs/open.cint sys_open(const char * filename,int flag,int mode) {struct m_inode * inode;struct file * f;int i,fd;mode &= 0777 & ~curr...

漫谈Linux内核哈希表(2)

原文:http://blog.chinaunix.net/uid-23069658-id-5012484.html

“Linux内核分析”实验三【代码】【图】

跟踪分析Linux内核的启动过程 作者:何振豪原创作品转载请注明出处 http://www.cnblogs.com/scoyer/p/6516032.html 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000这节课讲了如何查看linux内核源代码,构造一个简单的linux系统(算不上构造,实际上就是编译内核,然后打包git上的根文件系统,然后启动这个简单系统而已),最后还讲了如何利用gdb来跟踪调试linux内核的执行情况(重点)。 这次实验主...

在Linux内核中根据函数指针输出函数名称【代码】

在使用Linux内核提供的打印函数时,使用“%p”可以实现很多额外的效果,对于我们调试内核代码也有一定帮助。比如当我们看到函数指针变量,想获取这个函数指针对应的是哪个函数,可以使用“%pF”,示例: 1 #include <linux/init.h>2 #include <linux/module.h>3 4staticint test_function(void)5{6 printk("%s enter.\n", __func__);7 8return0;9} 1011staticint __init printk_demo_init(void) 12{ 13int (*func)(void); ...

Linux内核同步 - memory barrier【图】

一、前言我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着:1、编译器2、CPU取指执行编译器将符合人类思考的逻辑(c代码)翻译成了符合CPU运算规则的汇编指令,编译器了解底层CPU的思维模式,因此,它可以在...

Linux内核 -- 内核源码结构【图】

Linux 内核源代码的目录结构Linux 内核源代码包含如下目● arch:包含和硬件体系结构相关的代码,每个架构的CPU都对应一个目录,如i386、arm、    arm64、powerpc、mips 等。Linux 内核目前已经支持30 种左右的体系结构。在arch    目录下,存放的是各个平台以及各个平台的芯片对Linux 内核进程调度、内存管理、    中断等的支持,以及每个具体的SoC 和电路板的板级支持代码。● block:块设备的通用函数,驱动程序I/O...

《linux内核设计与实现》读书笔记第四章【图】

第4章 进程调度4.1 多任务多任务系统可以划分为:非抢占式多任务和抢占式多任务。 Linux 提供了抢占式的多任务模式。在抢占式多任务模式下,由调度程序来决定什么时候停止一个进程的运行。这个强制的挂起动作就叫做抢占。在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行。进程主动挂起自己的操作称为让步 。4.2 Linux 的进程调度1、O(1)调度器调度算法对于调度那些响应时间敏感的程序有先天不足。响应时间...

在linux内核文件中添加自己的驱动,添加自己的linux驱动,编译自己的linux驱动程序方法和例子图文【代码】【图】

此文章为done原创,转载请写明出处,尊重原创。写这个文章,我参考了网上的一些博客:http://bbs.chinaunix.net/thread-3634524-1-1.htmlhttp://www.bkjia.com/gjrj/800182.html也参考了参考了 《linux驱动开发详解》3.4章节,实现建立自己驱动目录。文章中的驱动范例是:linux设备驱动开发详解第二版 的 global mem tow,宋宝华主编的书本光盘源码在我们学习了linux的驱动之后,我们都想编写一个linux驱动验证一下自己是否写的对,...

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)

linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间linux内核是如何组成的?答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、...

Linux内核调试方法总结之ftrace【图】

ftrace【用途】ftrace包含一系列跟踪器,用于不同的场合,比如跟踪内核函数调用(function tracer)、跟踪上下文切换(sched_switch tracer)、查看中断被关闭的时长(irqsoff tracer)、跟踪内核中的延迟以及性能问题等。Ftrace是内建于Linux的内核跟踪工具,依赖于内核配置宏(Kernel Hacking->Tracers)和debugfs。【原理】 ftrace本质上是一种静态代码插装技术,不需要支持某种变成接口让用户自定义trace行为,...

Linux内核-链表【代码】

linux内核链表的定义(定义了双向链表,不含数据域)定义在 /linux-source-3.13.0/include/linux/types.h 头文件中.1struct list_head { 2struct list_head *next, *prev; 3 };我们可以利用这个数据结构定义含有数据域的链表,如:1struct my_list 2{ 3void * mydata; //void * 可以指向任何类型的数据4struct list_head list; //隐藏了链表指针5 } 链表的声明和初始化宏(list.h)定义在 /linux-source-3.13.0/include/lin...

Linux内核中SPI/I2c子系统剖析【图】

Linux内核中,SPI和I2C两个子系统的软件架构是一致的,且Linux内核的驱动模型都以bus,driver,device三种抽象对象为基本元素构建起来。下文的分析将主要用这三种抽象对象的创建过程及其相互调用关系和作用来进行说明。1. SPI各对象的初始流程1.1 创建spi_bus_type总线postcore_initcall(抽象层spi.c中)bus_register(&spi_bus_type);class_register(&spi_master_class);1.2 把板级信息注册到全局链表中embedsky_evm_dev_cfg(arc...

Linux内核设计的艺术-关于缓冲块的进程等待队列

进程A是一个读盘进程,目的是将hello.txt文件中的100字节读入buffer[100]。 代码如下:void FunA(); void main() {...FunA();... }void FunA() {char buffer[100];int i,j;int fd = open("/mnt/user/user1/user2/hello.txt",O_RDWR,0644);read(fd,buffer,sizeof(buffer));close(fd);for(i=0;i<1000000;i++){for(j=0;i<100000;j++){;}} } 进程B也是一个读盘进程,目的是将hello.txt文件中的200字节读入buffer[200]。 void ...