kernel
文章平均质量分 87
viewsky11
这个作者很懒,什么都没留下…
展开
-
每天分析一段linux内核代码---<linux/sched.h>
#ifndef _SCHED_H#define _SCHED_H#define NR_TASKS 64 // 系统中同时最多任务(进程)数。#define HZ 100 // 定义系统时钟滴答频率(1 百赫兹,每个滴答10ms)#define FIRST_TASK task[0] // 任务0 比较特殊,所以特意给它单独定义一个符号。#define LAST_TASK task转载 2014-08-13 09:31:20 · 1969 阅读 · 0 评论 -
每天一段linux内核代码——<kernel/sched.c>
#include #include #include struct thread_t SECTION(".task0") ALIGN(PAGE_SIZE) task0; struct thread_t *current = &task0;static struct list_t *ptask_list = &(task0.link);原创 2014-08-14 09:27:27 · 1358 阅读 · 0 评论 -
Linux 2.6.19.x 内核编译配置选项简介
转载自:http://www.douban.com/group/topic/15706557/Code maturity level options 代码成熟度选项Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择General s转载 2014-09-26 18:23:18 · 1375 阅读 · 0 评论 -
内核线程
【摘要】本文首先介绍了进程和线程的区别,接着分析了内核线程、轻量级LWP线程以及常见的用户线程的特点,同时介绍了内核线程和进程的区别。分析了创建内核线程kernel_thread函数的实现过程,介绍了一个在驱动中使用内核线程的实例。最后针对内核线程创建销毁的特点,给出了通用的内核线程操作函数API,使用该API可在自己的驱动或内核代码中方便的使用内核线程。【关键词】线程,进程,内核线程,用户线程,L转载 2016-11-02 22:11:11 · 756 阅读 · 0 评论 -
linux内核链表结构
linux的链表结构定义在include/linux/list.h中struct list_head{ struct list_head *next, *prev;};list_head结构包含着指向list_head结构的指针prev和next,由此可见,内核链表具备双链表功能,实际上,通常它都组织成双循环链表。不过它和其他双链表结构模型不同,list_head没有数据域。在linux内原创 2016-11-04 22:33:49 · 606 阅读 · 0 评论 -
struct net_device网络设备结构体详解
在linux中使用struct net_device结构体来描述每一个网络设备。同时这个用来刻画网络设备的struct net_device结构体包含的字段非常的多,以至于内核的开发者都觉得在现在的linux内核中,这个struct net_device是一个大的错误。 在本篇文章中,只介绍struct net_device中的一些字段,其他的字段在以后使用的时候再说。#define IFN转载 2016-11-05 18:07:30 · 19875 阅读 · 0 评论 -
网卡驱动
网卡驱动:载波检测-netif_carrier_ok/netif_carrier_on/netif_carrier_off网卡在物理上具有载波侦听的功能,当网络连接完整或者网络链接断开时,网卡芯片硬件会自动设置寄存器标志位来标识。如网线链接断开的时候,会将LinkSts清位;重新链接网线,则硬件自动将此位置位。这样,在网卡驱动中读写该位信息就可一判断网络是否链接通路。网卡驱动程序通过netif_c原创 2016-11-05 19:09:16 · 922 阅读 · 0 评论 -
简析内核同步与互斥
同步是建立在互斥的基础之上的,只有实现了互斥功能,才能实现同步机制。 同步一般用semaphore表示,互斥一般用spin_lock来表示。Windows内核源码也是如此,linux内核中亦然。主要区别是在samphore机制中,当某进程进不了临界区时会进行其他进程的调度,而spin_lock刚执行忙等。内核中的执行路径主要有:用户进程的内核态,此时有进程context,主要是代表进程在执行原创 2016-11-07 21:24:54 · 549 阅读 · 0 评论 -
kernel网络协议栈初始化
kernel的网络初始化顺序:core_initcall : sock_initfs_initcall : inet_initsubsys_initcall : net_dev_initdevice_initcall : 设备驱动初始化网络基础系统初始化 第一步,使用core_initcall初始化宏修饰sock_init函数,这个宏指定了sock_init函数放在级别为1的代码中,也就原创 2016-11-07 22:02:23 · 999 阅读 · 0 评论 -
linux的数据结构---kernel链表
链表是一种常见的组织有序数据的数据结构,相对于数组,具有更好的动态性,可以高效的在链表的任意位置实时的插入或者删去。在linux的源代码中,大量的使用了链表。通常链表数据结构至少有两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系。 在数据结构中定义一个指向任意类型为:struct list{ void *data; struct list *next;转载 2016-11-08 16:56:33 · 607 阅读 · 0 评论 -
Linux kernel Hash list
在看桥接、路由代码时,经常会有hash表相关定的结构,为了能够更好的理解桥接、路由的代码,所以需要好好的理解hash链表 一、相关数据结构 数据结构:struct hlist_head { structhlist_node *first;};struct hlist_node { structhlist_node *next, **pprev;};二、相关疑问 1、与一般的转载 2016-11-10 23:45:20 · 785 阅读 · 0 评论 -
U-Boot中MAC地址设置及往内核中传递
一、内核参数的传递 U-Boot向Linux驱动传递参数的方式有两种,一为在系统启动的时候由bootloader传入,还有一种是将驱动编译成模块,将参数作为模块加载的参数传入。内核通过setup接口接受Bootloader传入的参数。方式如下:static int __init param_mac_setup(char *str){……}__setup("mac=", param_mac_set转载 2016-11-11 10:01:35 · 9465 阅读 · 0 评论 -
linux套接字内核初始化和创建过程
1、系统初始化过程中会调用sock_init函数进行套接字的初始化,主要是进行缓存的初始化static int __init sock_init(void) { int err; /* * 初始化.sock缓存 */ sk_init(); /* * 初始化sk_buff缓存 */转载 2016-11-11 21:23:46 · 706 阅读 · 0 评论 -
sk_buff有关的几个重要的数据结构
1。sk_buff结构体这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。下面是他的定义,挺长struct sk_buff { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *pr转载 2016-11-11 21:32:03 · 730 阅读 · 0 评论 -
sk_buff的操作函数
1、alloc_skb()函数该函数的作用是在上层协议要发送数据包的时候或网络设备准备接收数据包的时候会调用alloc_skb()函数分配sk_buff结构体,需要释放时调用kfree_skb()函数。tatic inline struct sk_buff *alloc_skb(unsigned int size, gfp_t priority) {转载 2016-11-11 21:56:50 · 996 阅读 · 0 评论 -
kernel的INET协议族socket和传输层sock
Linux内核中协议族有INET协议族,UNIX协议族等,我们还是以INET协议族为例。下面是内核中的协议族声明:/* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define AF_LOCAL 1 /转载 2016-11-11 22:06:44 · 1850 阅读 · 0 评论 -
kernel中套接字的绑定、监听、连接和断开
1、套接字的绑定创建完套接字服务器端会在应用层使用bind函数惊醒套接字的绑定,这时会产生系统调用,sys_bind内核函数进行套接字。系统调用函数的具体实现SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) { struct socket *sock; struc转载 2016-11-11 22:14:27 · 1142 阅读 · 0 评论 -
用户空间与内核空间数据交换二
内核启动参数Linux 提供了一种通过 bootloader 向其传输启动参数的功能,内核开发者可以通过这种方式来向内核传输数据,从而控制内核启动行为。通常的使用方式是,定义一个分析参数的函数,而后使用内核提供的宏 __setup把它注册到内核中,该宏定义在 linux/init.h 中,因此要使用它必须包含该头文件:__setup("para_name=", parse_func)para_na转载 2016-11-29 00:21:33 · 673 阅读 · 0 评论 -
usb子系统中重要的数据结构
设备 usb_device 配置 usb_host_config 接口 usb_interface 设置 usb_host_interface端点 usb_host_endpoint usb_devicestruct usb_device { int devnum;//在usb总线上的地址 char devpath[16];转载 2016-11-12 23:01:56 · 477 阅读 · 0 评论 -
kernel中driver/base/core.c
/* * drivers/base/core.c - core driver model code (device registration, etc) * * Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs * Copyright (c) 2006 Greg K原创 2016-11-16 21:29:00 · 1113 阅读 · 0 评论 -
Documentation/gpio.txt 的中文翻译
Documentation/gpio.txt 的中文翻译如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 译存在问题,请联系中文版维护者。 英文版维护者: Grant Likely grant.likely@secretlab.ca Linus Walleij linus.walleij翻译 2016-11-16 22:46:17 · 1175 阅读 · 0 评论 -
container_of分析
在Linux 内核中,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_struct中。需要注意的是container_of不是一个函数而是一个宏。该宏定义在include/linux/kernel.h中,源码为:/** * container_of - cast a member of a structure out to the cont原创 2016-11-14 15:31:20 · 326 阅读 · 0 评论 -
linux内核链表list及功能函数
linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。struct list_head { struct list_head *next, *prev; }; 这是链表的元素结构。因为是循环链表,表头和表中节点都是这一结构。有prev和next两个指针,分别指转载 2016-11-16 17:57:27 · 866 阅读 · 0 评论 -
高通 msm平台GPIO相关的device tree设置
GPIO相关的dvice tree设置和interrupt设置gpoi号以及gpio相关的属性设置以tsp的proxy_en端口为例:i2c@78b6000 { /* BLSP1 QUP2 */ compatible = "qcom,i2c-msm-v2"; ... tmd3782@39 { compatible = "taos,tmd3782";转载 2016-11-30 00:02:21 · 16149 阅读 · 0 评论 -
内核文件解读(linux网络协议栈笔记)
内核文件解读为了解决 initcall_t到底是什么变量类型则必须提及 C 语言中一个比较少见的内容——可执行文件格 式,只有了解了这种文件格式才能具体知道 initcall_t 的意义。 ELF 文件格式ELF 是*nix 系统上可执行文件的标准格式,它取代了 out 格式的可执行文件,原因在于它的可扩展 性。 ELF 格式的可执行文件可有多个 section。DWARF(Debugging W原创 2016-11-30 10:34:58 · 2034 阅读 · 0 评论 -
linux设备驱动模型-kobject
sysfs文件系统“sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.”Linux2.6内核引入了sysf原创 2016-11-14 17:01:42 · 391 阅读 · 0 评论 -
中断及任务调度管理(linux网络协议栈笔记)
中断及任务调度管理Linux 书籍中常说的 BottomHalf 已然不见了,它们被转成 tasklets,这是支持 SMP 的。但其思想基本 一致。 中断及软中断模型我们在此不会对中断及异常的原理和机制做深入的介绍。但必须要作出一些说明,因为这是理解 Linux 内核与其它嵌入式/实时操作系统的不同,以及理解网络协议栈收报文的基础。 Linux 支持 CPU 的外部硬件中断和内部中断。严格来说,内原创 2016-11-30 17:34:54 · 1548 阅读 · 0 评论 -
Linux 设备管理(linux网络协议栈笔记)
Linux 设备管理设备初始化是我们要分析的第三和第四个大步骤,这个部分要涉及到一些设备驱动的背景知识。 设备管理的目标是能对所有的外设进行良好的读、写、控制等操作。但是如果众多设备没有一个统 一的接口,则不利于开发人员的工作。因此 Linux 采用了类似 UNIX 的方法,使用设备文件来实现这个 统一接口。由此可见,设备文件的相关概念是设备管理的最基础部分。 要让操作系统感知到设备的存在,必须原创 2016-11-30 22:39:55 · 2450 阅读 · 1 评论 -
linux kernel总结
内核与操作系统内核是操作系统的核心部分,包含了系统运行的核心过程,决定系统的性能,操作系统启动内核被装入到RAM中; 操作系统与底层硬件设备交互和为运行应用程序提供执行环境。Linux内核与微内核比较:微内核:内核只需要一个很小的函数集,通常包括几个同步原语,一个简单的调度程序和进程间通信机制。 运行在微内核之上的几个系统进程实现系统级功能:内存分配,设备驱动程序……完全的模块化进程。任何操作系转载 2016-11-18 11:39:06 · 1789 阅读 · 0 评论 -
linux网络设备理解
网络层次linux网络设备驱动与字符设备和块设备有很大的不同。 1. 字符设备和块设备对应/dev下的一个设备文件。而网络设备不存在这样的设备文件。网络设备使用套接字socket访问,虽然也使用read,write系统调用,但这些调用只作用于软件对象。 2. 块设备只响应来自内核的请求,而网络驱动程序异步接收来自外部世界的数据包,并向内核请求发送到内核。linux内核中网络子系统的设计基于设备无原创 2016-11-15 21:16:39 · 2472 阅读 · 0 评论 -
Documentation/sysfs的中文翻译
Documentation/filesystems/sysfs.txt 的中文翻译如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 译存在问题,请联系中文版维护者。 英文版维护者: Patrick Mochel mochel@osdl.org Mike Murphy mamurph@c翻译 2016-11-19 18:38:31 · 495 阅读 · 0 评论 -
mac80211源码分析
具体概念性的内容,以及mac80211的框架,可以参看: http://blog.csdn.net/zxygww/article/details/24874155 WLANlinux下wlan总体架构如图所示: mac80211架构,如图所示: 用户空间: 配置:wpa_supplicant和hostapd: 所有直接与用户交互的应用程序都在这里。 例如可以基于GUI / CL原创 2016-11-13 20:58:37 · 7165 阅读 · 0 评论 -
ip_forward参数对Linux内核转发影响分析
在进行Linux内核转发时,需要在proc文件系统的proc/sys目录设置转发的参数,可以使用下面的方法查看该参数的值cat /proc/sys/net/ipv4/ip_forward,该参数的默认值为0,可以使用下面的方法进行修改该值,使能Linux内核的IP层的数据抓发,但是下面的方法在系统重启后不再生效。echo 1 > /proc/sys/net/ipv4/ip_forward在Linu转载 2016-12-01 21:58:09 · 7047 阅读 · 0 评论 -
网络配置过程分析(linux网络协议栈笔记)
配置过程分析在本篇,我们先介绍配置普通设备的IP地址的内部过程,接着再转到loopback接口的配置过程,这两个过程有相似之处,所以一起解说。然后再转入FIB系统,讲解路由系统,并用图例演示路由表的变化。最后介绍接口状态的变化,这对于驱动程序开发人员来说也是比较重要的。 .1)配置是如何下达到内核的? 我们假设在安装我们的Linux系统时,没有配置IP地址,也没有挂上网线,完完全全是一台“裸机”原创 2016-12-01 21:19:52 · 2391 阅读 · 1 评论 -
网络配置过程分析二(linux网络协议栈笔记)
Loopback接口的配置过程前篇分析了给本机系统配置IP地址的过程,本篇介绍一下loopback接口的“配置”过程,之所以用引号,是因为此配置不完全是用户自己控制的,为什么不先介绍loopback的配置,原因也在此。上篇我们已经对配置的过程一步一步做了分解,那么我们可以一下子来了解loopback接口的初始化及配置过程,这也是对普通设备的初始化和配置过程的一个回顾。 要使Loopback接口起作用原创 2016-12-02 16:12:53 · 1686 阅读 · 1 评论 -
pin control subsystem(pinctrl)
GPIO相关硬件有哪些差异嵌入式工程师总是要处理各种各样的target board,每个target board上的GPIO总是存在不同,例如: 1、和CPU的连接方式不同 对于ARM的嵌入式硬件平台,SOC本身可以提供大量的IO port,SOC上的GPIO controller是通过SOC的总线(AMBA)连接到CPU的。对于嵌入式系统而言,除了SOC的IO port,一些外设芯片也可能会提转载 2016-11-21 20:20:14 · 2423 阅读 · 0 评论 -
fib系统分析(linux网络协议栈笔记)
FIB系统初始化在Linux路由系统中主要保存了三种与路由相关的数据,第一种是在物理上和本机相连接的主机地址信息表——相邻表:neigh_table{ },第二种是保存了在网络访问中判断一个网络地址应该走什么路由的数据表——路由规则表:fib_table{ },第三种表是最新使用过的查询路由地址的缓存地址数据表——路由缓存:rtcache,由rtable{ }节点组成。它们三者之间的关系如下图:原创 2016-12-02 17:39:20 · 7981 阅读 · 2 评论 -
Linux 3.10 ARM Device Tree 的初始化
以 arch/arm/mach-msm/board-dt-8960.c 为例,在该文件中的 msm_dt_init 函数的作用就是利用 dt(device tree)结构初始化 platform device。 static void __init msm_dt_init(void){of_platform_populate(NULL, of_default_bus_match_table, N转载 2016-12-02 21:21:05 · 606 阅读 · 0 评论 -
Device Tree Usage
原文链接:http://devicetree.org/Device_Tree_Usage#How_Interrupts_WorkDevice Tree Usage设备树使用手册This page walks through how to write a device tree for a new machine. It is intended to provide an overview of de翻译 2016-12-02 21:50:36 · 752 阅读 · 0 评论 -
设备驱动中的platform(kernel-4.7)
platform驱动模型搭建platform核心层:为设备层和驱动层提供注册接口、为设备层和驱动层的匹配提供标准。 内核是这样描述它们的(Documentation/driver-model/platform.txt):Platform devices are devices that typically appear as autonomousentities in the system. T原创 2016-12-12 21:45:42 · 1855 阅读 · 0 评论