[TOC]
初学 C 语言的时候看到过 陈皓《编程修养》 中的内容,当时不以为意。
工作一年后无意间再次看到这篇文章,感触颇深。发现其中的每一点言之凿凿。
于是拷贝其目录,试试看自己能否也像前辈一样将每一个修养的细节都用代码语言表现出来。
目录01、版权和版本
02、缩进、空格、换行、空行、对齐
03、程序注释
04、函数的[in][out]参数
05、对系统调用的返回进行判断
06、if 语句对出错的处理
07、头文件中的#ifndef
08、在堆上分配内存
09、变量的初始化
10、h和c文件的使用
11、出错信息的处理
12、常用函数和循环语句中的被计算量
13、函数名和变量名的命...
Git version: 2.7.4OS: Ubuntu 16.04
[TOC]
需求背景将 A 功能从 branchA 合入到主分支 master 后过了很多个提交后,发现 A 功能某个地方有 bug,那最好的方法就是跳回到写 A 功能的时候进行修改。
这分为两个部分
修改之前某次的 commit 信息
修改之前某次的 commit 内容
实现方法比如我现在的 git log 如下:1234fd65115db FUNCTION Mipi Camera Camera IC: OV13850 Interface: RX197a8ad0f7f FUNCTION 移植 8寸 Mipi LC...
[TOC]
预处理、编译、汇编、链接-E,-S,-c 和 -Ocpp,cc1,as,ld
预处理完成任务:预处理命令处理、头文件的包含、宏定义的拓展、条件编译的选择-E1gcc -E hello.c
在命令行定义宏:1gcc -DDEBUG hello.c
等于1#define DEBUG
编译(翻译)完成任务:词法分析、语法分析、源码翻译为汇编代码-S1$ gcc -S hello.c
编译器优化123$ gcc -o hello hello.c # 采用默认选项,不优化$ gcc -O2 -o hello2 hello.c # 优化等次是2$ gcc -Os -...
[TOC]
本文分析的问题是函数的栈调用机理。先说结论
结论
通过栈传递参数
从右向左 参数压栈
先压参数入栈
然后返回地址入栈
ebp 等寄存器入栈
调用过程中的栈是由调用方来维护
所谓的寄存器入栈 实际上是指的一组寄存器入栈。因为在新调用的函数中,这些寄存器仍然会被用到,为了退出调用函数后能恢复状态,凡是有可能被修改的寄存器都要入栈。出栈顺序和入栈顺序相反。这个过程由编译器维护。
栈在现在普遍应用的单指令流,单数据流计算机上,编译后的程序都是基于栈来调度的。程序装载入内存后,代码指令映射到内存空间的指令区,操作的数据则在对应的栈空间和堆空间上。堆空间用于动态内存的分配、应用。本文分...
sysfs 是 Linux 内核中一种新的 虚拟的基于内存的 文件系统。它的作用和 proc 类似,但除了同样具有查看(cat) 和 设定(echo) 内核参数功能之外,也可以用来管理 Linux 统一设备模型。它使用 sysfs 导出内核数据的方式更为统一。
sysfs 挂载点 /sys 目录结构
sysfs 与 Linux 统一设备模型的关系
常见属性文件的用法
以内核编程方面的具体例子展示如何添加 sysfs 支持
sysfs 介绍及其挂载点 /sys 下的目录结构/syssysfs 文件系统会被挂载在 /sys 上。参考 sysfs-rules.txt
procsysfs ...
统一设备模型是 Linux 2.5 内核开始开发的一套新设备模型。目的是为了对计算机上所有的设备进行统一的操作和表示。这个模型是在分析了 PCI 和 USB 的总线驱动过程中得到的,他们两种总线类型能代表当前系统中大多数设备类型,它们都有完善的热插拔机制和电源管理的支持,也有级联机制的支持,以桥接 PCI/USB 总线控制器的方式可以支持更多的设备。
比如典型的 PC 系统中, CPU 控制的是 PCI 总线,USB 总线是以一个 PCI-USB 桥的形式接在 PCI 总线设备上,外部 USB 再接在 USB 总线设备上。当 计算机 挂起(suspend)时,Linux 内核应该以“外...
服务器容量 10 T 竟然只剩 50G 不到了。公司加了 500 G 的普通硬盘用于存放不常用的源码。以下是步骤:
查看当前硬盘状况12$ df -h $ ls -l /dev/sd*
可以看到 sdb 是我们的第二块硬盘
1$ fdisk -l
可以看到Disk /dev/sdb doesn’t contain a valid partition table我们看到 sdb 还未挂载。
添加分区1$ sudo fdisk sdb
按 m 帮助可以看到用法
依次输入n //添加分区p //主要分区 //p表示主要 e表示拓展1 //起始分区号1 //起始扇区 //我这里填的是 2...
OS : Ubuntu16.04
需求场景修改 bootanimation 的时候美工发过来的文件太多了 , 需要批量重命名
方法Linux 下的 rename 命令格式是1rename 's/修改前的内容/修改后的内容/' 要修改的文件
批量添加后缀 txt1rename 's/$/\.txt/' *
$ 表示结束符,\.txt 表示修改为 .txt
批量修改后缀1rename 's/\.txt/\.bat/'
将 .txt 改为 .bat
将 10_01_001.png 改名为 001.png1rename '...
内核现在采用的是 sysfs 文件系统。在 sysfs 诞生之前我们采用的是 proc 文件系统。sysfs 是一个与 /proc 类似的文件系统,但是它的组织更好(从 /proc 中学习了很多教训)。不过 /proc 已经确立了自己的地位,因此即使 sysfs 与 /proc 相比有一些优点,/proc 也依然会存在。本文对 /proc 文件系统一些基础的知识进行归纳和整理。
另外还有一个 debugfs 文件系统,不过(顾名思义)它提供的更多是调试接口。debugfs 的一个优点是它将一个值导出给用户空间非常简单(实际上这不过是一个调用而已)。
proc 是一个虚拟的文件系统,我们利...
[TOC]
Version: linux-2.6.32
定义/include/linux/compiler.h12#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)
12//gcc 中提供的预处理命令,利于代码优化。long __builtin_expect (long exp, long c) [Built-in Function]
注解You may use __builtin_expect to provide the compiler with bra...