linux_driver
文章平均质量分 69
傲世阿龍
这个作者很懒,什么都没留下…
展开
-
linux宏定义likely和unlikely解析
在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢?这两个宏在内核中的定义如下:# define likely(x) __builtin_expect(!!(x), 1)# define unlikely(x) __builtin_expect(!!(x), 0)可见这里使用了gcc的内建函数__builtin_e转载 2017-11-09 15:30:13 · 272 阅读 · 0 评论 -
mips汇编程序中的.set指令使用
.set push --> save all settings .set reorder/noreorder --> let/don't let assembler reorder instructions .set at/noat --> let/don't let assembler use the register $at in instruction aliases (li,la,转载 2017-11-14 15:49:21 · 7947 阅读 · 0 评论 -
__read_mostly的使用
在linux中好多内容被定义为__read_mostly,那么这有什么作用呢?首先看一个使用:structr cpuinfo_mips cpu_data[NR_CPUS] __read_mostly再看一下其定义:#define __read_mostly __attribute__((__section__(".data..read_mostly")))也就是说被__rea原创 2017-11-14 14:19:32 · 5669 阅读 · 0 评论 -
mips架构linux启动分析(二)
在start_kernel函数的开始部分:asmlinkage void __init start_kernel(void){ char * command_line; extern const struct kernel_param __start___param[], __stop___param[]; lockdep_init(); smp_setup_processor_原创 2017-11-14 11:59:46 · 581 阅读 · 0 评论 -
____cacheline_aligned和____cacheline_aligned_in_smp
这两个都属于GCC扩展函数。____cacheline_aligned instructs the compiler to instantiate a struct or variable at an address corresponding to the beginning of an L1 cache line, for the specific architecture, i.e原创 2017-11-14 11:29:03 · 5364 阅读 · 0 评论 -
mips架构中的原子操作指令(llsc)
在多线程程序中,为了实现对共享变量的互斥访问,一般都会用spinlock实现,而spinlock需要一个TestAndSet的原子操作。而这种原子操作是需要专门的硬件支持才能完成的,在MIPS中,是通过特殊的Load,Store操作LL(Load Linked,链接加载)以及SC(Store Conditional,条件存储)完成的。LL 指令的功能是从内存中读取一个字,以实现接下来的转载 2017-11-14 10:05:50 · 2879 阅读 · 0 评论 -
int __builtin_constant_p (exp)函数的使用
int __builtin_constant_p (exp)是GCC内置函数功能:— Built-in Function: int __builtin_constant_p (exp)You can use the built-in function __builtin_constant_p todetermine if a value is known to be consta原创 2017-11-14 09:40:09 · 549 阅读 · 0 评论 -
mips架构linux启动分析(四)(接收bios信息和环境初始化)
老样子先看函数把.void __init prom_init(void){//初始化命令 prom_init_cmdline();//初始化环境 prom_init_env();//这里所作的是把桥片进行了一些配置 if (loongson_pch) loongson_pch->early_config();#ifdef CONFIG_NUMA prom_init_n原创 2017-11-17 18:11:53 · 1294 阅读 · 0 评论 -
linux中platform总线解析(四)(platform设备注册后自动匹配驱动)
当一个platform设备注册后,就会自动为其匹配驱动,这是怎么做到的呢?其实前面的分析已经有提到。这里只说函数调用,以及关键的部分,具体的不再分析。下面再来分析一次。这里函数进行了删减,把这个自动匹配的过程突显出来。具体的函数调用关系:platform_add_devices--->platform_device_register---->platform_dev原创 2017-11-17 17:38:07 · 398 阅读 · 0 评论 -
linux中platform总线解析(三)(platform驱动的注册)
直接看代码。其中注册过程中用到的一些重要的结构体:platform_driver结构:struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *)原创 2017-11-17 17:21:51 · 345 阅读 · 0 评论 -
一篇不错的关于GCC特性的文章
Linux 内核中的 GCC 特性了解用于 C 语言的 GCC 扩展文章原来的地址:https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/GCC 和 Linux 是出色的组合。尽管它们是独立的软件,但是 Linux 完全依靠 GCC 在新的体系结构上运行。Linux 还利用 GCC 中的特性(称为扩展)实转载 2017-11-15 09:34:09 · 407 阅读 · 0 评论 -
linux中的typeof使用
Another way to refer to the type of an expression is with typeof. The syntax of using of this keyword looks likesizeof, but theconstruct acts semantically like a type name defined withtypedef.Th原创 2017-11-15 09:44:37 · 653 阅读 · 0 评论 -
一篇讲解PCI架构的好文章
一篇外国人写的讲解pci的文章,很清楚,很细致,看完能对pci有一个清晰的了解。http://tldp.org/LDP/tlk/dd/pci.html原创 2017-11-24 14:17:59 · 692 阅读 · 0 评论 -
mips架构linux启动分析(六)(arch_mem_init(node内存)内存初始化)
这里开始就是各个node的内存的初始化了。OK,直接看代码.static void __init arch_mem_init(char **cmdline_p){ extern void plat_mem_setup(void);//定义板级的屏幕的相关信息 plat_mem_setup();//把代码段也加入到boot_mem_map进行管理(bootm机制) arch_m原创 2017-11-22 09:42:09 · 1093 阅读 · 0 评论 -
linux中bootmem分析
bootmem机制是在linux启动期间,buddy管理器,slab管理器没有初始化好时使用的内存管理方法。之后系统起来之后,就交由buddy等方法来管理了。在多核系统中,每个核都对应这个一个node_data结构体,其中就记录着这个核使用的内存,也包括了bootmem的信息。看一下node_data的结构体#define LEVELS_PER_SLICE 1原创 2017-11-21 20:36:06 · 743 阅读 · 0 评论 -
GNU中attribute中的cold和hot
cold The cold attribute on functions is used to inform the compiler that thefunction is unlikely to be executed. The function is optimized for size rather than speed and on many targets it is p原创 2017-11-21 15:59:15 · 3592 阅读 · 0 评论 -
mips架构linux启动分析(五)(bootmem和blockmem机制的初始化)(prom_init_numa_memory)
这篇内容涉及到了对bootmem和memblock机制的使用(当然了bootmem就是在系统启动时使用的),不会展开太多进行说明。后面会单独拿出来说一下。PS: 这里涉及到很对node和cpu这些全局或局部变量的使用,有什么区别吗?说明一下:感觉应该是一样的,这样就导致了分析代码页不好分析。 其实比较简单。在一个主板上,如果有4个处理器(不管这个处理器是不是多核)原创 2017-11-21 15:24:21 · 1025 阅读 · 0 评论 -
pci总线扫描设备本地操作(二)(local bus operation)
当type1命令通过桥片转换为type0命令格式或者是type0命令在到达总线后,是怎么查找到设备的呢?接下来就看一下这个过程的操作。type0命令只是在本地总线进行操作,不会传递到其他总线上,如果要查找的设备在其他总线上,那就会被master-abort终止。type1命令会在不同的总线上进行传播,直到找到对应设备所在桥片后转换为type0格式,并且除了pci桥其他设备不会对原创 2017-11-30 16:43:47 · 1211 阅读 · 0 评论 -
pci总线扫描操作一(pci桥操作)
cpu和pci总线相连时通过pci桥片,也就是在查找设备时,主要是桥片产生的命令,然后进行设备的查找。一,怎么看手册两个手册:a,PCI Local Bus Specification Revision 3.0b,PCI-to-PCI Bridge Architecture Specification Version 1.2a文档是讲解pci总线的本地总线(local bus)原创 2017-11-30 16:12:56 · 3858 阅读 · 0 评论 -
介绍GNU中__attribute__机制的网址
这里记录一下介绍gnu中__attribute__机制的网址http://www.unixwiz.net/techtips/gnu-c-attributes.html介绍GNU中对C扩展的网址https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/C-Extensions.html#C-ExtensionsGNU中特点介绍的首页https://原创 2017-11-14 19:29:59 · 218 阅读 · 0 评论 -
GNU中__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attrib转载 2017-11-14 21:01:04 · 243 阅读 · 0 评论 -
别人分析的mips架构的linux启动第一步(作为对比)
系统加电启动后,MIPS处理器默认的程序入口是0xBFC00000(虚拟地址),此地址在KSEG1(无缓存)区域内,对应的物理地址是0x1FC00000(高3位清零),所以CPU从物理地址0x1FC00000开始取第一条指令,这个地址在硬件上已经确定为FLASH(BIOS)的位置,BIOS将Linux内核镜像文件拷贝到RAM中某个空闲地址(LOAD地址)处,然后一般有个内存移动的操作(Entry转载 2017-11-13 17:27:19 · 2572 阅读 · 0 评论 -
分析mips架构linux启动流程(一)
mips架构内核启动时默认从BFC00000地址开始取指运行,也就是对应KSEG1,物理地址的1fc00000开始运行。在文件arch/mips/kernel/vmlinux.lds中指定了第一个运行的函数:#define mips mipsOUTPUT_ARCH(mips)ENTRY(kernel_entry)PHDRS { text PT_LOAD FLAGS(7); /*原创 2017-11-13 17:05:46 · 2226 阅读 · 1 评论 -
linux中kconfig-kbuild-makefile分析
一、 Kbuild语法 基本构成包括五种,menu/endmenu,menuconfig,config,choice/endchoice,source。下面就对每种详细介绍:1、menu/endmenumenu的作用,可以理解成一个目录,menu可以把其中一部分配置项包含到一个menu中,这样有利于配置的分类显示。menu与endmenu是一组指令,必须同时出转载 2017-08-30 10:59:01 · 2640 阅读 · 0 评论 -
移植系统时思路记录
在移植vxWorks系统,或者linux时都可以进行参考。 系统移植后没有什么打印信息,也启动不正常,此时可以把所有的驱动模块去掉,只留下一个最简单的内核,之后在进行移植。设备少了,需要进行排错的模块也少了很多。 先记录下,以供参考。原创 2017-05-10 15:11:44 · 347 阅读 · 0 评论 -
分析网卡通过i2c总线从e2prom中读取mac地址过程
平台:loongson3A系列CPU+loongson2H桥片的开发板.每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个设备时,使用的是i2c总线的驱动。i2c总线的时序这里就不介绍了,大家可以看一个i2原创 2017-07-25 19:38:06 · 1406 阅读 · 0 评论 -
一个platform总线型的i2c设备的注册
一首先在板级目录下 arch/mips/platform 定义设备信息static struct resource ls2h_i2c0_resources[] = { [0] = { .start = LS2H_I2C0_REG_BASE, .end = LS2H_I2C0_REG_BASE + 0x8, .flags = IORESOURCE_MEM, },原创 2017-07-31 07:50:57 · 567 阅读 · 0 评论 -
Linux内核中container_of函数详解
在Linux 内核中,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_struct中。在Linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。转载 2017-07-31 14:46:44 · 639 阅读 · 0 评论 -
增加usb转串口驱动到内核中
编译出来的内核,没有usb_to_serial的功能,给调试带来很大不方便,所以说一下怎么在内核中增加这项功能。在编译内核前,先进行配置,执行make menuconfig之后会出来这种图形:1,选择Device Drivers--->,并进入2,选择USB support--->3,选择USB serial converter suppor原创 2017-08-18 10:03:23 · 932 阅读 · 0 评论 -
解释Linux内核源码中的container_of宏及其标准C版本实现
在Linux内核源码文件 include/linux/kernel.h中,定义了container_of宏,源码如下:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @type:转载 2017-07-31 14:48:13 · 401 阅读 · 0 评论 -
在x86架构机器上交叉编译linux内核方法
环境介绍:loongson3-4核cpu(mips),编译机器x86-64位服务器在x86服务器上交叉编译mips架构的内核方法:在x86上编译mips架构内核时,需要使用交叉编译器,这里使用的交叉编译器是mips64el-redhat-linux-编译器。1,获取配置文件把配置文件拷贝到顶层目录中cp arch/mips/configs/loongson3_defc原创 2017-08-18 11:41:22 · 1116 阅读 · 0 评论 -
linux板级初始化
linux板级初始化 2017-07-26开发板:IMAX6Q内核:3.0.35 最近拿到了明远智睿 的EK314开发板,以前主要用2440,眼界过于狭隘,借此机会练习下。首先看看它的板级文件/arch/arm/mach-mx6/board-myimx6ek314.c在他的末尾指定了map_io、init_irq、init_machine、timer等初始化函数,M转载 2017-08-28 14:15:41 · 332 阅读 · 0 评论 -
vmliux的生成以及相关依赖
分析的版本:linux3.10.84分析方法:从顶层makefile进行分析,了解一下为了生成vmlinux,makefile都做了什么。运行一个新的shell:# SHELL used by kbuildCONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bas原创 2017-08-30 14:59:48 · 344 阅读 · 0 评论 -
bios跟内核的传参动作
嵌入式中常用的bios有pmon和uboot,这里的传参操作对于uboot和pmon来说,其实是很相似的。由内核的链接过程知道,内核链接的开头一般就是head.S文件,入口函数为kernel_entry.现在看一下这个函数:NESTED(kernel_entry, 16, sp) # kernel entry point kernel_entry_setup # cpu s原创 2017-08-30 15:23:08 · 766 阅读 · 0 评论 -
linux中platform总线解析(二)(platform设备的注册)
这里分析的是linux3.10内核,mips架构。然后说一下platform设备注册的时机:那是系统启动到什么时候调用的呢?就是在device_initcall阶段,也就是对应的对应6阶段。看一下函数调用:ls2h_device-initcall--->platform_add_devices(ls2h_platform_devices,ARRAY_SIZE(ls2h_pl原创 2017-11-17 16:39:04 · 573 阅读 · 0 评论 -
mips架构linux启动分析(三)(setup_arch--->cpu_probe)
接下来就要介绍板级初始化了。这篇主要是说一下板级初始化函数setup_arch中的cpu_probe函数。这里看一下setup_arch函数的样子:void __init setup_arch(char **cmdline_p){ cpu_probe(); prom_init();#ifdef CONFIG_EARLY_PRINTK setup_early_printk原创 2017-11-14 20:20:03 · 1237 阅读 · 0 评论 -
linux中platform总线解析(一)(platform总线初始化)
platform初始化的函数调用:start_kernel-->rest_init-->kernel_init-->kernel_init_freeable-->do_base_setup--->driver_init--->platform_bus_init初始化函数:platform初始化函数:int __init platform_bus_init(void){原创 2017-11-17 11:35:16 · 1024 阅读 · 0 评论 -
GCC对C语言的一些扩展小结
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结:GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化。描述函数属性的几个重要的关键字:void noreturnfun() __attribute__((noreturn));//函数转载 2017-11-09 17:32:33 · 545 阅读 · 0 评论 -
linux中noinline和inline关键字解析
noinline关键字用来通知编译器不要内联这个函数。【赛迪网讯】inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translationunit(可以转载 2017-11-09 17:30:21 · 4133 阅读 · 0 评论 -
linux中asmlinkage宏的解析
在linux内核代码中,经常看到asmlinkage限定词,例如:asmlinkage long sys_getpid(void)等,介绍如下:asmlinkage 的定义(/usr/include/asm/linkage.h里面):#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))__attribute__是关键转载 2017-11-09 16:20:59 · 793 阅读 · 0 评论