博文

Printf从函数库到OS跟踪流程

首先需要弄清楚:API-用户编程借口与 系统调用的区别,这里有一篇非常好的文章: http://www.tek-life.org/2010/10/12/linux%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%EF%BC%BBz%EF%BC%BD/ 另外,printf具体内部原理请见: http://www.tek-life.org/2010/10/12/printf%E5%92%8C%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA%EF%BC%BBz%EF%BC%BD/ 我仅仅是进行了code review arch/x86/boot/printf.c int printf(const char *fmt, ...) { char printf_buf[1024]; va_list args; int printed; va_start(args, fmt); printed = vsprintf(printf_buf, fmt, args); va_end(args); puts(printf_buf); return printed; } void __attribute__((section(".inittext"))) puts(const char *str) { int n = 0; while (*str) { putchar (*str++); n++; } } /* * These functions are in .inittext so they can be used to signal * error during initialization. */ void __attribute__((section(".inittext"))) putchar (int ch) { unsigned char c = ch; if (c == '\n') putchar('\r'); /* \n -> \r\n */ /* int $0x10 is known to have bugs involving touching registers it shouldn't. Be extra c...

A Skills List for Developing Embedded Software

图片
A Skills List for Developing Embedded Software   Dale Word Dept. of Electrical and Computer Engineering California State University, Chico 1. What’s Unique About Embedded Development The very nature of embedded systems dictates that the development of software for them is different than software for general purpose computers. a. Background The key factors that separate embedded computer systems from other type of computer based systems are as follows: · Dedicated Function – Embedded systems are designed to perform one specific set of functions, typically as part of a larger device or system. This is in contrast with a typical desktop system that is a general purpose computing platform, designed to support a variety of applications, each performing a different set of functions. · Limited Resources – Due to the fact that embedded systems are typically a component of a larger system, rather than a standalone computing device, they commonly are designed with limited computing resources. Th...

认识FAT32

图片
版权所有,禁止转载。 FAT32 文件系统是一个比较重要的文件系统,并且,设计思路比较简单。在 windows 操作系统,以及嵌入式平台上有广泛的用途。对于一个没有安装操作系统的普通 FAT32 分区的磁盘,主要的结构有: DBR , FAT 表,备份 FAT 表,以及数据区。注意与 FAT16 和 FAT12 区分, FAT32 是没有单独的根目录区的,因为单独的根目录区,对根目录下面的文件数量是有限制的。对于一个划分了 FAT32 分区的磁盘来说,在 DBR 里面包含有重要的磁盘分区信息。操作系统读取磁盘的时候,按照 DBR 和 FAT 表来读取和寻找文件的。 在 DBR 中,最重要的数据结构是 BPB 块, BPB 表里面包含了很多有用的信息。 Q : BPB 表保存在哪里? A :保存在 DBR 区中,而 DBR 区,在 FAT32 格式的磁盘分区中一般位于 0 磁头 1 柱面 1 扇区的位置。 0 磁头 0 柱面留给 MBR 以及保留扇区。如果没有安装操作系统,那么就在 0 磁头 0 柱面上第 1 个扇区。本文的实验没有安装操作系统的 SDCARD 。 知道了 BPB 保存在哪里后,要掌握 FAT32 分区情况,就需要知道一些关键的信息: 1 。 DBR 后面有多少的保留扇区? 2 。 FAT 表保存在哪里? 3 。一个 FAT 占多少扇区? 4 。在 FAT32 里面已经没有了根目录区的概念了,那么根目录在哪个扇区? 了解了这些以后,我们就能够大概跟踪到各个文件了。 DBR 截图 对照以上截图,以及 FAT 手册,我们就可以回答上面的这几个问题。 Q : DBR 后面有多少保留扇区? A : 0X0E 2 个字节。 0020 个扇区,也就是加上 DBR 一共 32 个扇区 Q : FAT 表保存在哪里? A :第一个柱面 DBR +保留扇区之后。第 32 个扇区之后,保存着 FAT 表 Q : 1 个 FAT 表占用多少扇区? A : 0X24 4 个字节。 01fc 个扇区 Q :根目录在哪个扇区? A :位于的簇号记录于 DBR 0X2C 4 个字节。不过,一般是在 FAT 表之后 DBR + 2 * FAT 表扇区之后。 0X0002 扇区 Q : FAT 表是以簇为单位来管理的,一个簇有多少扇区? A : DBR 里面偏移 0x0D 一个字...

用git管理源码

