ChinaUnix.net
相关文章推荐:

linux-arm-g

学习步骤如下: 1、linux 基础 安装linux操作系统 linux文件系统 linux常用命令 linux启动过程详解 熟悉linux服务能够独立安装linux操作系统 能够熟练使用linux系统的基本命令 认识linux系统的常用服务安装linux操作系统 linux基本命令实践 设置linux环境变量 定制linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器 2、Shell 编程基础 Shell简介 认识后台程序 Bash编程熟悉linux系统下的编辑环境 熟悉L...

by jeff200902 - 嵌入式 - 阅读(0) 回复(0)

其他文章推荐
相关博文

                                                ----XR21V1414 USB转串口                                                   ----16C554 总线扩展串口 不同的项目,有些项目经常需要转串口。有两种方式,一种用USB去扩,另一种用16C554 去扩。这两种从本质上来说,是一样的。成本上也不相上下。如果两种方式在项目设计中都可以的话,建议采用总线的方式。因为扩...

by ispsubb - 嵌入式 - 阅读(7740) 回复(0)

一、概述 在linux系统里,假设有两处代码(比如不同线程的两个函数F1和F2)都要获取两个锁(分别为L1和L2),如果F1持有L1后再去获取L2,而此时恰好由F2持有L2且它也正在尝试获取L1,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的AB-BA死锁。 死锁导致的最终结果无需多说,关于如何避免死锁在教科书上也有提到,最简单直观的做法就是按顺序上锁,以破坏死锁的环形等待条件。但...

by again1002 - LINUX - 阅读(420) 回复(0)

一、概述 如果仔细地阅读完初始化函数start_kernel,就会发现里面还有调用smp_processor_id()函数,这两个函数都是获取多处理器的ID,为什么会需要两个函数呢?其实这里有一个差别的,smp_setup_processor_id()函数可以不调用setup_arch()初始化函数就可以使用,而smp_processor_id()函数是一定要调用setup_arch()初始化函数后,才能使用。smp_setup_processor_id()函数是直接从cpu寄存器获取对称多处理器的ID,而smp_pr...

by again1002 - LINUX - 阅读(180) 回复(0)

一、概述 程序启动时,stack_canary将随机选择的小整数值保存在返回地址保存位置之前。大部分缓冲溢出攻击是从内存地址的低位向高位覆盖写内存,所以为了覆写返回地址,必须覆写canary值。因此可使用返回地址在返回前查看canary值,从而确认是否发生栈缓冲溢出攻击。 //初始化栈canary值,canary值用于防止栈溢出攻击的堆栈的保护字 static __always_inline void boot_init_stack_canary(void) ...

by again1002 - LINUX - 阅读(120) 回复(0)

一、概述 debug_objects_early_init()函数用于内核的对象调试。依赖配置CONFIG_DEBUG_OBJECTS。 二、相关结构体 struct debug_bucket {     struct hlist_head    list;    //挂载的是当前debug_obj对象     raw_spinlock_t        lock; }; struct debug_obj {     struct hlist_node node;    /...

by again1002 - LINUX - 阅读(120) 回复(0)

arm-linux时钟初始化   arm-linux时钟初始化是从MACHINE_START中的map_io函数开始的,map_io函数中会调用s3c24xx_init_clocks(12000000);来进行,我们来看一下初始化过程 static struct cpu_table *cpu; void __init s3c24xx_init_clocks(int xtal) {     if (xtal == 0)        xtal = 12*1000*1000;       if (cpu == NULL)        panic("s3c24xx_init_clocks: no cpu setup?\n");       if (c...

by zzfree54 - 嵌入式 - 阅读(270) 回复(0)

由于很多人总问这个问题,所以这里做一个总结文档供大家参考。这里必须先说明,以下的步骤都是针对linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的...

by zhjmyx - 嵌入式 - 阅读(870) 回复(0)

arm-linux的gdb移植分为两种情况.一种是交叉调试版。这一种模式是需要编译一个arm-linux版本gdbserver (GDB的stub模块).然后再编译一个X86版本交叉调试的gdb.为了与桌面版本身的gdb 区别开来,一般改名为 arm-linux-gdb。两者通过串口或者网络进行互联。还有一种是干脆把整个gdb移植成一个arm的本地版。在开发板上直接用gdb来调试。前一种方法是比较正统的方法。它gdbserver可以通过arm-linux-gdb直接在host上单步调试target的应用...

by elnino100 - LINUX - 阅读(210) 回复(0)

arm linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口。在应用程序和硬件之间设置一个额外层具有很多优点。首先,这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来。其次,这极大地提高了系统的安全性,因为内核在试图满足某个请求之前在接口级就可以检查这种请求的正确性。最后,更重要的是这些接口使得程序具有可移植性,因为只要内核所提供的一组接口相同,那么在任一内...

by enjoylhl - 嵌入式 - 阅读(390) 回复(0)

 linux的内存(正式)页表是在内核代码执行到start_kernel函数后执行paging _init函数建立的,这里要注意一个事情就是说,这里paging_init函数可以正常创建内存页表的条件有两个: 1、              meminfo已初始化:即初始化物理内存各个node的各个bank,一般对于小型arm嵌入式设备,不涉及多个内存就是一个node和一个bank;这部分初始化是在paging_init函数前面的对uboot所传参数的解析中完成的(可在内核的arm...

by 雾琰 - LINUX - 阅读(420) 回复(0)