- 博客(32)
- 资源 (20)
- 收藏
- 关注
原创 pci总线扫描设备本地操作(二)(local bus operation)
当type1命令通过桥片转换为type0命令格式或者是type0命令在到达总线后,是怎么查找到设备的呢?接下来就看一下这个过程的操作。type0命令只是在本地总线进行操作,不会传递到其他总线上,如果要查找的设备在其他总线上,那就会被master-abort终止。type1命令会在不同的总线上进行传播,直到找到对应设备所在桥片后转换为type0格式,并且除了pci桥其他设备不会对
2017-11-30 16:43:47 1211
原创 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
原创 一篇讲解PCI架构的好文章
一篇外国人写的讲解pci的文章,很清楚,很细致,看完能对pci有一个清晰的了解。http://tldp.org/LDP/tlk/dd/pci.html
2017-11-24 14:17:59 692
原创 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
原创 linux中bootmem分析
bootmem机制是在linux启动期间,buddy管理器,slab管理器没有初始化好时使用的内存管理方法。之后系统起来之后,就交由buddy等方法来管理了。在多核系统中,每个核都对应这个一个node_data结构体,其中就记录着这个核使用的内存,也包括了bootmem的信息。看一下node_data的结构体#define LEVELS_PER_SLICE 1
2017-11-21 20:36:06 742
原创 linux中memblock的使用
memblock是linux用于管理内存的一种机制。接下来说一些这个机制的初始化,以及其操作方法。先看一下memblock中使用的结构体://memblock中的flagenum { MEMBLOCK_NONE = 0x0, /* No special request */ MEMBLOCK_HOTPLUG = 0x1, /* hotpluggable region */ M
2017-11-21 19:45:10 2289 1
原创 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 3590
原创 mips架构linux启动分析(五)(bootmem和blockmem机制的初始化)(prom_init_numa_memory)
这篇内容涉及到了对bootmem和memblock机制的使用(当然了bootmem就是在系统启动时使用的),不会展开太多进行说明。后面会单独拿出来说一下。PS: 这里涉及到很对node和cpu这些全局或局部变量的使用,有什么区别吗?说明一下:感觉应该是一样的,这样就导致了分析代码页不好分析。 其实比较简单。在一个主板上,如果有4个处理器(不管这个处理器是不是多核)
2017-11-21 15:24:21 1025
转载 vim中的折叠功能
vim代码折叠功能问题:怎样在vim中实现代码折叠功能? 解决方法:直接使用vim自带的快捷键和命令,便可以实现功能强大的折叠 小试折叠: 1 :set fdm=marker 在vim中执行该命令 2 5G 将光标跳转到第5行 3 zf10G 折叠第5行到第10行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记 4 zR
2017-11-20 15:11:03 1921
原创 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
原创 linux中platform总线解析(四)(platform设备注册后自动匹配驱动)
当一个platform设备注册后,就会自动为其匹配驱动,这是怎么做到的呢?其实前面的分析已经有提到。这里只说函数调用,以及关键的部分,具体的不再分析。下面再来分析一次。这里函数进行了删减,把这个自动匹配的过程突显出来。具体的函数调用关系:platform_add_devices--->platform_device_register---->platform_dev
2017-11-17 17:38:07 398
原创 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
原创 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 571
原创 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
原创 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
转载 一篇不错的关于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
转载 GNU中__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attrib
2017-11-14 21:01:04 242
原创 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
原创 介绍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 217
转载 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
原创 __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
原创 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
原创 ____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
转载 mips架构中的原子操作指令(llsc)
在多线程程序中,为了实现对共享变量的互斥访问,一般都会用spinlock实现,而spinlock需要一个TestAndSet的原子操作。而这种原子操作是需要专门的硬件支持才能完成的,在MIPS中,是通过特殊的Load,Store操作LL(Load Linked,链接加载)以及SC(Store Conditional,条件存储)完成的。LL 指令的功能是从内存中读取一个字,以实现接下来的
2017-11-14 10:05:50 2875
原创 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
转载 别人分析的mips架构的linux启动第一步(作为对比)
系统加电启动后,MIPS处理器默认的程序入口是0xBFC00000(虚拟地址),此地址在KSEG1(无缓存)区域内,对应的物理地址是0x1FC00000(高3位清零),所以CPU从物理地址0x1FC00000开始取第一条指令,这个地址在硬件上已经确定为FLASH(BIOS)的位置,BIOS将Linux内核镜像文件拷贝到RAM中某个空闲地址(LOAD地址)处,然后一般有个内存移动的操作(Entry
2017-11-13 17:27:19 2572
原创 分析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
转载 GCC对C语言的一些扩展小结
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结:GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化。描述函数属性的几个重要的关键字:void noreturnfun() __attribute__((noreturn));//函数
2017-11-09 17:32:33 545
转载 linux中noinline和inline关键字解析
noinline关键字用来通知编译器不要内联这个函数。【赛迪网讯】inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translationunit(可以
2017-11-09 17:30:21 4133
转载 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
转载 linux中asmlinkage宏的使用
asmlinkage是个宏,使用它是为了保持参数在stack中。看一下/usr/include/asm/linkage.h里面的定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))其中 __attribute__是关键字,是gcc的C语言扩展。__attribute__机制是GNU C的一大特色
2017-11-09 16:19:30 309
转载 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
《LINUX内核修炼之道》
2017-10-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人