git管理源码,好处自不必说。学习git参考的是《pro git》。 该书的豆瓣链接:http://book.douban.com/subject/3420144/ 关于文件的修改: 如果,自己想添加新的文件。最好是,自己建立一个分支: git branch new-branch    //建立新的分支 git checkout new-branch //切换到新的分支下工作 这时候,可以添加或者修改文件。 注意,这个时候,该分支下新添加的文件与master分支是没有一点关系的。 另外,说一下git revert ,git reset --hard和 --soft的区别 git reset --mixed id ,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变)。 git reset --soft id. 实际上,是git reset --mixed id 后,又做了一次git add git reset --herd id.是将git的HEAD变了,文件也变了。 git revert与git reset最大的不同是,git revert 仅仅是撤销 某次 提交。 比如git revert HEAD~1  ,那么会撤销倒数第二次的提交结果。而倒数第一次的提交记录,仍然在。 如果git reset --hard HEAD~1,那么,commit退回到倒数第三次的状态中。 总体来讲,还是git revert 好啊,雁过留声嘛。 其实,通过git reset --soft id的方法,可以将原来多次的git提交记录合并为一个。 两个分支的合并:(分支也就是版本的意思) git pull . 分支1,  将分支1的变化提交到分支2。 在分支合并部分,不要用git merge 和 git push。容易出错。 另外,还有一种分支合并的方法是rebase。这种方法,更符合思维。 git checkout A1 git rebase master 过程是,找到将A1和master的共同commit点。A1 把自分叉以来的所有补丁都达到master上。相当于: git checkout master git pull . A1 ----or---- git checkout master git merge A1 关于查...

通过内核获取config文件

有两种方法,但前提是需要配置了,才能在编译好的内核中再获取config文件。貌似是一个蛋生鸡,鸡生蛋的纠结问题。 但,有时候,我们需要配置内核运行。因此,一般是需要获得一个既有的能跑的config文件。下面介绍的这两种获取config的方法就是用于此目的的。 首先,说一下方法: 法1.在运行的内核中的/proc/config.gz 保存的便是配置文件了 法2.通过/usr/src/linux/scripts/extract-ikconfig 脚本获得一个已经编译好的内核。 这两种方法的前提是,获取内核config的内核在编译的时候,下面的两项被选中了。 CONFIG_IKCONFIG This option enables the complete Linux kernel ".config" file contents to be saved in the kernel. It provides documentation of which kernel options are used in a running kernel or in an on-disk kernel. This information can be extracted from the kernel image file with the script scripts/extract-ikconfig and used as input to rebuild the current kernel or to build another kernel. It can also be extracted from a running kernel by reading /proc/config.gz if enabled (below). 如果这一项配置了,那么通过脚本extract-ikconfig获得config文件 CONFIG_IKCONFIG_PROC This option enables access to the kernel configuration file through /proc/config.gz. 如果这一项配置了,那么...

shell脚本后台执行的若干总结

命令后面直接加上&的幼儿园方法不讨论,因为解决不了问题。 shell关闭了,但仍然让脚本执行的方法: 1. nohup 就是忽略掉了父进程hungup信号,继续执行。默认是将脚本所有的输出,输出到了/dev/null或者 nohup.out. 2.用setsid的方法,让脚本的父进程设置为init,这样,关闭shell,脚本照样执行。但对于有输出的脚本程序就不行了,那么用什么方法捏?可以指定其标准输出和错误输出都到/dev/null中。 setsid python /opt/proxy/localproxy/proxy.py > /dev/null 2>&1 另外,搞清楚: command >/devnull 2>&1 与 command > /dev/null 2>/dev/null 其区别不解释. 对于xterm远程登录,可能掉线的情况,推荐方法是用screen.这样可以续上原来的session. screen的具体用法不解释。

Linux设备注册

在加载驱动之前,设备最先被加载。其中最主要的就是资源的注册了。本文简要介绍一些注册的一些过程。 最初,是要准备设备的资源,然后被初始化。 拿imx的MMC为例,其他的与之相同。 arch/arm/mach-imx/gener.c static struct resource imx_mmc_resources[] = { [0] = { .start = 0x00214000, .end = 0x002140FF, .flags = IORESOURCE_MEM, }, [1] = { .start = (SDHC_INT), .end = (SDHC_INT), .flags = IORESOURCE_IRQ, }, }; Coment:设备的资源定义一般都位于arch/arm/mach-机器类型目录下面的文件中。 static struct platform_device imx_mmc_device = { .name = "imx-mmc", .id = 0, .num_resources = ARRAY_SIZE(imx_mmc_resources), .resource = imx_mmc_resources, }; 最初的设备定义仅此而已。 然后,看一下注册是经过怎样的流程: void __init imx_map_io(void) { iotable_init(imx_io_desc, ARRAY_SIZE(imx_io_desc)); } static struct platform_device *devices[] __initdata = { &imx_mmc_device, &imxfb_device, &imx_uart1_device, &imx_uart2_device, }; static int __init imx_init(void) { return platform_add_devices(d...