Luke At Me

What I do, I understand.


  • Home

  • About

  • Tags

  • Categories

  • Archives

C language coding style

Posted on 2017-09-13 | Edited on 2019-12-29 | In 重拾 C 语言

本文描述的编码规范是个人比较喜欢的一些方式,基本上在个人项目中会优先采用,特此记录。
我比较喜欢 GNU/Linux 项目中的编码规范,所以本文中随处可见它们的影子~

Read more »

About sizeof

Posted on 2017-09-11 | Edited on 2019-12-29 | In 重拾 C 语言

sizeof 只能引用自动分配的变量,而不是一个指针可能指向的数据。
自动分配的或者静态的数组,都是可以使用 sizeof 来运算的。
因为sizeof是在编译期确定的,所以手动 malloc 的指针是 sizeof 无法处理的。

Read more »

试着聊聊并发和并行

Posted on 2017-09-05 | Edited on 2019-12-29

我们都知道电影就是依据人眼的视觉停留的特点而发明的,在一秒钟内切换超过24张连拍的静态图片人们就看不到切换图片期间的黑色间隔,从而达到动态的视觉效果。
所以,人类是很容易“欺骗”的,嘴上不承认,身体却很诚实地接纳了。

早期的计算机是单处理器系统,操作系统也是不支持多任务的。
后来出现了分时多任务系统,它采用了时间片轮转的方式,在一定的时间间隔内响应多个用户的操作。
类似电影,如果这个响应间隔可以做到足够小,那么用户就会觉得他在独占这台计算机。

比较著名的分时多任务系统就是 UNIX,而那个时候还没有多核处理器。于是,分时多任务处理的设计一直被操作系统设计者沿用至今。
接下来,我们该聊聊并发 (Concurrency) 了。
我没有找到关于并发的标准定义,但是我阅读过K&R的 UNIX 论文,我相信并发就是源自于分时多任务的理念。
它强调同一时间段有多个任务在同时进行。

直到后来,随着 CPU 技术的升级,我们迎来了多核处理器。
人们设想可以将任务分割成N多份子任务,然后交给多个处理器核心去运行,最后再整合处理结果。
这个效果非常接近硬件系统的组成,硬件系统一般由多个独立的工作模块或者局部电路组成,他们可以在同一时间点互不干扰地工作,最后通过并行接口传输的时候也是互不干扰的。
整个工作期间它们可以做到完全地同时。
所以,软件术语中的并行可以理解成硬件系统的并行效果,它的英文(Parallelism)也很类似并行接口(Paralle Port)的英文。

以前我自己也总是理不清这些术语,我希望您在阅读本文之后既可以正确地说出英文术语,也真正理解了它们。

关于脚本文件的第一行 - Shebang

Posted on 2017-03-28 | Edited on 2019-12-29 | In POSIX

我们在编写脚本的时候,通常会在第一行添加如下的语句:

1
2
#! /bin/bash
...

这是一个 POSIX 惯例,它有一个名称 — Shebang

在 POSIX 类系统中,如果文件第一行包含 Shebang 标志,该行后面的内容会被 POSIX 系统的程序加载器识别为解释器指令,并调用该解释器。
同时,将该文件传递给解释器作为参数。
因为文件第一行以 #! 开头,所以解释器(大部分解释器将#开头的语句作为注释)会忽略该行。

起源

关于它的起源,一直没有官方的说法,估计是约定俗成的惯例了,权当了解下吧。

  • 很多脚本主要是 shell 脚本,所以取其前面的几个字母 「She」;
  • #和!的读音为 Sharp 和 bang

例外

有的解释器指令不会忽略 #,比如 cat,如下:

1
2
3
#! /bin/cat
Hello World!

cat 会将该文件的所有内容输出。

总结

这里列举一下 Shebang 的几点要求:

  • #! 必须连接在一起,它的术语是 Shebang,也称为 hashbang
  • #! 一句必须在文件的最开始,第一行
  • # 开头的语句一般情况下会被当成注释而忽略,所以Shebang 对文件的内容是没有影响的
  • #! 开头的一行会设置解释器运行环境

Build Android Kernel of ARM64 on OS X

Posted on 2017-03-20 | Edited on 2019-12-29

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不需要。
    Read more »

简单的引导程序

Posted on 2017-03-17 | Edited on 2019-12-29 | In 操作系统实验

引导程序是我们开发操作系统的第一步,这里我贴出一个示例,来演示引导程序包含哪些内容。

这是一个简单的引导程序 bootloader, 它只用来显示一串字符, 然后什么都不做。
虽然很精简, 但是你也可以使用 nasm 编译它, 然后写入到 u 盘里在真机上实验。
后续添加代码注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
section mbr vstart=0x7c00
start:
;; init regs
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov fs, ax
mov sp, 0x7c00
.clearscreen:
;; clear screen
mov ax, 0x600
mov bx, 700
mov cx, 0
mov dx, 0x184f
int 0x10
.getcursorpos:
;; get position of cursor
mov ah, 3
mov bh, 0
int 0x10
.print:
;; print message at the cursor
mov ax, message
mov bp, ax
mov cx, 8
mov ax, 0x1301
mov bx, 0x2
int 0x10
.halt:
;; endless loop, doing nothing
jmp $
.data:
message db "MBR Demo"
times 510 - ($-$$) db 0
db 0x55, 0xaa

const指针

Posted on 2017-03-17 | Edited on 2019-12-29 | In 重拾 C 语言

指针本质上也是一个整型的变量, 但是声明指针的时候如果遇到 const 修饰, 情况会略复杂一点。

Read more »

Build Android Kernel of x86 on OS X

Posted on 2017-03-15 | Edited on 2019-12-29

Target Platform

nexus player, x86

Mac Hardware

MacBook Pro (Retina, 13-inch, Early 2015)

System

macOS Sierra, 10.12.3

OS X SDK

1
2
3
4
5
6
ls -ali /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
1915385 drwxr-xr-x 5 root wheel 170 2 9 09:37 .
1914962 drwxr-xr-x 5 root wheel 170 12 16 06:44 ..
1915386 drwxr-xr-x 5 root wheel 170 9 17 2017 MacOSX.sdk
2086424 drwxr-xr-x@ 5 ice wheel 170 11 16 2015 MacOSX10.11.sdk
1948121 lrwxr-xr-x 1 root wheel 10 2 9 09:08 MacOSX10.12.sdk -> MacOSX.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

1
2
3
4
5
6
In file included from arch/x86/tools/relocs_32.c:1:
arch/x86/tools/relocs.h:13:10: fatal error: 'byteswap.h' file not found
#include <byteswap.h>
^
1 error generated.
make[1]: *** [arch/x86/tools/relocs_32.o] Error 1

解决:拷贝对应文件夹中的头文件

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, 内核编译好了,启动不了

1
brew install gnu-sed coreutils

设置环境变量PATH
按照上述安装命令中生成的提示信息设置PATH

Luke Chen

Luke Chen

8 posts
3 categories
8 tags
RSS
GitHub E-Mail
0%
© 2019 Luke Chen
Powered by Hexo v3.2.2
|
Theme – NexT.Gemini v6.4.0