本文描述的编码规范是个人比较喜欢的一些方式,基本上在个人项目中会优先采用,特此记录。
我比较喜欢 GNU/Linux 项目中的编码规范,所以本文中随处可见它们的影子~
About sizeof
sizeof 只能引用自动分配的变量,而不是一个指针可能指向的数据。
自动分配的或者静态的数组,都是可以使用 sizeof 来运算的。
因为sizeof是在编译期确定的,所以手动 malloc 的指针是 sizeof 无法处理的。
试着聊聊并发和并行
我们都知道电影就是依据人眼的视觉停留的特点而发明的,在一秒钟内切换超过24张连拍的静态图片人们就看不到切换图片期间的黑色间隔,从而达到动态的视觉效果。
所以,人类是很容易“欺骗”的,嘴上不承认,身体却很诚实地接纳了。
早期的计算机是单处理器系统,操作系统也是不支持多任务的。
后来出现了分时多任务系统,它采用了时间片轮转的方式,在一定的时间间隔内响应多个用户的操作。
类似电影,如果这个响应间隔可以做到足够小,那么用户就会觉得他在独占这台计算机。
比较著名的分时多任务系统就是 UNIX,而那个时候还没有多核处理器。于是,分时多任务处理的设计一直被操作系统设计者沿用至今。
接下来,我们该聊聊并发 (Concurrency) 了。
我没有找到关于并发的标准定义,但是我阅读过K&R的 UNIX 论文,我相信并发就是源自于分时多任务的理念。
它强调同一时间段有多个任务在同时进行。
直到后来,随着 CPU 技术的升级,我们迎来了多核处理器。
人们设想可以将任务分割成N多份子任务,然后交给多个处理器核心去运行,最后再整合处理结果。
这个效果非常接近硬件系统的组成,硬件系统一般由多个独立的工作模块或者局部电路组成,他们可以在同一时间点互不干扰地工作,最后通过并行接口传输的时候也是互不干扰的。
整个工作期间它们可以做到完全地同时。
所以,软件术语中的并行可以理解成硬件系统的并行效果,它的英文(Parallelism)也很类似并行接口(Paralle Port)的英文。
以前我自己也总是理不清这些术语,我希望您在阅读本文之后既可以正确地说出英文术语,也真正理解了它们。
关于脚本文件的第一行 - Shebang
我们在编写脚本的时候,通常会在第一行添加如下的语句:
这是一个 POSIX 惯例,它有一个名称 — Shebang
在 POSIX 类系统中,如果文件第一行包含 Shebang 标志,该行后面的内容会被 POSIX 系统的程序加载器识别为解释器指令,并调用该解释器。
同时,将该文件传递给解释器作为参数。
因为文件第一行以 #! 开头,所以解释器(大部分解释器将#开头的语句作为注释)会忽略该行。
起源
关于它的起源,一直没有官方的说法,估计是约定俗成的惯例了,权当了解下吧。
- 很多脚本主要是 shell 脚本,所以取其前面的几个字母 「She」;
#和!的读音为Sharp和bang
例外
有的解释器指令不会忽略 #,比如 cat,如下:
cat 会将该文件的所有内容输出。
总结
这里列举一下 Shebang 的几点要求:
#!必须连接在一起,它的术语是Shebang,也称为hashbang#!一句必须在文件的最开始,第一行#开头的语句一般情况下会被当成注释而忽略,所以Shebang对文件的内容是没有影响的#!开头的一行会设置解释器运行环境
Build Android Kernel of ARM64 on OS X
elf.h file not found
拷贝 elf.h (二选一,两个都行)
- GitHub
- 修改
/Volumes/android/aosp/external/elfutils/libelf/elf.h
遇到了features.h 文件未找到的错误,就将#include <features.h>一行注释掉。
将elf.h拷贝到/usr/include或者/usr/local/include中,推荐放在后者,放在前者的话系统升级时会覆盖。目前发现libelf不需要。
简单的引导程序
引导程序是我们开发操作系统的第一步,这里我贴出一个示例,来演示引导程序包含哪些内容。
这是一个简单的引导程序 bootloader, 它只用来显示一串字符, 然后什么都不做。
虽然很精简, 但是你也可以使用 nasm 编译它, 然后写入到 u 盘里在真机上实验。
后续添加代码注释。
|
|
Build Android Kernel of x86 on OS X
Target Platform
nexus player, x86
Mac Hardware
MacBook Pro (Retina, 13-inch, Early 2015)
System
macOS Sierra, 10.12.3
OS X SDK
|
|
Issue fixing
elf.h file not found
拷贝 elf.h (二选一,两个都行)
- GitHub
/Volumes/android/aosp/external/elfutils/libelf/elf.h,遇到了features.h文件未找到的错误,就将#include <features.h>一行注释掉。
将elf.h拷贝到/usr/include或者/usr/local/include中,推荐放在后者,放在前者的话系统升级时会覆盖。
目前发现libelf不需要。
byteswap.h file not found
|
|
解决:拷贝对应文件夹中的头文件
arch/x86/kernel/cpu/capflags.c:69:31: error: expected expression before ‘]’ token
[X86_FEATURE_PCLMULQDQ (432+] = “pclmulqdq (432+”,
等这一个C文件里的错误。
根据Linux的github里面的sh脚本,这个文件应该是根据arch/x86/kernel/cpu/mkcapflags.sh/Volumes/android/x86_64/arch/x86/include/asm/cpufeature.h 和生成的。
解决:拷贝对应文件夹中的capflags.c
下载 GNU sed 和 stat
起初未替换sed 和stat, 内核编译好了,启动不了
设置环境变量PATH
按照上述安装命令中生成的提示信息设置PATH