# 學習 Linux
> 註:因為排版有點困難所以直接搬到[這裡](https://hackmd.io/@tinyynoob/Bkwm9S1gq)重新開始
[TOC]
## Intro
### C Language
#### Types
a value stored in an object or returned by a function
Types are partitioned into :
- function type
- object type
- incomplete type
> [你所不知道的C語言 指標篇](https://hackmd.io/@sysprog/c-prog/%2Fs%2FHyBPr9WGl)
> [ISO/IEC 9899:TC3](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)
---
a pointer points to a word.
doubly free 會造成 undefined behavior
free(NULL) 是合乎規範的用法,它不會做任何事情
在需要歸零的情況下 `calloc` 比 `malloc` + `memset`更有效率
`void *` 存在的目的就是為了被轉型
#### Type qualifiers
##### const
- **`float *`** has type ''pointer to float''
- The const-qualified version of this type is designated as **`float * const`**. Its type is ''const-qualified pointer to float''.
- whereas **`const float *`** has type ''pointer to const-qualified float''
##### restrict
An object that is accessed through a restrict-qualified pointer has a special association with that pointer.
If an object is accessed through one of the pointer parameters, then it is not also accessed through the other.
#### strict aliasing rule
https://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html
The rule may be avoid by **union**.
#### compile
|gcc||
|:-:|:--|
| -o | 生成目的檔案 |
| -E | only preprocessing |
| -c | no linking |
| -Werror | 把 warning 轉為 error |
| -Wall | generate all warnings |
| -w | no warning |
| -I | specify header path |
| -L | specify function library path |
| -static | 連結成靜態函式庫 |
| -g | 包含 debug 資訊 |
| -v | 輸出編譯過程資訊 |
| -O<n\> | 編譯器最佳化等級 $n\in \{0,1,2,\dotsc\}$ 預設為 O1 |
交換編譯:在一種平台上編譯,然後放到另一種平台執行。
objdump -d \*.c 反組譯命令
#### gdb
##### 語法
- `run` ___
- `run` ___ `<` ___ (run)
- next
- step
- continue
- print _
- `whatis` _
- `break` ___ [`if` ___]
- set args __
- set `*argv[]`
#### Makefile
> https://hackmd.io/@sysprog/gnu-linux-dev/https%3A%2F%2Fhackmd.io%2Fs%2FSySTMXPvl
#### Linux kernel coding style
> [Linux kernel coding style](https://www.kernel.org/doc/html/v4.10/process/coding-style.html)
If only one branch of a conditional statement is a single statement, all the branches should use braces.
```c=
if (condition) {
do_this();
do_that();
} else {
otherwise();
}
```
#### GNU C
- **`typeof()`** 取得 data type
```c
typeof(*x) y;
```
- variable length array
```c=
struct t {
int length;
char contents[0];
};
int myLength;
struct t *p = malloc(sizeof(struct t) + myLength);
p->length = myLength;
```
- switch-case with ranges
```c=
static int local_atoi(const char *name)
{
int val = 0;
for(;; name++) {
switch (*name) {
case '0' ... '9':
val = 10 * val + (*name - '0');
break;
default:
return val;
}
}
}
```
- Designated Initializers
> https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
- **`__attribute__()`**
### Computer Architechture
- big endian
- e.g. 1234
- TCP/IP
- little endian
- e.g. 4321
[**cache**](https://hackmd.io/@sysprog/HkW3Dr1Rb?type=view)
### OS
- Hard real time: The system can answer within a given maximum amount of time (guaranteed worst case)
- Soft real time:
## 基本 Linux 操作與概念
POSIX = Portable Operating System Interface 規範 kernel 與 application 間的界面
>[鳥哥](https://linux.vbird.org/linux_basic/centos7/0110whatislinux.php)
>[鳥哥 Linux 權限操作與檔案管理](https://linux.vbird.org/linux_basic/centos7/0210filepermission.php)
/var/lock/
- [update syntax](https://project.zhps.tp.edu.tw/ethan/2019/03/ubuntu-%E6%9B%B4%E6%96%B0%E8%88%87%E5%8D%87%E7%B4%9A/)
### /lib/modules/5.13.0-28-generic/kernel
| | |
|:-:|:--|
| arch | CPU 相關程式碼 |
| block ||
| certs | 證書機制 |
| crypto | 加密相關 |
| Documentation ||
| drivers ||
| fs | file system |
| include ||
| init ||
| ipc | interprocess communication |
| kernel | process management, scheduler, lock, e.t.c.|
| lib ||
| mm | memory management|
| net | 網路通訊協定相關 |
| samples ||
| scripts ||
| security ||
| sound | 音效卡相關 |
| tools | 一些開發工具,如 perf 等 |
| usr ||
| virt | 虛擬化相關 |
usr: unix software resource
### stream I/O
fd: file descriptor
### 中斷處理 interrupt handler
### 檔案系統 file system
Linux 抽象出 VFS (virtual file system) 軟體層,以便於支援多種檔案系統架構。
---
### Linux kernel setting
- make config
- "y": 編譯進核心
- "m": 編譯成模組
- "n": 不編譯
- make menuconfig : with GUI
設定檔 .config
### Linked List
Linux kernel 於 `<list.h>` 中提供了 `struct list_head` 及一套框架來操作 list
[Linux kernel API 文件](https://www.kernel.org/doc/html/latest/core-api/kernel-api.html)
```c
struct list_head {
struct list_head *next, *prev;
}
```
使用上需要將 `struct list_head` 嵌入其它資料結構,並使用 `container_of()` 來獲取需要的內容。使用範例如下:
```c=
struct node {
int data;
struct list_head p; // note: it is not a pointer
};
int main(void)
{
struct list_head h = LIST_HEAD_INIT(h);
/* construct a list with 100 elements */
for (int i = 1; i <= 100; i++) {
struct node *newNode = (struct node *) malloc(sizeof(struct node));
if (!newNode)
goto clearlist;
newNode->data = i;
list_add_tail(&newNode->p, &h);
}
/* traverse the list and print each data */
struct list_head *it;
list_for_each(it, &h)
printf("%d\n", container_of(it, struct node, p)->data);
clearlist:
while (!list_empty(&h)) {
struct list_head *curr = h.next;
struct node *tmp = container_of(curr, struct node, p);
list_del(curr);
free(tmp);
}
return 0;
}
```
## 疑惑區
- argc/argv[]
- **static**, **extern**
- macro 與 pointer 之互動
-
## skip part
- QEMU lab
- ARM structure