From 9dafe2825441653f247f52fe1fac97b4f01e6ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Dost=C3=A1l?= Date: Sat, 22 Jul 2017 20:02:40 +0200 Subject: [PATCH 001/179] Initialization: fix copy paste error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit replace "will have will have" with only "will have" Signed-off-by: Radek Dostál --- Initialization/linux-initialization-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-1.md b/Initialization/linux-initialization-1.md index 010f4af..e2309c1 100644 --- a/Initialization/linux-initialization-1.md +++ b/Initialization/linux-initialization-1.md @@ -485,7 +485,7 @@ INIT_PER_CPU(gdt_page); As we got `init_per_cpu__gdt_page` in `INIT_PER_CPU_VAR` and `INIT_PER_CPU` macro from linker script will be expanded we will get offset from the `__per_cpu_load`. After this calculations, we will have correct base address of the new GDT. -Generally per-CPU variables is a 2.6 kernel feature. You can understand what it is from its name. When we create `per-CPU` variable, each CPU will have will have its own copy of this variable. Here we creating `gdt_page` per-CPU variable. There are many advantages for variables of this type, like there are no locks, because each CPU works with its own copy of variable and etc... So every core on multiprocessor will have its own `GDT` table and every entry in the table will represent a memory segment which can be accessed from the thread which ran on the core. You can read in details about `per-CPU` variables in the [Theory/per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) post. +Generally per-CPU variables is a 2.6 kernel feature. You can understand what it is from its name. When we create `per-CPU` variable, each CPU will have its own copy of this variable. Here we creating `gdt_page` per-CPU variable. There are many advantages for variables of this type, like there are no locks, because each CPU works with its own copy of variable and etc... So every core on multiprocessor will have its own `GDT` table and every entry in the table will represent a memory segment which can be accessed from the thread which ran on the core. You can read in details about `per-CPU` variables in the [Theory/per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) post. As we loaded new Global Descriptor Table, we reload segments as we did it every time: From 684c5ee70b27fef1e7a78e4764cafbb32a29e8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Dost=C3=A1l?= Date: Sat, 22 Jul 2017 20:07:52 +0200 Subject: [PATCH 002/179] Initialization: fix spelling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "hierarcy" => "hierarchy" "hierarcies" => "hierarcies" Signed-off-by: Radek Dostál --- Initialization/linux-initialization-8.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Initialization/linux-initialization-8.md b/Initialization/linux-initialization-8.md index 1b391ab..9bcccd3 100644 --- a/Initialization/linux-initialization-8.md +++ b/Initialization/linux-initialization-8.md @@ -322,7 +322,7 @@ The `real-time` policies are also supported for the time-critical applications: Now let's get back to the our code and look on the two configuration options: `CONFIG_FAIR_GROUP_SCHED` and `CONFIG_RT_GROUP_SCHED`. The least unit which scheduler operates is an individual task or thread. But a process is not only one type of entities of which the scheduller may operate. Both of these options provides support for group scheduling. The first one option provides support for group scheduling with `completely fair scheduler` policies and the second with `real-time` policies respectively. -In simple words, group scheduling is a feature that allows us to schedule a set of tasks as if a single task. For example, if you create a group with two tasks on the group, then this group is just like one normal task, from the kernel perspective. After a group is scheduled, the scheduler will pick a task from this group and it will be scheduled inside the group. So, such mechanism allows us to build hierarcies and manage their resources. Although a minimal unit of scheduling is a process, the Linux kernel scheduler does not use `task_struct` structure under the hood. There is special `sched_entity` strcture that is used by the Linux kernel scheduler as scheduling unit. +In simple words, group scheduling is a feature that allows us to schedule a set of tasks as if a single task. For example, if you create a group with two tasks on the group, then this group is just like one normal task, from the kernel perspective. After a group is scheduled, the scheduler will pick a task from this group and it will be scheduled inside the group. So, such mechanism allows us to build hierarchies and manage their resources. Although a minimal unit of scheduling is a process, the Linux kernel scheduler does not use `task_struct` structure under the hood. There is special `sched_entity` strcture that is used by the Linux kernel scheduler as scheduling unit. So, the current goal is to calculate a space to allocate for a `sched_entity(ies)` of the root task group and we do it two times with: @@ -362,7 +362,7 @@ ptr = (unsigned long)kzalloc(alloc_size, GFP_NOWAIT); #endif ``` -As I already mentioned, the Linux group scheduling mechanism allows to specify a hierarcy. The root of such hierarcies is the `root_runqueuetask_group` task group structure. This structure contains many fields, but we are interested in `se`, `rt_se`, `cfs_rq` and `rt_rq` for this moment: +As I already mentioned, the Linux group scheduling mechanism allows to specify a hierarchy. The root of such hierarchies is the `root_runqueuetask_group` task group structure. This structure contains many fields, but we are interested in `se`, `rt_se`, `cfs_rq` and `rt_rq` for this moment: The first two are instances of `sched_entity` structure. It is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/master/include/linux/sched.h) kernel header filed and used by the scheduler as a unit of scheduling. From 4e08a7e4268d6c1742ea2e474df995c0bd1dac2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Dost=C3=A1l?= Date: Sat, 22 Jul 2017 20:11:34 +0200 Subject: [PATCH 003/179] Initialization: make grep command more precise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Idea is clearly to grep for "kthreadd", even though grepping for "kthread" will also work. Signed-off-by: Radek Dostál --- Initialization/linux-initialization-10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-10.md b/Initialization/linux-initialization-10.md index a56d86f..0f82498 100644 --- a/Initialization/linux-initialization-10.md +++ b/Initialization/linux-initialization-10.md @@ -260,7 +260,7 @@ Here the `kernel_thread` function (defined in the [kernel/fork.c](https://github We will not dive into details about `kernel_thread` implementation (we will see it in the chapter which describe scheduler, just need to say that `kernel_thread` invokes [clone](http://www.tutorialspoint.com/unix_system_calls/clone.htm)). Now we only need to know that we create new kernel thread with `kernel_thread` function, parent and child of the thread will use shared information about filesystem and it will start to execute `kernel_init` function. A kernel thread differs from a user thread that it runs in kernel mode. So with these two `kernel_thread` calls we create two new kernel threads with the `PID = 1` for `init` process and `PID = 2` for `kthreadd`. We already know what is `init` process. Let's look on the `kthreadd`. It is a special kernel thread which manages and helps different parts of the kernel to create another kernel thread. We can see it in the output of the `ps` util: ```C -$ ps -ef | grep kthread +$ ps -ef | grep kthreadd root 2 0 0 Jan11 ? 00:00:00 [kthreadd] ``` From 8b4faeac4bcb1821b834fd8e2094bbacb123cc40 Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 30 Jul 2017 13:47:57 +0600 Subject: [PATCH 004/179] Create syscall-6.md --- SysCall/syscall-6.md | 221 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 SysCall/syscall-6.md diff --git a/SysCall/syscall-6.md b/SysCall/syscall-6.md new file mode 100644 index 0000000..43c0759 --- /dev/null +++ b/SysCall/syscall-6.md @@ -0,0 +1,221 @@ +Limits on resources in Linux +================================================================================ + +Each process in the system uses certain amount of different resources like files, CPU time, memory and so on. + +Such resources are not infinite and each process and we should have an instrument to manage it. Sometimes it is useful to know current limits for a certain resource or to change it's value. In this post we will consider such instruments that allow us to get information about limits for a process and increase or decrease such limits. + +We will start from userspace view and then we will look how it is implemented in the Linux kernel. + +There are three main fundamental [system calls](https://en.wikipedia.org/wiki/System_call) to manage resource limit for a process: + + * `getrlimit` + * `setrlimit` + * `prlimit` + +The first two allows a process to read and set limits on a system resource. The last one is extension for previous functions. The `prlimit` allows to set and read the resource limits of a process specified by [PID](https://en.wikipedia.org/wiki/Process_identifier). Definitions of these functions looks: + +The `getrlimit` is: + +```C +int getrlimit(int resource, struct rlimit *rlim); +``` + +The `setrlimit` is: + +```C +int setrlimit(int resource, const struct rlimit *rlim); +``` + +And the definition of the `prlimit` is: + +```C +int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, + struct rlimit *old_limit); +``` + +In the first two cases, functions takes two parameters: + + * `resource` - represents resource type (we will see available types later); + * `rlim` - combination of `soft` and `hard` limits. + +There are two types of limits: + + * `soft` + * `hard` + +The first provides actual limit for a resource of a process. The second is a ceiling value of a `soft` limit and can be set only by superuser. So, `soft` limit can't exceed related `hard` limit never. + +Both these values are combined in the `rlimit` structure: + +```C +struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; +}; +``` + +The last one function looks a little bit complex and takes `4` arguments. Besides `resource` argument, it takes: + + * `pid` - specifies an ID of a process on which the `prlimit` should be executed; + * `new_limit` - provides new limits values if it is not `NULL`; + * `old_limit` - current `soft` and `hard` limits will be placed here if it is not `NULL`. + +Exactly `prlimit` function is used by [ulimit](https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-ulimit) util. We can verify this with the help of [strace](https://linux.die.net/man/1/strace) util. + +For example: + +``` +~$ strace ulimit -s 2>&1 | grep rl + +prlimit64(0, RLIMIT_NPROC, NULL, {rlim_cur=63727, rlim_max=63727}) = 0 +prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=4*1024}) = 0 +prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 +``` + +Here we can see `prlimit64`, but not the `prlimit`. The fact is that we see underlying system call here instead of library call. + +Now let's look at list of available resources: + +| Resouce | Description +|-------------------|------------------------------------------------------------------------------------------| +| RLIMIT_CPU | CPU time limit given in seconds | +| RLIMIT_FSIZE | the maximum size of files that a process may create | +| RLIMIT_DATA | the maximum size of the process's data segment | +| RLIMIT_STACK | the maximum size of the process stack in bytes | +| RLIMIT_CORE | the maximum size of a [core](http://man7.org/linux/man-pages/man5/core.5.html) file. | +| RLIMIT_RSS | the number of bytes that can be allocated for a process in RAM | +| RLIMIT_NPROC | the maximum number of processes that can be created by a user | +| RLIMIT_NOFILE | the maximum number of a file descriptor that can be opened by by a process | +| RLIMIT_MEMLOCK | the maximum number of bytes of memory that may be locked into RAM by [mlock](http://man7.org/linux/man-pages/man2/mlock.2.html).| +| RLIMIT_AS | the maximum size of virtual memory in bytes. | +| RLIMIT_LOCKS | the maximum number [flock](https://linux.die.net/man/1/flock) and locking related [fcntl](http://man7.org/linux/man-pages/man2/fcntl.2.html) calls| +| RLIMIT_SIGPENDING | maximum number of [signals](http://man7.org/linux/man-pages/man7/signal.7.html) that may be queued for a user of the calling process| +| RLIMIT_MSGQUEUE | the number of bytes that can be allocated for [POSIX message queues](http://man7.org/linux/man-pages/man7/mq_overview.7.html) | +| RLIMIT_NICE | the maximum [nice](https://linux.die.net/man/1/nice) value that can be set by a process | +| RLIMIT_RTPRIO | maximum real-time priority value | +| RLIMIT_RTTIME | maximum number of microseconds that a process may be scheduled under real-time scheduling policy without making blocking system call| + +If you're looking into source code of an open source projects, you will note that reading or updating of a resource limit is quite widely used operation and. + +For example: [systemd](https://github.com/systemd/systemd/blob/master/src/core/main.c) + +```C +/* Don't limit the coredump size */ +(void) setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY)); +``` + +Or [haproxy](https://github.com/haproxy/haproxy/blob/master/src/haproxy.c): + +```C +getrlimit(RLIMIT_NOFILE, &limit); +if (limit.rlim_cur < global.maxsock) { + Warning("[%s.main()] FD limit (%d) too low for maxconn=%d/maxsock=%d. Please raise 'ulimit-n' to %d or more to avoid any trouble.\n", + argv[0], (int)limit.rlim_cur, global.maxconn, global.maxsock, global.maxsock); +} +``` + +We've just saw a little bit about resources limits related stuff in the userspace, now let's look at the same system calls in the Linux kernel. + +Limits on resource in the Linux kernel +-------------------------------------------------------------------------------- + +Both implementation of `getrlimit` system call and `setrlimit` looks similar. Both they execute `do_prlimit` function that is core implementation of the `prlimit` system call and copy from/to given `rlimit` from/to userspace: + +The `getrlimit`: + +```C +SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim) +{ + struct rlimit value; + int ret; + + ret = do_prlimit(current, resource, NULL, &value); + if (!ret) + ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0; + + return ret; +} +``` + +and `setrlimit`: + +```C +SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim) +{ + struct rlimit new_rlim; + + if (copy_from_user(&new_rlim, rlim, sizeof(*rlim))) + return -EFAULT; + return do_prlimit(current, resource, &new_rlim, NULL); +} +``` + +Implementations of these system calls are defined in the [kernel/sys.c](https://github.com/torvalds/linux/blob/master/kernel/sys.c) kernel source code file. + +First of all the `do_prlimit` function executes a check that the given resource is valid: + +```C +if (resource >= RLIM_NLIMITS) + return -EINVAL; +``` + +and in a failure case returns `-EINVAL` error. After this check will pass successfully and new limits was passed as non `NULL` value, two following checks: + +```C +if (new_rlim) { + if (new_rlim->rlim_cur > new_rlim->rlim_max) + return -EINVAL; + if (resource == RLIMIT_NOFILE && + new_rlim->rlim_max > sysctl_nr_open) + return -EPERM; +} +``` + +check that the given `soft` limit does not exceeds `hard` limit and in a case when the given resource is the maximum number of a file descriptors that hard limit is not greater than `sysctl_nr_open` value. The value of the `sysctl_nr_open` can be found via [procfs](https://en.wikipedia.org/wiki/Procfs): + +``` +~$ cat /proc/sys/fs/nr_open +1048576 +``` + +After all of these checks we lock `tasklist` to be sure that [signal]() handlers related things will not be destroyed while we updating limits for a given resource: + +```C +read_lock(&tasklist_lock); +... +... +... +read_unlock(&tasklist_lock); +``` + +We need to do this because `prlimit` system call allows us to update limits of another task by the given pid. As task list is locked, we take the `rlimit` instance that is responsible for the given resource limit of the given process: + +```C +rlim = tsk->signal->rlim + resource; +``` + +where the `tsk->signal->rlim` is just array of `struct rlimit` that represents certain resources. And if the `new_rlim` is not `NULL` we just update its value. If `old_rlim` is not `NULL` we fill it: + +```C +if (old_rlim) + *old_rlim = *rlim; +``` + +That's all. + +Conclusion +-------------------------------------------------------------------------------- + +This is the end of the second part that describes implementation of the system calls in the Linux kernel. If you have questions or suggestions, ping me on Twitter [0xAX](https://twitter.com/0xAX), drop me an [email](anotherworldofworld@gmail.com), or just create an [issue](https://github.com/0xAX/linux-internals/issues/new). + +**Please note that English is not my first language and I am really sorry for any inconvenience. If you find any mistakes please send me PR to [linux-insides](https://github.com/0xAX/linux-internals).** + +Links +-------------------------------------------------------------------------------- + +* [system calls](https://en.wikipedia.org/wiki/System_call) +* [PID](https://en.wikipedia.org/wiki/Process_identifier) +* [ulimit](https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-ulimit) +* [strace](https://linux.die.net/man/1/strace) +* [POSIX message queues](http://man7.org/linux/man-pages/man7/mq_overview.7.html) From 6e6835c76baf8cd8974f90c760fe45e3a43279be Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 30 Jul 2017 13:49:13 +0600 Subject: [PATCH 005/179] Update README.md --- SysCall/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SysCall/README.md b/SysCall/README.md index 9851b4a..4549e70 100644 --- a/SysCall/README.md +++ b/SysCall/README.md @@ -6,4 +6,5 @@ This chapter describes the `system call` concept in the linux kernel. * [How the Linux kernel handles a system call](syscall-2.md) - this part describes how the Linux kernel handles a system call from a userspace application. * [vsyscall and vDSO](syscall-3.md) - third part describes `vsyscall` and `vDSO` concepts. * [How the Linux kernel runs a program](syscall-4.md) - this part describes startup process of a program. -* [Implementation of the open system call](syscall-5.md) - this part describes implementation of the [open](http://man7.org/linux/man-pages/man2/open.2.html) system call. \ No newline at end of file +* [Implementation of the open system call](syscall-5.md) - this part describes implementation of the [open](http://man7.org/linux/man-pages/man2/open.2.html) system call. +* [Limits on resources in Linux](https://github.com/0xAX/linux-insides/blob/master/SysCall/syscall-6.md) - this part descrbies implementation of the [getrlimit/setrlimit](https://linux.die.net/man/2/getrlimit) system calls. From cf40a49fc91dbdf2c433b9b73e50a67237497025 Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 30 Jul 2017 13:49:44 +0600 Subject: [PATCH 006/179] Update SUMMARY.md --- SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SUMMARY.md b/SUMMARY.md index 8ed35ca..0bf8766 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -34,6 +34,7 @@ * [vsyscall and vDSO](SysCall/syscall-3.md) * [How the Linux kernel runs a program](SysCall/syscall-4.md) * [Implementation of the open system call](SysCall/syscall-5.md) + * [Limits on resources in Linux](SysCall/syscall-6.md) * [Timers and time management](Timers/README.md) * [Introduction](Timers/timers-1.md) * [Clocksource framework](Timers/timers-2.md) From 307605b85497a4aee237c7fcee3703e91f98e909 Mon Sep 17 00:00:00 2001 From: Jakub Wilk Date: Sun, 30 Jul 2017 14:09:13 +0200 Subject: [PATCH 007/179] SysCall/syscall-6: Fix typos --- SysCall/syscall-6.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SysCall/syscall-6.md b/SysCall/syscall-6.md index 43c0759..d2ff7d0 100644 --- a/SysCall/syscall-6.md +++ b/SysCall/syscall-6.md @@ -77,7 +77,7 @@ Here we can see `prlimit64`, but not the `prlimit`. The fact is that we see unde Now let's look at list of available resources: -| Resouce | Description +| Resource | Description |-------------------|------------------------------------------------------------------------------------------| | RLIMIT_CPU | CPU time limit given in seconds | | RLIMIT_FSIZE | the maximum size of files that a process may create | @@ -86,7 +86,7 @@ Now let's look at list of available resources: | RLIMIT_CORE | the maximum size of a [core](http://man7.org/linux/man-pages/man5/core.5.html) file. | | RLIMIT_RSS | the number of bytes that can be allocated for a process in RAM | | RLIMIT_NPROC | the maximum number of processes that can be created by a user | -| RLIMIT_NOFILE | the maximum number of a file descriptor that can be opened by by a process | +| RLIMIT_NOFILE | the maximum number of a file descriptor that can be opened by a process | | RLIMIT_MEMLOCK | the maximum number of bytes of memory that may be locked into RAM by [mlock](http://man7.org/linux/man-pages/man2/mlock.2.html).| | RLIMIT_AS | the maximum size of virtual memory in bytes. | | RLIMIT_LOCKS | the maximum number [flock](https://linux.die.net/man/1/flock) and locking related [fcntl](http://man7.org/linux/man-pages/man2/fcntl.2.html) calls| @@ -96,7 +96,7 @@ Now let's look at list of available resources: | RLIMIT_RTPRIO | maximum real-time priority value | | RLIMIT_RTTIME | maximum number of microseconds that a process may be scheduled under real-time scheduling policy without making blocking system call| -If you're looking into source code of an open source projects, you will note that reading or updating of a resource limit is quite widely used operation and. +If you're looking into source code of open source projects, you will note that reading or updating of a resource limit is quite widely used operation. For example: [systemd](https://github.com/systemd/systemd/blob/master/src/core/main.c) @@ -172,7 +172,7 @@ if (new_rlim) { } ``` -check that the given `soft` limit does not exceeds `hard` limit and in a case when the given resource is the maximum number of a file descriptors that hard limit is not greater than `sysctl_nr_open` value. The value of the `sysctl_nr_open` can be found via [procfs](https://en.wikipedia.org/wiki/Procfs): +check that the given `soft` limit does not exceed `hard` limit and in a case when the given resource is the maximum number of a file descriptors that hard limit is not greater than `sysctl_nr_open` value. The value of the `sysctl_nr_open` can be found via [procfs](https://en.wikipedia.org/wiki/Procfs): ``` ~$ cat /proc/sys/fs/nr_open From 99793174539e0630ca96f3d0ccfeffff15550d4c Mon Sep 17 00:00:00 2001 From: int3rrupt Date: Sun, 30 Jul 2017 08:24:36 -0700 Subject: [PATCH 008/179] Update sentence grammar Remove "never" from end of sentence and change "can't exceed to "can never exceed" --- SysCall/syscall-6.md | 2 +- contributors.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SysCall/syscall-6.md b/SysCall/syscall-6.md index d2ff7d0..7c5cbed 100644 --- a/SysCall/syscall-6.md +++ b/SysCall/syscall-6.md @@ -44,7 +44,7 @@ There are two types of limits: * `soft` * `hard` -The first provides actual limit for a resource of a process. The second is a ceiling value of a `soft` limit and can be set only by superuser. So, `soft` limit can't exceed related `hard` limit never. +The first provides actual limit for a resource of a process. The second is a ceiling value of a `soft` limit and can be set only by superuser. So, `soft` limit can never exceed related `hard` limit. Both these values are combined in the `rlimit` structure: diff --git a/contributors.md b/contributors.md index 05d630c..59aace9 100644 --- a/contributors.md +++ b/contributors.md @@ -105,3 +105,4 @@ Thank you to all contributors: * [Nathan Dautenhahn](https://github.com/ndauten) * [Sachin Patil](https://github.com/psachin) * [Stéphan Gorget](https://github.com/phantez) +* [Adrian Reyes](https://github.com/int3rrupt) From 17da4af718de774f4e93b29fe7d636d56e3701f5 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 30 Jul 2017 15:55:02 -0400 Subject: [PATCH 009/179] Make all Github links reference a specific commit Closes #480 --- Booting/linux-bootstrap-1.md | 28 +++++----- Booting/linux-bootstrap-2.md | 50 +++++++++--------- Booting/linux-bootstrap-3.md | 28 +++++----- Booting/linux-bootstrap-4.md | 36 ++++++------- Booting/linux-bootstrap-5.md | 30 +++++------ Cgroups/cgroups1.md | 12 ++--- Concepts/cpumask.md | 10 ++-- Concepts/initcall.md | 22 ++++---- Concepts/per-cpu.md | 8 +-- DataStructures/bitmap.md | 32 ++++++------ DataStructures/dlist.md | 6 +-- DataStructures/radix-tree.md | 6 +-- Initialization/linux-initialization-1.md | 28 +++++----- Initialization/linux-initialization-10.md | 44 ++++++++-------- Initialization/linux-initialization-2.md | 16 +++--- Initialization/linux-initialization-3.md | 24 ++++----- Initialization/linux-initialization-4.md | 26 +++++----- Initialization/linux-initialization-5.md | 30 +++++------ Initialization/linux-initialization-6.md | 24 ++++----- Initialization/linux-initialization-7.md | 30 +++++------ Initialization/linux-initialization-8.md | 30 +++++------ Initialization/linux-initialization-9.md | 32 ++++++------ LINKS.md | 2 +- Misc/contribute.md | 14 ++--- Misc/how_kernel_compiled.md | 46 ++++++++--------- Misc/linkers.md | 4 +- SyncPrim/sync-1.md | 16 +++--- SyncPrim/sync-2.md | 26 +++++----- SyncPrim/sync-3.md | 24 ++++----- SyncPrim/sync-4.md | 28 +++++----- SyncPrim/sync-5.md | 34 ++++++------- SyncPrim/sync-6.md | 8 +-- SysCall/syscall-1.md | 28 +++++----- SysCall/syscall-2.md | 26 +++++----- SysCall/syscall-3.md | 20 ++++---- SysCall/syscall-4.md | 14 ++--- SysCall/syscall-5.md | 26 +++++----- SysCall/syscall-6.md | 6 +-- Theory/ELF.md | 10 ++-- Theory/Paging.md | 10 ++-- Theory/asm.md | 2 +- Timers/timers-1.md | 32 ++++++------ Timers/timers-2.md | 12 ++--- Timers/timers-3.md | 44 ++++++++-------- Timers/timers-4.md | 24 ++++----- Timers/timers-5.md | 18 +++---- Timers/timers-6.md | 16 +++--- Timers/timers-7.md | 12 ++--- interrupts/interrupts-1.md | 12 ++--- interrupts/interrupts-10.md | 30 +++++------ interrupts/interrupts-2.md | 62 +++++++++++------------ interrupts/interrupts-3.md | 14 ++--- interrupts/interrupts-4.md | 18 +++---- interrupts/interrupts-5.md | 14 ++--- interrupts/interrupts-6.md | 26 +++++----- interrupts/interrupts-7.md | 22 ++++---- interrupts/interrupts-8.md | 40 +++++++-------- interrupts/interrupts-9.md | 26 +++++----- mm/linux-mm-1.md | 6 +-- mm/linux-mm-2.md | 18 +++---- mm/linux-mm-3.md | 14 ++--- 61 files changed, 678 insertions(+), 678 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index 70b12fc..d60496e 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -192,13 +192,13 @@ At the start of execution, the BIOS is not in RAM, but in ROM. Bootloader -------------------------------------------------------------------------------- -There are a number of bootloaders that can boot Linux, such as [GRUB 2](https://www.gnu.org/software/grub/) and [syslinux](http://www.syslinux.org/wiki/index.php/The_Syslinux_Project). The Linux kernel has a [Boot protocol](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt) which specifies the requirements for a bootloader to implement Linux support. This example will describe GRUB 2. +There are a number of bootloaders that can boot Linux, such as [GRUB 2](https://www.gnu.org/software/grub/) and [syslinux](http://www.syslinux.org/wiki/index.php/The_Syslinux_Project). The Linux kernel has a [Boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt) which specifies the requirements for a bootloader to implement Linux support. This example will describe GRUB 2. Continuing from before, now that the `BIOS` has chosen a boot device and transferred control to the boot sector code, execution starts from [boot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/boot.S;hb=HEAD). This code is very simple, due to the limited amount of space available, and contains a pointer which is used to jump to the location of GRUB 2's core image. The core image begins with [diskboot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/diskboot.S;hb=HEAD), which is usually stored immediately after the first sector in the unused space before the first partition. The above code loads the rest of the core image, which contains GRUB 2's kernel and drivers for handling filesystems, into memory. After loading the rest of the core image, it executes [grub_main](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/kern/main.c) function. The `grub_main` function initializes the console, gets the base address for modules, sets the root device, loads/parses the grub configuration file, loads modules, etc. At the end of execution, `grub_main` function moves grub to normal mode. The `grub_normal_execute` function (from the `grub-core/normal/main.c` source code file) completes the final preparations and shows a menu to select an operating system. When we select one of the grub menu entries, the `grub_menu_execute_entry` function runs, executing the grub `boot` command and booting the selected operating system. -As we can read in the kernel boot protocol, the bootloader must read and fill some fields of the kernel setup header, which starts at the `0x01f1` offset from the kernel setup code. You may look at the boot [linker script](https://github.com/torvalds/linux/blob/master/arch/x86/boot/setup.ld#L16) to make sure in this offset. The kernel header [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S) starts from: +As we can read in the kernel boot protocol, the bootloader must read and fill some fields of the kernel setup header, which starts at the `0x01f1` offset from the kernel setup code. You may look at the boot [linker script](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L16) to make sure in this offset. The kernel header [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) starts from: ```assembly .globl hdr @@ -212,7 +212,7 @@ hdr: boot_flag: .word 0xAA55 ``` -The bootloader must fill this and the rest of the headers (which are only marked as being type `write` in the Linux boot protocol, such as in [this example](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt#L354)) with values which it has either received from the command line or calculated during boot. (We will not go over full descriptions and explanations for all fields of the kernel setup header now but instead when the discuss how kernel uses them; you can find a description of all fields in the [boot protocol](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt#L156).) +The bootloader must fill this and the rest of the headers (which are only marked as being type `write` in the Linux boot protocol, such as in [this example](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L354)) with values which it has either received from the command line or calculated during boot. (We will not go over full descriptions and explanations for all fields of the kernel setup header now but instead when the discuss how kernel uses them; you can find a description of all fields in the [boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156).) As we can see in the kernel boot protocol, the memory map will be the following after loading the kernel: @@ -256,7 +256,7 @@ The bootloader has now loaded the Linux kernel into memory, filled the header fi Start of Kernel Setup -------------------------------------------------------------------------------- -Finally, we are in the kernel! Technically, the kernel hasn't run yet; first, the kernel setup part must configure some stuff like decompressor, memory management related things and etc. After all of such things, kernel setup part will decompress actual kernel and jump on it. Execution of setup part starts from [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S) at [_start](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L292). It is a little strange at first sight, as there are several instructions before it. +Finally, we are in the kernel! Technically, the kernel hasn't run yet; first, the kernel setup part must configure some stuff like decompressor, memory management related things and etc. After all of such things, kernel setup part will decompress actual kernel and jump on it. Execution of setup part starts from [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) at [_start](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L292). It is a little strange at first sight, as there are several instructions before it. A long time ago, the Linux kernel used to have its own bootloader. Now, however, if you run, for example, @@ -318,7 +318,7 @@ _start: // ``` -Here we can see a `jmp` instruction opcode (`0xeb`) that jumps to the `start_of_setup-1f` point. In `Nf` notation, `2f` refers to the following local `2:` label; in our case, it is label `1` that is present right after the jump, and it contains the rest of the setup [header](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt#L156). Right after the setup header, we see the `.entrytext` section, which starts at the `start_of_setup` label. +Here we can see a `jmp` instruction opcode (`0xeb`) that jumps to the `start_of_setup-1f` point. In `Nf` notation, `2f` refers to the following local `2:` label; in our case, it is label `1` that is present right after the jump, and it contains the rest of the setup [header](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156). Right after the setup header, we see the `.entrytext` section, which starts at the `start_of_setup` label. This is the first code that actually runs (aside from the previous jump instructions, of course). After the kernel setup part received control from the bootloader, the first `jmp` instruction is located at the `0x200` offset from the start of the kernel real mode, i.e., after the first 512 bytes. This we can both read in the Linux kernel boot protocol and see in the grub2 source code: @@ -342,7 +342,7 @@ After the jump to `start_of_setup`, the kernel needs to do the following: * Make sure that all segment register values are equal * Set up a correct stack, if needed * Set up [bss](https://en.wikipedia.org/wiki/.bss) -* Jump to the C code in [main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c) +* Jump to the C code in [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c) Let's look at the implementation. @@ -365,7 +365,7 @@ _start: .byte start_of_setup-1f ``` -jump, which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L46). It also needs to align `cs` from `0x10200` to `0x10000`, as well as all other segment registers. After that, we set up the stack: +jump, which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L46). It also needs to align `cs` from `0x10200` to `0x10000`, as well as all other segment registers. After that, we set up the stack: ```assembly pushw %ds @@ -373,12 +373,12 @@ jump, which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/l lretw ``` -which pushes the value of `ds` to the stack with the address of the [6](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L494) label and executes the `lretw` instruction. When the `lretw` instruction is called, it loads the address of label `6` into the [instruction pointer](https://en.wikipedia.org/wiki/Program_counter) register and loads `cs` with the value of `ds`. Afterward, `ds` and `cs` will have the same values. +which pushes the value of `ds` to the stack with the address of the [6](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L494) label and executes the `lretw` instruction. When the `lretw` instruction is called, it loads the address of label `6` into the [instruction pointer](https://en.wikipedia.org/wiki/Program_counter) register and loads `cs` with the value of `ds`. Afterward, `ds` and `cs` will have the same values. Stack Setup -------------------------------------------------------------------------------- -Almost all of the setup code is in preparation for the C language environment in real mode. The next [step](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L569) is checking the `ss` register value and making a correct stack if `ss` is wrong: +Almost all of the setup code is in preparation for the C language environment in real mode. The next [step](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L569) is checking the `ss` register value and making a correct stack if `ss` is wrong: ```assembly movw %ss, %dx @@ -395,7 +395,7 @@ This can lead to 3 different scenarios: Let's look at all three of these scenarios in turn: -* `ss` has a correct address (`0x1000`). In this case, we go to label [2](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L584): +* `ss` has a correct address (`0x1000`). In this case, we go to label [2](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L584): ```assembly 2: andw $~3, %dx @@ -410,7 +410,7 @@ Here we can see the alignment of `dx` (contains `sp` given by bootloader) to `4` ![stack](http://oi58.tinypic.com/16iwcis.jpg) -* In the second scenario, (`ss` != `ds`). First, we put the value of [_end](https://github.com/torvalds/linux/blob/master/arch/x86/boot/setup.ld#L52) (the address of the end of the setup code) into `dx` and check the `loadflags` header field using the `testb` instruction to see whether we can use the heap. [loadflags](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L321) is a bitmask header which is defined as: +* In the second scenario, (`ss` != `ds`). First, we put the value of [_end](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L52) (the address of the end of the setup code) into `dx` and check the `loadflags` header field using the `testb` instruction to see whether we can use the heap. [loadflags](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) is a bitmask header which is defined as: ```C #define LOADED_HIGH (1<<0) @@ -450,7 +450,7 @@ The last two steps that need to happen before we can jump to the main C code are jne setup_bad ``` -This simply compares the [setup_sig](https://github.com/torvalds/linux/blob/master/arch/x86/boot/setup.ld#L39) with the magic number `0x5a5aaa55`. If they are not equal, a fatal error is reported. +This simply compares the [setup_sig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L39) with the magic number `0x5a5aaa55`. If they are not equal, a fatal error is reported. If the magic number matches, knowing we have a set of correct segment registers and a stack, we only need to set up the BSS section before jumping into the C code. @@ -465,7 +465,7 @@ The BSS section is used to store statically allocated, uninitialized data. Linux rep; stosl ``` -First, the [__bss_start](https://github.com/torvalds/linux/blob/master/arch/x86/boot/setup.ld#L47) address is moved into `di`. Next, the `_end + 3` address (+3 - aligns to 4 bytes) is moved into `cx`. The `eax` register is cleared (using a `xor` instruction), and the bss section size (`cx`-`di`) is calculated and put into `cx`. Then, `cx` is divided by four (the size of a 'word'), and the `stosl` instruction is used repeatedly, storing the value of `eax` (zero) into the address pointed to by `di`, automatically increasing `di` by four, repeating until `cx` reaches zero). The net effect of this code is that zeros are written through all words in memory from `__bss_start` to `_end`: +First, the [__bss_start](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L47) address is moved into `di`. Next, the `_end + 3` address (+3 - aligns to 4 bytes) is moved into `cx`. The `eax` register is cleared (using a `xor` instruction), and the bss section size (`cx`-`di`) is calculated and put into `cx`. Then, `cx` is divided by four (the size of a 'word'), and the `stosl` instruction is used repeatedly, storing the value of `eax` (zero) into the address pointed to by `di`, automatically increasing `di` by four, repeating until `cx` reaches zero). The net effect of this code is that zeros are written through all words in memory from `__bss_start` to `_end`: ![bss](http://oi59.tinypic.com/29m2eyr.jpg) @@ -478,7 +478,7 @@ That's all - we have the stack and BSS, so we can jump to the `main()` C functio calll main ``` -The `main()` function is located in [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c). You can read about what this does in the next part. +The `main()` function is located in [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c). You can read about what this does in the next part. Conclusion -------------------------------------------------------------------------------- diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index d65e2d2..ec319d9 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -4,7 +4,7 @@ Kernel booting process. Part 2. First steps in the kernel setup -------------------------------------------------------------------------------- -We started to dive into linux kernel insides in the previous [part](linux-bootstrap-1.md) and saw the initial part of the kernel setup code. We stopped at the first call to the `main` function (which is the first function written in C) from [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c). +We started to dive into linux kernel insides in the previous [part](linux-bootstrap-1.md) and saw the initial part of the kernel setup code. We stopped at the first call to the `main` function (which is the first function written in C) from [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c). In this part, we will continue to research the kernel setup code and * see what `protected mode` is, @@ -172,20 +172,20 @@ The algorithm for the transition from real mode into protected mode is: We will see the complete transition to protected mode in the linux kernel in the next part, but before we can move to protected mode, we need to do some more preparations. -Let's look at [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c). We can see some routines there which perform keyboard initialization, heap initialization, etc... Let's take a look. +Let's look at [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c). We can see some routines there which perform keyboard initialization, heap initialization, etc... Let's take a look. Copying boot parameters into the "zeropage" -------------------------------------------------------------------------------- -We will start from the `main` routine in "main.c". First function which is called in `main` is [`copy_boot_params(void)`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L30). It copies the kernel setup header into the field of the `boot_params` structure which is defined in the [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/bootparam.h#L113). +We will start from the `main` routine in "main.c". First function which is called in `main` is [`copy_boot_params(void)`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L30). It copies the kernel setup header into the field of the `boot_params` structure which is defined in the [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113). The `boot_params` structure contains the `struct setup_header hdr` field. This structure contains the same fields as defined in [linux boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) and is filled by the boot loader and also at kernel compile/build time. `copy_boot_params` does two things: -1. Copies `hdr` from [header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L281) to the `boot_params` structure in `setup_header` field +1. Copies `hdr` from [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L281) to the `boot_params` structure in `setup_header` field 2. Updates pointer to the kernel command line if the kernel was loaded with the old command line protocol. -Note that it copies `hdr` with `memcpy` function which is defined in the [copy.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/copy.S) source file. Let's have a look inside: +Note that it copies `hdr` with `memcpy` function which is defined in the [copy.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S) source file. Let's have a look inside: ```assembly GLOBAL(memcpy) @@ -205,7 +205,7 @@ GLOBAL(memcpy) ENDPROC(memcpy) ``` -Yeah, we just moved to C code and now assembly again :) First of all, we can see that `memcpy` and other routines which are defined here, start and end with the two macros: `GLOBAL` and `ENDPROC`. `GLOBAL` is described in [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/linkage.h) which defines `globl` directive and the label for it. `ENDPROC` is described in [include/linux/linkage.h](https://github.com/torvalds/linux/blob/master/include/linux/linkage.h) which marks the `name` symbol as a function name and ends with the size of the `name` symbol. +Yeah, we just moved to C code and now assembly again :) First of all, we can see that `memcpy` and other routines which are defined here, start and end with the two macros: `GLOBAL` and `ENDPROC`. `GLOBAL` is described in [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/linkage.h) which defines `globl` directive and the label for it. `ENDPROC` is described in [include/linux/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/linkage.h) which marks the `name` symbol as a function name and ends with the size of the `name` symbol. Implementation of `memcpy` is easy. At first, it pushes values from the `si` and `di` registers to the stack to preserve their values because they will change during the `memcpy`. `memcpy` (and other functions in copy.S) use `fastcall` calling conventions. So it gets its incoming parameters from the `ax`, `dx` and `cx` registers. Calling `memcpy` looks like this: @@ -223,7 +223,7 @@ So, Console initialization -------------------------------------------------------------------------------- -After `hdr` is copied into `boot_params.hdr`, the next step is console initialization by calling the `console_init` function which is defined in [arch/x86/boot/early_serial_console.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/early_serial_console.c). +After `hdr` is copied into `boot_params.hdr`, the next step is console initialization by calling the `console_init` function which is defined in [arch/x86/boot/early_serial_console.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/early_serial_console.c). It tries to find the `earlyprintk` option in the command line and if the search was successful, it parses the port address and baud rate of the serial port and initializes the serial port. The value of `earlyprintk` command line option can be one of these: @@ -238,7 +238,7 @@ if (cmdline_find_option_bool("debug")) puts("early console in setup code\n"); ``` -The definition of `puts` is in [tty.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/tty.c). As we can see it prints character by character in a loop by calling the `putchar` function. Let's look into the `putchar` implementation: +The definition of `puts` is in [tty.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/tty.c). As we can see it prints character by character in a loop by calling the `putchar` function. Let's look into the `putchar` implementation: ```C void __attribute__((section(".inittext"))) putchar(int ch) @@ -253,7 +253,7 @@ void __attribute__((section(".inittext"))) putchar(int ch) } ``` -`__attribute__((section(".inittext")))` means that this code will be in the `.inittext` section. We can find it in the linker file [setup.ld](https://github.com/torvalds/linux/blob/master/arch/x86/boot/setup.ld#L19). +`__attribute__((section(".inittext")))` means that this code will be in the `.inittext` section. We can find it in the linker file [setup.ld](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L19). First of all, `putchar` checks for the `\n` symbol and if it is found, prints `\r` before. After that it outputs the character on the VGA screen by calling the BIOS with the `0x10` interrupt call: @@ -282,7 +282,7 @@ Here `initregs` takes the `biosregs` structure and first fills `biosregs` with z reg->gs = gs(); ``` -Let's look at the [memset](https://github.com/torvalds/linux/blob/master/arch/x86/boot/copy.S#L36) implementation: +Let's look at the [memset](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S#L36) implementation: ```assembly GLOBAL(memset) @@ -309,14 +309,14 @@ The next instruction multiplies `eax` with `0x01010101`. It needs to because `me The rest of the `memset` function does almost the same as `memcpy`. -After the `biosregs` structure is filled with `memset`, `bios_putchar` calls the [0x10](http://www.ctyme.com/intr/rb-0106.htm) interrupt which prints a character. Afterwards it checks if the serial port was initialized or not and writes a character there with [serial_putchar](https://github.com/torvalds/linux/blob/master/arch/x86/boot/tty.c#L30) and `inb/outb` instructions if it was set. +After the `biosregs` structure is filled with `memset`, `bios_putchar` calls the [0x10](http://www.ctyme.com/intr/rb-0106.htm) interrupt which prints a character. Afterwards it checks if the serial port was initialized or not and writes a character there with [serial_putchar](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/tty.c#L30) and `inb/outb` instructions if it was set. Heap initialization -------------------------------------------------------------------------------- -After the stack and bss section were prepared in [header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S) (see previous [part](linux-bootstrap-1.md)), the kernel needs to initialize the [heap](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L116) with the [`init_heap`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L116) function. +After the stack and bss section were prepared in [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) (see previous [part](linux-bootstrap-1.md)), the kernel needs to initialize the [heap](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. -First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/bootparam.h#L21) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L321) in the kernel setup header and calculates the end of the stack if this flag was set: +First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L21) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) in the kernel setup header and calculates the end of the stack if this flag was set: ```C char *stack_end; @@ -339,9 +339,9 @@ Now the heap is initialized and we can use it using the `GET_HEAP` method. We wi CPU validation -------------------------------------------------------------------------------- -The next step as we can see is cpu validation by `validate_cpu` from [arch/x86/boot/cpu.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/cpu.c). +The next step as we can see is cpu validation by `validate_cpu` from [arch/x86/boot/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpu.c). -It calls the [`check_cpu`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/cpucheck.c#L102) function and passes cpu level and required cpu level to it and checks that the kernel launches on the right cpu level. +It calls the [`check_cpu`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpucheck.c#L102) function and passes cpu level and required cpu level to it and checks that the kernel launches on the right cpu level. ```c check_cpu(&cpu_level, &req_level, &err_flags); if (cpu_level < req_level) { @@ -356,7 +356,7 @@ Memory detection The next step is memory detection by the `detect_memory` function. `detect_memory` basically provides a map of available RAM to the CPU. It uses different programming interfaces for memory detection like `0xe820`, `0xe801` and `0x88`. We will see only the implementation of **0xE820** here. -Let's look into the `detect_memory_e820` implementation from the [arch/x86/boot/memory.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/memory.c) source file. First of all, the `detect_memory_e820` function initializes the `biosregs` structure as we saw above and fills registers with special values for the `0xe820` call: +Let's look into the `detect_memory_e820` implementation from the [arch/x86/boot/memory.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/memory.c) source file. First of all, the `detect_memory_e820` function initializes the `biosregs` structure as we saw above and fills registers with special values for the `0xe820` call: ```assembly initregs(&ireg); @@ -400,7 +400,7 @@ You can see the result of this in the `dmesg` output, something like: Keyboard initialization -------------------------------------------------------------------------------- -The next step is the initialization of the keyboard with the call of the [`keyboard_init()`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L65) function. At first `keyboard_init` initializes registers using the `initregs` function and calling the [0x16](http://www.ctyme.com/intr/rb-1756.htm) interrupt for getting the keyboard status. +The next step is the initialization of the keyboard with the call of the [`keyboard_init()`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L65) function. At first `keyboard_init` initializes registers using the `initregs` function and calling the [0x16](http://www.ctyme.com/intr/rb-1756.htm) interrupt for getting the keyboard status. ```c initregs(&ireg); ireg.ah = 0x02; /* Get keyboard status */ @@ -418,7 +418,7 @@ Querying The next couple of steps are queries for different parameters. We will not dive into details about these queries but will get back to it in later parts. Let's take a short look at these functions: -The [query_mca](https://github.com/torvalds/linux/blob/master/arch/x86/boot/mca.c#L18) routine calls the [0x15](http://www.ctyme.com/intr/rb-1594.htm) BIOS interrupt to get the machine model number, sub-model number, BIOS revision level, and other hardware-specific attributes: +The [query_mca](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/mca.c#L18) routine calls the [0x15](http://www.ctyme.com/intr/rb-1594.htm) BIOS interrupt to get the machine model number, sub-model number, BIOS revision level, and other hardware-specific attributes: ```c int query_mca(void) @@ -482,13 +482,13 @@ static inline void set_fs(u16 seg) } ``` -This function contains inline assembly which gets the value of the `seg` parameter and puts it into the `fs` register. There are many functions in [boot.h](https://github.com/torvalds/linux/blob/master/arch/x86/boot/boot.h) like `set_fs`, for example `set_gs`, `fs`, `gs` for reading a value in it etc... +This function contains inline assembly which gets the value of the `seg` parameter and puts it into the `fs` register. There are many functions in [boot.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/boot.h) like `set_fs`, for example `set_gs`, `fs`, `gs` for reading a value in it etc... At the end of `query_mca` it just copies the table pointed to by `es:bx` to the `boot_params.sys_desc_table`. The next step is getting [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) information by calling the `query_ist` function. First of all, it checks the CPU level and if it is correct, calls `0x15` for getting info and saves the result to `boot_params`. -The following [query_apm_bios](https://github.com/torvalds/linux/blob/master/arch/x86/boot/apm.c#L21) function gets [Advanced Power Management](http://en.wikipedia.org/wiki/Advanced_Power_Management) information from the BIOS. `query_apm_bios` calls the `0x15` BIOS interruption too, but with `ah` = `0x53` to check `APM` installation. After the `0x15` execution, `query_apm_bios` functions check the `PM` signature (it must be `0x504d`), carry flag (it must be 0 if `APM` supported) and value of the `cx` register (if it's 0x02, protected mode interface is supported). +The following [query_apm_bios](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/apm.c#L21) function gets [Advanced Power Management](http://en.wikipedia.org/wiki/Advanced_Power_Management) information from the BIOS. `query_apm_bios` calls the `0x15` BIOS interruption too, but with `ah` = `0x53` to check `APM` installation. After the `0x15` execution, `query_apm_bios` functions check the `PM` signature (it must be `0x504d`), carry flag (it must be 0 if `APM` supported) and value of the `cx` register (if it's 0x02, protected mode interface is supported). Next, it calls `0x15` again, but with `ax = 0x5304` for disconnecting the `APM` interface and connecting the 32-bit protected mode interface. In the end, it fills `boot_params.apm_bios_info` with values obtained from the BIOS. @@ -500,9 +500,9 @@ Note that `query_apm_bios` will be executed only if `CONFIG_APM` or `CONFIG_APM_ #endif ``` -The last is the [`query_edd`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/edd.c#L122) function, which queries `Enhanced Disk Drive` information from the BIOS. Let's look into the `query_edd` implementation. +The last is the [`query_edd`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/edd.c#L122) function, which queries `Enhanced Disk Drive` information from the BIOS. Let's look into the `query_edd` implementation. -First of all, it reads the [edd](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt#L1023) option from the kernel's command line and if it was set to `off` then `query_edd` just returns. +First of all, it reads the [edd](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt#L1023) option from the kernel's command line and if it was set to `off` then `query_edd` just returns. If EDD is enabled, `query_edd` goes over BIOS-supported hard disks and queries EDD information in the following loop: @@ -519,7 +519,7 @@ for (devno = 0x80; devno < 0x80+EDD_MBR_SIG_MAX; devno++) { } ``` -where `0x80` is the first hard drive and the value of `EDD_MBR_SIG_MAX` macro is 16. It collects data into the array of [edd_info](https://github.com/torvalds/linux/blob/master/include/uapi/linux/edd.h#L172) structures. `get_edd_info` checks that EDD is present by invoking the `0x13` interrupt with `ah` as `0x41` and if EDD is present, `get_edd_info` again calls the `0x13` interrupt, but with `ah` as `0x48` and `si` containing the address of the buffer where EDD information will be stored. +where `0x80` is the first hard drive and the value of `EDD_MBR_SIG_MAX` macro is 16. It collects data into the array of [edd_info](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/edd.h#L172) structures. `get_edd_info` checks that EDD is present by invoking the `0x13` interrupt with `ah` as `0x41` and if EDD is present, `get_edd_info` again calls the `0x13` interrupt, but with `ah` as `0x48` and `si` containing the address of the buffer where EDD information will be stored. Conclusion -------------------------------------------------------------------------------- @@ -539,8 +539,8 @@ Links * [Nice explanation of CPU Modes with code](http://www.codeproject.com/Articles/45788/The-Real-Protected-Long-mode-assembly-tutorial-for) * [How to Use Expand Down Segments on Intel 386 and Later CPUs](http://www.sudleyplace.com/dpmione/expanddown.html) * [earlyprintk documentation](http://lxr.free-electrons.com/source/Documentation/x86/earlyprintk.txt) -* [Kernel Parameters](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt) -* [Serial console](https://github.com/torvalds/linux/blob/master/Documentation/serial-console.txt) +* [Kernel Parameters](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt) +* [Serial console](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/serial-console.txt) * [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) * [APM](https://en.wikipedia.org/wiki/Advanced_Power_Management) * [EDD specification](http://www.t13.org/documents/UploadedDocuments/docs2004/d1572r3-EDD3.pdf) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index 1793c9e..2eee109 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -4,14 +4,14 @@ Kernel booting process. Part 3. Video mode initialization and transition to protected mode -------------------------------------------------------------------------------- -This is the third part of the `Kernel booting process` series. In the previous [part](linux-bootstrap-2.md#kernel-booting-process-part-2), we stopped right before the call of the `set_video` routine from [main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L181). In this part, we will see: +This is the third part of the `Kernel booting process` series. In the previous [part](linux-bootstrap-2.md#kernel-booting-process-part-2), we stopped right before the call of the `set_video` routine from [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L181). In this part, we will see: - video mode initialization in the kernel setup code, - preparation before switching into protected mode, - transition to protected mode **NOTE** If you don't know anything about protected mode, you can find some information about it in the previous [part](linux-bootstrap-2.md#protected-mode). Also, there are a couple of [links](linux-bootstrap-2.md#links) which can help you. -As I wrote above, we will start from the `set_video` function which is defined in the [arch/x86/boot/video.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/video.c#L315) source code file. We can see that it starts by first getting the video mode from the `boot_params.hdr` structure: +As I wrote above, we will start from the `set_video` function which is defined in the [arch/x86/boot/video.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/video.c#L315) source code file. We can see that it starts by first getting the video mode from the `boot_params.hdr` structure: ```C u16 mode = boot_params.hdr.vid_mode; @@ -58,13 +58,13 @@ If you read the source code of the kernel, you'll see these very often and so it Heap API -------------------------------------------------------------------------------- -After we get `vid_mode` from `boot_params.hdr` in the `set_video` function, we can see the call to the `RESET_HEAP` function. `RESET_HEAP` is a macro which is defined in [boot.h](https://github.com/torvalds/linux/blob/master/arch/x86/boot/boot.h#L199). It is defined as: +After we get `vid_mode` from `boot_params.hdr` in the `set_video` function, we can see the call to the `RESET_HEAP` function. `RESET_HEAP` is a macro which is defined in [boot.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/boot.h#L199). It is defined as: ```C #define RESET_HEAP() ((void *)( HEAP = _end )) ``` -If you have read the second part, you will remember that we initialized the heap with the [`init_heap`](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L116) function. We have a couple of utility functions for heap which are defined in `boot.h`. They are: +If you have read the second part, you will remember that we initialized the heap with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. We have a couple of utility functions for heap which are defined in `boot.h`. They are: ```C #define RESET_HEAP() @@ -123,7 +123,7 @@ That's all. Now we have a simple API for heap and can setup video mode. Set up video mode -------------------------------------------------------------------------------- -Now we can move directly to video mode initialization. We stopped at the `RESET_HEAP()` call in the `set_video` function. Next is the call to `store_mode_params` which stores video mode parameters in the `boot_params.screen_info` structure which is defined in [include/uapi/linux/screen_info.h](https://github.com/0xAX/linux/blob/master/include/uapi/linux/screen_info.h). +Now we can move directly to video mode initialization. We stopped at the `RESET_HEAP()` call in the `set_video` function. Next is the call to `store_mode_params` which stores video mode parameters in the `boot_params.screen_info` structure which is defined in [include/uapi/linux/screen_info.h](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/include/uapi/linux/screen_info.h). If we look at the `store_mode_params` function, we can see that it starts with the call to the `store_cursor_position` function. As you can understand from the function name, it gets information about cursor and stores it. @@ -146,7 +146,7 @@ font_size = rdfs16(0x485); boot_params.screen_info.orig_video_points = font_size; ``` -First of all, we put 0 in the `FS` register with the `set_fs` function. We already saw functions like `set_fs` in the previous part. They are all defined in [boot.h](https://github.com/0xAX/linux/blob/master/arch/x86/boot/boot.h). Next, we read the value which is located at address `0x485` (this memory location is used to get the font size) and save the font size in `boot_params.screen_info.orig_video_points`. +First of all, we put 0 in the `FS` register with the `set_fs` function. We already saw functions like `set_fs` in the previous part. They are all defined in [boot.h](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/boot.h). Next, we read the value which is located at address `0x485` (this memory location is used to get the font size) and save the font size in `boot_params.screen_info.orig_video_points`. ``` x = rdfs16(0x44a); @@ -174,7 +174,7 @@ if (!heap_free(saved.x*saved.y*sizeof(u16)+512)) and allocates space in the heap if it is enough and stores `saved_screen` in it. -The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/master/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting moment, we can see the loop: +The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting moment, we can see the loop: ```C for (card = video_cards; card < video_cards_end; card++) { @@ -213,7 +213,7 @@ struct card_info { }; ``` -is in the `.videocards` segment. Let's look in the [arch/x86/boot/setup.ld](https://github.com/0xAX/linux/blob/master/arch/x86/boot/setup.ld) linker script, where we can find: +is in the `.videocards` segment. Let's look in the [arch/x86/boot/setup.ld](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/setup.ld) linker script, where we can find: ``` .videocards : { @@ -227,7 +227,7 @@ It means that `video_cards` is just a memory address and all `card_info` structu After `probe_cards` execution is finished, we move to the main loop in the `set_video` function. There is an infinite loop which tries to set up video mode with the `set_mode` function or prints a menu if we passed `vid_mode=ask` to the kernel command line or video mode is undefined. -The `set_mode` function is defined in [video-mode.c](https://github.com/0xAX/linux/blob/master/arch/x86/boot/video-mode.c#L147) and gets only one parameter, `mode`, which is the number of video modes (we got it from the menu or in the start of `setup_video`, from the kernel setup header). +The `set_mode` function is defined in [video-mode.c](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/video-mode.c#L147) and gets only one parameter, `mode`, which is the number of video modes (we got it from the menu or in the start of `setup_video`, from the kernel setup header). The `set_mode` function checks the `mode` and calls the `raw_set_mode` function. The `raw_set_mode` calls the `set_mode` function for the selected card i.e. `card->set_mode(struct mode_info*)`. We can get access to this function from the `card_info` structure. Every video mode defines this structure with values filled depending upon the video mode (for example for `vga` it is the `video_vga.set_mode` function. See above example of `card_info` structure for `vga`). `video_vga.set_mode` is `vga_set_mode`, which checks the vga mode and calls the respective function: @@ -276,9 +276,9 @@ After this, we have set video mode and now we can switch to the protected mode. Last preparation before transition into protected mode -------------------------------------------------------------------------------- -We can see the last function call - `go_to_protected_mode` - in [main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c#L184). As the comment says: `Do the last things and invoke protected mode`, so let's see these last things and switch into protected mode. +We can see the last function call - `go_to_protected_mode` - in [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L184). As the comment says: `Do the last things and invoke protected mode`, so let's see these last things and switch into protected mode. -`go_to_protected_mode` is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what they do and how it works. +`go_to_protected_mode` is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what they do and how it works. First is the call to the `realmode_switch_hook` function in `go_to_protected_mode`. This function invokes the real mode switch hook if it is present and disables [NMI](http://en.wikipedia.org/wiki/Non-maskable_interrupt). Hooks are used if the bootloader runs in a hostile environment. You can read more about hooks in the [boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) (see **ADVANCED BOOT LOADER HOOKS**). @@ -306,7 +306,7 @@ static inline void io_delay(void) To output any byte to the port `0x80` should delay exactly 1 microsecond. So we can write any value (value from `AL` register in our case) to the `0x80` port. After this delay `realmode_switch_hook` function has finished execution and we can move to the next function. -The next function is `enable_a20`, which enables [A20 line](http://en.wikipedia.org/wiki/A20_line). This function is defined in [arch/x86/boot/a20.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/a20.c) and it tries to enable the A20 gate with different methods. The first is the `a20_test_short` function which checks if A20 is already enabled or not with the `a20_test` function: +The next function is `enable_a20`, which enables [A20 line](http://en.wikipedia.org/wiki/A20_line). This function is defined in [arch/x86/boot/a20.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/a20.c) and it tries to enable the A20 gate with different methods. The first is the `a20_test_short` function which checks if A20 is already enabled or not with the `a20_test` function: ```C static int a20_test(int loops) @@ -336,7 +336,7 @@ First of all, we put `0x0000` in the `FS` register and `0xffff` in the `GS` regi Next, we write an updated `ctr` value into `fs:gs` with the `wrfs32` function, then delay for 1ms, and then read the value from the `GS` register by address `A20_TEST_ADDR+0x10`, if it's not zero we already have enabled the A20 line. If A20 is disabled, we try to enable it with a different method which you can find in the `a20.c`. For example with call of `0x15` BIOS interrupt with `AH=0x2041` etc. -If the `enabled_a20` function finished with fail, print an error message and call function `die`. You can remember it from the first source code file where we started - [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S): +If the `enabled_a20` function finished with fail, print an error message and call function `die`. You can remember it from the first source code file where we started - [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S): ```assembly die: @@ -489,7 +489,7 @@ This is the end of the `go_to_protected_mode` function. We loaded IDT, GDT, disa protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4)); ``` -which is defined in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pmjump.S#L26). It takes two parameters: +which is defined in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S#L26). It takes two parameters: * address of protected mode entry point * address of `boot_params` diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index c6d93a5..d6fa3d3 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -8,7 +8,7 @@ This is the fourth part of the `Kernel booting process` where we will see first **NOTE: there will be much assembly code in this part, so if you are not familiar with that, you might want to consult a book about it** -In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md) we stopped at the jump to the 32-bit entry point in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pmjump.S): +In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md) we stopped at the jump to the 32-bit entry point in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S): ```assembly jmpl *%eax @@ -46,7 +46,7 @@ We can see here that `cs` register contains - `0x10` (as you will remember from 32-bit entry point -------------------------------------------------------------------------------- -We can find the definition of the 32-bit entry point in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly source code file: +We can find the definition of the 32-bit entry point in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file: ```assembly __HEAD @@ -62,10 +62,10 @@ First of all, why `compressed` directory? Actually `bzimage` is a gzipped `vmlin There were two files in the `arch/x86/boot/compressed` directory: -* [head_32.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_32.S) -* [head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) +* [head_32.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_32.S) +* [head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) -but we will see only `head_64.S` because, as you may remember, this book is only `x86_64` related; `head_32.S` is not used in our case. Let's look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/Makefile). There we can see the following target: +but we will see only `head_64.S` because, as you may remember, this book is only `x86_64` related; `head_32.S` is not used in our case. Let's look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile). There we can see the following target: ```Makefile vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ @@ -73,7 +73,7 @@ vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ $(obj)/piggy.o $(obj)/cpuflags.o ``` -Note `$(obj)/head_$(BITS).o`. This means that we will select which file to link based on what `$(BITS)` is set to, either head_32.o or head_64.o. `$(BITS)` is defined elsewhere in [arch/x86/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile) based on the .config file: +Note `$(obj)/head_$(BITS).o`. This means that we will select which file to link based on what `$(BITS)` is set to, either head_32.o or head_64.o. `$(BITS)` is defined elsewhere in [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile) based on the .config file: ```Makefile ifeq ($(CONFIG_X86_32),y) @@ -92,7 +92,7 @@ Now we know where to start, so let's do it. Reload the segments if needed -------------------------------------------------------------------------------- -As indicated above, we start in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly source code file. First we see the definition of the special section attribute before the `startup_32` definition: +As indicated above, we start in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file. First we see the definition of the special section attribute before the `startup_32` definition: ```assembly __HEAD @@ -100,13 +100,13 @@ As indicated above, we start in the [arch/x86/boot/compressed/head_64.S](https:/ ENTRY(startup_32) ``` -The `__HEAD` is macro which is defined in [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h) header file and expands to the definition of the following section: +The `__HEAD` is macro which is defined in [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h) header file and expands to the definition of the following section: ```C #define __HEAD .section ".head.text","ax" ``` -with `.head.text` name and `ax` flags. In our case, these flags show us that this section is [executable](https://en.wikipedia.org/wiki/Executable) or in other words contains code. We can find definition of this section in the [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/vmlinux.lds.S) linker script: +with `.head.text` name and `ax` flags. In our case, these flags show us that this section is [executable](https://en.wikipedia.org/wiki/Executable) or in other words contains code. We can find definition of this section in the [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/vmlinux.lds.S) linker script: ``` SECTIONS @@ -153,7 +153,7 @@ So, if the `KEEP_SEGMENTS` bit is not set in the `loadflags`, we need to reset ` movl %eax, %ss ``` -Remember that the `__BOOT_DS` is `0x18` (index of data segment in the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table)). If `KEEP_SEGMENTS` is set, we jump to the nearest `1f` label or update segment registers with `__BOOT_DS` if it is not set. It is pretty easy, but here is one interesting moment. If you've read the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md), you may remember that we already updated these segment registers right after we switched to [protected mode](https://en.wikipedia.org/wiki/Protected_mode) in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pmjump.S). So why do we need to care about values of segment registers again? The answer is easy. The Linux kernel also has a 32-bit boot protocol and if a bootloader uses it to load the Linux kernel all code before the `startup_32` will be missed. In this case, the `startup_32` will be the first entry point of the Linux kernel right after the bootloader and there are no guarantees that segment registers will be in known state. +Remember that the `__BOOT_DS` is `0x18` (index of data segment in the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table)). If `KEEP_SEGMENTS` is set, we jump to the nearest `1f` label or update segment registers with `__BOOT_DS` if it is not set. It is pretty easy, but here is one interesting moment. If you've read the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md), you may remember that we already updated these segment registers right after we switched to [protected mode](https://en.wikipedia.org/wiki/Protected_mode) in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S). So why do we need to care about values of segment registers again? The answer is easy. The Linux kernel also has a 32-bit boot protocol and if a bootloader uses it to load the Linux kernel all code before the `startup_32` will be missed. In this case, the `startup_32` will be the first entry point of the Linux kernel right after the bootloader and there are no guarantees that segment registers will be in known state. After we have checked the `KEEP_SEGMENTS` flag and put the correct value to the segment registers, the next step is to calculate the difference between where we loaded and compiled to run. Remember that `setup.ld.S` contains following definition: `. = 0` at the start of the `.head.text` section. This means that the code in this section is compiled to run from `0` address. We can see this in `objdump` output: @@ -184,7 +184,7 @@ After this, a register will contain the address of a label. Let's look at the si subl $1b, %ebp ``` -As you remember from the previous part, the `esi` register contains the address of the [boot_params](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/bootparam.h#L113) structure which was filled before we moved to the protected mode. The `boot_params` structure contains a special field `scratch` with offset `0x1e4`. These four bytes field will be temporary stack for `call` instruction. We are getting the address of the `scratch` field + 4 bytes and putting it in the `esp` register. We add `4` bytes to the base of the `BP_scratch` field because, as just described, it will be a temporary stack and the stack grows from top to down in `x86_64` architecture. So our stack pointer will point to the top of the stack. Next, we can see the pattern that I've described above. We make a call to the `1f` label and put the address of this label to the `ebp` register because we have return address on the top of stack after the `call` instruction will be executed. So, for now we have an address of the `1f` label and now it is easy to get address of the `startup_32`. We just need to subtract address of label from the address which we got from the stack: +As you remember from the previous part, the `esi` register contains the address of the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113) structure which was filled before we moved to the protected mode. The `boot_params` structure contains a special field `scratch` with offset `0x1e4`. These four bytes field will be temporary stack for `call` instruction. We are getting the address of the `scratch` field + 4 bytes and putting it in the `esp` register. We add `4` bytes to the base of the `BP_scratch` field because, as just described, it will be a temporary stack and the stack grows from top to down in `x86_64` architecture. So our stack pointer will point to the top of the stack. Next, we can see the pattern that I've described above. We make a call to the `1f` label and put the address of this label to the `ebp` register because we have return address on the top of stack after the `call` instruction will be executed. So, for now we have an address of the `1f` label and now it is easy to get address of the `startup_32`. We just need to subtract address of label from the address which we got from the stack: ``` startup_32 (0x0) +-----------------------+ @@ -256,7 +256,7 @@ We could not setup the stack while we did not know the address of the `startup_3 movl %eax, %esp ``` -The `boot_stack_end` label, defined in the same [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly source code file and located in the [.bss](https://en.wikipedia.org/wiki/.bss) section: +The `boot_stack_end` label, defined in the same [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file and located in the [.bss](https://en.wikipedia.org/wiki/.bss) section: ```assembly .bss @@ -278,7 +278,7 @@ After we have set up the stack, next step is CPU verification. As we are going t jnz no_longmode ``` -This function defined in the [arch/x86/kernel/verify_cpu.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/verify_cpu.S) assembly file and just contains a couple of calls to the [cpuid](https://en.wikipedia.org/wiki/CPUID) instruction. This instruction is used for getting information about the processor. In our case, it checks `long mode` and `SSE` support and returns `0` on success or `1` on fail in the `eax` register. +This function defined in the [arch/x86/kernel/verify_cpu.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/verify_cpu.S) assembly file and just contains a couple of calls to the [cpuid](https://en.wikipedia.org/wiki/CPUID) instruction. This instruction is used for getting information about the processor. In our case, it checks `long mode` and `SSE` support and returns `0` on success or `1` on fail in the `eax` register. If the value of the `eax` is not zero, we jump to the `no_longmode` label which just stops the CPU by the call of the `hlt` instruction while no hardware interrupt will not happen: @@ -305,7 +305,7 @@ it has been loaded at and the compile time physical address (CONFIG_PHYSICAL_START) is used as the minimum location. ``` -In simple terms, this means that the Linux kernel with the same configuration can be booted from different addresses. Technically, this is done by compiling the decompressor as [position independent code](https://en.wikipedia.org/wiki/Position-independent_code). If we look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/Makefile), we will see that the decompressor is indeed compiled with the `-fPIC` flag: +In simple terms, this means that the Linux kernel with the same configuration can be booted from different addresses. Technically, this is done by compiling the decompressor as [position independent code](https://en.wikipedia.org/wiki/Position-independent_code). If we look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile), we will see that the decompressor is indeed compiled with the `-fPIC` flag: ```Makefile KBUILD_CFLAGS += -fno-strict-aliasing -fPIC @@ -329,7 +329,7 @@ When we are using position-independent code an address is obtained by adding the addl $z_extract_offset, %ebx ``` -Remember that the value of the `ebp` register is the physical address of the `startup_32` label. If the `CONFIG_RELOCATABLE` kernel configuration option is enabled during kernel configuration, we put this address in the `ebx` register, align it to a multiple of `2MB` and compare it with the `LOAD_PHYSICAL_ADDR` value. The `LOAD_PHYSICAL_ADDR` macro is defined in the [arch/x86/include/asm/boot.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/boot.h) header file and it looks like this: +Remember that the value of the `ebp` register is the physical address of the `startup_32` label. If the `CONFIG_RELOCATABLE` kernel configuration option is enabled during kernel configuration, we put this address in the `ebx` register, align it to a multiple of `2MB` and compare it with the `LOAD_PHYSICAL_ADDR` value. The `LOAD_PHYSICAL_ADDR` macro is defined in the [arch/x86/include/asm/boot.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/boot.h) header file and it looks like this: ```C #define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ @@ -352,7 +352,7 @@ When we have the base address where we will relocate the compressed kernel image lgdt gdt(%ebp) ``` -Here we put the base address from `ebp` register with `gdt` offset into the `eax` register. Next we put this address into `ebp` register with offset `gdt+2` and load the `Global Descriptor Table` with the `lgdt` instruction. To understand the magic with `gdt` offsets we need to look at the definition of the `Global Descriptor Table`. We can find its definition in the same source code [file](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S): +Here we put the base address from `ebp` register with `gdt` offset into the `eax` register. Next we put this address into `ebp` register with offset `gdt+2` and load the `Global Descriptor Table` with the `lgdt` instruction. To understand the magic with `gdt` offsets we need to look at the definition of the `Global Descriptor Table`. We can find its definition in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly .data @@ -436,7 +436,7 @@ Let's look at the implementation of this. First of all, we clear the buffer for We put the address of `pgtable` plus `ebx` (remember that `ebx` contains the address to relocate the kernel for decompression) in the `edi` register, clear the `eax` register and set the `ecx` register to `6144`. The `rep stosl` instruction will write the value of the `eax` to `edi`, increase value of the `edi` register by `4` and decrease the value of the `ecx` register by `1`. This operation will be repeated while the value of the `ecx` register is greater than zero. That's why we put `6144` in `ecx`. -`pgtable` is defined at the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly file and is: +`pgtable` is defined at the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly file and is: ```assembly .section ".pgtable","a",@nobits @@ -511,7 +511,7 @@ First of all we need to set the `EFER.LME` flag in the [MSR](http://en.wikipedia wrmsr ``` -Here we put the `MSR_EFER` flag (which is defined in [arch/x86/include/uapi/asm/msr-index.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/msr-index.h#L7)) in the `ecx` register and call `rdmsr` instruction which reads the [MSR](http://en.wikipedia.org/wiki/Model-specific_register) register. After `rdmsr` executes, we will have the resulting data in `edx:eax` which depends on the `ecx` value. We check the `EFER_LME` bit with the `btsl` instruction and write data from `eax` to the `MSR` register with the `wrmsr` instruction. +Here we put the `MSR_EFER` flag (which is defined in [arch/x86/include/uapi/asm/msr-index.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/msr-index.h#L7)) in the `ecx` register and call `rdmsr` instruction which reads the [MSR](http://en.wikipedia.org/wiki/Model-specific_register) register. After `rdmsr` executes, we will have the resulting data in `edx:eax` which depends on the `ecx` value. We check the `EFER_LME` bit with the `btsl` instruction and write data from `eax` to the `MSR` register with the `wrmsr` instruction. In the next step, we push the address of the kernel segment code to the stack (we defined it in the GDT) and put the address of the `startup_64` routine in `eax`. diff --git a/Booting/linux-bootstrap-5.md b/Booting/linux-bootstrap-5.md index 3e4ad1e..8722ed1 100644 --- a/Booting/linux-bootstrap-5.md +++ b/Booting/linux-bootstrap-5.md @@ -9,7 +9,7 @@ This is the fifth part of the `Kernel booting process` series. We saw transition Preparation before kernel decompression -------------------------------------------------------------------------------- -We stopped right before the jump on the 64-bit entry point - `startup_64` which is located in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) source code file. We already saw the jump to the `startup_64` in the `startup_32`: +We stopped right before the jump on the 64-bit entry point - `startup_64` which is located in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) source code file. We already saw the jump to the `startup_64` in the `startup_32`: ```assembly pushl $__KERNEL_CS @@ -69,7 +69,7 @@ In the next step we can see setup of the stack pointer and resetting of the flag popfq ``` -As you can see above, the `rbx` register contains the start address of the kernel decompressor code and we just put this address with `boot_stack_end` offset to the `rsp` register which represents pointer to the top of the stack. After this step, the stack will be correct. You can find definition of the `boot_stack_end` in the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly source code file: +As you can see above, the `rbx` register contains the start address of the kernel decompressor code and we just put this address with `boot_stack_end` offset to the `rsp` register which represents pointer to the top of the stack. After this step, the stack will be correct. You can find definition of the `boot_stack_end` in the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file: ```assembly .bss @@ -81,7 +81,7 @@ boot_stack: boot_stack_end: ``` -It located in the end of the `.bss` section, right before the `.pgtable`. If you will look into [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/vmlinux.lds.S) linker script, you will find Definition of the `.bss` and `.pgtable` there. +It located in the end of the `.bss` section, right before the `.pgtable`. If you will look into [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/vmlinux.lds.S) linker script, you will find Definition of the `.bss` and `.pgtable` there. As we set the stack, now we can copy the compressed kernel to the address that we got above, when we calculated the relocation address of the decompressed kernel. Before details, let's look at this assembly code: @@ -99,7 +99,7 @@ As we set the stack, now we can copy the compressed kernel to the address that w First of all we push `rsi` to the stack. We need preserve the value of `rsi`, because this register now stores a pointer to the `boot_params` which is real mode structure that contains booting related data (you must remember this structure, we filled it in the start of kernel setup). In the end of this code we'll restore the pointer to the `boot_params` into `rsi` again. -The next two `leaq` instructions calculates effective addresses of the `rip` and `rbx` with `_bss - 8` offset and put it to the `rsi` and `rdi`. Why do we calculate these addresses? Actually the compressed kernel image is located between this copying code (from `startup_32` to the current code) and the decompression code. You can verify this by looking at the linker script - [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/vmlinux.lds.S): +The next two `leaq` instructions calculates effective addresses of the `rip` and `rbx` with `_bss - 8` offset and put it to the `rsi` and `rdi`. Why do we calculate these addresses? Actually the compressed kernel image is located between this copying code (from `startup_32` to the current code) and the decompression code. You can verify this by looking at the linker script - [arch/x86/boot/compressed/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/vmlinux.lds.S): ``` . = 0; @@ -188,9 +188,9 @@ At the end, we can see the call to the `decompress_kernel` function: popq %rsi ``` -Again we set `rdi` to a pointer to the `boot_params` structure and call `decompress_kernel` from [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c) with seven arguments: +Again we set `rdi` to a pointer to the `boot_params` structure and call `decompress_kernel` from [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) with seven arguments: -* `rmode` - pointer to the [boot_params](https://github.com/torvalds/linux/blob/master//arch/x86/include/uapi/asm/bootparam.h#L114) structure which is filled by bootloader or during early kernel initialization; +* `rmode` - pointer to the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973//arch/x86/include/uapi/asm/bootparam.h#L114) structure which is filled by bootloader or during early kernel initialization; * `heap` - pointer to the `boot_heap` which represents start address of the early boot heap; * `input_data` - pointer to the start of the compressed kernel or in other words pointer to the `arch/x86/boot/compressed/vmlinux.bin.bz2`; * `input_len` - size of the compressed kernel; @@ -203,7 +203,7 @@ All arguments will be passed through the registers according to [System V Applic Kernel decompression -------------------------------------------------------------------------------- -As we saw in previous paragraph, the `decompress_kernel` function is defined in the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c) source code file and takes seven arguments. This function starts with the video/console initialization that we already saw in the previous parts. We need to do this again because we don't know if we started in [real mode](https://en.wikipedia.org/wiki/Real_mode) or a bootloader was used, or whether the bootloader used the 32 or 64-bit boot protocol. +As we saw in previous paragraph, the `decompress_kernel` function is defined in the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) source code file and takes seven arguments. This function starts with the video/console initialization that we already saw in the previous parts. We need to do this again because we don't know if we started in [real mode](https://en.wikipedia.org/wiki/Real_mode) or a bootloader was used, or whether the bootloader used the 32 or 64-bit boot protocol. After the first initialization steps, we store pointers to the start of the free memory and to the end of it: @@ -212,7 +212,7 @@ free_mem_ptr = heap; free_mem_end_ptr = heap + BOOT_HEAP_SIZE; ``` -where the `heap` is the second parameter of the `decompress_kernel` function which we got in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S): +where the `heap` is the second parameter of the `decompress_kernel` function which we got in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly leaq boot_heap(%rip), %rsi @@ -227,7 +227,7 @@ boot_heap: where the `BOOT_HEAP_SIZE` is macro which expands to `0x8000` (`0x400000` in a case of `bzip2` kernel) and represents the size of the heap. -After heap pointers initialization, the next step is the call of the `choose_random_location` function from [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c#L425) source code file. As we can guess from the function name, it chooses the memory location where the kernel image will be decompressed. It may look weird that we need to find or even `choose` location where to decompress the compressed kernel image, but the Linux kernel supports [kASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) which allows decompression of the kernel into a random address, for security reasons. Let's open the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c#L425) source code file and look at `choose_random_location`. +After heap pointers initialization, the next step is the call of the `choose_random_location` function from [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file. As we can guess from the function name, it chooses the memory location where the kernel image will be decompressed. It may look weird that we need to find or even `choose` location where to decompress the compressed kernel image, but the Linux kernel supports [kASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) which allows decompression of the kernel into a random address, for security reasons. Let's open the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file and look at `choose_random_location`. First, `choose_random_location` tries to find the `kaslr` option in the Linux kernel command line if `CONFIG_HIBERNATION` is set, and `nokaslr` otherwise: @@ -254,7 +254,7 @@ out: which just returns the `output` parameter which we passed to the `choose_random_location`, unchanged. If the `CONFIG_HIBERNATION` kernel configuration option is disabled and the `nokaslr` option is in the kernel command line, we jump to `out` again. -For now, let's assume the kernel was configured with randomization enabled and try to understand what `kASLR` is. We can find information about it in the [documentation](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt): +For now, let's assume the kernel was configured with randomization enabled and try to understand what `kASLR` is. We can find information about it in the [documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt): ``` kaslr/nokaslr [X86] @@ -268,7 +268,7 @@ hibernation will be disabled. It means that we can pass the `kaslr` option to the kernel's command line and get a random address for the decompressed kernel (you can read more about ASLR [here](https://en.wikipedia.org/wiki/Address_space_layout_randomization)). So, our current goal is to find random address where we can `safely` to decompress the Linux kernel. I repeat: `safely`. What does it mean in this context? You may remember that besides the code of decompressor and directly the kernel image, there are some unsafe places in memory. For example, the [initrd](https://en.wikipedia.org/wiki/Initrd) image is in memory too, and we must not overlap it with the decompressed kernel. -The next function will help us to find a safe place where we can decompress kernel. This function is `mem_avoid_init`. It defined in the same source code [file](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c), and takes four arguments that we already saw in the `decompress_kernel` function: +The next function will help us to find a safe place where we can decompress kernel. This function is `mem_avoid_init`. It defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c), and takes four arguments that we already saw in the `decompress_kernel` function: * `input_data` - pointer to the start of the compressed kernel, or in other words, the pointer to `arch/x86/boot/compressed/vmlinux.bin.bz2`; * `input_len` - the size of the compressed kernel; @@ -309,7 +309,7 @@ The implementation of the `mem_avoid_init` is pretty simple. Let's look on the p ... ``` -Here we can see calculation of the [initrd](http://en.wikipedia.org/wiki/Initrd) start address and size. The `ext_ramdisk_image` is the high `32-bits` of the `ramdisk_image` field from the setup header, and `ext_ramdisk_size` is the high 32-bits of the `ramdisk_size` field from the [boot protocol](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt): +Here we can see calculation of the [initrd](http://en.wikipedia.org/wiki/Initrd) start address and size. The `ext_ramdisk_image` is the high `32-bits` of the `ramdisk_image` field from the setup header, and `ext_ramdisk_size` is the high 32-bits of the `ramdisk_size` field from the [boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt): ``` Offset Proto Name Meaning @@ -322,7 +322,7 @@ Offset Proto Name Meaning ... ``` -And `ext_ramdisk_image` and `ext_ramdisk_size` can be found in the [Documentation/x86/zero-page.txt](https://github.com/torvalds/linux/blob/master/Documentation/x86/zero-page.txt): +And `ext_ramdisk_image` and `ext_ramdisk_size` can be found in the [Documentation/x86/zero-page.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/zero-page.txt): ``` Offset Proto Name Meaning @@ -428,7 +428,7 @@ return slots[get_random_long() % slot_max]; where `get_random_long` function checks different CPU flags as `X86_FEATURE_RDRAND` or `X86_FEATURE_TSC` and chooses a method for getting random number (it can be the RDRAND instruction, the time stamp counter, the programmable interval timer, etc...). After retrieving the random address, execution of the `choose_random_location` is finished. -Now let's back to [misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c#L404). After getting the address for the kernel image, there need to be some checks to be sure that the retrieved random address is correctly aligned and address is not wrong. +Now let's back to [misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c#L404). After getting the address for the kernel image, there need to be some checks to be sure that the retrieved random address is correctly aligned and address is not wrong. After all these checks we will see the familiar message: @@ -528,7 +528,7 @@ and if it's not valid, it prints an error message and halts. If we got a valid ` That's all. From now on, all loadable segments are in the correct place. The last `handle_relocations` function adjusts addresses in the kernel image, and is called only if the `kASLR` was enabled during kernel configuration. -After the kernel is relocated, we return back from the `decompress_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S). The address of the kernel will be in the `rax` register and we jump to it: +After the kernel is relocated, we return back from the `decompress_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S). The address of the kernel will be in the `rax` register and we jump to it: ```assembly jmp *%rax diff --git a/Cgroups/cgroups1.md b/Cgroups/cgroups1.md index b92a62e..f178fc6 100644 --- a/Cgroups/cgroups1.md +++ b/Cgroups/cgroups1.md @@ -224,7 +224,7 @@ Early initialization of `cgroups` starts from the call of the: cgroup_init_early(); ``` -function in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) during early initialization of the Linux kernel. This function is defined in the [kernel/cgroup.c](https://github.com/torvalds/linux/blob/master/kernel/cgroup.c) source code file and starts from the definition of two following local variables: +function in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) during early initialization of the Linux kernel. This function is defined in the [kernel/cgroup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cgroup.c) source code file and starts from the definition of two following local variables: ```C int __init cgroup_init_early(void) @@ -256,7 +256,7 @@ which represents mount options of `cgroupfs`. For example we may create named cg $ mount -t cgroup -oname=my_cgrp,none /mnt/cgroups ``` -The second variable - `ss` has type - `cgroup_subsys` structure which is defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/cgroup-defs.h) header file and as you may guess from the name of the type, it represents a `cgroup` subsystem. This structure contains various fields and callback functions like: +The second variable - `ss` has type - `cgroup_subsys` structure which is defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cgroup-defs.h) header file and as you may guess from the name of the type, it represents a `cgroup` subsystem. This structure contains various fields and callback functions like: ```C struct cgroup_subsys { @@ -292,7 +292,7 @@ Here we may see call of the `init_cgroup_root` function which will execute initi struct cgroup_root cgrp_dfl_root; ``` -Its `cgrp` field represented by the `cgroup` structure which represents a `cgroup` as you already may guess and defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/cgroup-defs.h) header file. We already know that a process which is represented by the `task_struct` in the Linux kernel. The `task_struct` does not contain direct link to a `cgroup` where this task is attached. But it may be reached via `ccs_set` field of the `task_struct`. This `ccs_set` structure holds pointer to the array of subsystem states: +Its `cgrp` field represented by the `cgroup` structure which represents a `cgroup` as you already may guess and defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cgroup-defs.h) header file. We already know that a process which is represented by the `task_struct` in the Linux kernel. The `task_struct` does not contain direct link to a `cgroup` where this task is attached. But it may be reached via `ccs_set` field of the `task_struct`. This `ccs_set` structure holds pointer to the array of subsystem states: ```C struct css_set { @@ -376,7 +376,7 @@ for_each_subsys(ss, i) { } ``` -The `for_each_subsys` here is a macro which is defined in the [kernel/cgroup.c](https://github.com/torvalds/linux/blob/master/kernel/cgroup.c) source code file and just expands to the `for` loop over `cgroup_subsys` array. Definition of this array may be found in the same source code file and it looks in a little unusual way: +The `for_each_subsys` here is a macro which is defined in the [kernel/cgroup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cgroup.c) source code file and just expands to the `for` loop over `cgroup_subsys` array. Definition of this array may be found in the same source code file and it looks in a little unusual way: ```C #define SUBSYS(_x) [_x ## _cgrp_id] = &_x ## _cgrp_subsys, @@ -386,7 +386,7 @@ The `for_each_subsys` here is a macro which is defined in the [kernel/cgroup.c]( #undef SUBSYS ``` -It is defined as `SUBSYS` macro which takes one argument (name of a subsystem) and defines `cgroup_subsys` array of cgroup subsystems. Additionally we may see that the array is initialized with content of the [linux/cgroup_subsys.h](https://github.com/torvalds/linux/blob/master/include/linux/cgroup_subsys.h) header file. If we will look inside of this header file we will see again set of the `SUBSYS` macros with the given subsystems names: +It is defined as `SUBSYS` macro which takes one argument (name of a subsystem) and defines `cgroup_subsys` array of cgroup subsystems. Additionally we may see that the array is initialized with content of the [linux/cgroup_subsys.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cgroup_subsys.h) header file. If we will look inside of this header file we will see again set of the `SUBSYS` macros with the given subsystems names: ```C #if IS_ENABLED(CONFIG_CPUSETS) @@ -401,7 +401,7 @@ SUBSYS(cpu) ... ``` -This works because of `#undef` statement after first definition of the `SUBSYS` macro. Look at the `&_x ## _cgrp_subsys` expression. The `##` operator concatenates right and left expression in a `C` macro. So as we passed `cpuset`, `cpu` and etc., to the `SUBSYS` macro, somewhere `cpuset_cgrp_subsys`, `cp_cgrp_subsys` should be defined. And that's true. If you will look in the [kernel/cpuset.c](https://github.com/torvalds/linux/blob/master/kernel/cpuset.c) source code file, you will see this definition: +This works because of `#undef` statement after first definition of the `SUBSYS` macro. Look at the `&_x ## _cgrp_subsys` expression. The `##` operator concatenates right and left expression in a `C` macro. So as we passed `cpuset`, `cpu` and etc., to the `SUBSYS` macro, somewhere `cpuset_cgrp_subsys`, `cp_cgrp_subsys` should be defined. And that's true. If you will look in the [kernel/cpuset.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cpuset.c) source code file, you will see this definition: ```C struct cgroup_subsys cpuset_cgrp_subsys = { diff --git a/Concepts/cpumask.md b/Concepts/cpumask.md index ea67bc3..5f520c3 100644 --- a/Concepts/cpumask.md +++ b/Concepts/cpumask.md @@ -6,11 +6,11 @@ Introduction `Cpumasks` is a special way provided by the Linux kernel to store information about CPUs in the system. The relevant source code and header files which contains API for `Cpumasks` manipulation: -* [include/linux/cpumask.h](https://github.com/torvalds/linux/blob/master/include/linux/cpumask.h) -* [lib/cpumask.c](https://github.com/torvalds/linux/blob/master/lib/cpumask.c) -* [kernel/cpu.c](https://github.com/torvalds/linux/blob/master/kernel/cpu.c) +* [include/linux/cpumask.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cpumask.h) +* [lib/cpumask.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/cpumask.c) +* [kernel/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cpu.c) -As comment says from the [include/linux/cpumask.h](https://github.com/torvalds/linux/blob/master/include/linux/cpumask.h): Cpumasks provide a bitmap suitable for representing the set of CPU's in a system, one bit position per CPU number. We already saw a bit about cpumask in the `boot_cpu_init` function from the [Kernel entry point](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html) part. This function makes first boot cpu online, active and etc...: +As comment says from the [include/linux/cpumask.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cpumask.h): Cpumasks provide a bitmap suitable for representing the set of CPU's in a system, one bit position per CPU number. We already saw a bit about cpumask in the `boot_cpu_init` function from the [Kernel entry point](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html) part. This function makes first boot cpu online, active and etc...: ```C set_cpu_online(cpu, true); @@ -62,7 +62,7 @@ As we are focusing on the `x86_64` architecture, `unsigned long` is 8-bytes size (((8) + (8) - 1) / (8)) = 1 ``` -`NR_CPUS` macro represents the number of CPUs in the system and depends on the `CONFIG_NR_CPUS` macro which is defined in [include/linux/threads.h](https://github.com/torvalds/linux/blob/master/include/linux/threads.h) and looks like this: +`NR_CPUS` macro represents the number of CPUs in the system and depends on the `CONFIG_NR_CPUS` macro which is defined in [include/linux/threads.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/threads.h) and looks like this: ```C #ifndef CONFIG_NR_CPUS diff --git a/Concepts/initcall.md b/Concepts/initcall.md index f435480..dd155dd 100644 --- a/Concepts/initcall.md +++ b/Concepts/initcall.md @@ -27,7 +27,7 @@ static int __init nmi_warning_debugfs(void) } ``` -from the [arch/x86/kernel/nmi.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/nmi.c) source code file. As we may see it just creates the `nmi_longest_ns` [debugfs](https://en.wikipedia.org/wiki/Debugfs) file in the `arch_debugfs_dir` directory. Actually, this `debugfs` file may be created only after the `arch_debugfs_dir` will be created. Creation of this directory occurs during the architecture-specific initialization of the Linux kernel. Actually this directory will be created in the `arch_kdebugfs_init` function from the [arch/x86/kernel/kdebugfs.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/kdebugfs.c) source code file. Note that the `arch_kdebugfs_init` function is marked as `initcall` too: +from the [arch/x86/kernel/nmi.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/nmi.c) source code file. As we may see it just creates the `nmi_longest_ns` [debugfs](https://en.wikipedia.org/wiki/Debugfs) file in the `arch_debugfs_dir` directory. Actually, this `debugfs` file may be created only after the `arch_debugfs_dir` will be created. Creation of this directory occurs during the architecture-specific initialization of the Linux kernel. Actually this directory will be created in the `arch_kdebugfs_init` function from the [arch/x86/kernel/kdebugfs.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/kdebugfs.c) source code file. Note that the `arch_kdebugfs_init` function is marked as `initcall` too: ```C arch_initcall(arch_kdebugfs_init); @@ -44,7 +44,7 @@ The Linux kernel calls all architecture-specific `initcalls` before the `fs` rel * `device`; * `late`. -All of their names are represented by the `initcall_level_names` array which is defined in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file: +All of their names are represented by the `initcall_level_names` array which is defined in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file: ```C static char *initcall_level_names[] __initdata = { @@ -64,7 +64,7 @@ All functions which are marked as `initcall` by these identifiers, will be calle Implementation initcall mechanism in the Linux kernel -------------------------------------------------------------------------------- -The Linux kernel provides a set of macros from the [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h) header file to mark a given function as `initcall`. All of these macros are pretty simple: +The Linux kernel provides a set of macros from the [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h) header file to mark a given function as `initcall`. All of these macros are pretty simple: ```C #define early_initcall(fn) __define_initcall(fn, early) @@ -97,7 +97,7 @@ To understand the `__define_initcall` macro, first of all let's look at the `ini typedef int (*initcall_t)(void); ``` -Now let's return to the `_-define_initcall` macro. The [##](https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html) provides ability to concatenate two symbols. In our case, the first line of the `__define_initcall` macro produces definition of the given function which is located in the `.initcall id .init` [ELF section](http://www.skyfree.org/linux/references/ELF_Format.pdf) and marked with the following [gcc](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) attributes: `__initcall_function_name_id` and `__used`. If we will look in the [include/asm-generic/vmlinux.lds.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/vmlinux.lds.h) header file which represents data for the kernel [linker](https://en.wikipedia.org/wiki/Linker_%28computing%29) script, we will see that all of `initcalls` sections will be placed in the `.data` section: +Now let's return to the `_-define_initcall` macro. The [##](https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html) provides ability to concatenate two symbols. In our case, the first line of the `__define_initcall` macro produces definition of the given function which is located in the `.initcall id .init` [ELF section](http://www.skyfree.org/linux/references/ELF_Format.pdf) and marked with the following [gcc](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) attributes: `__initcall_function_name_id` and `__used`. If we will look in the [include/asm-generic/vmlinux.lds.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/vmlinux.lds.h) header file which represents data for the kernel [linker](https://en.wikipedia.org/wiki/Linker_%28computing%29) script, we will see that all of `initcalls` sections will be placed in the `.data` section: ```C #define INIT_CALLS \ @@ -123,7 +123,7 @@ Now let's return to the `_-define_initcall` macro. The [##](https://gcc.gnu.org/ ``` -The second attribute - `__used` is defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/master/include/linux/compiler-gcc.h) header file and it expands to the definition of the following `gcc` attribute: +The second attribute - `__used` is defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler-gcc.h) header file and it expands to the definition of the following `gcc` attribute: ```C #define __used __attribute__((__used__)) @@ -151,7 +151,7 @@ depends on the `CONFIG_LTO` kernel configuration option and just provides stub f In order to prevent any problem when there is no reference to a variable in a module, it will be moved to the end of the program. That's all about the `__define_initcall` macro. So, all of the `*_initcall` macros will be expanded during compilation of the Linux kernel, and all `initcalls` will be placed in their sections and all of them will be available from the `.data` section and the Linux kernel will know where to find a certain `initcall` to call it during initialization process. -As `initcalls` can be called by the Linux kernel, let's look how the Linux kernel does this. This process starts in the `do_basic_setup` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file: +As `initcalls` can be called by the Linux kernel, let's look how the Linux kernel does this. This process starts in the `do_basic_setup` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file: ```C static void __init do_basic_setup(void) @@ -178,7 +178,7 @@ static void __init do_initcalls(void) } ``` -The `initcall_levels` array is defined in the same source code [file](https://github.com/torvalds/linux/blob/master/init/main.c) and contains pointers to the sections which were defined in the `__define_initcall` macro: +The `initcall_levels` array is defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) and contains pointers to the sections which were defined in the `__define_initcall` macro: ```C static initcall_t *initcall_levels[] __initdata = { @@ -215,7 +215,7 @@ If you are interested, you can find these sections in the `arch/x86/kernel/vmlin If you are not familiar with this then you can know more about [linkers](https://en.wikipedia.org/wiki/Linker_%28computing%29) in the special [part](https://0xax.gitbooks.io/linux-insides/content/Misc/linkers.html) of this book. -As we just saw, the `do_initcall_level` function takes one parameter - level of `initcall` and does following two things: First of all this function parses the `initcall_command_line` which is copy of usual kernel [command line](https://www.kernel.org/doc/Documentation/kernel-parameters.txt) which may contain parameters for modules with the `parse_args` function from the [kernel/params.c](https://github.com/torvalds/linux/blob/master/kernel/params.c) source code file and call the `do_on_initcall` function for each level: +As we just saw, the `do_initcall_level` function takes one parameter - level of `initcall` and does following two things: First of all this function parses the `initcall_command_line` which is copy of usual kernel [command line](https://www.kernel.org/doc/Documentation/kernel-parameters.txt) which may contain parameters for modules with the `parse_args` function from the [kernel/params.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/params.c) source code file and call the `do_on_initcall` function for each level: ```C for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) @@ -279,7 +279,7 @@ else ret = fn(); ``` -Depends on the value of the `initcall_debug` variable, the `do_one_initcall_debug` function will call `initcall` or this function will do it directly via `fn()`. The `initcall_debug` variable is defined in the [same](https://github.com/torvalds/linux/blob/master/init/main.c) source code file: +Depends on the value of the `initcall_debug` variable, the `do_one_initcall_debug` function will call `initcall` or this function will do it directly via `fn()`. The `initcall_debug` variable is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file: ```C bool initcall_debug; @@ -335,13 +335,13 @@ if (irqs_disabled()) { That's all. In this way the Linux kernel does initialization of many subsystems in a correct order. From now on, we know what is the `initcall` mechanism in the Linux kernel. In this part, we covered main general portion of the `initcall` mechanism but we left some important concepts. Let's make a short look at these concepts. -First of all, we have missed one level of `initcalls`, this is `rootfs initcalls`. You can find definition of the `rootfs_initcall` in the [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h) header file along with all similar macros which we saw in this part: +First of all, we have missed one level of `initcalls`, this is `rootfs initcalls`. You can find definition of the `rootfs_initcall` in the [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h) header file along with all similar macros which we saw in this part: ```C #define rootfs_initcall(fn) __define_initcall(fn, rootfs) ``` -As we may understand from the macro's name, its main purpose is to store callbacks which are related to the [rootfs](https://en.wikipedia.org/wiki/Initramfs). Besides this goal, it may be useful to initialize other stuffs after initialization related to filesystems level only if devices related stuff are not initialized. For example, the decompression of the [initramfs](https://en.wikipedia.org/wiki/Initramfs) which occurred in the `populate_rootfs` function from the [init/initramfs.c](https://github.com/torvalds/linux/blob/master/init/initramfs.c) source code file: +As we may understand from the macro's name, its main purpose is to store callbacks which are related to the [rootfs](https://en.wikipedia.org/wiki/Initramfs). Besides this goal, it may be useful to initialize other stuffs after initialization related to filesystems level only if devices related stuff are not initialized. For example, the decompression of the [initramfs](https://en.wikipedia.org/wiki/Initramfs) which occurred in the `populate_rootfs` function from the [init/initramfs.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/initramfs.c) source code file: ```C rootfs_initcall(populate_rootfs); diff --git a/Concepts/per-cpu.md b/Concepts/per-cpu.md index fe9ccef..26c0323 100644 --- a/Concepts/per-cpu.md +++ b/Concepts/per-cpu.md @@ -10,7 +10,7 @@ The kernel provides an API for creating per-cpu variables - the `DEFINE_PER_CPU` DEFINE_PER_CPU_SECTION(type, name, "") ``` -This macro defined in the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/percpu-defs.h) as many other macros for work with per-cpu variables. Now we will see how this feature is implemented. +This macro defined in the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h) as many other macros for work with per-cpu variables. Now we will see how this feature is implemented. Take a look at the `DECLARE_PER_CPU` definition. We see that it takes 2 parameters: `type` and `name`, so we can use it to create per-cpu variables, for example like this: @@ -53,7 +53,7 @@ It means that we will have a `per_cpu_n` variable in the `.data..percpu` section Ok, now we know that when we use the `DEFINE_PER_CPU` macro, a per-cpu variable in the `.data..percpu` section will be created. When the kernel initializes it calls the `setup_per_cpu_areas` function which loads the `.data..percpu` section multiple times, one section per CPU. -Let's look at the per-CPU areas initialization process. It starts in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) from the call of the `setup_per_cpu_areas` function which is defined in the [arch/x86/kernel/setup_percpu.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup_percpu.c). +Let's look at the per-CPU areas initialization process. It starts in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) from the call of the `setup_per_cpu_areas` function which is defined in the [arch/x86/kernel/setup_percpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup_percpu.c). ```C pr_info("NR_CPUS:%d nr_cpumask_bits:%d nr_cpu_ids:%d nr_node_ids:%d\n", @@ -80,7 +80,7 @@ percpu_alloc= Select which percpu first chunk allocator to use. and performance comparison. ``` -The [mm/percpu.c](https://github.com/torvalds/linux/blob/master/mm/percpu.c) contains the handler of this command line option: +The [mm/percpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/percpu.c) contains the handler of this command line option: ```C early_param("percpu_alloc", percpu_alloc_setup); @@ -218,7 +218,7 @@ where `NR_CPUS` is the number of CPUs. The `__per_cpu_offset` array is filled wi `RELOC_HIDE` just returns offset `(typeof(ptr)) (__ptr + (off))` and it will return a pointer to the variable. -That's all! Of course it is not the full API, but a general overview. It can be hard to start with, but to understand per-cpu variables you mainly need to understand the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/percpu-defs.h) magic. +That's all! Of course it is not the full API, but a general overview. It can be hard to start with, but to understand per-cpu variables you mainly need to understand the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h) magic. Let's again look at the algorithm of getting a pointer to a per-cpu variable: diff --git a/DataStructures/bitmap.md b/DataStructures/bitmap.md index 36d2cf4..260d3ee 100644 --- a/DataStructures/bitmap.md +++ b/DataStructures/bitmap.md @@ -6,12 +6,12 @@ Bit arrays and bit operations in the Linux kernel Besides different [linked](https://en.wikipedia.org/wiki/Linked_data_structure) and [tree](https://en.wikipedia.org/wiki/Tree_%28data_structure%29) based data structures, the Linux kernel provides [API](https://en.wikipedia.org/wiki/Application_programming_interface) for [bit arrays](https://en.wikipedia.org/wiki/Bit_array) or `bitmap`. Bit arrays are heavily used in the Linux kernel and following source code files contain common `API` for work with such structures: -* [lib/bitmap.c](https://github.com/torvalds/linux/blob/master/lib/bitmap.c) -* [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) +* [lib/bitmap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/bitmap.c) +* [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) Besides these two files, there is also architecture-specific header file which provides optimized bit operations for certain architecture. We consider [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, so in our case it will be: -* [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) +* [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file. As I just wrote above, the `bitmap` is heavily used in the Linux kernel. For example a `bit array` is used to store set of online/offline processors for systems which support [hot-plug](https://www.kernel.org/doc/Documentation/cpu-hotplug.txt) cpu (more about this you can read in the [cpumasks](https://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) part), a `bit array` stores set of allocated [irqs](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29) during initialization of the Linux kernel and etc. @@ -26,7 +26,7 @@ Before we will look on `API` for bitmaps manipulation, we must know how to decla unsigned long my_bitmap[8] ``` -The second way is to use the `DECLARE_BITMAP` macro which is defined in the [include/linux/types.h](https://github.com/torvalds/linux/blob/master/include/linux/types.h) header file: +The second way is to use the `DECLARE_BITMAP` macro which is defined in the [include/linux/types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/types.h) header file: ```C #define DECLARE_BITMAP(name,bits) \ @@ -64,18 +64,18 @@ After we are able to declare a bit array, we can start to use it. Architecture-specific bit operations ================================================================================ -We already saw above a couple of source code and header files which provide [API](https://en.wikipedia.org/wiki/Application_programming_interface) for manipulation of bit arrays. The most important and widely used API of bit arrays is architecture-specific and located as we already know in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) header file. +We already saw above a couple of source code and header files which provide [API](https://en.wikipedia.org/wiki/Application_programming_interface) for manipulation of bit arrays. The most important and widely used API of bit arrays is architecture-specific and located as we already know in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file. First of all let's look at the two most important functions: * `set_bit`; * `clear_bit`. -I think that there is no need to explain what these function do. This is already must be clear from their name. Let's look on their implementation. If you will look into the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) header file, you will note that each of these functions represented by two variants: [atomic](https://en.wikipedia.org/wiki/Linearizability) and not. Before we will start to dive into implementations of these functions, first of all we must to know a little about `atomic` operations. +I think that there is no need to explain what these function do. This is already must be clear from their name. Let's look on their implementation. If you will look into the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file, you will note that each of these functions represented by two variants: [atomic](https://en.wikipedia.org/wiki/Linearizability) and not. Before we will start to dive into implementations of these functions, first of all we must to know a little about `atomic` operations. In simple words atomic operations guarantees that two or more operations will not be performed on the same data concurrently. The `x86` architecture provides a set of atomic instructions, for example [xchg](http://x86.renejeschke.de/html/file_module_x86_id_328.html) instruction, [cmpxchg](http://x86.renejeschke.de/html/file_module_x86_id_41.html) instruction and etc. Besides atomic instructions, some of non-atomic instructions can be made atomic with the help of the [lock](http://x86.renejeschke.de/html/file_module_x86_id_159.html) instruction. It is enough to know about atomic operations for now, so we can begin to consider implementation of `set_bit` and `clear_bit` functions. -First of all, let's start to consider `non-atomic` variants of this function. Names of non-atomic `set_bit` and `clear_bit` starts from double underscore. As we already know, all of these functions are defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) header file and the first function is `__set_bit`: +First of all, let's start to consider `non-atomic` variants of this function. Names of non-atomic `set_bit` and `clear_bit` starts from double underscore. As we already know, all of these functions are defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file and the first function is `__set_bit`: ```C static inline void __set_bit(long nr, volatile unsigned long *addr) @@ -122,13 +122,13 @@ set_bit(long nr, volatile unsigned long *addr) } ``` -First of all note that this function takes the same set of parameters that `__set_bit`, but additionally marked with the `__always_inline` attribute. The `__always_inline` is macro which defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/master/include/linux/compiler-gcc.h) and just expands to the `always_inline` attribute: +First of all note that this function takes the same set of parameters that `__set_bit`, but additionally marked with the `__always_inline` attribute. The `__always_inline` is macro which defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler-gcc.h) and just expands to the `always_inline` attribute: ```C #define __always_inline inline __attribute__((always_inline)) ``` -which means that this function will be always inlined to reduce size of the Linux kernel image. Now let's try to understand implementation of the `set_bit` function. First of all we check a given number of bit at the beginning of the `set_bit` function. The `IS_IMMEDIATE` macro defined in the same [header](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) file and expands to the call of the builtin [gcc](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) function: +which means that this function will be always inlined to reduce size of the Linux kernel image. Now let's try to understand implementation of the `set_bit` function. First of all we check a given number of bit at the beginning of the `set_bit` function. The `IS_IMMEDIATE` macro defined in the same [header](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) file and expands to the call of the builtin [gcc](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) function: ```C #define IS_IMMEDIATE(nr) (__builtin_constant_p(nr)) @@ -171,7 +171,7 @@ the `ninth` bit will be set. Note that all of these operations are marked with `LOCK_PREFIX` which is expands to the [lock](http://x86.renejeschke.de/html/file_module_x86_id_159.html) instruction which guarantees atomicity of this operation. -As we already know, besides the `set_bit` and `__set_bit` operations, the Linux kernel provides two inverse functions to clear bit in atomic and non-atomic context. They are `clear_bit` and `__clear_bit`. Both of these functions are defined in the same [header file](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) and takes the same set of arguments. But not only arguments are similar. Generally these functions are very similar on the `set_bit` and `__set_bit`. Let's look on the implementation of the non-atomic `__clear_bit` function: +As we already know, besides the `set_bit` and `__set_bit` operations, the Linux kernel provides two inverse functions to clear bit in atomic and non-atomic context. They are `clear_bit` and `__clear_bit`. Both of these functions are defined in the same [header file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) and takes the same set of arguments. But not only arguments are similar. Generally these functions are very similar on the `set_bit` and `__set_bit`. Let's look on the implementation of the non-atomic `__clear_bit` function: ```C static inline void __clear_bit(long nr, volatile unsigned long *addr) @@ -204,7 +204,7 @@ and as we can see it is very similar on `set_bit` and just contains two differen That's all. Now we can set and clear bit in any bit array and and we can go to other operations on bitmasks. -Most widely used operations on a bit arrays are set and clear bit in a bit array in the Linux kernel. But besides this operations it is useful to do additional operations on a bit array. Yet another widely used operation in the Linux kernel - is to know is a given bit set or not in a bit array. We can achieve this with the help of the `test_bit` macro. This macro is defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) header file and expands to the call of the `constant_test_bit` or `variable_test_bit` depends on bit number: +Most widely used operations on a bit arrays are set and clear bit in a bit array in the Linux kernel. But besides this operations it is useful to do additional operations on a bit array. Yet another widely used operation in the Linux kernel - is to know is a given bit set or not in a bit array. We can achieve this with the help of the `test_bit` macro. This macro is defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file and expands to the call of the `constant_test_bit` or `variable_test_bit` depends on bit number: ```C #define test_bit(nr, addr) \ @@ -290,7 +290,7 @@ For this moment we know the most important architecture-specific operations with Common bit operations ================================================================================ -Besides the architecture-specific API from the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) header file, the Linux kernel provides common API for manipulation of bit arrays. As we know from the beginning of this part, we can find it in the [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) header file and additionally in the * [lib/bitmap.c](https://github.com/torvalds/linux/blob/master/lib/bitmap.c) source code file. But before these source code files let's look into the [include/linux/bitops.h](https://github.com/torvalds/linux/blob/master/include/linux/bitops.h) header file which provides a set of useful macro. Let's look on some of they. +Besides the architecture-specific API from the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) header file, the Linux kernel provides common API for manipulation of bit arrays. As we know from the beginning of this part, we can find it in the [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) header file and additionally in the * [lib/bitmap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/bitmap.c) source code file. But before these source code files let's look into the [include/linux/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitops.h) header file which provides a set of useful macro. Let's look on some of they. First of all let's look at following four macros: @@ -310,9 +310,9 @@ All of these macros provide iterator over certain set of bits in a bit array. Th As we may see it takes three arguments and expands to the loop from first set bit which is returned as result of the `find_first_bit` function and to the last bit number while it is less than given size. -Besides these four macros, the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bitops.h) provides API for rotation of `64-bit` or `32-bit` values and etc. +Besides these four macros, the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bitops.h) provides API for rotation of `64-bit` or `32-bit` values and etc. -The next [header](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) file which provides API for manipulation with a bit arrays. For example it provides two functions: +The next [header](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) file which provides API for manipulation with a bit arrays. For example it provides two functions: * `bitmap_zero`; * `bitmap_fill`. @@ -331,7 +331,7 @@ static inline void bitmap_zero(unsigned long *dst, unsigned int nbits) } ``` -First of all we can see the check for `nbits`. The `small_const_nbits` is macro which defined in the same header [file](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) and looks: +First of all we can see the check for `nbits`. The `small_const_nbits` is macro which defined in the same header [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) and looks: ```C #define small_const_nbits(nbits) \ @@ -354,7 +354,7 @@ static inline void bitmap_fill(unsigned long *dst, unsigned int nbits) } ``` -Besides the `bitmap_fill` and `bitmap_zero` functions, the [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) header file provides `bitmap_copy` which is similar on the `bitmap_zero`, but just uses [memcpy](http://man7.org/linux/man-pages/man3/memcpy.3.html) instead of [memset](http://man7.org/linux/man-pages/man3/memset.3.html). Also it provides bitwise operations for bit array like `bitmap_and`, `bitmap_or`, `bitamp_xor` and etc. We will not consider implementation of these functions because it is easy to understand implementations of these functions if you understood all from this part. Anyway if you are interested how did these function implemented, you may open [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/master/include/linux/bitmap.h) header file and start to research. +Besides the `bitmap_fill` and `bitmap_zero` functions, the [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) header file provides `bitmap_copy` which is similar on the `bitmap_zero`, but just uses [memcpy](http://man7.org/linux/man-pages/man3/memcpy.3.html) instead of [memset](http://man7.org/linux/man-pages/man3/memset.3.html). Also it provides bitwise operations for bit array like `bitmap_and`, `bitmap_or`, `bitamp_xor` and etc. We will not consider implementation of these functions because it is easy to understand implementations of these functions if you understood all from this part. Anyway if you are interested how did these function implemented, you may open [include/linux/bitmap.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/bitmap.h) header file and start to research. That's all. diff --git a/DataStructures/dlist.md b/DataStructures/dlist.md index 4dbd735..cebb44a 100644 --- a/DataStructures/dlist.md +++ b/DataStructures/dlist.md @@ -4,9 +4,9 @@ Data Structures in the Linux Kernel Doubly linked list -------------------------------------------------------------------------------- -Linux kernel provides its own implementation of doubly linked list, which you can find in the [include/linux/list.h](https://github.com/torvalds/linux/blob/master/include/linux/list.h). We will start `Data Structures in the Linux kernel` from the doubly linked list data structure. Why? Because it is very popular in the kernel, just try to [search](http://lxr.free-electrons.com/ident?i=list_head) +Linux kernel provides its own implementation of doubly linked list, which you can find in the [include/linux/list.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/list.h). We will start `Data Structures in the Linux kernel` from the doubly linked list data structure. Why? Because it is very popular in the kernel, just try to [search](http://lxr.free-electrons.com/ident?i=list_head) -First of all, let's look on the main structure in the [include/linux/types.h](https://github.com/torvalds/linux/blob/master/include/linux/types.h): +First of all, let's look on the main structure in the [include/linux/types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/types.h): ```C struct list_head { @@ -35,7 +35,7 @@ struct nmi_desc { }; ``` -Let's look at some examples to understand how `list_head` is used in the kernel. As I already wrote about, there are many, really many different places where lists are used in the kernel. Let's look for an example in miscellaneous character drivers. Misc character drivers API from the [drivers/char/misc.c](https://github.com/torvalds/linux/blob/master/drivers/char/misc.c) is used for writing small drivers for handling simple hardware or virtual devices. Those drivers share same major number: +Let's look at some examples to understand how `list_head` is used in the kernel. As I already wrote about, there are many, really many different places where lists are used in the kernel. Let's look for an example in miscellaneous character drivers. Misc character drivers API from the [drivers/char/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/char/misc.c) is used for writing small drivers for handling simple hardware or virtual devices. Those drivers share same major number: ```C #define MISC_MAJOR 10 diff --git a/DataStructures/radix-tree.md b/DataStructures/radix-tree.md index 57d9a29..149eb46 100644 --- a/DataStructures/radix-tree.md +++ b/DataStructures/radix-tree.md @@ -6,8 +6,8 @@ Radix tree As you already know linux kernel provides many different libraries and functions which implement different data structures and algorithms. In this part we will consider one of these data structures - [Radix tree](http://en.wikipedia.org/wiki/Radix_tree). There are two files which are related to `radix tree` implementation and API in the linux kernel: -* [include/linux/radix-tree.h](https://github.com/torvalds/linux/blob/master/include/linux/radix-tree.h) -* [lib/radix-tree.c](https://github.com/torvalds/linux/blob/master/lib/radix-tree.c) +* [include/linux/radix-tree.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/radix-tree.h) +* [lib/radix-tree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/radix-tree.c) Lets talk about what a `radix tree` is. Radix tree is a `compressed trie` where a [trie](http://en.wikipedia.org/wiki/Trie) is a data structure which implements an interface of an associative array and allows to store values as `key-value`. The keys are usually strings, but any data type can be used. A trie is different from an `n-tree` because of its nodes. Nodes of a trie do not store keys; instead, a node of a trie stores single character labels. The key which is related to a given node is derived by traversing from the root of the tree to this node. For example: @@ -43,7 +43,7 @@ Lets talk about what a `radix tree` is. Radix tree is a `compressed trie` where So in this example, we can see the `trie` with keys, `go` and `cat`. The compressed trie or `radix tree` differs from `trie` in that all intermediates nodes which have only one child are removed. -Radix tree in linux kernel is the data structure which maps values to integer keys. It is represented by the following structures from the file [include/linux/radix-tree.h](https://github.com/torvalds/linux/blob/master/include/linux/radix-tree.h): +Radix tree in linux kernel is the data structure which maps values to integer keys. It is represented by the following structures from the file [include/linux/radix-tree.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/radix-tree.h): ```C struct radix_tree_root { diff --git a/Initialization/linux-initialization-1.md b/Initialization/linux-initialization-1.md index e2309c1..b0fecd5 100644 --- a/Initialization/linux-initialization-1.md +++ b/Initialization/linux-initialization-1.md @@ -4,20 +4,20 @@ Kernel initialization. Part 1. First steps in the kernel code -------------------------------------------------------------------------------- -The previous [post](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) was a last part of the Linux kernel [booting process](https://0xax.gitbooks.io/linux-insides/content/Booting/index.html) chapter and now we are starting to dive into initialization process of the Linux kernel. After the image of the Linux kernel is decompressed and placed in a correct place in memory, it starts to work. All previous parts describe the work of the Linux kernel setup code which does preparation before the first bytes of the Linux kernel code will be executed. From now we are in the kernel and all parts of this chapter will be devoted to the initialization process of the kernel before it will launch process with [pid](https://en.wikipedia.org/wiki/Process_identifier) `1`. There are many things to do before the kernel will start first `init` process. Hope we will see all of the preparations before kernel will start in this big chapter. We will start from the kernel entry point, which is located in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) and will move further and further. We will see first preparations like early page tables initialization, switch to a new descriptor in kernel space and many many more, before we will see the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c#L489) will be called. +The previous [post](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) was a last part of the Linux kernel [booting process](https://0xax.gitbooks.io/linux-insides/content/Booting/index.html) chapter and now we are starting to dive into initialization process of the Linux kernel. After the image of the Linux kernel is decompressed and placed in a correct place in memory, it starts to work. All previous parts describe the work of the Linux kernel setup code which does preparation before the first bytes of the Linux kernel code will be executed. From now we are in the kernel and all parts of this chapter will be devoted to the initialization process of the kernel before it will launch process with [pid](https://en.wikipedia.org/wiki/Process_identifier) `1`. There are many things to do before the kernel will start first `init` process. Hope we will see all of the preparations before kernel will start in this big chapter. We will start from the kernel entry point, which is located in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) and will move further and further. We will see first preparations like early page tables initialization, switch to a new descriptor in kernel space and many many more, before we will see the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L489) will be called. -In the last [part](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) of the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Booting/index.html) we stopped at the [jmp](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) instruction from the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly source code file: +In the last [part](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) of the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Booting/index.html) we stopped at the [jmp](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) instruction from the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file: ```assembly jmp *%rax ``` -At this moment the `rax` register contains address of the Linux kernel entry point which that was obtained as a result of the call of the `decompress_kernel` function from the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c) source code file. So, our last instruction in the kernel setup code is a jump on the kernel entry point. We already know where is defined the entry point of the linux kernel, so we are able to start to learn what does the Linux kernel does after the start. +At this moment the `rax` register contains address of the Linux kernel entry point which that was obtained as a result of the call of the `decompress_kernel` function from the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) source code file. So, our last instruction in the kernel setup code is a jump on the kernel entry point. We already know where is defined the entry point of the linux kernel, so we are able to start to learn what does the Linux kernel does after the start. First steps in the kernel -------------------------------------------------------------------------------- -Okay, we got the address of the decompressed kernel image from the `decompress_kernel` function into `rax` register and just jumped there. As we already know the entry point of the decompressed kernel image starts in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) assembly source code file and at the beginning of it, we can see following definitions: +Okay, we got the address of the decompressed kernel image from the `decompress_kernel` function into `rax` register and just jumped there. As we already know the entry point of the decompressed kernel image starts in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) assembly source code file and at the beginning of it, we can see following definitions: ```assembly .text @@ -36,7 +36,7 @@ We can see definition of the `startup_64` routine that is defined in the `__HEAD #define __HEAD .section ".head.text","ax" ``` -We can see definition of this section in the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vmlinux.lds.S#L93) linker script: +We can see definition of this section in the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vmlinux.lds.S#L93) linker script: ``` .text : AT(ADDR(.text) - LOAD_OFFSET) { @@ -53,7 +53,7 @@ Besides the definition of the `.text` section, we can understand default virtual . = __START_KERNEL; ``` -for the [x86_64](https://en.wikipedia.org/wiki/X86-64). The definition of the `__START_KERNEL` macro is located in the [arch/x86/include/asm/page_types.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/page_types.h) header file and represented by the sum of the base virtual address of the kernel mapping and physical start: +for the [x86_64](https://en.wikipedia.org/wiki/X86-64). The definition of the `__START_KERNEL` macro is located in the [arch/x86/include/asm/page_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/page_types.h) header file and represented by the sum of the base virtual address of the kernel mapping and physical start: ```C #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) @@ -354,14 +354,14 @@ pushq $0 popfq ``` -The most interesting thing here is the `initial_stack`. This symbol is defined in the [source](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) code file and looks like: +The most interesting thing here is the `initial_stack`. This symbol is defined in the [source](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) code file and looks like: ```assembly GLOBAL(initial_stack) .quad init_thread_union+THREAD_SIZE-8 ``` -The `GLOBAL` is already familiar to us from. It defined in the [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/linkage.h) header file expands to the `global` symbol definition: +The `GLOBAL` is already familiar to us from. It defined in the [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/linkage.h) header file expands to the `global` symbol definition: ```C #define GLOBAL(name) \ @@ -369,7 +369,7 @@ The `GLOBAL` is already familiar to us from. It defined in the [arch/x86/include name: ``` -The `THREAD_SIZE` macro is defined in the [arch/x86/include/asm/page_64_types.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/page_64_types.h) header file and depends on value of the `KASAN_STACK_ORDER` macro: +The `THREAD_SIZE` macro is defined in the [arch/x86/include/asm/page_64_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/page_64_types.h) header file and depends on value of the `KASAN_STACK_ORDER` macro: ```C #define THREAD_SIZE_ORDER (2 + KASAN_STACK_ORDER) @@ -451,7 +451,7 @@ struct gdt_page { } __attribute__((aligned(PAGE_SIZE))); ``` -in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h). It contains one field `gdt` which is array of the `desc_struct` structure which is defined as: +in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h). It contains one field `gdt` which is array of the `desc_struct` structure which is defined as: ```C struct desc_struct { @@ -470,13 +470,13 @@ struct desc_struct { } __attribute__((packed)); ``` -and presents familiar to us `GDT` descriptor. Also we can note that `gdt_page` structure aligned to `PAGE_SIZE` which is `4096` bytes. It means that `gdt` will occupy one page. Now let's try to understand what is `INIT_PER_CPU_VAR`. `INIT_PER_CPU_VAR` is a macro which defined in the [arch/x86/include/asm/percpu.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/percpu.h) and just concats `init_per_cpu__` with the given parameter: +and presents familiar to us `GDT` descriptor. Also we can note that `gdt_page` structure aligned to `PAGE_SIZE` which is `4096` bytes. It means that `gdt` will occupy one page. Now let's try to understand what is `INIT_PER_CPU_VAR`. `INIT_PER_CPU_VAR` is a macro which defined in the [arch/x86/include/asm/percpu.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/percpu.h) and just concats `init_per_cpu__` with the given parameter: ```C #define INIT_PER_CPU_VAR(var) init_per_cpu__##var ``` -After the `INIT_PER_CPU_VAR` macro will be expanded, we will have `init_per_cpu__gdt_page`. We can see in the [linker script](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vmlinux.lds.S): +After the `INIT_PER_CPU_VAR` macro will be expanded, we will have `init_per_cpu__gdt_page`. We can see in the [linker script](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vmlinux.lds.S): ``` #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load @@ -535,7 +535,7 @@ Here we put the address of the `initial_code` to the `rax` and push fake address ... ``` -As we can see `initial_code` contains address of the `x86_64_start_kernel`, which is defined in the [arch/x86/kerne/head64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head64.c) and looks like this: +As we can see `initial_code` contains address of the `x86_64_start_kernel`, which is defined in the [arch/x86/kerne/head64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head64.c) and looks like this: ```C asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) { @@ -552,7 +552,7 @@ This is first C code in the kernel! Next to start_kernel -------------------------------------------------------------------------------- -We need to see last preparations before we can see "kernel entry point" - start_kernel function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c#L489). +We need to see last preparations before we can see "kernel entry point" - start_kernel function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L489). First of all we can see some checks in the `x86_64_start_kernel` function: diff --git a/Initialization/linux-initialization-10.md b/Initialization/linux-initialization-10.md index 0f82498..cca93c1 100644 --- a/Initialization/linux-initialization-10.md +++ b/Initialization/linux-initialization-10.md @@ -6,7 +6,7 @@ End of the linux kernel initialization process This is tenth part of the chapter about linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) and in the [previous part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-9.html) we saw the initialization of the [RCU](http://en.wikipedia.org/wiki/Read-copy-update) and stopped on the call of the `acpi_early_init` function. This part will be the last part of the [Kernel initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) chapter, so let's finish it. -After the call of the `acpi_early_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c), we can see the following code: +After the call of the `acpi_early_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c), we can see the following code: ```C #ifdef CONFIG_X86_ESPFIX64 @@ -14,7 +14,7 @@ After the call of the `acpi_early_init` function from the [init/main.c](https:// #endif ``` -Here we can see the call of the `init_espfix_bsp` function which depends on the `CONFIG_X86_ESPFIX64` kernel configuration option. As we can understand from the function name, it does something with the stack. This function is defined in the [arch/x86/kernel/espfix_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/espfix_64.c) and prevents leaking of `31:16` bits of the `esp` register during returning to 16-bit stack. First of all we install `espfix` page upper directory into the kernel page directory in the `init_espfix_bs`: +Here we can see the call of the `init_espfix_bsp` function which depends on the `CONFIG_X86_ESPFIX64` kernel configuration option. As we can understand from the function name, it does something with the stack. This function is defined in the [arch/x86/kernel/espfix_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/espfix_64.c) and prevents leaking of `31:16` bits of the `esp` register during returning to 16-bit stack. First of all we install `espfix` page upper directory into the kernel page directory in the `init_espfix_bs`: ```C pgd_p = &init_level4_pgt[pgd_index(ESPFIX_BASE_ADDR)]; @@ -29,7 +29,7 @@ Where `ESPFIX_BASE_ADDR` is: #define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << PGDIR_SHIFT) ``` -Also we can find it in the [Documentation/x86/x86_64/mm](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt): +Also we can find it in the [Documentation/x86/x86_64/mm](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt): ``` ... unused hole ... @@ -37,7 +37,7 @@ ffffff0000000000 - ffffff7fffffffff (=39 bits) %esp fixup stacks ... unused hole ... ``` -After we've filled page global directory with the `espfix` pud, the next step is call of the `init_espfix_random` and `init_espfix_ap` functions. The first function returns random locations for the `espfix` page and the second enables the `espfix` for the current CPU. After the `init_espfix_bsp` finished the work, we can see the call of the `thread_info_cache_init` function which defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c) and allocates cache for the `thread_info` if `THREAD_SIZE` is less than `PAGE_SIZE`: +After we've filled page global directory with the `espfix` pud, the next step is call of the `init_espfix_random` and `init_espfix_ap` functions. The first function returns random locations for the `espfix` page and the second enables the `espfix` for the current CPU. After the `init_espfix_bsp` finished the work, we can see the call of the `thread_info_cache_init` function which defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c) and allocates cache for the `thread_info` if `THREAD_SIZE` is less than `PAGE_SIZE`: ```C # if THREAD_SIZE >= PAGE_SIZE @@ -56,7 +56,7 @@ void thread_info_cache_init(void) #endif ``` -As we already know the `PAGE_SIZE` is `(_AC(1,UL) << PAGE_SHIFT)` or `4096` bytes and `THREAD_SIZE` is `(PAGE_SIZE << THREAD_SIZE_ORDER)` or `16384` bytes for the `x86_64`. The next function after the `thread_info_cache_init` is the `cred_init` from the [kernel/cred.c](https://github.com/torvalds/linux/blob/master/kernel/cred.c). This function just allocates cache for the credentials (like `uid`, `gid`, etc.): +As we already know the `PAGE_SIZE` is `(_AC(1,UL) << PAGE_SHIFT)` or `4096` bytes and `THREAD_SIZE` is `(PAGE_SIZE << THREAD_SIZE_ORDER)` or `16384` bytes for the `x86_64`. The next function after the `thread_info_cache_init` is the `cred_init` from the [kernel/cred.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cred.c). This function just allocates cache for the credentials (like `uid`, `gid`, etc.): ```C void __init cred_init(void) @@ -66,7 +66,7 @@ void __init cred_init(void) } ``` -more about credentials you can read in the [Documentation/security/credentials.txt](https://github.com/torvalds/linux/blob/master/Documentation/security/credentials.txt). Next step is the `fork_init` function from the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c). The `fork_init` function allocates cache for the `task_struct`. Let's look on the implementation of the `fork_init`. First of all we can see definitions of the `ARCH_MIN_TASKALIGN` macro and creation of a slab where task_structs will be allocated: +more about credentials you can read in the [Documentation/security/credentials.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/security/credentials.txt). Next step is the `fork_init` function from the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c). The `fork_init` function allocates cache for the `task_struct`. Let's look on the implementation of the `fork_init`. First of all we can see definitions of the `ARCH_MIN_TASKALIGN` macro and creation of a slab where task_structs will be allocated: ```C #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR @@ -128,7 +128,7 @@ struct rlimit { }; ``` -structure from the [include/uapi/linux/resource.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/resource.h). In our case the resource is the `RLIMIT_NPROC` which is the maximum number of processes that user can own and `RLIMIT_SIGPENDING` - the maximum number of pending signals. We can see it in the: +structure from the [include/uapi/linux/resource.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/resource.h). In our case the resource is the `RLIMIT_NPROC` which is the maximum number of processes that user can own and `RLIMIT_SIGPENDING` - the maximum number of pending signals. We can see it in the: ```C cat /proc/self/limits @@ -146,7 +146,7 @@ Max pending signals 63815 63815 signals Initialization of the caches -------------------------------------------------------------------------------- -The next function after the `fork_init` is the `proc_caches_init` from the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c). This function allocates caches for the memory descriptors (or `mm_struct` structure). At the beginning of the `proc_caches_init` we can see allocation of the different [SLAB](http://en.wikipedia.org/wiki/Slab_allocation) caches with the call of the `kmem_cache_create`: +The next function after the `fork_init` is the `proc_caches_init` from the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c). This function allocates caches for the memory descriptors (or `mm_struct` structure). At the beginning of the `proc_caches_init` we can see allocation of the different [SLAB](http://en.wikipedia.org/wiki/Slab_allocation) caches with the call of the `kmem_cache_create`: * `sighand_cachep` - manage information about installed signal handlers; * `signal_cachep` - manage information about process signal descriptor; @@ -168,7 +168,7 @@ After this we allocate `SLAB` cache for the important `vm_area_struct` which use vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC); ``` -Note, that we use `KMEM_CACHE` macro here instead of the `kmem_cache_create`. This macro is defined in the [include/linux/slab.h](https://github.com/torvalds/linux/blob/master/include/linux/slab.h) and just expands to the `kmem_cache_create` call: +Note, that we use `KMEM_CACHE` macro here instead of the `kmem_cache_create`. This macro is defined in the [include/linux/slab.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/slab.h) and just expands to the `kmem_cache_create` call: ```C #define KMEM_CACHE(__struct, __flags) kmem_cache_create(#__struct,\ @@ -178,19 +178,19 @@ Note, that we use `KMEM_CACHE` macro here instead of the `kmem_cache_create`. Th The `KMEM_CACHE` has one difference from `kmem_cache_create`. Take a look on `__alignof__` operator. The `KMEM_CACHE` macro aligns `SLAB` to the size of the given structure, but `kmem_cache_create` uses given value to align space. After this we can see the call of the `mmap_init` and `nsproxy_cache_init` functions. The first function initializes virtual memory area `SLAB` and the second function initializes `SLAB` for namespaces. -The next function after the `proc_caches_init` is `buffer_init`. This function is defined in the [fs/buffer.c](https://github.com/torvalds/linux/blob/master/fs/buffer.c) source code file and allocate cache for the `buffer_head`. The `buffer_head` is a special structure which defined in the [include/linux/buffer_head.h](https://github.com/torvalds/linux/blob/master/include/linux/buffer_head.h) and used for managing buffers. In the start of the `buffer_init` function we allocate cache for the `struct buffer_head` structures with the call of the `kmem_cache_create` function as we did in the previous functions. And calculate the maximum size of the buffers in memory with: +The next function after the `proc_caches_init` is `buffer_init`. This function is defined in the [fs/buffer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/buffer.c) source code file and allocate cache for the `buffer_head`. The `buffer_head` is a special structure which defined in the [include/linux/buffer_head.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/buffer_head.h) and used for managing buffers. In the start of the `buffer_init` function we allocate cache for the `struct buffer_head` structures with the call of the `kmem_cache_create` function as we did in the previous functions. And calculate the maximum size of the buffers in memory with: ```C nrpages = (nr_free_buffer_pages() * 10) / 100; max_buffer_heads = nrpages * (PAGE_SIZE / sizeof(struct buffer_head)); ``` -which will be equal to the `10%` of the `ZONE_NORMAL` (all RAM from the 4GB on the `x86_64`). The next function after the `buffer_init` is - `vfs_caches_init`. This function allocates `SLAB` caches and hashtable for different [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) caches. We already saw the `vfs_caches_init_early` function in the eighth part of the linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-8.html) which initialized caches for `dcache` (or directory-cache) and [inode](http://en.wikipedia.org/wiki/Inode) cache. The `vfs_caches_init` function makes post-early initialization of the `dcache` and `inode` caches, private data cache, hash tables for the mount points, etc. More details about [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) will be described in the separate part. After this we can see `signals_init` function. This function is defined in the [kernel/signal.c](https://github.com/torvalds/linux/blob/master/kernel/signal.c) and allocates a cache for the `sigqueue` structures which represents queue of the real time signals. The next function is `page_writeback_init`. This function initializes the ratio for the dirty pages. Every low-level page entry contains the `dirty` bit which indicates whether a page has been written to after been loaded into memory. +which will be equal to the `10%` of the `ZONE_NORMAL` (all RAM from the 4GB on the `x86_64`). The next function after the `buffer_init` is - `vfs_caches_init`. This function allocates `SLAB` caches and hashtable for different [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) caches. We already saw the `vfs_caches_init_early` function in the eighth part of the linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-8.html) which initialized caches for `dcache` (or directory-cache) and [inode](http://en.wikipedia.org/wiki/Inode) cache. The `vfs_caches_init` function makes post-early initialization of the `dcache` and `inode` caches, private data cache, hash tables for the mount points, etc. More details about [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) will be described in the separate part. After this we can see `signals_init` function. This function is defined in the [kernel/signal.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/signal.c) and allocates a cache for the `sigqueue` structures which represents queue of the real time signals. The next function is `page_writeback_init`. This function initializes the ratio for the dirty pages. Every low-level page entry contains the `dirty` bit which indicates whether a page has been written to after been loaded into memory. Creation of the root for the procfs -------------------------------------------------------------------------------- -After all of this preparations we need to create the root for the [proc](http://en.wikipedia.org/wiki/Procfs) filesystem. We will do it with the call of the `proc_root_init` function from the [fs/proc/root.c](https://github.com/torvalds/linux/blob/master/fs/proc/root.c). At the start of the `proc_root_init` function we allocate the cache for the inodes and register a new filesystem in the system with the: +After all of this preparations we need to create the root for the [proc](http://en.wikipedia.org/wiki/Procfs) filesystem. We will do it with the call of the `proc_root_init` function from the [fs/proc/root.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/proc/root.c). At the start of the `proc_root_init` function we allocate the cache for the inodes and register a new filesystem in the system with the: ```C err = register_filesystem(&proc_fs_type); @@ -198,7 +198,7 @@ err = register_filesystem(&proc_fs_type); return; ``` -As I wrote above we will not dive into details about [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) and different filesystems in this chapter, but will see it in the chapter about the `VFS`. After we've registered a new filesystem in our system, we call the `proc_self_init` function from the [fs/proc/self.c](https://github.com/torvalds/linux/blob/master/fs/proc/self.c) and this function allocates `inode` number for the `self` (`/proc/self` directory refers to the process accessing the `/proc` filesystem). The next step after the `proc_self_init` is `proc_setup_thread_self` which setups the `/proc/thread-self` directory which contains information about current thread. After this we create `/proc/self/mounts` symlink which will contains mount points with the call of the +As I wrote above we will not dive into details about [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) and different filesystems in this chapter, but will see it in the chapter about the `VFS`. After we've registered a new filesystem in our system, we call the `proc_self_init` function from the [fs/proc/self.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/proc/self.c) and this function allocates `inode` number for the `self` (`/proc/self` directory refers to the process accessing the `/proc` filesystem). The next step after the `proc_self_init` is `proc_setup_thread_self` which setups the `/proc/thread-self` directory which contains information about current thread. After this we create `/proc/self/mounts` symlink which will contains mount points with the call of the ```C proc_symlink("mounts", NULL, "self/mounts"); @@ -237,7 +237,7 @@ That's all. Finally we have passed through the long-long `start_kernel` function First steps after the start_kernel -------------------------------------------------------------------------------- -The `rest_init` function is defined in the same source code file as `start_kernel` function, and this file is [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). In the beginning of the `rest_init` we can see call of the two following functions: +The `rest_init` function is defined in the same source code file as `start_kernel` function, and this file is [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). In the beginning of the `rest_init` we can see call of the two following functions: ```C rcu_scheduler_starting(); @@ -251,7 +251,7 @@ kernel_thread(kernel_init, NULL, CLONE_FS); pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); ``` -Here the `kernel_thread` function (defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c)) creates new kernel thread.As we can see the `kernel_thread` function takes three arguments: +Here the `kernel_thread` function (defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c)) creates new kernel thread.As we can see the `kernel_thread` function takes three arguments: * Function which will be executed in a new thread; * Parameter for the `kernel_init` function; @@ -291,7 +291,7 @@ where `DECLARE_COMPLETION` macro defined as: struct completion work = COMPLETION_INITIALIZER(work) ``` -and expands to the definition of the `completion` structure. This structure is defined in the [include/linux/completion.h](https://github.com/torvalds/linux/blob/master/include/linux/completion.h) and presents `completions` concept. Completions is a code synchronization mechanism which provides race-free solution for the threads that must wait for some process to have reached a point or a specific state. Using completions consists of three parts: The first is definition of the `complete` structure and we did it with the `DECLARE_COMPLETION`. The second is call of the `wait_for_completion`. After the call of this function, a thread which called it will not continue to execute and will wait while other thread did not call `complete` function. Note that we call `wait_for_completion` with the `kthreadd_done` in the beginning of the `kernel_init_freeable`: +and expands to the definition of the `completion` structure. This structure is defined in the [include/linux/completion.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/completion.h) and presents `completions` concept. Completions is a code synchronization mechanism which provides race-free solution for the threads that must wait for some process to have reached a point or a specific state. Using completions consists of three parts: The first is definition of the `complete` structure and we did it with the `DECLARE_COMPLETION`. The second is call of the `wait_for_completion`. After the call of this function, a thread which called it will not continue to execute and will wait while other thread did not call `complete` function. Note that we call `wait_for_completion` with the `kthreadd_done` in the beginning of the `kernel_init_freeable`: ```C wait_for_completion(&kthreadd_done); @@ -305,7 +305,7 @@ And the last step is to call `complete` function as we saw it above. After this cpu_startup_entry(CPUHP_ONLINE); ``` -The first `init_idle_bootup_task` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/master/kernel/sched/core.c) sets the Scheduling class for the current process (`idle` class in our case): +The first `init_idle_bootup_task` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/core.c) sets the Scheduling class for the current process (`idle` class in our case): ```C void init_idle_bootup_task(struct task_struct *idle) @@ -314,7 +314,7 @@ void init_idle_bootup_task(struct task_struct *idle) } ``` -where `idle` class is a low task priority and tasks can be run only when the processor doesn't have anything to run besides this tasks. The second function `schedule_preempt_disabled` disables preempt in `idle` tasks. And the third function `cpu_startup_entry` is defined in the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/master/sched/idle.c) and calls `cpu_idle_loop` from the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/master/sched/idle.c). The `cpu_idle_loop` function works as process with `PID = 0` and works in the background. Main purpose of the `cpu_idle_loop` is to consume the idle CPU cycles. When there is no process to run, this process starts to work. We have one process with `idle` scheduling class (we just set the `current` task to the `idle` with the call of the `init_idle_bootup_task` function), so the `idle` thread does not do useful work but just checks if there is an active task to switch to: +where `idle` class is a low task priority and tasks can be run only when the processor doesn't have anything to run besides this tasks. The second function `schedule_preempt_disabled` disables preempt in `idle` tasks. And the third function `cpu_startup_entry` is defined in the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/sched/idle.c) and calls `cpu_idle_loop` from the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/sched/idle.c). The `cpu_idle_loop` function works as process with `PID = 0` and works in the background. Main purpose of the `cpu_idle_loop` is to consume the idle CPU cycles. When there is no process to run, this process starts to work. We have one process with `idle` scheduling class (we just set the `current` task to the `idle` with the call of the `init_idle_bootup_task` function), so the `idle` thread does not do useful work but just checks if there is an active task to switch to: ```C static void cpu_idle_loop(void) @@ -364,7 +364,7 @@ if (!ramdisk_execute_command) ramdisk_execute_command = "/init"; ``` -Check user's permissions for the `ramdisk` and call the `prepare_namespace` function from the [init/do_mounts.c](https://github.com/torvalds/linux/blob/master/init/do_mounts.c) which checks and mounts the [initrd](http://en.wikipedia.org/wiki/Initrd): +Check user's permissions for the `ramdisk` and call the `prepare_namespace` function from the [init/do_mounts.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/do_mounts.c) which checks and mounts the [initrd](http://en.wikipedia.org/wiki/Initrd): ```C if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { @@ -406,7 +406,7 @@ return do_execve(getname_kernel(init_filename), (const char __user *const __user *)envp_init); ``` -The `do_execve` function is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/master/include/linux/sched.h) and runs program with the given file name and arguments. If we did not pass `rdinit=` option to the kernel command line, kernel starts to check the `execute_command` which is equal to value of the `init=` kernel command line parameter: +The `do_execve` function is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/sched.h) and runs program with the given file name and arguments. If we did not pass `rdinit=` option to the kernel command line, kernel starts to check the `execute_command` which is equal to value of the `init=` kernel command line parameter: ```C if (execute_command) { @@ -452,8 +452,8 @@ Links * [SLAB](http://en.wikipedia.org/wiki/Slab_allocation) * [xsave](http://www.felixcloutier.com/x86/XSAVES.html) * [FPU](http://en.wikipedia.org/wiki/Floating-point_unit) -* [Documentation/security/credentials.txt](https://github.com/torvalds/linux/blob/master/Documentation/security/credentials.txt) -* [Documentation/x86/x86_64/mm](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt) +* [Documentation/security/credentials.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/security/credentials.txt) +* [Documentation/x86/x86_64/mm](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt) * [RCU](http://en.wikipedia.org/wiki/Read-copy-update) * [VFS](http://en.wikipedia.org/wiki/Virtual_file_system) * [inode](http://en.wikipedia.org/wiki/Inode) diff --git a/Initialization/linux-initialization-2.md b/Initialization/linux-initialization-2.md index 7a8dab9..318fe66 100644 --- a/Initialization/linux-initialization-2.md +++ b/Initialization/linux-initialization-2.md @@ -15,7 +15,7 @@ for (i = 0; i < NUM_EXCEPTION_VECTORS; i++) set_intr_gate(i, early_idt_handler_array[i]); ``` -from the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head64.c) source code file. But before we started to sort out this code, we need to know about interrupts and handlers. +from the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head64.c) source code file. But before we started to sort out this code, we need to know about interrupts and handlers. Some theory -------------------------------------------------------------------------------- @@ -154,7 +154,7 @@ Here we call `set_intr_gate` in the loop, which takes two parameters: * Number of an interrupt or `vector number`; * Address of the idt handler. -and inserts an interrupt gate to the `IDT` table which is represented by the `&idt_descr` array. First of all let's look on the `early_idt_handler_array` array. It is an array which is defined in the [arch/x86/include/asm/segment.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/segment.h) header file contains addresses of the first `32` exception handlers: +and inserts an interrupt gate to the `IDT` table which is represented by the `&idt_descr` array. First of all let's look on the `early_idt_handler_array` array. It is an array which is defined in the [arch/x86/include/asm/segment.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/segment.h) header file contains addresses of the first `32` exception handlers: ```C #define EARLY_IDT_HANDLER_SIZE 9 @@ -165,9 +165,9 @@ extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS][EARLY_IDT_HANDL The `early_idt_handler_array` is `288` bytes array which contains address of exception entry points every nine bytes. Every nine bytes of this array consist of two bytes optional instruction for pushing dummy error code if an exception does not provide it, two bytes instruction for pushing vector number to the stack and five bytes of `jump` to the common exception handler code. -As we can see, We're filling only first 32 `IDT` entries in the loop, because all of the early setup runs with interrupts disabled, so there is no need to set up interrupt handlers for vectors greater than `32`. The `early_idt_handler_array` array contains generic idt handlers and we can find its definition in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) assembly file. For now we will skip it, but will look it soon. Before this we will look on the implementation of the `set_intr_gate` macro. +As we can see, We're filling only first 32 `IDT` entries in the loop, because all of the early setup runs with interrupts disabled, so there is no need to set up interrupt handlers for vectors greater than `32`. The `early_idt_handler_array` array contains generic idt handlers and we can find its definition in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) assembly file. For now we will skip it, but will look it soon. Before this we will look on the implementation of the `set_intr_gate` macro. -The `set_intr_gate` macro is defined in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h) header file and looks: +The `set_intr_gate` macro is defined in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h) header file and looks: ```C #define set_intr_gate(n, addr) \ @@ -256,7 +256,7 @@ Okay, now we have filled and loaded `Interrupt Descriptor Table`, we know how th Early interrupts handlers -------------------------------------------------------------------------------- -As you can read above, we filled `IDT` with the address of the `early_idt_handler_array`. We can find it in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) assembly file: +As you can read above, we filled `IDT` with the address of the `early_idt_handler_array`. We can find it in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) assembly file: ```assembly .globl early_idt_handler_array @@ -305,7 +305,7 @@ As i wrote above, CPU pushes flag register, `CS` and `RIP` on the stack. So befo |--------------------| ``` -Now let's look on the `early_idt_handler_common` implementation. It locates in the same [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S#L343) assembly file and first of all we can see check for [NMI](http://en.wikipedia.org/wiki/Non-maskable_interrupt). We don't need to handle it, so just ignore it in the `early_idt_handler_common`: +Now let's look on the `early_idt_handler_common` implementation. It locates in the same [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S#L343) assembly file and first of all we can see check for [NMI](http://en.wikipedia.org/wiki/Non-maskable_interrupt). We don't need to handle it, so just ignore it in the `early_idt_handler_common`: ```assembly cmpl $2,(%rsp) @@ -377,7 +377,7 @@ Page fault handling In the previous paragraph we saw first early interrupt handler which checks interrupt number for page fault and calls `early_make_pgtable` for building new page tables if it is. We need to have `#PF` handler in this step because there are plans to add ability to load kernel above `4G` and make access to `boot_params` structure above the 4G. -You can find implementation of the `early_make_pgtable` in the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head64.c) and takes one parameter - address from the `cr2` register, which caused Page Fault. Let's look on it: +You can find implementation of the `early_make_pgtable` in the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head64.c) and takes one parameter - address from the `cr2` register, which caused Page Fault. Let's look on it: ```C int __init early_make_pgtable(unsigned long address) @@ -399,7 +399,7 @@ It starts from the definition of some variables which have `*val_t` types. All o typedef unsigned long pgdval_t; ``` -Also we will operate with the `*_t` (not val) types, for example `pgd_t` and etc... All of these types defined in the [arch/x86/include/asm/pgtable_types.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/pgtable_types.h) and represent structures like this: +Also we will operate with the `*_t` (not val) types, for example `pgd_t` and etc... All of these types defined in the [arch/x86/include/asm/pgtable_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/pgtable_types.h) and represent structures like this: ```C typedef struct { pgdval_t pgd; } pgd_t; diff --git a/Initialization/linux-initialization-3.md b/Initialization/linux-initialization-3.md index 6a768cb..520c718 100644 --- a/Initialization/linux-initialization-3.md +++ b/Initialization/linux-initialization-3.md @@ -4,7 +4,7 @@ Kernel initialization. Part 3. Last preparations before the kernel entry point -------------------------------------------------------------------------------- -This is the third part of the Linux kernel initialization process series. In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Initialization/linux-initialization-2.md) we saw early interrupt and exception handling and will continue to dive into the linux kernel initialization process in the current part. Our next point is 'kernel entry point' - `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file. Yes, technically it is not kernel's entry point but the start of the generic kernel code which does not depend on certain architecture. But before we call the `start_kernel` function, we must do some preparations. So let's continue. +This is the third part of the Linux kernel initialization process series. In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Initialization/linux-initialization-2.md) we saw early interrupt and exception handling and will continue to dive into the linux kernel initialization process in the current part. Our next point is 'kernel entry point' - `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file. Yes, technically it is not kernel's entry point but the start of the generic kernel code which does not depend on certain architecture. But before we call the `start_kernel` function, we must do some preparations. So let's continue. boot_params again -------------------------------------------------------------------------------- @@ -15,7 +15,7 @@ In the previous part we stopped at setting Interrupt Descriptor Table and loadin copy_bootdata(__va(real_mode_data)); ``` -This function takes one argument - virtual address of the `real_mode_data`. Remember that we passed the address of the `boot_params` structure from [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/bootparam.h#L114) to the `x86_64_start_kernel` function as first argument in [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S): +This function takes one argument - virtual address of the `real_mode_data`. Remember that we passed the address of the `boot_params` structure from [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L114) to the `x86_64_start_kernel` function as first argument in [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S): ``` /* rsi is pointer to real mode structure with interesting info. @@ -23,13 +23,13 @@ This function takes one argument - virtual address of the `real_mode_data`. Reme movq %rsi, %rdi ``` -Now let's look at `__va` macro. This macro defined in [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c): +Now let's look at `__va` macro. This macro defined in [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c): ```C #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) ``` -where `PAGE_OFFSET` is `__PAGE_OFFSET` which is `0xffff880000000000` and the base virtual address of the direct mapping of all physical memory. So we're getting virtual address of the `boot_params` structure and pass it to the `copy_bootdata` function, where we copy `real_mod_data` to the `boot_params` which is declared in the [arch/x86/kernel/setup.h](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.h) +where `PAGE_OFFSET` is `__PAGE_OFFSET` which is `0xffff880000000000` and the base virtual address of the direct mapping of all physical memory. So we're getting virtual address of the `boot_params` structure and pass it to the `copy_bootdata` function, where we copy `real_mod_data` to the `boot_params` which is declared in the [arch/x86/kernel/setup.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.h) ```C extern struct boot_params boot_params; @@ -82,7 +82,7 @@ In the next step, as we have copied `boot_params` structure, we need to move fro clear_page(init_level4_pgt); ``` -function and pass `init_level4_pgt` which also defined in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) and looks: +function and pass `init_level4_pgt` which also defined in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) and looks: ```assembly NEXT_PAGE(init_level4_pgt) @@ -93,7 +93,7 @@ NEXT_PAGE(init_level4_pgt) .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE ``` -which maps first 2 gigabytes and 512 megabytes for the kernel code, data and bss. `clear_page` function defined in the [arch/x86/lib/clear_page_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/lib/clear_page_64.S) let's look on this function: +which maps first 2 gigabytes and 512 megabytes for the kernel code, data and bss. `clear_page` function defined in the [arch/x86/lib/clear_page_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/lib/clear_page_64.S) let's look on this function: ```assembly ENTRY(clear_page) @@ -172,7 +172,7 @@ if (!boot_params.hdr.version) and if it is zero we call `copy_bootdata` function again with the virtual address of the `real_mode_data` (read about its implementation). -In the next step we can see the call of the `reserve_ebda_region` function which defined in the [arch/x86/kernel/head.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head.c). This function reserves memory block for the `EBDA` or Extended BIOS Data Area. The Extended BIOS Data Area located in the top of conventional memory and contains data about ports, disk parameters and etc... +In the next step we can see the call of the `reserve_ebda_region` function which defined in the [arch/x86/kernel/head.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head.c). This function reserves memory block for the `EBDA` or Extended BIOS Data Area. The Extended BIOS Data Area located in the top of conventional memory and contains data about ports, disk parameters and etc... Let's look on the `reserve_ebda_region` function. It starts from the checking is paravirtualization enabled or not: @@ -194,7 +194,7 @@ We're getting the virtual address of the BIOS low memory in kilobytes and conver ebda_addr = get_bios_ebda(); ``` -where `get_bios_ebda` function defined in the [arch/x86/include/asm/bios_ebda.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/bios_ebda.h) and looks like: +where `get_bios_ebda` function defined in the [arch/x86/include/asm/bios_ebda.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/bios_ebda.h) and looks like: ```C static inline unsigned int get_bios_ebda(void) @@ -250,7 +250,7 @@ lowmem = min(lowmem, LOWMEM_CAP); memblock_reserve(lowmem, 0x100000 - lowmem); ``` -`memblock_reserve` function is defined at [mm/block.c](https://github.com/torvalds/linux/blob/master/mm/block.c) and takes two parameters: +`memblock_reserve` function is defined at [mm/block.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/block.c) and takes two parameters: * base physical address; * region size. @@ -376,7 +376,7 @@ struct memblock_region { }; ``` -NUMA node id depends on `MAX_NUMNODES` macro which is defined in the [include/linux/numa.h](https://github.com/torvalds/linux/blob/master/include/linux/numa.h): +NUMA node id depends on `MAX_NUMNODES` macro which is defined in the [include/linux/numa.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/numa.h): ```C #define MAX_NUMNODES (1 << NODES_SHIFT) @@ -401,7 +401,7 @@ static inline void memblock_set_region_node(struct memblock_region *r, int nid) } ``` -After this we will have first reserved `memblock` for the extended bios data area in the `.meminit.data` section. `reserve_ebda_region` function finished its work on this step and we can go back to the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head64.c). +After this we will have first reserved `memblock` for the extended bios data area in the `.meminit.data` section. `reserve_ebda_region` function finished its work on this step and we can go back to the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head64.c). We finished all preparations before the kernel entry point! The last step in the `x86_64_start_reservations` function is the call of the: @@ -409,7 +409,7 @@ We finished all preparations before the kernel entry point! The last step in the start_kernel() ``` -function from [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) file. +function from [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) file. That's all for this part. diff --git a/Initialization/linux-initialization-4.md b/Initialization/linux-initialization-4.md index 60d689a..058ed4b 100644 --- a/Initialization/linux-initialization-4.md +++ b/Initialization/linux-initialization-4.md @@ -4,7 +4,7 @@ Kernel initialization. Part 4. Kernel entry point ================================================================================ -If you have read the previous part - [Last preparations before the kernel entry point](https://github.com/0xAX/linux-insides/blob/master/Initialization/linux-initialization-3.md), you can remember that we finished all pre-initialization stuff and stopped right before the call to the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). The `start_kernel` is the entry of the generic and architecture independent kernel code, although we will return to the `arch/` folder many times. If you look inside of the `start_kernel` function, you will see that this function is very big. For this moment it contains about `86` calls of functions. Yes, it's very big and of course this part will not cover all the processes that occur in this function. In the current part we will only start to do it. This part and all the next which will be in the [Kernel initialization process](https://github.com/0xAX/linux-insides/blob/master/Initialization/README.md) chapter will cover it. +If you have read the previous part - [Last preparations before the kernel entry point](https://github.com/0xAX/linux-insides/blob/master/Initialization/linux-initialization-3.md), you can remember that we finished all pre-initialization stuff and stopped right before the call to the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). The `start_kernel` is the entry of the generic and architecture independent kernel code, although we will return to the `arch/` folder many times. If you look inside of the `start_kernel` function, you will see that this function is very big. For this moment it contains about `86` calls of functions. Yes, it's very big and of course this part will not cover all the processes that occur in this function. In the current part we will only start to do it. This part and all the next which will be in the [Kernel initialization process](https://github.com/0xAX/linux-insides/blob/master/Initialization/README.md) chapter will cover it. The main purpose of the `start_kernel` to finish kernel initialization process and launch the first `init` process. Before the first process will be started, the `start_kernel` must do many things such as: to enable [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt), to initialize processor id, to enable early [cgroups](http://en.wikipedia.org/wiki/Cgroups) subsystem, to setup per-cpu areas, to initialize different caches in [vfs](http://en.wikipedia.org/wiki/Virtual_file_system), to initialize memory manager, rcu, vmalloc, scheduler, IRQs, ACPI and many many more. Only after these steps will we see the launch of the first `init` process in the last part of this chapter. So much kernel code awaits us, let's start. @@ -13,7 +13,7 @@ The main purpose of the `start_kernel` to finish kernel initialization process a A little about function attributes --------------------------------------------------------------------------------- -As I wrote above, the `start_kernel` function is defined in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). This function defined with the `__init` attribute and as you already may know from other parts, all functions which are defined with this attribute are necessary during kernel initialization. +As I wrote above, the `start_kernel` function is defined in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). This function defined with the `__init` attribute and as you already may know from other parts, all functions which are defined with this attribute are necessary during kernel initialization. ```C #define __init __section(.init.text) __cold notrace @@ -33,7 +33,7 @@ In the definition of the `start_kernel` function, you can also see the `__visibl #define __visible __attribute__((externally_visible)) ``` -where `externally_visible` tells to the compiler that something uses this function or variable, to prevent marking this function/variable as `unusable`. You can find the definition of this and other macro attributes in [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h). +where `externally_visible` tells to the compiler that something uses this function or variable, to prevent marking this function/variable as `unusable`. You can find the definition of this and other macro attributes in [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h). First steps in the start_kernel -------------------------------------------------------------------------------- @@ -51,9 +51,9 @@ The first represents a pointer to the kernel command line and the second will co struct task_struct init_task = INIT_TASK(init_task); ``` -where `task_struct` stores all the information about a process. I will not explain this structure in this book because it's very big. You can find its definition in [include/linux/sched.h](https://github.com/torvalds/linux/blob/master/include/linux/sched.h#L1278). At this moment `task_struct` contains more than `100` fields! Although you will not see the explanation of the `task_struct` in this book, we will use it very often since it is the fundamental structure which describes the `process` in the Linux kernel. I will describe the meaning of the fields of this structure as we meet them in practice. +where `task_struct` stores all the information about a process. I will not explain this structure in this book because it's very big. You can find its definition in [include/linux/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/sched.h#L1278). At this moment `task_struct` contains more than `100` fields! Although you will not see the explanation of the `task_struct` in this book, we will use it very often since it is the fundamental structure which describes the `process` in the Linux kernel. I will describe the meaning of the fields of this structure as we meet them in practice. -You can see the definition of the `init_task` and it initialized by the `INIT_TASK` macro. This macro is from [include/linux/init_task.h](https://github.com/torvalds/linux/blob/master/include/linux/init_task.h) and it just fills the `init_task` with the values for the first process. For example it sets: +You can see the definition of the `init_task` and it initialized by the `INIT_TASK` macro. This macro is from [include/linux/init_task.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init_task.h) and it just fills the `init_task` with the values for the first process. For example it sets: * init process state to zero or `runnable`. A runnable process is one which is waiting only for a CPU to run on; * init process flags - `PF_KTHREAD` which means - kernel thread; @@ -111,7 +111,7 @@ http://www.quora.com/In-Linux-kernel-Why-thread_info-structure-and-the-kernel-st So the `INIT_TASK` macro fills these `task_struct's` fields and many many more. As I already wrote above, I will not describe all the fields and values in the `INIT_TASK` macro but we will see them soon. -Now let's go back to the `set_task_stack_end_magic` function. This function defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c#L297) and sets a [canary](http://en.wikipedia.org/wiki/Stack_buffer_overflow) to the `init` process stack to prevent stack overflow. +Now let's go back to the `set_task_stack_end_magic` function. This function defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c#L297) and sets a [canary](http://en.wikipedia.org/wiki/Stack_buffer_overflow) to the `init` process stack to prevent stack overflow. ```C void set_task_stack_end_magic(struct task_struct *tsk) @@ -134,7 +134,7 @@ where `task_thread_info` just returns the stack which we filled with the `INIT_T #define task_thread_info(task) ((struct thread_info *)(task)->stack) ``` -From the Linux kernel `v4.9-rc1` release, `thread_info` structure may contains only flags and stack pointer resides in `task_struct` structure which represents a thread in the Linux kernel. This depends on `CONFIG_THREAD_INFO_IN_TASK` kernel configuration option which is enabled by default for `x86_64`. You can be sure in this if you will look in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) configuration build file: +From the Linux kernel `v4.9-rc1` release, `thread_info` structure may contains only flags and stack pointer resides in `task_struct` structure which represents a thread in the Linux kernel. This depends on `CONFIG_THREAD_INFO_IN_TASK` kernel configuration option which is enabled by default for `x86_64`. You can be sure in this if you will look in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) configuration build file: ``` config THREAD_INFO_IN_TASK @@ -148,7 +148,7 @@ config THREAD_INFO_IN_TASK and put_task_stack() in save_thread_stack_tsk() and get_wchan(). ``` -and [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/master/arch/x86/Kconfig): +and [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Kconfig): ``` config X86 @@ -215,7 +215,7 @@ and write this value to the top of the IRQ stack with the: this_cpu_write(irq_stack_union.stack_canary, canary); // read below about this_cpu_write ``` -Again, we will not dive into details here, we will cover it in the part about [IRQs](http://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29). As canary is set, we disable local and early boot IRQs and register the bootstrap CPU in the CPU maps. We disable local IRQs (interrupts for current CPU) with the `local_irq_disable` macro which expands to the call of the `arch_local_irq_disable` function from [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/percpu-defs.h): +Again, we will not dive into details here, we will cover it in the part about [IRQs](http://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29). As canary is set, we disable local and early boot IRQs and register the bootstrap CPU in the CPU maps. We disable local IRQs (interrupts for current CPU) with the `local_irq_disable` macro which expands to the call of the `arch_local_irq_disable` function from [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h): ```C static inline notrace void arch_local_irq_enable(void) @@ -241,7 +241,7 @@ For now it is just zero. If the `CONFIG_DEBUG_PREEMPT` configuration option is d #define raw_smp_processor_id() (this_cpu_read(cpu_number)) ``` -`this_cpu_read` as many other function like this (`this_cpu_write`, `this_cpu_add` and etc...) defined in the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/master/include/linux/percpu-defs.h) and presents `this_cpu` operation. These operations provide a way of optimizing access to the [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Theory/per-cpu.html) variables which are associated with the current processor. In our case it is `this_cpu_read`: +`this_cpu_read` as many other function like this (`this_cpu_write`, `this_cpu_add` and etc...) defined in the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h) and presents `this_cpu` operation. These operations provide a way of optimizing access to the [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Theory/per-cpu.html) variables which are associated with the current processor. In our case it is `this_cpu_read`: ``` __pcpu_size_call_return(this_cpu_read_, pcp) @@ -375,9 +375,9 @@ Linux version 4.0.0-rc6+ (alex@localhost) (gcc version 4.9.1 (Ubuntu 4.9.1-16ubu Architecture-dependent parts of initialization --------------------------------------------------------------------------------- -The next step is architecture-specific initialization. The Linux kernel does it with the call of the `setup_arch` function. This is a very big function like `start_kernel` and we do not have time to consider all of its implementation in this part. Here we'll only start to do it and continue in the next part. As it is `architecture-specific`, we need to go again to the `arch/` directory. The `setup_arch` function defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) source code file and takes only one argument - address of the kernel command line. +The next step is architecture-specific initialization. The Linux kernel does it with the call of the `setup_arch` function. This is a very big function like `start_kernel` and we do not have time to consider all of its implementation in this part. Here we'll only start to do it and continue in the next part. As it is `architecture-specific`, we need to go again to the `arch/` directory. The `setup_arch` function defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) source code file and takes only one argument - address of the kernel command line. -This function starts from the reserving memory block for the kernel `_text` and `_data` which starts from the `_text` symbol (you can remember it from the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S#L46)) and ends before `__bss_stop`. We are using `memblock` for the reserving of memory block: +This function starts from the reserving memory block for the kernel `_text` and `_data` which starts from the `_text` symbol (you can remember it from the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S#L46)) and ends before `__bss_stop`. We are using `memblock` for the reserving of memory block: ```C memblock_reserve(__pa_symbol(_text), (unsigned long)__bss_stop - (unsigned long)_text); @@ -440,7 +440,7 @@ static u64 __init get_ramdisk_image(void) } ``` -Here we get the address of the ramdisk from the `boot_params` and shift left it on `32`. We need to do it because as you can read in the [Documentation/x86/zero-page.txt](https://github.com/0xAX/linux/blob/master/Documentation/x86/zero-page.txt): +Here we get the address of the ramdisk from the `boot_params` and shift left it on `32`. We need to do it because as you can read in the [Documentation/x86/zero-page.txt](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/Documentation/x86/zero-page.txt): ``` 0C0/004 ALL ext_ramdisk_image ramdisk_image high 32bits diff --git a/Initialization/linux-initialization-5.md b/Initialization/linux-initialization-5.md index 070a515..4e4d8b0 100644 --- a/Initialization/linux-initialization-5.md +++ b/Initialization/linux-initialization-5.md @@ -4,7 +4,7 @@ Kernel initialization. Part 5. Continue of architecture-specific initialization ================================================================================ -In the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html), we stopped at the initialization of an architecture-specific stuff from the [setup_arch](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c#L856) function and now we will continue with it. As we reserved memory for the [initrd](http://en.wikipedia.org/wiki/Initrd), next step is the `olpc_ofw_detect` which detects [One Laptop Per Child support](http://wiki.laptop.org/go/OFW_FAQ). We will not consider platform related stuff in this book and will skip functions related with it. So let's go ahead. The next step is the `early_trap_init` function. This function initializes debug (`#DB` - raised when the `TF` flag of rflags is set) and `int3` (`#BP`) interrupts gate. If you don't know anything about interrupts, you can read about it in the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html). In `x86` architecture `INT`, `INTO` and `INT3` are special instructions which allow a task to explicitly call an interrupt handler. The `INT3` instruction calls the breakpoint (`#BP`) handler. You may remember, we already saw it in the [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) about interrupts: and exceptions: +In the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html), we stopped at the initialization of an architecture-specific stuff from the [setup_arch](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c#L856) function and now we will continue with it. As we reserved memory for the [initrd](http://en.wikipedia.org/wiki/Initrd), next step is the `olpc_ofw_detect` which detects [One Laptop Per Child support](http://wiki.laptop.org/go/OFW_FAQ). We will not consider platform related stuff in this book and will skip functions related with it. So let's go ahead. The next step is the `early_trap_init` function. This function initializes debug (`#DB` - raised when the `TF` flag of rflags is set) and `int3` (`#BP`) interrupts gate. If you don't know anything about interrupts, you can read about it in the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html). In `x86` architecture `INT`, `INTO` and `INT3` are special instructions which allow a task to explicitly call an interrupt handler. The `INT3` instruction calls the breakpoint (`#BP`) handler. You may remember, we already saw it in the [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) about interrupts: and exceptions: ``` ---------------------------------------------------------------------------------------------- @@ -14,7 +14,7 @@ In the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initializat ---------------------------------------------------------------------------------------------- ``` -Debug interrupt `#DB` is the primary method of invoking debuggers. `early_trap_init` defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c). This functions sets `#DB` and `#BP` handlers and reloads [IDT](http://en.wikipedia.org/wiki/Interrupt_descriptor_table): +Debug interrupt `#DB` is the primary method of invoking debuggers. `early_trap_init` defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c). This functions sets `#DB` and `#BP` handlers and reloads [IDT](http://en.wikipedia.org/wiki/Interrupt_descriptor_table): ```C void __init early_trap_init(void) @@ -48,13 +48,13 @@ As `#DB` and `#BP` gates written to the `idt_descr`, we reload `IDT` table with #DB handler -------------------------------------------------------------------------------- -As you can read above, we passed address of the `#DB` handler as `&debug` in the `set_intr_gate_ist`. [lxr.free-electrons.com](http://lxr.free-electrons.com/ident) is a great resource for searching identifiers in the linux kernel source code, but unfortunately you will not find `debug` handler with it. All of you can find, it is `debug` definition in the [arch/x86/include/asm/traps.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/traps.h): +As you can read above, we passed address of the `#DB` handler as `&debug` in the `set_intr_gate_ist`. [lxr.free-electrons.com](http://lxr.free-electrons.com/ident) is a great resource for searching identifiers in the linux kernel source code, but unfortunately you will not find `debug` handler with it. All of you can find, it is `debug` definition in the [arch/x86/include/asm/traps.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/traps.h): ```C asmlinkage void debug(void); ``` -We can see `asmlinkage` attribute which tells to us that `debug` is function written with [assembly](http://en.wikipedia.org/wiki/Assembly_language). Yeah, again and again assembly :). Implementation of the `#DB` handler as other handlers is in this [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/entry_64.S) and defined with the `idtentry` assembly macro: +We can see `asmlinkage` attribute which tells to us that `debug` is function written with [assembly](http://en.wikipedia.org/wiki/Assembly_language). Yeah, again and again assembly :). Implementation of the `#DB` handler as other handlers is in this [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) and defined with the `idtentry` assembly macro: ```assembly idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK @@ -68,7 +68,7 @@ idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK * paranoid - if this parameter = 1, switch to special stack (read above); * shift_ist - stack to switch during interrupt. -Now let's look on `idtentry` macro implementation. This macro defined in the same assembly file and defines `debug` function with the `ENTRY` macro. For the start `idtentry` macro checks that given parameters are correct in case if need to switch to the special stack. In the next step it checks that give interrupt returns error code. If interrupt does not return error code (in our case `#DB` does not return error code), it calls `INTR_FRAME` or `XCPT_FRAME` if interrupt has error code. Both of these macros `XCPT_FRAME` and `INTR_FRAME` do nothing and need only for the building initial frame state for interrupts. They uses `CFI` directives and used for debugging. More info you can find in the [CFI directives](https://sourceware.org/binutils/docs/as/CFI-directives.html). As comment from the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/entry_64.S) says: `CFI macros are used to generate dwarf2 unwind information for better backtraces. They don't change any code.` so we will ignore them. +Now let's look on `idtentry` macro implementation. This macro defined in the same assembly file and defines `debug` function with the `ENTRY` macro. For the start `idtentry` macro checks that given parameters are correct in case if need to switch to the special stack. In the next step it checks that give interrupt returns error code. If interrupt does not return error code (in our case `#DB` does not return error code), it calls `INTR_FRAME` or `XCPT_FRAME` if interrupt has error code. Both of these macros `XCPT_FRAME` and `INTR_FRAME` do nothing and need only for the building initial frame state for interrupts. They uses `CFI` directives and used for debugging. More info you can find in the [CFI directives](https://sourceware.org/binutils/docs/as/CFI-directives.html). As comment from the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) says: `CFI macros are used to generate dwarf2 unwind information for better backtraces. They don't change any code.` so we will ignore them. ```assembly .macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 @@ -126,7 +126,7 @@ We need to do it as `dummy` error code for stack consistency for all interrupts. subq $ORIG_RAX-R15, %rsp ``` -where `ORIRG_RAX`, `R15` and other macros defined in the [arch/x86/include/asm/calling.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/calling.h) and `ORIG_RAX-R15` is 120 bytes. General purpose registers will occupy these 120 bytes because we need to store all registers on the stack during interrupt handling. After we set stack for general purpose registers, the next step is checking that interrupt came from userspace with: +where `ORIRG_RAX`, `R15` and other macros defined in the [arch/x86/include/asm/calling.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/calling.h) and `ORIG_RAX-R15` is 120 bytes. General purpose registers will occupy these 120 bytes because we need to store all registers on the stack during interrupt handling. After we set stack for general purpose registers, the next step is checking that interrupt came from userspace with: ```assembly testl $3, CS(%rsp) @@ -146,14 +146,14 @@ Here we checks first and second bits in the `CS`. You can remember that `CS` reg 1: ret ``` -In the next steps we put `pt_regs` pointer to the `rdi`, save error code in the `rsi` if it has and call interrupt handler which is - `do_debug` in our case from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c). `do_debug` like other handlers takes two parameters: +In the next steps we put `pt_regs` pointer to the `rdi`, save error code in the `rsi` if it has and call interrupt handler which is - `do_debug` in our case from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c). `do_debug` like other handlers takes two parameters: * pt_regs - is a structure which presents set of CPU registers which are saved in the process' memory region; * error code - error code of interrupt. After interrupt handler finished its work, calls `paranoid_exit` which restores stack, switch on userspace if interrupt came from there and calls `iret`. That's all. Of course it is not all :), but we will see more deeply in the separate chapter about interrupts. -This is general view of the `idtentry` macro for `#DB` interrupt. All interrupts are similar to this implementation and defined with idtentry too. After `early_trap_init` finished its work, the next function is `early_cpu_init`. This function defined in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c) and collects information about CPU and its vendor. +This is general view of the `idtentry` macro for `#DB` interrupt. All interrupts are similar to this implementation and defined with idtentry too. After `early_trap_init` finished its work, the next function is `early_cpu_init`. This function defined in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c) and collects information about CPU and its vendor. Early ioremap initialization -------------------------------------------------------------------------------- @@ -165,14 +165,14 @@ The next step is initialization of early `ioremap`. In general there are two way We already saw first method (`outb/inb` instructions) in the part about linux kernel booting [process](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-3.html). The second method is to map I/O physical addresses to virtual addresses. When a physical address is accessed by the CPU, it may refer to a portion of physical RAM which can be mapped on memory of the I/O device. So `ioremap` used to map device memory into kernel address space. -As i wrote above next function is the `early_ioremap_init` which re-maps I/O memory to kernel address space so it can access it. We need to initialize early ioremap for early initialization code which needs to temporarily map I/O or memory regions before the normal mapping functions like `ioremap` are available. Implementation of this function is in the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/ioremap.c). At the start of the `early_ioremap_init` we can see definition of the `pmd` point with `pmd_t` type (which presents page middle directory entry `typedef struct { pmdval_t pmd; } pmd_t;` where `pmdval_t` is `unsigned long`) and make a check that `fixmap` aligned in a correct way: +As i wrote above next function is the `early_ioremap_init` which re-maps I/O memory to kernel address space so it can access it. We need to initialize early ioremap for early initialization code which needs to temporarily map I/O or memory regions before the normal mapping functions like `ioremap` are available. Implementation of this function is in the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/ioremap.c). At the start of the `early_ioremap_init` we can see definition of the `pmd` point with `pmd_t` type (which presents page middle directory entry `typedef struct { pmdval_t pmd; } pmd_t;` where `pmdval_t` is `unsigned long`) and make a check that `fixmap` aligned in a correct way: ```C pmd_t *pmd; BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1)); ``` -`fixmap` - is fixed virtual address mappings which extends from `FIXADDR_START` to `FIXADDR_TOP`. Fixed virtual addresses are needed for subsystems that need to know the virtual address at compile time. After the check `early_ioremap_init` makes a call of the `early_ioremap_setup` function from the [mm/early_ioremap.c](https://github.com/torvalds/linux/blob/master/mm/early_ioremap.c). `early_ioremap_setup` fills `slot_virt` array of the `unsigned long` with virtual addresses with 512 temporary boot-time fix-mappings: +`fixmap` - is fixed virtual address mappings which extends from `FIXADDR_START` to `FIXADDR_TOP`. Fixed virtual addresses are needed for subsystems that need to know the virtual address at compile time. After the check `early_ioremap_init` makes a call of the `early_ioremap_setup` function from the [mm/early_ioremap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/early_ioremap.c). `early_ioremap_setup` fills `slot_virt` array of the `unsigned long` with virtual addresses with 512 temporary boot-time fix-mappings: ```C for (i = 0; i < FIX_BTMAPS_SLOTS; i++) @@ -286,7 +286,7 @@ struct resource { }; ``` -presents abstraction for a tree-like subset of system resources. This structure provides range of addresses from `start` to `end` (`resource_size_t` is `phys_addr_t` or `u64` for `x86_64`) which a resource covers, `name` of a resource (you see these names in the `/proc/iomem` output) and `flags` of a resource (All resources flags defined in the [include/linux/ioport.h](https://github.com/torvalds/linux/blob/master/include/linux/ioport.h)). The last are three pointers to the `resource` structure. These pointers enable a tree-like structure: +presents abstraction for a tree-like subset of system resources. This structure provides range of addresses from `start` to `end` (`resource_size_t` is `phys_addr_t` or `u64` for `x86_64`) which a resource covers, `name` of a resource (you see these names in the `/proc/iomem` output) and `flags` of a resource (All resources flags defined in the [include/linux/ioport.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/ioport.h)). The last are three pointers to the `resource` structure. These pointers enable a tree-like structure: ``` +-------------+ +-------------+ @@ -339,7 +339,7 @@ void __init setup_memory_map(void) } ``` -First of all we call look here the call of the `x86_init.resources.memory_setup`. `x86_init` is a `x86_init_ops` structure which presents platform specific setup functions as resources initialization, pci initialization and etc... initialization of the `x86_init` is in the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/x86_init.c). I will not give here the full description because it is very long, but only one part which interests us for now: +First of all we call look here the call of the `x86_init.resources.memory_setup`. `x86_init` is a `x86_init_ops` structure which presents platform specific setup functions as resources initialization, pci initialization and etc... initialization of the `x86_init` is in the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/x86_init.c). I will not give here the full description because it is very long, but only one part which interests us for now: ```C struct x86_init_ops x86_init __initdata = { @@ -392,7 +392,7 @@ Protocol: 2.09+ parameters passing mechanism. ``` -It used for storing setup information for different types as device tree blob, EFI setup data and etc... In the second step we copy BIOS EDD information from the `boot_params` structure that we collected in the [arch/x86/boot/edd.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/edd.c) to the `edd` structure: +It used for storing setup information for different types as device tree blob, EFI setup data and etc... In the second step we copy BIOS EDD information from the `boot_params` structure that we collected in the [arch/x86/boot/edd.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/edd.c) to the `edd` structure: ```C static inline void __init copy_edd(void) @@ -408,7 +408,7 @@ static inline void __init copy_edd(void) Memory descriptor initialization -------------------------------------------------------------------------------- -The next step is initialization of the memory descriptor of the init process. As you already can know every process has its own address space. This address space presented with special data structure which called `memory descriptor`. Directly in the linux kernel source code memory descriptor presented with `mm_struct` structure. `mm_struct` contains many different fields related with the process address space as start/end address of the kernel code/data, start/end of the brk, number of memory areas, list of memory areas and etc... This structure defined in the [include/linux/mm_types.h](https://github.com/torvalds/linux/blob/master/include/linux/mm_types.h). As every process has its own memory descriptor, `task_struct` structure contains it in the `mm` and `active_mm` field. And our first `init` process has it too. You can remember that we saw the part of initialization of the init `task_struct` with `INIT_TASK` macro in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html): +The next step is initialization of the memory descriptor of the init process. As you already can know every process has its own address space. This address space presented with special data structure which called `memory descriptor`. Directly in the linux kernel source code memory descriptor presented with `mm_struct` structure. `mm_struct` contains many different fields related with the process address space as start/end address of the kernel code/data, start/end of the brk, number of memory areas, list of memory areas and etc... This structure defined in the [include/linux/mm_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mm_types.h). As every process has its own memory descriptor, `task_struct` structure contains it in the `mm` and `active_mm` field. And our first `init` process has it too. You can remember that we saw the part of initialization of the init `task_struct` with `INIT_TASK` macro in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html): ```C #define INIT_TASK(tsk) \ @@ -466,7 +466,7 @@ We already know a little about `resource` structure (read above). Here we fills 01a11000-01ac3fff : Kernel bss ``` -All of these structures are defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) and look like typical resource initialization: +All of these structures are defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) and look like typical resource initialization: ```C static struct resource code_resource = { diff --git a/Initialization/linux-initialization-6.md b/Initialization/linux-initialization-6.md index 178cd8a..80dcd19 100644 --- a/Initialization/linux-initialization-6.md +++ b/Initialization/linux-initialization-6.md @@ -4,7 +4,7 @@ Kernel initialization. Part 6. Architecture-specific initialization, again... ================================================================================ -In the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) we saw architecture-specific (`x86_64` in our case) initialization stuff from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) and finished on `x86_configure_nx` function which sets the `_PAGE_NX` flag depends on support of [NX bit](http://en.wikipedia.org/wiki/NX_bit). As I wrote before `setup_arch` function and `start_kernel` are very big, so in this and in the next part we will continue to learn about architecture-specific initialization process. The next function after `x86_configure_nx` is `parse_early_param`. This function is defined in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) and as you can understand from its name, this function parses kernel command line and setups different services depends on the given parameters (all kernel command line parameters you can find are in the [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt)). You may remember how we setup `earlyprintk` in the earliest [part](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-2.html). On the early stage we looked for kernel parameters and their value with the `cmdline_find_option` function and `__cmdline_find_option`, `__cmdline_find_option_bool` helpers from the [arch/x86/boot/cmdline.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/cmdline.c). There we're in the generic kernel part which does not depend on architecture and here we use another approach. If you are reading linux kernel source code, you already note calls like this: +In the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) we saw architecture-specific (`x86_64` in our case) initialization stuff from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) and finished on `x86_configure_nx` function which sets the `_PAGE_NX` flag depends on support of [NX bit](http://en.wikipedia.org/wiki/NX_bit). As I wrote before `setup_arch` function and `start_kernel` are very big, so in this and in the next part we will continue to learn about architecture-specific initialization process. The next function after `x86_configure_nx` is `parse_early_param`. This function is defined in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) and as you can understand from its name, this function parses kernel command line and setups different services depends on the given parameters (all kernel command line parameters you can find are in the [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt)). You may remember how we setup `earlyprintk` in the earliest [part](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-2.html). On the early stage we looked for kernel parameters and their value with the `cmdline_find_option` function and `__cmdline_find_option`, `__cmdline_find_option_bool` helpers from the [arch/x86/boot/cmdline.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cmdline.c). There we're in the generic kernel part which does not depend on architecture and here we use another approach. If you are reading linux kernel source code, you already note calls like this: ```C early_param("gbpages", parse_direct_gbpages_on); @@ -22,7 +22,7 @@ and defined as: __setup_param(str, fn, fn, 1) ``` -in the [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h). As you can see `early_param` macro just makes call of the `__setup_param` macro: +in the [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h). As you can see `early_param` macro just makes call of the `__setup_param` macro: ```C #define __setup_param(str, unique_id, fn, early) \ @@ -50,7 +50,7 @@ and contains three fields: * function which setups something depend on parameter; * field determines is parameter early (1) or not (0). -Note that `__set_param` macro defines with `__section(.init.setup)` attribute. It means that all `__setup_str_*` will be placed in the `.init.setup` section, moreover, as we can see in the [include/asm-generic/vmlinux.lds.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/vmlinux.lds.h), they will be placed between `__setup_start` and `__setup_end`: +Note that `__set_param` macro defines with `__section(.init.setup)` attribute. It means that all `__setup_str_*` will be placed in the `.init.setup` section, moreover, as we can see in the [include/asm-generic/vmlinux.lds.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/vmlinux.lds.h), they will be placed between `__setup_start` and `__setup_end`: ``` #define INIT_SETUP(initsetup_align) \ @@ -78,7 +78,7 @@ void __init parse_early_param(void) } ``` -The `parse_early_param` function defines two static variables. First `done` check that `parse_early_param` already called and the second is temporary storage for kernel command line. After this we copy `boot_command_line` to the temporary command line which we just defined and call the `parse_early_options` function from the same source code `main.c` file. `parse_early_options` calls the `parse_args` function from the [kernel/params.c](https://github.com/torvalds/linux/blob/master/) where `parse_args` parses given command line and calls `do_early_param` function. This [function](https://github.com/torvalds/linux/blob/master/init/main.c#L413) goes from the ` __setup_start` to `__setup_end`, and calls the function from the `obs_kernel_param` if a parameter is early. After this all services which are depend on early command line parameters were setup and the next call after the `parse_early_param` is `x86_report_nx`. As I wrote in the beginning of this part, we already set `NX-bit` with the `x86_configure_nx`. The next `x86_report_nx` function from the [arch/x86/mm/setup_nx.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/setup_nx.c) just prints information about the `NX`. Note that we call `x86_report_nx` not right after the `x86_configure_nx`, but after the call of the `parse_early_param`. The answer is simple: we call it after the `parse_early_param` because the kernel support `noexec` parameter: +The `parse_early_param` function defines two static variables. First `done` check that `parse_early_param` already called and the second is temporary storage for kernel command line. After this we copy `boot_command_line` to the temporary command line which we just defined and call the `parse_early_options` function from the same source code `main.c` file. `parse_early_options` calls the `parse_args` function from the [kernel/params.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/) where `parse_args` parses given command line and calls `do_early_param` function. This [function](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L413) goes from the ` __setup_start` to `__setup_end`, and calls the function from the `obs_kernel_param` if a parameter is early. After this all services which are depend on early command line parameters were setup and the next call after the `parse_early_param` is `x86_report_nx`. As I wrote in the beginning of this part, we already set `NX-bit` with the `x86_configure_nx`. The next `x86_report_nx` function from the [arch/x86/mm/setup_nx.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/setup_nx.c) just prints information about the `NX`. Note that we call `x86_report_nx` not right after the `x86_configure_nx`, but after the call of the `parse_early_param`. The answer is simple: we call it after the `parse_early_param` because the kernel support `noexec` parameter: ``` noexec [X86] @@ -97,7 +97,7 @@ After this we can see call of the: memblock_x86_reserve_range_setup_data(); ``` -function. This function is defined in the same [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) source code file and remaps memory for the `setup_data` and reserved memory block for the `setup_data` (more about `setup_data` you can read in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) and about `ioremap` and `memblock` you can read in the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html)). +function. This function is defined in the same [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) source code file and remaps memory for the `setup_data` and reserved memory block for the `setup_data` (more about `setup_data` you can read in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) and about `ioremap` and `memblock` you can read in the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html)). In the next step we can see following conditional statement: @@ -110,7 +110,7 @@ In the next step we can see following conditional statement: } ``` -The first `acpi_mps_check` function from the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/acpi/boot.c) depends on `CONFIG_X86_LOCAL_APIC` and `CONFIG_x86_MPPARSE` configuration options: +The first `acpi_mps_check` function from the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/acpi/boot.c) depends on `CONFIG_X86_LOCAL_APIC` and `CONFIG_x86_MPPARSE` configuration options: ```C int __init acpi_mps_check(void) @@ -142,13 +142,13 @@ In the next step we make a dump of the [PCI](http://en.wikipedia.org/wiki/Conven #endif ``` -`pci_early_dump_regs` variable defined in the [arch/x86/pci/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/pci/common.c) and its value depends on the kernel command line parameter: `pci=earlydump`. We can find definition of this parameter in the [drivers/pci/pci.c](https://github.com/torvalds/linux/blob/master/arch): +`pci_early_dump_regs` variable defined in the [arch/x86/pci/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/pci/common.c) and its value depends on the kernel command line parameter: `pci=earlydump`. We can find definition of this parameter in the [drivers/pci/pci.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch): ```C early_param("pci", pci_setup); ``` -`pci_setup` function gets the string after the `pci=` and analyzes it. This function calls `pcibios_setup` which defined as `__weak` in the [drivers/pci/pci.c](https://github.com/torvalds/linux/blob/master/arch) and every architecture defines the same function which overrides `__weak` analog. For example `x86_64` architecture-dependent version is in the [arch/x86/pci/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/pci/common.c): +`pci_setup` function gets the string after the `pci=` and analyzes it. This function calls `pcibios_setup` which defined as `__weak` in the [drivers/pci/pci.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch) and every architecture defines the same function which overrides `__weak` analog. For example `x86_64` architecture-dependent version is in the [arch/x86/pci/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/pci/common.c): ```C char *__init pcibios_setup(char *str) { @@ -165,7 +165,7 @@ char *__init pcibios_setup(char *str) { } ``` -So, if `CONFIG_PCI` option is set and we passed `pci=earlydump` option to the kernel command line, next function which will be called - `early_dump_pci_devices` from the [arch/x86/pci/early.c](https://github.com/torvalds/linux/blob/master/arch/x86/pci/early.c). This function checks `noearly` pci parameter with: +So, if `CONFIG_PCI` option is set and we passed `pci=earlydump` option to the kernel command line, next function which will be called - `early_dump_pci_devices` from the [arch/x86/pci/early.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/pci/early.c). This function checks `noearly` pci parameter with: ```C if (!early_pci_allowed()) @@ -289,7 +289,7 @@ dmi_scan_machine(); dmi_memdev_walk(); ``` -First is `dmi_scan_machine` defined in the [drivers/firmware/dmi_scan.c](https://github.com/torvalds/linux/blob/master/drivers/firmware/dmi_scan.c). This function goes through the [System Management BIOS](http://en.wikipedia.org/wiki/System_Management_BIOS) structures and extracts information. There are two ways specified to gain access to the `SMBIOS` table: get the pointer to the `SMBIOS` table from the [EFI](http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface)'s configuration table and scanning the physical memory between `0xF0000` and `0x10000` addresses. Let's look on the second approach. `dmi_scan_machine` function remaps memory between `0xf0000` and `0x10000` with the `dmi_early_remap` which just expands to the `early_ioremap`: +First is `dmi_scan_machine` defined in the [drivers/firmware/dmi_scan.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/firmware/dmi_scan.c). This function goes through the [System Management BIOS](http://en.wikipedia.org/wiki/System_Management_BIOS) structures and extracts information. There are two ways specified to gain access to the `SMBIOS` table: get the pointer to the `SMBIOS` table from the [EFI](http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface)'s configuration table and scanning the physical memory between `0xF0000` and `0x10000` addresses. Let's look on the second approach. `dmi_scan_machine` function remaps memory between `0xf0000` and `0x10000` with the `dmi_early_remap` which just expands to the `early_ioremap`: ```C void __init dmi_scan_machine(void) @@ -379,7 +379,7 @@ static inline void find_smp_config(void) } ``` -inside. `x86_init.mpparse.find_smp_config` is the `default_find_smp_config` function from the [arch/x86/kernel/mpparse.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/mpparse.c). In the `default_find_smp_config` function we are scanning a couple of memory regions for `SMP` config and return if they are found: +inside. `x86_init.mpparse.find_smp_config` is the `default_find_smp_config` function from the [arch/x86/kernel/mpparse.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/mpparse.c). In the `default_find_smp_config` function we are scanning a couple of memory regions for `SMP` config and return if they are found: ```C if (smp_scan_config(0x0, 0x400) || @@ -533,7 +533,7 @@ Links * [MultiProcessor Specification](http://en.wikipedia.org/wiki/MultiProcessor_Specification) * [NX bit](http://en.wikipedia.org/wiki/NX_bit) -* [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt) +* [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt) * [APIC](http://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller) * [CPU masks](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) * [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html) diff --git a/Initialization/linux-initialization-7.md b/Initialization/linux-initialization-7.md index 757c233..fb7a86b 100644 --- a/Initialization/linux-initialization-7.md +++ b/Initialization/linux-initialization-7.md @@ -4,7 +4,7 @@ Kernel initialization. Part 7. The End of the architecture-specific initialization, almost... ================================================================================ -This is the seventh part of the Linux Kernel initialization process which covers insides of the `setup_arch` function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c#L861). As you can know from the previous [parts](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html), the `setup_arch` function does some architecture-specific (in our case it is [x86_64](http://en.wikipedia.org/wiki/X86-64)) initialization stuff like reserving memory for kernel code/data/bss, early scanning of the [Desktop Management Interface](http://en.wikipedia.org/wiki/Desktop_Management_Interface), early dump of the [PCI](http://en.wikipedia.org/wiki/PCI) device and many many more. If you have read the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html), you can remember that we've finished it at the `setup_real_mode` function. In the next step, as we set limit of the [memblock](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-1.html) to the all mapped pages, we can see the call of the `setup_log_buf` function from the [kernel/printk/printk.c](https://github.com/torvalds/linux/blob/master/kernel/printk/printk.c). +This is the seventh part of the Linux Kernel initialization process which covers insides of the `setup_arch` function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c#L861). As you can know from the previous [parts](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html), the `setup_arch` function does some architecture-specific (in our case it is [x86_64](http://en.wikipedia.org/wiki/X86-64)) initialization stuff like reserving memory for kernel code/data/bss, early scanning of the [Desktop Management Interface](http://en.wikipedia.org/wiki/Desktop_Management_Interface), early dump of the [PCI](http://en.wikipedia.org/wiki/PCI) device and many many more. If you have read the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html), you can remember that we've finished it at the `setup_real_mode` function. In the next step, as we set limit of the [memblock](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-1.html) to the all mapped pages, we can see the call of the `setup_log_buf` function from the [kernel/printk/printk.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/printk/printk.c). The `setup_log_buf` function setups kernel cyclic buffer and its length depends on the `CONFIG_LOG_BUF_SHIFT` configuration option. As we can read from the documentation of the `CONFIG_LOG_BUF_SHIFT` it can be between `12` and `21`. In the insides, buffer defined as array of chars: @@ -66,9 +66,9 @@ In the end of the `reserve_initrd` function, we free memblock memory which occup memblock_free(ramdisk_image, ramdisk_end - ramdisk_image); ``` -After we relocated `initrd` ramdisk image, the next function is `vsmp_init` from the [arch/x86/kernel/vsmp_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vsmp_64.c). This function initializes support of the `ScaleMP vSMP`. As I already wrote in the previous parts, this chapter will not cover non-related `x86_64` initialization parts (for example as the current or `ACPI`, etc.). So we will skip implementation of this for now and will back to it in the part which cover techniques of parallel computing. +After we relocated `initrd` ramdisk image, the next function is `vsmp_init` from the [arch/x86/kernel/vsmp_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vsmp_64.c). This function initializes support of the `ScaleMP vSMP`. As I already wrote in the previous parts, this chapter will not cover non-related `x86_64` initialization parts (for example as the current or `ACPI`, etc.). So we will skip implementation of this for now and will back to it in the part which cover techniques of parallel computing. -The next function is `io_delay_init` from the [arch/x86/kernel/io_delay.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/io_delay.c). This function allows to override default I/O delay `0x80` port. We already saw I/O delay in the [Last preparation before transition into protected mode](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-3.html), now let's look on the `io_delay_init` implementation: +The next function is `io_delay_init` from the [arch/x86/kernel/io_delay.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/io_delay.c). This function allows to override default I/O delay `0x80` port. We already saw I/O delay in the [Last preparation before transition into protected mode](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-3.html), now let's look on the `io_delay_init` implementation: ```C void __init io_delay_init(void) @@ -78,7 +78,7 @@ void __init io_delay_init(void) } ``` -This function check `io_delay_override` variable and overrides I/O delay port if `io_delay_override` is set. We can set `io_delay_override` variably by passing `io_delay` option to the kernel command line. As we can read from the [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt), `io_delay` option is: +This function check `io_delay_override` variable and overrides I/O delay port if `io_delay_override` is set. We can set `io_delay_override` variably by passing `io_delay` option to the kernel command line. As we can read from the [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt), `io_delay` option is: ``` io_delay= [X86] I/O delay method @@ -92,13 +92,13 @@ io_delay= [X86] I/O delay method No delay ``` -We can see `io_delay` command line parameter setup with the `early_param` macro in the [arch/x86/kernel/io_delay.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/io_delay.c) +We can see `io_delay` command line parameter setup with the `early_param` macro in the [arch/x86/kernel/io_delay.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/io_delay.c) ```C early_param("io_delay", io_delay_param); ``` -More about `early_param` you can read in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html). So the `io_delay_param` function which setups `io_delay_override` variable will be called in the [do_early_param](https://github.com/torvalds/linux/blob/master/init/main.c#L413) function. `io_delay_param` function gets the argument of the `io_delay` kernel command line parameter and sets `io_delay_type` depends on it: +More about `early_param` you can read in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html). So the `io_delay_param` function which setups `io_delay_override` variable will be called in the [do_early_param](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L413) function. `io_delay_param` function gets the argument of the `io_delay` kernel command line parameter and sets `io_delay_type` depends on it: ```C static int __init io_delay_param(char *s) @@ -127,7 +127,7 @@ The next functions are `acpi_boot_table_init`, `early_acpi_boot_init` and `initm Allocate area for DMA -------------------------------------------------------------------------------- -In the next step we need to allocate area for the [Direct memory access](http://en.wikipedia.org/wiki/Direct_memory_access) with the `dma_contiguous_reserve` function which is defined in the [drivers/base/dma-contiguous.c](https://github.com/torvalds/linux/blob/master/drivers/base/dma-contiguous.c). `DMA` is a special mode when devices communicate with memory without CPU. Note that we pass one parameter - `max_pfn_mapped << PAGE_SHIFT`, to the `dma_contiguous_reserve` function and as you can understand from this expression, this is limit of the reserved memory. Let's look on the implementation of this function. It starts from the definition of the following variables: +In the next step we need to allocate area for the [Direct memory access](http://en.wikipedia.org/wiki/Direct_memory_access) with the `dma_contiguous_reserve` function which is defined in the [drivers/base/dma-contiguous.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/base/dma-contiguous.c). `DMA` is a special mode when devices communicate with memory without CPU. Note that we pass one parameter - `max_pfn_mapped << PAGE_SHIFT`, to the `dma_contiguous_reserve` function and as you can understand from this expression, this is limit of the reserved memory. Let's look on the implementation of this function. It starts from the definition of the following variables: ```C phys_addr_t selected_size = 0; @@ -189,7 +189,7 @@ The next step is the call of the function - `x86_init.paging.pagetable_init`. If #define native_pagetable_init paging_init ``` -which expands as you can see to the call of the `paging_init` function from the [arch/x86/mm/init_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/init_64.c). The `paging_init` function initializes sparse memory and zone sizes. First of all what's zones and what is it `Sparsemem`. The `Sparsemem` is a special foundation in the linux kernel memory manager which used to split memory area into different memory banks in the [NUMA](http://en.wikipedia.org/wiki/Non-uniform_memory_access) systems. Let's look on the implementation of the `paginig_init` function: +which expands as you can see to the call of the `paging_init` function from the [arch/x86/mm/init_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/init_64.c). The `paging_init` function initializes sparse memory and zone sizes. First of all what's zones and what is it `Sparsemem`. The `Sparsemem` is a special foundation in the linux kernel memory manager which used to split memory area into different memory banks in the [NUMA](http://en.wikipedia.org/wiki/Non-uniform_memory_access) systems. Let's look on the implementation of the `paginig_init` function: ```C void __init paging_init(void) @@ -205,7 +205,7 @@ void __init paging_init(void) } ``` -As you can see there is call of the `sparse_memory_present_with_active_regions` function which records a memory area for every `NUMA` node to the array of the `mem_section` structure which contains a pointer to the structure of the array of `struct page`. The next `sparse_init` function allocates non-linear `mem_section` and `mem_map`. In the next step we clear state of the movable memory nodes and initialize sizes of zones. Every `NUMA` node is divided into a number of pieces which are called - `zones`. So, `zone_sizes_init` function from the [arch/x86/mm/init.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/init.c) initializes size of zones. +As you can see there is call of the `sparse_memory_present_with_active_regions` function which records a memory area for every `NUMA` node to the array of the `mem_section` structure which contains a pointer to the structure of the array of `struct page`. The next `sparse_init` function allocates non-linear `mem_section` and `mem_map`. In the next step we clear state of the movable memory nodes and initialize sizes of zones. Every `NUMA` node is divided into a number of pieces which are called - `zones`. So, `zone_sizes_init` function from the [arch/x86/mm/init.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/init.c) initializes size of zones. Again, this part and next parts do not cover this theme in full details. There will be special part about `NUMA`. @@ -222,7 +222,7 @@ if (boot_cpu_data.cpuid_level >= 0) { } ``` -The next function which you can see is `map_vsyscal` from the [arch/x86/kernel/vsyscall_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vsyscall_64.c). This function maps memory space for [vsyscalls](https://lwn.net/Articles/446528/) and depends on `CONFIG_X86_VSYSCALL_EMULATION` kernel configuration option. Actually `vsyscall` is a special segment which provides fast access to the certain system calls like `getcpu`, etc. Let's look on implementation of this function: +The next function which you can see is `map_vsyscal` from the [arch/x86/kernel/vsyscall_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vsyscall_64.c). This function maps memory space for [vsyscalls](https://lwn.net/Articles/446528/) and depends on `CONFIG_X86_VSYSCALL_EMULATION` kernel configuration option. Actually `vsyscall` is a special segment which provides fast access to the certain system calls like `getcpu`, etc. Let's look on implementation of this function: ```C void __init map_vsyscall(void) @@ -241,7 +241,7 @@ void __init map_vsyscall(void) } ``` -In the beginning of the `map_vsyscall` we can see definition of two variables. The first is extern variable `__vsyscall_page`. As a extern variable, it defined somewhere in other source code file. Actually we can see definition of the `__vsyscall_page` in the [arch/x86/kernel/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vsyscall_emu_64.S). The `__vsyscall_page` symbol points to the aligned calls of the `vsyscalls` as `gettimeofday`, etc.: +In the beginning of the `map_vsyscall` we can see definition of two variables. The first is extern variable `__vsyscall_page`. As a extern variable, it defined somewhere in other source code file. Actually we can see definition of the `__vsyscall_page` in the [arch/x86/kernel/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vsyscall_emu_64.S). The `__vsyscall_page` symbol points to the aligned calls of the `vsyscalls` as `gettimeofday`, etc.: ```assembly .globl __vsyscall_page @@ -308,7 +308,7 @@ if (smp_found_config) get_smp_config(); ``` -The `get_smp_config` expands to the `x86_init.mpparse.default_get_smp_config` function which is defined in the [arch/x86/kernel/mpparse.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/mpparse.c). This function defines a pointer to the multiprocessor floating pointer structure - `mpf_intel` (you can read about it in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html)) and does some checks: +The `get_smp_config` expands to the `x86_init.mpparse.default_get_smp_config` function which is defined in the [arch/x86/kernel/mpparse.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/mpparse.c). This function defines a pointer to the multiprocessor floating pointer structure - `mpf_intel` (you can read about it in the previous [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/%20linux-initialization-6.html)) and does some checks: ```C struct mpf_intel *mpf = mpf_found; @@ -334,7 +334,7 @@ That's all, and now we can back to the `start_kernel` from the `setup_arch`. Back to the main.c ================================================================================ -As I wrote above, we have finished with the `setup_arch` function and now we can back to the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). As you may remember or saw yourself, `start_kernel` function as big as the `setup_arch`. So the couple of the next part will be dedicated to learning of this function. So, let's continue with it. After the `setup_arch` we can see the call of the `mm_init_cpumask` function. This function sets the [cpumask](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) pointer to the memory descriptor `cpumask`. We can look on its implementation: +As I wrote above, we have finished with the `setup_arch` function and now we can back to the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). As you may remember or saw yourself, `start_kernel` function as big as the `setup_arch`. So the couple of the next part will be dedicated to learning of this function. So, let's continue with it. After the `setup_arch` we can see the call of the `mm_init_cpumask` function. This function sets the [cpumask](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) pointer to the memory descriptor `cpumask`. We can look on its implementation: ```C static inline void mm_init_cpumask(struct mm_struct *mm) @@ -346,7 +346,7 @@ static inline void mm_init_cpumask(struct mm_struct *mm) } ``` -As you can see in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c), we pass memory descriptor of the init process to the `mm_init_cpumask` and depends on `CONFIG_CPUMASK_OFFSTACK` configuration option we clear [TLB](http://en.wikipedia.org/wiki/Translation_lookaside_buffer) switch `cpumask`. +As you can see in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c), we pass memory descriptor of the init process to the `mm_init_cpumask` and depends on `CONFIG_CPUMASK_OFFSTACK` configuration option we clear [TLB](http://en.wikipedia.org/wiki/Translation_lookaside_buffer) switch `cpumask`. In the next step we can see the call of the following function: @@ -471,7 +471,7 @@ Links * [x86_64](http://en.wikipedia.org/wiki/X86-64) * [initrd](http://en.wikipedia.org/wiki/Initrd) * [Kernel panic](http://en.wikipedia.org/wiki/Kernel_panic) -* [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/master/Documentation/kernel-parameters.txt) +* [Documentation/kernel-parameters.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt) * [ACPI](http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface) * [Direct memory access](http://en.wikipedia.org/wiki/Direct_memory_access) * [NUMA](http://en.wikipedia.org/wiki/Non-uniform_memory_access) diff --git a/Initialization/linux-initialization-8.md b/Initialization/linux-initialization-8.md index 9bcccd3..24da32c 100644 --- a/Initialization/linux-initialization-8.md +++ b/Initialization/linux-initialization-8.md @@ -6,9 +6,9 @@ Scheduler initialization This is the eighth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) of the Linux kernel initialization process chapter and we stopped on the `setup_nr_cpu_ids` function in the [previous part](https://github.com/0xAX/linux-insides/blob/master/Initialization/linux-initialization-7.md). -The main point of this part is [scheduler](http://en.wikipedia.org/wiki/Scheduling_%28computing%29) initialization. But before we will start to learn initialization process of the scheduler, we need to do some stuff. The next step in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) is the `setup_per_cpu_areas` function. This function setups memory areas for the `percpu` variables, more about it you can read in the special part about the [Per-CPU variables](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html). After `percpu` areas is up and running, the next step is the `smp_prepare_boot_cpu` function. +The main point of this part is [scheduler](http://en.wikipedia.org/wiki/Scheduling_%28computing%29) initialization. But before we will start to learn initialization process of the scheduler, we need to do some stuff. The next step in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) is the `setup_per_cpu_areas` function. This function setups memory areas for the `percpu` variables, more about it you can read in the special part about the [Per-CPU variables](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html). After `percpu` areas is up and running, the next step is the `smp_prepare_boot_cpu` function. -This function does some preparations for [symmetric multiprocessing](http://en.wikipedia.org/wiki/Symmetric_multiprocessing). Since this function is architecture specific, it is located in the [arch/x86/include/asm/smp.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/smp.h#L78) Linux kernel header file. Let's look at the definition of this function: +This function does some preparations for [symmetric multiprocessing](http://en.wikipedia.org/wiki/Symmetric_multiprocessing). Since this function is architecture specific, it is located in the [arch/x86/include/asm/smp.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/smp.h#L78) Linux kernel header file. Let's look at the definition of this function: ```C static inline void smp_prepare_boot_cpu(void) @@ -17,7 +17,7 @@ static inline void smp_prepare_boot_cpu(void) } ``` -We may see here that it just calls the `smp_prepare_boot_cpu` callback of the `smp_ops` structure. If we look at the definition of instance of this structure from the [arch/x86/kernel/smp.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/smp.c) source code file, we will see that the `smp_prepare_boot_cpu` expands to the call of the `native_smp_prepare_boot_cpu` function: +We may see here that it just calls the `smp_prepare_boot_cpu` callback of the `smp_ops` structure. If we look at the definition of instance of this structure from the [arch/x86/kernel/smp.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/smp.c) source code file, we will see that the `smp_prepare_boot_cpu` expands to the call of the `native_smp_prepare_boot_cpu` function: ```C struct smp_ops smp_ops = { @@ -75,7 +75,7 @@ static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) The `get_cpu_gdt_table` uses `per_cpu` macro for getting value of a `gdt_page` percpu variable for the given CPU number (bootstrap processor with `id` - 0 in our case). -You may ask the following question: so, if we can access `gdt_page` percpu variable, where it was defined? Actually we already saw it in this book. If you have read the first [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html) of this chapter, you can remember that we saw definition of the `gdt_page` in the [arch/x86/kernel/head_64.S](https://github.com/0xAX/linux/blob/master/arch/x86/kernel/head_64.S): +You may ask the following question: so, if we can access `gdt_page` percpu variable, where it was defined? Actually we already saw it in this book. If you have read the first [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html) of this chapter, you can remember that we saw definition of the `gdt_page` in the [arch/x86/kernel/head_64.S](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/kernel/head_64.S): ```assembly early_gdt_descr: @@ -84,14 +84,14 @@ early_gdt_descr_base: .quad INIT_PER_CPU_VAR(gdt_page) ``` -and if we will look on the [linker](https://github.com/0xAX/linux/blob/master/arch/x86/kernel/vmlinux.lds.S) file we can see that it locates after the `__per_cpu_load` symbol: +and if we will look on the [linker](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/kernel/vmlinux.lds.S) file we can see that it locates after the `__per_cpu_load` symbol: ```C #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load INIT_PER_CPU(gdt_page); ``` -and filled `gdt_page` in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c#L94): +and filled `gdt_page` in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c#L94): ```C DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { @@ -180,12 +180,12 @@ Node 0, zone Normal ... ``` -As I wrote above all nodes are described with the `pglist_data` or `pg_data_t` structure in memory. This structure is defined in the [include/linux/mmzone.h](https://github.com/torvalds/linux/blob/master/include/linux/mmzone.h). The `build_all_zonelists` function from the [mm/page_alloc.c](https://github.com/torvalds/linux/blob/master/mm/page_alloc.c) constructs an ordered `zonelist` (of different zones `DMA`, `DMA32`, `NORMAL`, `HIGH_MEMORY`, `MOVABLE`) which specifies the zones/nodes to visit when a selected `zone` or `node` cannot satisfy the allocation request. That's all. More about `NUMA` and multiprocessor systems will be in the special part. +As I wrote above all nodes are described with the `pglist_data` or `pg_data_t` structure in memory. This structure is defined in the [include/linux/mmzone.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mmzone.h). The `build_all_zonelists` function from the [mm/page_alloc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/page_alloc.c) constructs an ordered `zonelist` (of different zones `DMA`, `DMA32`, `NORMAL`, `HIGH_MEMORY`, `MOVABLE`) which specifies the zones/nodes to visit when a selected `zone` or `node` cannot satisfy the allocation request. That's all. More about `NUMA` and multiprocessor systems will be in the special part. The rest of the stuff before scheduler initialization -------------------------------------------------------------------------------- -Before we will start to dive into linux kernel scheduler initialization process we must do a couple of things. The first thing is the `page_alloc_init` function from the [mm/page_alloc.c](https://github.com/torvalds/linux/blob/master/mm/page_alloc.c). This function looks pretty easy: +Before we will start to dive into linux kernel scheduler initialization process we must do a couple of things. The first thing is the `page_alloc_init` function from the [mm/page_alloc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/page_alloc.c). This function looks pretty easy: ```C void __init page_alloc_init(void) @@ -207,7 +207,7 @@ After this function we can see the kernel command line in the initialization out And a couple of functions such as `parse_early_param` and `parse_args` which handles linux kernel command line. You may remember that we already saw the call of the `parse_early_param` function in the sixth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-6.html) of the kernel initialization chapter, so why we call it again? Answer is simple: we call this function in the architecture-specific code (`x86_64` in our case), but not all architecture calls this function. And we need to call the second function `parse_args` to parse and handle non-early command line arguments. -In the next step we can see the call of the `jump_label_init` from the [kernel/jump_label.c](https://github.com/torvalds/linux/blob/master/kernel/jump_label.c). and initializes [jump label](https://lwn.net/Articles/412072/). +In the next step we can see the call of the `jump_label_init` from the [kernel/jump_label.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/jump_label.c). and initializes [jump label](https://lwn.net/Articles/412072/). After this we can see the call of the `setup_log_buf` function which setups the [printk](http://www.makelinux.net/books/lkd2/ch18lev1sec3) log buffer. We already saw this function in the seventh [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-7.html) of the linux kernel initialization process chapter. @@ -230,7 +230,7 @@ pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, ``` The number of elements of the `pid_hash` depends on the `RAM` configuration, but it can be between `2^4` and `2^12`. The `pidhash_init` computes the size -and allocates the required storage (which is `hlist` in our case - the same as [doubly linked list](http://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html), but contains one pointer instead on the [struct hlist_head](https://github.com/torvalds/linux/blob/master/include/linux/types.h)]. The `alloc_large_system_hash` function allocates a large system hash table with `memblock_virt_alloc_nopanic` if we pass `HASH_EARLY` flag (as it in our case) or with `__vmalloc` if we did no pass this flag. +and allocates the required storage (which is `hlist` in our case - the same as [doubly linked list](http://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html), but contains one pointer instead on the [struct hlist_head](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/types.h)]. The `alloc_large_system_hash` function allocates a large system hash table with `memblock_virt_alloc_nopanic` if we pass `HASH_EARLY` flag (as it in our case) or with `__vmalloc` if we did no pass this flag. The result we can see in the `dmesg` output: @@ -244,7 +244,7 @@ $ dmesg | grep hash That's all. The rest of the stuff before scheduler initialization is the following functions: `vfs_caches_init_early` does early initialization of the [virtual file system](http://en.wikipedia.org/wiki/Virtual_file_system) (more about it will be in the chapter which will describe virtual file system), `sort_main_extable` sorts the kernel's built-in exception table entries which are between `__start___ex_table` and `__stop___ex_table`, and `trap_init` initializes trap handlers (more about last two function we will know in the separate chapter about interrupts). -The last step before the scheduler initialization is initialization of the memory manager with the `mm_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). As we can see, the `mm_init` function initializes different parts of the linux kernel memory manager: +The last step before the scheduler initialization is initialization of the memory manager with the `mm_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). As we can see, the `mm_init` function initializes different parts of the linux kernel memory manager: ```C page_ext_init_flatmem(); @@ -264,7 +264,7 @@ Scheduler initialization And now we come to the main purpose of this part - initialization of the task scheduler. I want to say again as I already did it many times, you will not see the full explanation of the scheduler here, there will be special separate chapter about this. Here will be described first initial scheduler mechanisms which are initialized first of all. So let's start. -Our current point is the `sched_init` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/master/kernel/sched/core.c) kernel source code file and as we can understand from the function's name, it initializes scheduler. Let's start to dive into this function and try to understand how the scheduler is initialized. At the start of the `sched_init` function we can see the following call: +Our current point is the `sched_init` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/core.c) kernel source code file and as we can understand from the function's name, it initializes scheduler. Let's start to dive into this function and try to understand how the scheduler is initialized. At the start of the `sched_init` function we can see the following call: ```C sched_clock_init(); @@ -364,7 +364,7 @@ ptr = (unsigned long)kzalloc(alloc_size, GFP_NOWAIT); As I already mentioned, the Linux group scheduling mechanism allows to specify a hierarchy. The root of such hierarchies is the `root_runqueuetask_group` task group structure. This structure contains many fields, but we are interested in `se`, `rt_se`, `cfs_rq` and `rt_rq` for this moment: -The first two are instances of `sched_entity` structure. It is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/master/include/linux/sched.h) kernel header filed and used by the scheduler as a unit of scheduling. +The first two are instances of `sched_entity` structure. It is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/sched.h) kernel header filed and used by the scheduler as a unit of scheduling. ```C struct task_group { @@ -413,7 +413,7 @@ That's all with the bandwiths of `real-time` and `deadline` tasks and in the nex #endif ``` -The real-time scheduler requires global resources to make scheduling decision. But unfortunately scalability bottlenecks appear as the number of CPUs increase. The concept of `root domains` was introduced for improving scalability and avoid such bottlenecks. Instead of bypassing over all `run queues`, the scheduler gets information about a CPU where/from to push/pull a `real-time` task from the `root_domain` structure. This structure is defined in the [kernel/sched/sched.h](https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h) kernel header file and just keeps track of CPUs that can be used to push or pull a process. +The real-time scheduler requires global resources to make scheduling decision. But unfortunately scalability bottlenecks appear as the number of CPUs increase. The concept of `root domains` was introduced for improving scalability and avoid such bottlenecks. Instead of bypassing over all `run queues`, the scheduler gets information about a CPU where/from to push/pull a `real-time` task from the `root_domain` structure. This structure is defined in the [kernel/sched/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/sched.h) kernel header file and just keeps track of CPUs that can be used to push or pull a process. After `root domain` initialization, we make initialization of the `bandwidth` for the `real-time` tasks of the `root task group` as we did the same above: ```C @@ -455,7 +455,7 @@ for_each_possible_cpu(i) { ... ``` -The `rq` structure in the Linux kernel is defined in the [kernel/sched/sched.h](https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h#L625). As I already mentioned this above, a `run queue` is a fundamental data structure in a scheduling process. The scheduler uses it to determine who will be runned next. As you may see, this structure has many different fields and we will not cover all of them here, but we will look on them when they will be directly used. +The `rq` structure in the Linux kernel is defined in the [kernel/sched/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/sched.h#L625). As I already mentioned this above, a `run queue` is a fundamental data structure in a scheduling process. The scheduler uses it to determine who will be runned next. As you may see, this structure has many different fields and we will not cover all of them here, but we will look on them when they will be directly used. After initialization of `per-cpu` run queues with default values, we need to setup `load weight` of the first task in the system: diff --git a/Initialization/linux-initialization-9.md b/Initialization/linux-initialization-9.md index 35ec3a1..1a8d9ff 100644 --- a/Initialization/linux-initialization-9.md +++ b/Initialization/linux-initialization-9.md @@ -4,12 +4,12 @@ Kernel initialization. Part 9. RCU initialization ================================================================================ -This is ninth part of the [Linux Kernel initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) and in the previous part we stopped at the [scheduler initialization](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-8.html). In this part we will continue to dive to the linux kernel initialization process and the main purpose of this part will be to learn about initialization of the [RCU](http://en.wikipedia.org/wiki/Read-copy-update). We can see that the next step in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) after the `sched_init` is the call of the `preempt_disable`. There are two macros: +This is ninth part of the [Linux Kernel initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) and in the previous part we stopped at the [scheduler initialization](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-8.html). In this part we will continue to dive to the linux kernel initialization process and the main purpose of this part will be to learn about initialization of the [RCU](http://en.wikipedia.org/wiki/Read-copy-update). We can see that the next step in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) after the `sched_init` is the call of the `preempt_disable`. There are two macros: * `preempt_disable` * `preempt_enable` -for preemption disabling and enabling. First of all let's try to understand what is `preempt` in the context of an operating system kernel. In simple words, preemption is ability of the operating system kernel to preempt current task to run task with higher priority. Here we need to disable preemption because we will have only one `init` process for the early boot time and we don't need to stop it before we call `cpu_idle` function. The `preempt_disable` macro is defined in the [include/linux/preempt.h](https://github.com/torvalds/linux/blob/master/include/linux/preempt.h) and depends on the `CONFIG_PREEMPT_COUNT` kernel configuration option. This macro is implemented as: +for preemption disabling and enabling. First of all let's try to understand what is `preempt` in the context of an operating system kernel. In simple words, preemption is ability of the operating system kernel to preempt current task to run task with higher priority. Here we need to disable preemption because we will have only one `init` process for the early boot time and we don't need to stop it before we call `cpu_idle` function. The `preempt_disable` macro is defined in the [include/linux/preempt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/preempt.h) and depends on the `CONFIG_PREEMPT_COUNT` kernel configuration option. This macro is implemented as: ```C #define preempt_disable() \ @@ -71,7 +71,7 @@ That's all. Preemption is disabled and we can go ahead. Initialization of the integer ID management -------------------------------------------------------------------------------- -In the next step we can see the call of the `idr_init_cache` function which defined in the [lib/idr.c](https://github.com/torvalds/linux/blob/master/lib/idr.c). The `idr` library is used in a various [places](http://lxr.free-electrons.com/ident?i=idr_find) in the linux kernel to manage assigning integer `IDs` to objects and looking up objects by id. +In the next step we can see the call of the `idr_init_cache` function which defined in the [lib/idr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/idr.c). The `idr` library is used in a various [places](http://lxr.free-electrons.com/ident?i=idr_find) in the linux kernel to manage assigning integer `IDs` to objects and looking up objects by id. Let's look on the implementation of the `idr_init_cache` function: @@ -83,7 +83,7 @@ void __init idr_init_cache(void) } ``` -Here we can see the call of the `kmem_cache_create`. We already called the `kmem_cache_init` in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c#L485). This function create generalized caches again using the `kmem_cache_alloc` (more about caches we will see in the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html) chapter). In our case, as we are using `kmem_cache_t` which will be used by the [slab](http://en.wikipedia.org/wiki/Slab_allocation) allocator and `kmem_cache_create` creates it. As you can see we pass five parameters to the `kmem_cache_create`: +Here we can see the call of the `kmem_cache_create`. We already called the `kmem_cache_init` in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L485). This function create generalized caches again using the `kmem_cache_alloc` (more about caches we will see in the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html) chapter). In our case, as we are using `kmem_cache_t` which will be used by the [slab](http://en.wikipedia.org/wiki/Slab_allocation) allocator and `kmem_cache_create` creates it. As you can see we pass five parameters to the `kmem_cache_create`: * name of the cache; * size of the object to store in cache; @@ -91,7 +91,7 @@ Here we can see the call of the `kmem_cache_create`. We already called the `kmem * flags; * constructor for the objects. -and it will create `kmem_cache` for the integer IDs. Integer `IDs` is commonly used pattern to map set of integer IDs to the set of pointers. We can see usage of the integer IDs in the [i2c](http://en.wikipedia.org/wiki/I%C2%B2C) drivers subsystem. For example [drivers/i2c/i2c-core.c](https://github.com/torvalds/linux/blob/master/drivers/i2c/i2c-core.c) which represents the core of the `i2c` subsystem defines `ID` for the `i2c` adapter with the `DEFINE_IDR` macro: +and it will create `kmem_cache` for the integer IDs. Integer `IDs` is commonly used pattern to map set of integer IDs to the set of pointers. We can see usage of the integer IDs in the [i2c](http://en.wikipedia.org/wiki/I%C2%B2C) drivers subsystem. For example [drivers/i2c/i2c-core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/i2c/i2c-core.c) which represents the core of the `i2c` subsystem defines `ID` for the `i2c` adapter with the `DEFINE_IDR` macro: ```C static DEFINE_IDR(i2c_adapter_idr); @@ -125,13 +125,13 @@ The next step is [RCU](http://en.wikipedia.org/wiki/Read-copy-update) initializa * `CONFIG_TINY_RCU` * `CONFIG_TREE_RCU` -In the first case `rcu_init` will be in the [kernel/rcu/tiny.c](https://github.com/torvalds/linux/blob/master/kernel/rcu/tiny.c) and in the second case it will be defined in the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.c). We will see the implementation of the `tree rcu`, but first of all about the `RCU` in general. +In the first case `rcu_init` will be in the [kernel/rcu/tiny.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tiny.c) and in the second case it will be defined in the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.c). We will see the implementation of the `tree rcu`, but first of all about the `RCU` in general. `RCU` or read-copy update is a scalable high-performance synchronization mechanism implemented in the Linux kernel. On the early stage the linux kernel provided support and environment for the concurrently running applications, but all execution was serialized in the kernel using a single global lock. In our days linux kernel has no single global lock, but provides different mechanisms including [lock-free data structures](http://en.wikipedia.org/wiki/Concurrent_data_structure), [percpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) data structures and other. One of these mechanisms is - the `read-copy update`. The `RCU` technique is designed for rarely-modified data structures. The idea of the `RCU` is simple. For example we have a rarely-modified data structure. If somebody wants to change this data structure, we make a copy of this data structure and make all changes in the copy. In the same time all other users of the data structure use old version of it. Next, we need to choose safe moment when original version of the data structure will have no users and update it with the modified copy. Of course this description of the `RCU` is very simplified. To understand some details about `RCU`, first of all we need to learn some terminology. Data readers in the `RCU` executed in the [critical section](http://en.wikipedia.org/wiki/Critical_section). Every time when data reader get to the critical section, it calls the `rcu_read_lock`, and `rcu_read_unlock` on exit from the critical section. If the thread is not in the critical section, it will be in state which called - `quiescent state`. The moment when every thread is in the `quiescent state` called - `grace period`. If a thread wants to remove an element from the data structure, this occurs in two steps. First step is `removal` - atomically removes element from the data structure, but does not release the physical memory. After this thread-writer announces and waits until it is finished. From this moment, the removed element is available to the thread-readers. After the `grace period` finished, the second step of the element removal will be started, it just removes the element from the physical memory. -There a couple of implementations of the `RCU`. Old `RCU` called classic, the new implementation called `tree` RCU. As you may already understand, the `CONFIG_TREE_RCU` kernel configuration option enables tree `RCU`. Another is the `tiny` RCU which depends on `CONFIG_TINY_RCU` and `CONFIG_SMP=n`. We will see more details about the `RCU` in general in the separate chapter about synchronization primitives, but now let's look on the `rcu_init` implementation from the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.c): +There a couple of implementations of the `RCU`. Old `RCU` called classic, the new implementation called `tree` RCU. As you may already understand, the `CONFIG_TREE_RCU` kernel configuration option enables tree `RCU`. Another is the `tiny` RCU which depends on `CONFIG_TINY_RCU` and `CONFIG_SMP=n`. We will see more details about the `RCU` in general in the separate chapter about synchronization primitives, but now let's look on the `rcu_init` implementation from the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.c): ```C void __init rcu_init(void) @@ -186,7 +186,7 @@ determined by the number of CPUs and by CONFIG_RCU_FANOUT. Small systems will have a "hierarchy" consisting of a single rcu_node. ``` -The `rcu_node` structure is defined in the [kernel/rcu/tree.h](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.h) and contains information about current grace period, is grace period completed or not, CPUs or groups that need to switch in order for current grace period to proceed, etc. Every `rcu_node` contains a lock for a couple of CPUs. These `rcu_node` structures are embedded into a linear array in the `rcu_state` structure and represented as a tree with the root as the first element and covers all CPUs. As you can see the number of the rcu nodes determined by the `NUM_RCU_NODES` which depends on number of available CPUs: +The `rcu_node` structure is defined in the [kernel/rcu/tree.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.h) and contains information about current grace period, is grace period completed or not, CPUs or groups that need to switch in order for current grace period to proceed, etc. Every `rcu_node` contains a lock for a couple of CPUs. These `rcu_node` structures are embedded into a linear array in the `rcu_state` structure and represented as a tree with the root as the first element and covers all CPUs. As you can see the number of the rcu nodes determined by the `NUM_RCU_NODES` which depends on number of available CPUs: ```C #define NUM_RCU_NODES (RCU_SUM - NR_CPUS) @@ -271,7 +271,7 @@ for (i = 2; i <= MAX_RCU_LVLS; i++) rcu_capacity[i] = rcu_capacity[i - 1] * CONFIG_RCU_FANOUT; ``` -And in the last step we calculate the number of rcu_nodes at each level of the tree in the [loop](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.c#L4094). +And in the last step we calculate the number of rcu_nodes at each level of the tree in the [loop](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.c#L4094). As we calculated geometry of the `rcu_node` tree, we need to go back to the `rcu_init` function and next step we need to initialize two `rcu_state` structures with the `rcu_init_one` function: @@ -285,7 +285,7 @@ The `rcu_init_one` function takes two arguments: * Global `RCU` state; * Per-CPU data for `RCU`. -Both variables defined in the [kernel/rcu/tree.h](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.h) with its `percpu` data: +Both variables defined in the [kernel/rcu/tree.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.h) with its `percpu` data: ``` extern struct rcu_state rcu_bh_state; @@ -307,7 +307,7 @@ struct softirq_action }; ``` -which is defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/master/include/linux/interrupt.h) and contains only one field - handler of an interrupt. You can check about `softirqs` in the your system with the: +which is defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/interrupt.h) and contains only one field - handler of an interrupt. You can check about `softirqs` in the your system with the: ``` $ cat /proc/softirqs @@ -338,7 +338,7 @@ void open_softirq(int nr, void (*action)(struct softirq_action *)) } ``` -In our case the interrupt handler is - `rcu_process_callbacks` which is defined in the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/master/kernel/rcu/tree.c) and does the `RCU` core processing for the current CPU. After we registered `softirq` interrupt for the `RCU`, we can see the following code: +In our case the interrupt handler is - `rcu_process_callbacks` which is defined in the [kernel/rcu/tree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/rcu/tree.c) and does the `RCU` core processing for the current CPU. After we registered `softirq` interrupt for the `RCU`, we can see the following code: ```C cpu_notifier(rcu_cpu_notify, 0); @@ -376,9 +376,9 @@ Ok, we already passed the main theme of this part which is `RCU` initialization, * They have the character of debugging and not important for now; * We will see many of this stuff in the separate parts/chapters. -After we initialized `RCU`, the next step which you can see in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) is the - `trace_init` function. As you can understand from its name, this function initialize [tracing](http://en.wikipedia.org/wiki/Tracing_%28software%29) subsystem. You can read more about linux kernel trace system - [here](http://elinux.org/Kernel_Trace_Systems). +After we initialized `RCU`, the next step which you can see in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) is the - `trace_init` function. As you can understand from its name, this function initialize [tracing](http://en.wikipedia.org/wiki/Tracing_%28software%29) subsystem. You can read more about linux kernel trace system - [here](http://elinux.org/Kernel_Trace_Systems). -After the `trace_init`, we can see the call of the `radix_tree_init`. If you are familiar with the different data structures, you can understand from the name of this function that it initializes kernel implementation of the [Radix tree](http://en.wikipedia.org/wiki/Radix_tree). This function is defined in the [lib/radix-tree.c](https://github.com/torvalds/linux/blob/master/lib/radix-tree.c) and you can read more about it in the part about [Radix tree](https://0xax.gitbooks.io/linux-insides/content/DataStructures/radix-tree.html). +After the `trace_init`, we can see the call of the `radix_tree_init`. If you are familiar with the different data structures, you can understand from the name of this function that it initializes kernel implementation of the [Radix tree](http://en.wikipedia.org/wiki/Radix_tree). This function is defined in the [lib/radix-tree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/radix-tree.c) and you can read more about it in the part about [Radix tree](https://0xax.gitbooks.io/linux-insides/content/DataStructures/radix-tree.html). In the next step we can see the functions which are related to the `interrupts handling` subsystem, they are: @@ -396,7 +396,7 @@ local_irq_enable(); which expands to the `sti` instruction and making post initialization of the [SLAB](http://en.wikipedia.org/wiki/Slab_allocation) with the call of the `kmem_cache_init_late` function (As I wrote above we will know about the `SLAB` in the [Linux memory management](http://0xax.gitbooks.io/linux-insides/content/mm/index.html) chapter). -After the post initialization of the `SLAB`, next point is initialization of the console with the `console_init` function from the [drivers/tty/tty_io.c](https://github.com/torvalds/linux/blob/master/drivers/tty/tty_io.c). +After the post initialization of the `SLAB`, next point is initialization of the console with the `console_init` function from the [drivers/tty/tty_io.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/tty/tty_io.c). After the console initialization, we can see the `lockdep_info` function which prints information about the [Lock dependency validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt). After this, we can see the initialization of the dynamic allocation of the `debug objects` with the `debug_objects_mem_init`, kernel memory leak [detector](https://www.kernel.org/doc/Documentation/kmemleak.txt) initialization with the `kmemleak_init`, `percpu` pageset setup with the `setup_per_cpu_pageset`, setup of the [NUMA](http://en.wikipedia.org/wiki/Non-uniform_memory_access) policy with the `numa_policy_init`, setting time for the scheduler with the `sched_clock_init`, `pidmap` initialization with the call of the `pidmap_init` function for the initial `PID` namespace, cache creation with the `anon_vma_init` for the private virtual memory areas and early initialization of the [ACPI](http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface) with the `acpi_early_init`. @@ -405,7 +405,7 @@ This is the end of the ninth part of the [linux kernel initialization process](h Conclusion -------------------------------------------------------------------------------- -It is the end of the ninth part about the linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html). In this part, we looked on the initialization process of the `RCU` subsystem. In the next part we will continue to dive into linux kernel initialization process and I hope that we will finish with the `start_kernel` function and will go to the `rest_init` function from the same [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file and will see the start of the first process. +It is the end of the ninth part about the linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html). In this part, we looked on the initialization process of the `RCU` subsystem. In the next part we will continue to dive into linux kernel initialization process and I hope that we will finish with the `start_kernel` function and will go to the `rest_init` function from the same [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file and will see the start of the first process. If you have any questions or suggestions write me a comment or ping me at [twitter](https://twitter.com/0xAX). diff --git a/LINKS.md b/LINKS.md index f4e971d..638a40f 100644 --- a/LINKS.md +++ b/LINKS.md @@ -5,7 +5,7 @@ Linux boot ------------------------ * [Linux/x86 boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) -* [Linux kernel parameters](https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.rst) +* [Linux kernel parameters](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/admin-guide/kernel-parameters.rst) Protected mode ------------------------ diff --git a/Misc/contribute.md b/Misc/contribute.md index a6b2f63..07eb1bf 100644 --- a/Misc/contribute.md +++ b/Misc/contribute.md @@ -100,11 +100,11 @@ If your current Linux kernel was built with the support for access to the `/proc $ cat /proc/config.gz | gunzip > ~/dev/linux/.config ``` -If you are not satisfied with the standard kernel configuration that is provided by the maintainers of your distro, you can configure the Linux kernel manually. There are a couple of ways to do it. The Linux kernel root [Makefile](https://github.com/torvalds/linux/blob/master/Makefile) provides a set of targets that allows you to configure it. For example `menuconfig` provides a menu-driven interface for the kernel configuration: +If you are not satisfied with the standard kernel configuration that is provided by the maintainers of your distro, you can configure the Linux kernel manually. There are a couple of ways to do it. The Linux kernel root [Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile) provides a set of targets that allows you to configure it. For example `menuconfig` provides a menu-driven interface for the kernel configuration: ![menuconfig](http://s21.postimg.org/zcz48p7yf/menucnonfig.png) -The `defconfig` argument generates the default kernel configuration file for the current architecture, for example [x86_64 defconfig](https://github.com/torvalds/linux/blob/master/arch/x86/configs/x86_64_defconfig). You can pass the `ARCH` command line argument to `make` to build `defconfig` for the given architecture: +The `defconfig` argument generates the default kernel configuration file for the current architecture, for example [x86_64 defconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/configs/x86_64_defconfig). You can pass the `ARCH` command line argument to `make` to build `defconfig` for the given architecture: ``` $ make ARCH=arm64 defconfig @@ -314,7 +314,7 @@ static char *dgap_sindex(char *string, char *group) } ``` -This function looks for a match of any character in the group and returns that position. During research of source code of the Linux kernel, I have noted that the [lib/string.c](https://github.com/torvalds/linux/blob/master/lib/string.c#L473) source code file contains the implementation of the `strpbrk` function that does the same thing as `dgap_sinidex`. It is not a good idea to use a custom implementation of a function that already exists, so we can remove the `dgap_sindex` function from the [drivers/staging/dgap/dgap.c](https://github.com/torvalds/linux/blob/master/drivers/staging/dgap/dgap.c) source code file and use the `strpbrk` instead. +This function looks for a match of any character in the group and returns that position. During research of source code of the Linux kernel, I have noted that the [lib/string.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/string.c#L473) source code file contains the implementation of the `strpbrk` function that does the same thing as `dgap_sinidex`. It is not a good idea to use a custom implementation of a function that already exists, so we can remove the `dgap_sindex` function from the [drivers/staging/dgap/dgap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/staging/dgap/dgap.c) source code file and use the `strpbrk` instead. First of all let's create new `git` branch based on the current master that synced with the Linux kernel mainline repo: @@ -407,7 +407,7 @@ In the end of this part I want to give you some advice that will describe what t * Each time when you have changed something in the Linux kernel source code - compile it. After any changes. Again and again. Nobody likes changes that don't even compile. -* The Linux kernel has a coding style [guide](https://github.com/torvalds/linux/blob/master/Documentation/CodingStyle) and you need to comply with it. There is great script which can help to check your changes. This script is - [scripts/checkpatch.pl](https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl). Just pass source code file with changes to it and you will see: +* The Linux kernel has a coding style [guide](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/CodingStyle) and you need to comply with it. There is great script which can help to check your changes. This script is - [scripts/checkpatch.pl](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/checkpatch.pl). Just pass source code file with changes to it and you will see: ``` $ ./scripts/checkpatch.pl -f drivers/staging/dgap/dgap.c @@ -442,7 +442,7 @@ It's important that your email be in the [plain text](https://en.wikipedia.org/w * Do not be surprised if you do not get an immediate answer after you send your patch. Maintainers can be very busy. -* The [scripts](https://github.com/torvalds/linux/tree/master/scripts) directory contains many different useful scripts that are related to Linux kernel development. We already saw two scripts from this directory: the `checkpatch.pl` and the `get_maintainer.pl` scripts. Outside of those scripts, you can find the [stackusage](https://github.com/torvalds/linux/blob/master/scripts/stackusage) script that will print usage of the stack, [extract-vmlinux](https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux) for extracting an uncompressed kernel image, and many others. Outside of the `scripts` directory you can find some very useful [scripts](https://github.com/lorenzo-stoakes/kernel-scripts) by [Lorenzo Stoakes](https://twitter.com/ljsloz) for kernel development. +* The [scripts](https://github.com/torvalds/linux/tree/master/scripts) directory contains many different useful scripts that are related to Linux kernel development. We already saw two scripts from this directory: the `checkpatch.pl` and the `get_maintainer.pl` scripts. Outside of those scripts, you can find the [stackusage](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/stackusage) script that will print usage of the stack, [extract-vmlinux](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/extract-vmlinux) for extracting an uncompressed kernel image, and many others. Outside of the `scripts` directory you can find some very useful [scripts](https://github.com/lorenzo-stoakes/kernel-scripts) by [Lorenzo Stoakes](https://twitter.com/ljsloz) for kernel development. * Subscribe to the Linux kernel mailing list. There are a large number of letters every day on `lkml`, but it is very useful to read them and understand things such as the current state of the Linux kernel. Other than `lkml` there are [set](http://vger.kernel.org/vger-lists.html) mailing listings which are related to the different Linux kernel subsystems. @@ -483,7 +483,7 @@ Links * [procfs](https://en.wikipedia.org/wiki/Procfs) * [sysfs](https://en.wikipedia.org/wiki/Sysfs) * [Linux kernel mail listing archive](https://lkml.org/) -* [Linux kernel coding style guide](https://github.com/torvalds/linux/blob/master/Documentation/CodingStyle) -* [How to Get Your Change Into the Linux Kernel](https://github.com/torvalds/linux/blob/master/Documentation/SubmittingPatches) +* [Linux kernel coding style guide](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/CodingStyle) +* [How to Get Your Change Into the Linux Kernel](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/SubmittingPatches) * [Linux Kernel Newbies](http://kernelnewbies.org/) * [plain text](https://en.wikipedia.org/wiki/Plain_text) diff --git a/Misc/how_kernel_compiled.md b/Misc/how_kernel_compiled.md index 1aa4775..4c69990 100644 --- a/Misc/how_kernel_compiled.md +++ b/Misc/how_kernel_compiled.md @@ -6,7 +6,7 @@ Introduction I won't tell you how to build and install a custom Linux kernel on your machine. If you need help with this, you can find many [resources](https://encrypted.google.com/search?q=building+linux+kernel#q=building+linux+kernel+from+source+code) that will help you do it. Instead, we will learn what occurs when you execute `make` in the root directory of the Linux kernel source code. -When I started to study the source code of the Linux kernel, the [makefile](https://github.com/torvalds/linux/blob/master/Makefile) was the first file that I opened. And it was scary :). The [makefile](https://en.wikipedia.org/wiki/Make_%28software%29) contained `1591` lines of code when I wrote this part and the kernel was the [4.2.0-rc3](https://github.com/torvalds/linux/commit/52721d9d3334c1cb1f76219a161084094ec634dc) release. +When I started to study the source code of the Linux kernel, the [makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile) was the first file that I opened. And it was scary :). The [makefile](https://en.wikipedia.org/wiki/Make_%28software%29) contained `1591` lines of code when I wrote this part and the kernel was the [4.2.0-rc3](https://github.com/torvalds/linux/commit/52721d9d3334c1cb1f76219a161084094ec634dc) release. This makefile is the top makefile in the Linux kernel source code and the kernel building starts here. Yes, it is big, but moreover, if you've read the source code of the Linux kernel you may have noted that all directories containing source code has its own makefile. Of course it is not possible to describe how each source file is compiled and linked, so we will only study the standard compilation case. You will not find here building of the kernel's documentation, cleaning of the kernel source code, [tags](https://en.wikipedia.org/wiki/Ctags) generation, [cross-compilation](https://en.wikipedia.org/wiki/Cross_compiler) related stuff, etc... We will start from the `make` execution with the standard kernel configuration file and will finish with the building of the [bzImage](https://en.wikipedia.org/wiki/Vmlinux#bzImage). @@ -20,7 +20,7 @@ Preparation before the kernel compilation There are many things to prepare before the kernel compilation can be started. The main point here is to find and configure the type of compilation, to parse command line arguments that are passed to `make`, etc... So let's dive into the top `Makefile` of Linux kernel. -The top `Makefile` of Linux kernel is responsible for building two major products: [vmlinux](https://en.wikipedia.org/wiki/Vmlinux) (the resident kernel image) and the modules (any module files). The [Makefile](https://github.com/torvalds/linux/blob/master/Makefile) of the Linux kernel starts with the definition of following variables: +The top `Makefile` of Linux kernel is responsible for building two major products: [vmlinux](https://en.wikipedia.org/wiki/Vmlinux) (the resident kernel image) and the modules (any module files). The [Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile) of the Linux kernel starts with the definition of following variables: ```Makefile VERSION = 4 @@ -183,7 +183,7 @@ Here we can see definition of these variables and the value of `KBUILD_BUILTIN` include scripts/Kbuild.include ``` -The [Kbuild](https://github.com/torvalds/linux/blob/master/Documentation/kbuild/kbuild.txt) or `Kernel Build System` is a special infrastructure to manage building the kernel and its modules. `kbuild` files have the same syntax as makefiles. The [scripts/Kbuild.include](https://github.com/torvalds/linux/blob/master/scripts/Kbuild.include) file provides some generic definitions for the `kbuild` system. After including this `kbuild` file (back in [makefile](https://github.com/torvalds/linux/blob/master/Makefile)) we can see the definitions of the variables that are related to the different tools used during kernel and module compilation (like linker, compilers, utils from the [binutils](http://www.gnu.org/software/binutils/), etc...): +The [Kbuild](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kbuild/kbuild.txt) or `Kernel Build System` is a special infrastructure to manage building the kernel and its modules. `kbuild` files have the same syntax as makefiles. The [scripts/Kbuild.include](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/Kbuild.include) file provides some generic definitions for the `kbuild` system. After including this `kbuild` file (back in [makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile)) we can see the definitions of the variables that are related to the different tools used during kernel and module compilation (like linker, compilers, utils from the [binutils](http://www.gnu.org/software/binutils/), etc...): ```Makefile AS = $(CROSS_COMPILE)as @@ -241,7 +241,7 @@ With that, we have finished all preparations. The next step is building the `vml Directly to the kernel build -------------------------------------------------------------------------------- -We have now finished all the preparations, and next step in the main makefile is related to the kernel build. Before this moment, nothing has been printed to the terminal by `make`. But now the first steps of the compilation are started. We need to go to line [598](https://github.com/torvalds/linux/blob/master/Makefile#L598) of the Linux kernel top makefile and we will find the `vmlinux` target there: +We have now finished all the preparations, and next step in the main makefile is related to the kernel build. Before this moment, nothing has been printed to the terminal by `make`. But now the first steps of the compilation are started. We need to go to line [598](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile#L598) of the Linux kernel top makefile and we will find the `vmlinux` target there: ```Makefile all: vmlinux @@ -250,13 +250,13 @@ all: vmlinux Don't worry that we have missed many lines in Makefile that are between `export RCS_FIND_IGNORE.....` and `all: vmlinux.....`. This part of the makefile is responsible for the `make *.config` targets and as I wrote in the beginning of this part we will see only building of the kernel in a general way. -The `all:` target is the default when no target is given on the command line. You can see here that we include architecture specific makefile there (in our case it will be [arch/x86/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile)). From this moment we will continue from this makefile. As we can see `all` target depends on the `vmlinux` target that defined a little lower in the top makefile: +The `all:` target is the default when no target is given on the command line. You can see here that we include architecture specific makefile there (in our case it will be [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile)). From this moment we will continue from this makefile. As we can see `all` target depends on the `vmlinux` target that defined a little lower in the top makefile: ```Makefile vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE ``` -The `vmlinux` is the Linux kernel in a statically linked executable file format. The [scripts/link-vmlinux.sh](https://github.com/torvalds/linux/blob/master/scripts/link-vmlinux.sh) script links and combines different compiled subsystems into vmlinux. The second target is the `vmlinux-deps` that defined as: +The `vmlinux` is the Linux kernel in a statically linked executable file format. The [scripts/link-vmlinux.sh](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/link-vmlinux.sh) script links and combines different compiled subsystems into vmlinux. The second target is the `vmlinux-deps` that defined as: ```Makefile vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) @@ -302,7 +302,7 @@ prepare1: prepare2 $(version_h) include/generated/utsrelease.h \ prepare2: prepare3 outputmakefile asm-generic ``` -The first `prepare0` expands to the `archprepare` that expands to the `archheaders` and `archscripts` that defined in the `x86_64` specific [Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile). Let's look on it. The `x86_64` specific makefile starts from the definition of the variables that are related to the architecture-specific configs ([defconfig](https://github.com/torvalds/linux/tree/master/arch/x86/configs), etc...). After this it defines flags for the compiling of the [16-bit](https://en.wikipedia.org/wiki/Real_mode) code, calculating of the `BITS` variable that can be `32` for `i386` or `64` for the `x86_64` flags for the assembly source code, flags for the linker and many many more (all definitions you can find in the [arch/x86/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile)). The first target is `archheaders` in the makefile generates syscall table: +The first `prepare0` expands to the `archprepare` that expands to the `archheaders` and `archscripts` that defined in the `x86_64` specific [Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile). Let's look on it. The `x86_64` specific makefile starts from the definition of the variables that are related to the architecture-specific configs ([defconfig](https://github.com/torvalds/linux/tree/master/arch/x86/configs), etc...). After this it defines flags for the compiling of the [16-bit](https://en.wikipedia.org/wiki/Real_mode) code, calculating of the `BITS` variable that can be `32` for `i386` or `64` for the `x86_64` flags for the assembly source code, flags for the linker and many many more (all definitions you can find in the [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile)). The first target is `archheaders` in the makefile generates syscall table: ```Makefile archheaders: @@ -316,7 +316,7 @@ archscripts: scripts_basic $(Q)$(MAKE) $(build)=arch/x86/tools relocs ``` -We can see that it depends on the `scripts_basic` target from the top [Makefile](https://github.com/torvalds/linux/blob/master/Makefile). At the first we can see the `scripts_basic` target that executes make for the [scripts/basic](https://github.com/torvalds/linux/blob/master/scripts/basic/Makefile) makefile: +We can see that it depends on the `scripts_basic` target from the top [Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile). At the first we can see the `scripts_basic` target that executes make for the [scripts/basic](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/basic/Makefile) makefile: ```Makefile scripts_basic: @@ -333,14 +333,14 @@ always := $(hostprogs-y) $(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep ``` -First program is `fixdep` - optimizes list of dependencies generated by [gcc](https://gcc.gnu.org/) that tells make when to remake a source code file. The second program is `bin2c`, which depends on the value of the `CONFIG_BUILD_BIN2C` kernel configuration option and is a very little C program that allows to convert a binary on stdin to a C include on stdout. You can note here a strange notation: `hostprogs-y`, etc... This notation is used in the all `kbuild` files and you can read more about it in the [documentation](https://github.com/torvalds/linux/blob/master/Documentation/kbuild/makefiles.txt). In our case `hostprogs-y` tells `kbuild` that there is one host program named `fixdep` that will be built from `fixdep.c` that is located in the same directory where the `Makefile` is. The first output after we execute `make` in our terminal will be result of this `kbuild` file: +First program is `fixdep` - optimizes list of dependencies generated by [gcc](https://gcc.gnu.org/) that tells make when to remake a source code file. The second program is `bin2c`, which depends on the value of the `CONFIG_BUILD_BIN2C` kernel configuration option and is a very little C program that allows to convert a binary on stdin to a C include on stdout. You can note here a strange notation: `hostprogs-y`, etc... This notation is used in the all `kbuild` files and you can read more about it in the [documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kbuild/makefiles.txt). In our case `hostprogs-y` tells `kbuild` that there is one host program named `fixdep` that will be built from `fixdep.c` that is located in the same directory where the `Makefile` is. The first output after we execute `make` in our terminal will be result of this `kbuild` file: ``` $ make HOSTCC scripts/basic/fixdep ``` -As `script_basic` target was executed, the `archscripts` target will execute `make` for the [arch/x86/tools](https://github.com/torvalds/linux/blob/master/arch/x86/tools/Makefile) makefile with the `relocs` target: +As `script_basic` target was executed, the `archscripts` target will execute `make` for the [arch/x86/tools](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/tools/Makefile) makefile with the `relocs` target: ```Makefile $(Q)$(MAKE) $(build)=arch/x86/tools relocs @@ -376,7 +376,7 @@ prepare0: archprepare FORCE $(Q)$(MAKE) $(build)=. ``` -Note on the `build`. It defined in the [scripts/Kbuild.include](https://github.com/torvalds/linux/blob/master/scripts/Kbuild.include) and looks like this: +Note on the `build`. It defined in the [scripts/Kbuild.include](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/Kbuild.include) and looks like this: ```Makefile build := -f $(srctree)/scripts/Makefile.build obj @@ -388,13 +388,13 @@ Or in our case it is current source directory - `.`: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=. ``` -The [scripts/Makefile.build](https://github.com/torvalds/linux/blob/master/scripts/Makefile.build) tries to find the `Kbuild` file by the given directory via the `obj` parameter, include this `Kbuild` files: +The [scripts/Makefile.build](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/Makefile.build) tries to find the `Kbuild` file by the given directory via the `obj` parameter, include this `Kbuild` files: ```Makefile include $(kbuild-file) ``` -and build targets from it. In our case `.` contains the [Kbuild](https://github.com/torvalds/linux/blob/master/Kbuild) file that generates the `kernel/bounds.s` and the `arch/x86/kernel/asm-offsets.s`. After this the `prepare` target finished to work. The `vmlinux-dirs` also depends on the second target - `scripts` that compiles following programs: `file2alias`, `mk_elfconfig`, `modpost`, etc..... After scripts/host-programs compilation our `vmlinux-dirs` target can be executed. First of all let's try to understand what does `vmlinux-dirs` contain. For my case it contains paths of the following kernel directories: +and build targets from it. In our case `.` contains the [Kbuild](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Kbuild) file that generates the `kernel/bounds.s` and the `arch/x86/kernel/asm-offsets.s`. After this the `prepare` target finished to work. The `vmlinux-dirs` also depends on the second target - `scripts` that compiles following programs: `file2alias`, `mk_elfconfig`, `modpost`, etc..... After scripts/host-programs compilation our `vmlinux-dirs` target can be executed. First of all let's try to understand what does `vmlinux-dirs` contain. For my case it contains paths of the following kernel directories: ``` init usr arch/x86 kernel mm fs ipc security crypto block @@ -402,7 +402,7 @@ drivers sound firmware arch/x86/pci arch/x86/power arch/x86/video net lib arch/x86/lib ``` -We can find definition of the `vmlinux-dirs` in the top [Makefile](https://github.com/torvalds/linux/blob/master/Makefile) of the Linux kernel: +We can find definition of the `vmlinux-dirs` in the top [Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile) of the Linux kernel: ```Makefile vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ @@ -464,7 +464,7 @@ vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE +$(call if_changed,link-vmlinux) ``` -As you can see main purpose of it is a call of the [scripts/link-vmlinux.sh](https://github.com/torvalds/linux/blob/master/scripts/link-vmlinux.sh) script is linking of the all `built-in.o`(s) to the one statically linked executable and creation of the [System.map](https://en.wikipedia.org/wiki/System.map). In the end we will see following output: +As you can see main purpose of it is a call of the [scripts/link-vmlinux.sh](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/scripts/link-vmlinux.sh) script is linking of the all `built-in.o`(s) to the one statically linked executable and creation of the [System.map](https://en.wikipedia.org/wiki/System.map). In the end we will see following output: ``` LINK vmlinux @@ -500,7 +500,7 @@ The `bzImage` file is the compressed Linux kernel image. We can get it by execut all: bzImage ``` -in the [arch/x86/kernel/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile). Let's look on this target, it will help us to understand how this image builds. As I already said the `bzImage` target defined in the [arch/x86/kernel/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile) and looks like this: +in the [arch/x86/kernel/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile). Let's look on this target, it will help us to understand how this image builds. As I already said the `bzImage` target defined in the [arch/x86/kernel/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile) and looks like this: ```Makefile bzImage: vmlinux @@ -515,7 +515,7 @@ We can see here, that first of all called `make` for the boot directory, in our boot := arch/x86/boot ``` -The main goal now is to build the source code in the `arch/x86/boot` and `arch/x86/boot/compressed` directories, build `setup.bin` and `vmlinux.bin`, and build the `bzImage` from them in the end. First target in the [arch/x86/boot/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/boot/Makefile) is the `$(obj)/setup.elf`: +The main goal now is to build the source code in the `arch/x86/boot` and `arch/x86/boot/compressed` directories, build `setup.bin` and `vmlinux.bin`, and build the `bzImage` from them in the end. First target in the [arch/x86/boot/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/Makefile) is the `$(obj)/setup.elf`: ```Makefile $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE @@ -537,7 +537,7 @@ We already have the `setup.ld` linker script in the `arch/x86/boot` directory an CC arch/x86/boot/edd.o ``` -The next source file is [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S), but we can't build it now because this target depends on the following two header files: +The next source file is [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S), but we can't build it now because this target depends on the following two header files: ```Makefile $(obj)/header.o: $(obj)/voffset.h $(obj)/zoffset.h @@ -550,7 +550,7 @@ The first is `voffset.h` generated by the `sed` script that gets two addresses f #define VO__text 0xffffffff81000000 ``` -They are the start and the end of the kernel. The second is `zoffset.h` depens on the `vmlinux` target from the [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/Makefile): +They are the start and the end of the kernel. The second is `zoffset.h` depens on the `vmlinux` target from the [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile): ```Makefile $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE @@ -627,7 +627,7 @@ and the creation of the `vmlinux.bin` from the `vmlinux`: objcopy -O binary -R .note -R .comment -S arch/x86/boot/compressed/vmlinux arch/x86/boot/vmlinux.bin ``` -In the end we compile host program: [arch/x86/boot/tools/build.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/tools/build.c) that will create our `bzImage` from the `setup.bin` and the `vmlinux.bin`: +In the end we compile host program: [arch/x86/boot/tools/build.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/tools/build.c) that will create our `bzImage` from the `setup.bin` and the `vmlinux.bin`: ``` arch/x86/boot/tools/build arch/x86/boot/setup.bin arch/x86/boot/vmlinux.bin arch/x86/boot/zoffset.h arch/x86/boot/bzImage @@ -653,16 +653,16 @@ Links ================================================================================ * [GNU make util](https://en.wikipedia.org/wiki/Make_%28software%29) -* [Linux kernel top Makefile](https://github.com/torvalds/linux/blob/master/Makefile) +* [Linux kernel top Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Makefile) * [cross-compilation](https://en.wikipedia.org/wiki/Cross_compiler) * [Ctags](https://en.wikipedia.org/wiki/Ctags) * [sparse](https://en.wikipedia.org/wiki/Sparse) * [bzImage](https://en.wikipedia.org/wiki/Vmlinux#bzImage) * [uname](https://en.wikipedia.org/wiki/Uname) * [shell](https://en.wikipedia.org/wiki/Shell_%28computing%29) -* [Kbuild](https://github.com/torvalds/linux/blob/master/Documentation/kbuild/kbuild.txt) +* [Kbuild](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kbuild/kbuild.txt) * [binutils](http://www.gnu.org/software/binutils/) * [gcc](https://gcc.gnu.org/) -* [Documentation](https://github.com/torvalds/linux/blob/master/Documentation/kbuild/makefiles.txt) +* [Documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kbuild/makefiles.txt) * [System.map](https://en.wikipedia.org/wiki/System.map) * [Relocation](https://en.wikipedia.org/wiki/Relocation_%28computing%29) diff --git a/Misc/linkers.md b/Misc/linkers.md index 1d527ac..c8cac71 100644 --- a/Misc/linkers.md +++ b/Misc/linkers.md @@ -439,13 +439,13 @@ $ ld @linker.ld The next command line option is `-b` or `--format`. This command line option specifies format of the input object files `ELF`, `DJGPP/COFF` and etc. There is a command line option for the same purpose but for the output file: `--oformat=output-format`. -The next command line option is `--defsym`. Full format of this command line option is the `--defsym=symbol=expression`. It allows to create global symbol in the output file containing the absolute address given by expression. We can find following case where this command line option can be useful: in the Linux kernel source code and more precisely in the Makefile that is related to the kernel decompression for the ARM architecture - [arch/arm/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/master/arch/arm/boot/compressed/Makefile), we can find following definition: +The next command line option is `--defsym`. Full format of this command line option is the `--defsym=symbol=expression`. It allows to create global symbol in the output file containing the absolute address given by expression. We can find following case where this command line option can be useful: in the Linux kernel source code and more precisely in the Makefile that is related to the kernel decompression for the ARM architecture - [arch/arm/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/arm/boot/compressed/Makefile), we can find following definition: ``` LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ) ``` -As we already know, it defines the `_kernel_bss_size` symbol with the size of the `.bss` section in the output file. This symbol will be used in the first [assembly file](https://github.com/torvalds/linux/blob/master/arch/arm/boot/compressed/head.S) that will be executed during kernel decompressing: +As we already know, it defines the `_kernel_bss_size` symbol with the size of the `.bss` section in the output file. This symbol will be used in the first [assembly file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/arm/boot/compressed/head.S) that will be executed during kernel decompressing: ```assembly ldr r5, =_kernel_bss_size diff --git a/SyncPrim/sync-1.md b/SyncPrim/sync-1.md index eef69bb..f3f5d7a 100644 --- a/SyncPrim/sync-1.md +++ b/SyncPrim/sync-1.md @@ -212,7 +212,7 @@ function which allows us to `acquire` a spinlock. The `raw_spin_lock` macro is d #define raw_spin_lock(lock) _raw_spin_lock(lock) ``` -As we may see in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/master/include/linux/spinlock.h) header file, definition of the `_raw_spin_lock` macro depends on the `CONFIG_SMP` kernel configuration parameter: +As we may see in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock.h) header file, definition of the `_raw_spin_lock` macro depends on the `CONFIG_SMP` kernel configuration parameter: ```C #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) @@ -222,7 +222,7 @@ As we may see in the [include/linux/spinlock.h](https://github.com/torvalds/linu #endif ``` -So, if the [SMP](https://en.wikipedia.org/wiki/Symmetric_multiprocessing) is enabled in the Linux kernel, the `_raw_spin_lock` macro is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/spinlock.h) header file and looks like: +So, if the [SMP](https://en.wikipedia.org/wiki/Symmetric_multiprocessing) is enabled in the Linux kernel, the `_raw_spin_lock` macro is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/spinlock.h) header file and looks like: ```C #define _raw_spin_lock(lock) __raw_spin_lock(lock) @@ -239,7 +239,7 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock) } ``` -As you may see, first of all we disable [preemption](https://en.wikipedia.org/wiki/Preemption_%28computing%29) by the call of the `preempt_disable` macro from the [include/linux/preempt.h](https://github.com/torvalds/linux/blob/master/include/linux/preempt.h) (more about this you may read in the ninth [part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-9.html) of the Linux kernel initialization process chapter). When we will unlock the given `spinlock`, preemption will be enabled again: +As you may see, first of all we disable [preemption](https://en.wikipedia.org/wiki/Preemption_%28computing%29) by the call of the `preempt_disable` macro from the [include/linux/preempt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/preempt.h) (more about this you may read in the ninth [part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-9.html) of the Linux kernel initialization process chapter). When we will unlock the given `spinlock`, preemption will be enabled again: ```C static inline void __raw_spin_unlock(raw_spinlock_t *lock) @@ -282,7 +282,7 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, } ``` -As I wrote above, we will not consider stuff here which is related to debugging or tracing. The main point of the `lock_acquire` function is to disable hardware interrupts by the call of the `raw_local_irq_save` macro, because the given spinlock might be acquired with enabled hardware interrupts. In this way the process will not be preempted. Note that in the end of the `lock_acquire` function we will enable hardware interrupts again with the help of the `raw_local_irq_restore` macro. As you already may guess, the main work will be in the `__lock_acquire` function which is defined in the [kernel/locking/lockdep.c](https://github.com/torvalds/linux/blob/master/kernel/locking/lockdep.c) source code file. +As I wrote above, we will not consider stuff here which is related to debugging or tracing. The main point of the `lock_acquire` function is to disable hardware interrupts by the call of the `raw_local_irq_save` macro, because the given spinlock might be acquired with enabled hardware interrupts. In this way the process will not be preempted. Note that in the end of the `lock_acquire` function we will enable hardware interrupts again with the help of the `raw_local_irq_restore` macro. As you already may guess, the main work will be in the `__lock_acquire` function which is defined in the [kernel/locking/lockdep.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/lockdep.c) source code file. The `__lock_acquire` function looks big. We will try to understand what does this function do, but not in this part. Actually this function mostly related to the Linux kernel [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) and it is not topic of this part. If we will return to the definition of the `__raw_spin_lock` function, we will see that it contains the following definition in the end: @@ -290,14 +290,14 @@ The `__lock_acquire` function looks big. We will try to understand what does thi LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock); ``` -The `LOCK_CONTENDED` macro is defined in the [include/linux/lockdep.h](https://github.com/torvalds/linux/blob/master/include/linux/lockdep.h) header file and just calls the given function with the given `spinlock`: +The `LOCK_CONTENDED` macro is defined in the [include/linux/lockdep.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/lockdep.h) header file and just calls the given function with the given `spinlock`: ```C #define LOCK_CONTENDED(_lock, try, lock) \ lock(_lock) ``` -In our case, the `lock` is `do_raw_spin_lock` function from the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/master/include/linux/spnlock.h) header file and the `_lock` is the given `raw_spinlock_t`: +In our case, the `lock` is `do_raw_spin_lock` function from the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spnlock.h) header file and the `_lock` is the given `raw_spinlock_t`: ```C static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock) @@ -307,13 +307,13 @@ static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock) } ``` -The `__acquire` here is just [sparse](https://en.wikipedia.org/wiki/Sparse) related macro and we are not interesting in it in this moment. Location of the definition of the `arch_spin_lock` function depends on two things: the first is architecture of system and the second do we use `queued spinlocks` or not. In our case we consider only `x86_64` architecture, so the definition of the `arch_spin_lock` is represented as the macro from the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlocks.h) header file: +The `__acquire` here is just [sparse](https://en.wikipedia.org/wiki/Sparse) related macro and we are not interesting in it in this moment. Location of the definition of the `arch_spin_lock` function depends on two things: the first is architecture of system and the second do we use `queued spinlocks` or not. In our case we consider only `x86_64` architecture, so the definition of the `arch_spin_lock` is represented as the macro from the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlocks.h) header file: ```C #define arch_spin_lock(l) queued_spin_lock(l) ``` -if we are using `queued spinlocks`. Or in other case, the `arch_spin_lock` function is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/spinlock.h) header file. Now we will consider only `normal spinlock` and information related to `queued spinlocks` we will see later. Let's look again on the definition of the `arch_spinlock` structure, to understand implementation of the `arch_spin_lock` function: +if we are using `queued spinlocks`. Or in other case, the `arch_spin_lock` function is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/spinlock.h) header file. Now we will consider only `normal spinlock` and information related to `queued spinlocks` we will see later. Let's look again on the definition of the `arch_spinlock` structure, to understand implementation of the `arch_spin_lock` function: ```C typedef struct arch_spinlock { diff --git a/SyncPrim/sync-2.md b/SyncPrim/sync-2.md index 5bf78a5..33d1117 100644 --- a/SyncPrim/sync-2.md +++ b/SyncPrim/sync-2.md @@ -17,7 +17,7 @@ We saw [API](https://en.wikipedia.org/wiki/Application_programming_interface) of * `spin_is_locked` - returns the state of the given `spinlock`; * and etc. -And we know that all of these macro which are defined in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/master/include/linux/spinlock.h) header file will be expanded to the call of the functions with `arch_spin_.*` prefix from the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/spinlock.h) for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. If we will look at this header fill with attention, we will that these functions (`arch_spin_is_locked`, `arch_spin_lock`, `arch_spin_unlock` and etc) defined only if the `CONFIG_QUEUED_SPINLOCKS` kernel configuration option is disabled: +And we know that all of these macro which are defined in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock.h) header file will be expanded to the call of the functions with `arch_spin_.*` prefix from the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/spinlock.h) for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. If we will look at this header fill with attention, we will that these functions (`arch_spin_is_locked`, `arch_spin_lock`, `arch_spin_unlock` and etc) defined only if the `CONFIG_QUEUED_SPINLOCKS` kernel configuration option is disabled: ```C #ifdef CONFIG_QUEUED_SPINLOCKS @@ -35,7 +35,7 @@ static __always_inline void arch_spin_lock(arch_spinlock_t *lock) #endif ``` -This means that the [arch/x86/include/asm/qspinlock.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/qspinlock.h) header file provides own implementation of these functions. Actually they are macros and they are located in other header file. This header file is - [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlock.h#L126). If we will look into this header file, we will find definition of these macros: +This means that the [arch/x86/include/asm/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/qspinlock.h) header file provides own implementation of these functions. Actually they are macros and they are located in other header file. This header file is - [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlock.h#L126). If we will look into this header file, we will find definition of these macros: ```C #define arch_spin_is_locked(l) queued_spin_is_locked(l) @@ -53,7 +53,7 @@ Before we will consider how queued spinlocks and their [API](https://en.wikipedi Introduction to queued spinlocks ------------------------------------------------------------------------------- -Queued spinlocks is a [locking mechanism](https://en.wikipedia.org/wiki/Lock_%28computer_science%29) in the Linux kernel which is replacement for the standard `spinlocks`. At least this is true for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. If we will look at the following kernel configuration file - [kernel/Kconfig.locks](https://github.com/torvalds/linux/blob/master/kernel/Kconfig.locks), we will see following configuration entries: +Queued spinlocks is a [locking mechanism](https://en.wikipedia.org/wiki/Lock_%28computer_science%29) in the Linux kernel which is replacement for the standard `spinlocks`. At least this is true for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. If we will look at the following kernel configuration file - [kernel/Kconfig.locks](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/Kconfig.locks), we will see following configuration entries: ``` config ARCH_USE_QUEUED_SPINLOCKS @@ -64,7 +64,7 @@ config QUEUED_SPINLOCKS depends on SMP ``` -This means that the `CONFIG_QUEUED_SPINLOCKS` kernel configuration option will be enabled by default if the `ARCH_USE_QUEUED_SPINLOCKS` is enabled. We may see that the `ARCH_USE_QUEUED_SPINLOCKS` is enabled by default in the `x86_64` specific kernel configuration file - [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/master/arch/x86/Kconfig): +This means that the `CONFIG_QUEUED_SPINLOCKS` kernel configuration option will be enabled by default if the `ARCH_USE_QUEUED_SPINLOCKS` is enabled. We may see that the `ARCH_USE_QUEUED_SPINLOCKS` is enabled by default in the `x86_64` specific kernel configuration file - [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Kconfig): ``` config X86 @@ -187,7 +187,7 @@ That's all about theory of the `queued spinlocks`, now let's consider how this m API of queued spinlocks ------------------------------------------------------------------------------- -Now we know a little about `queued spinlocks` from the theoretical side, time to see the implementation of this mechanism in the Linux kernel. As we saw above, the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlock.h#L126) header files provides a set of macro which are represent API for a spinlock acquiring, releasing and etc: +Now we know a little about `queued spinlocks` from the theoretical side, time to see the implementation of this mechanism in the Linux kernel. As we saw above, the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlock.h#L126) header files provides a set of macro which are represent API for a spinlock acquiring, releasing and etc: ```C #define arch_spin_is_locked(l) queued_spin_is_locked(l) @@ -200,7 +200,7 @@ Now we know a little about `queued spinlocks` from the theoretical side, time to #define arch_spin_unlock_wait(l) queued_spin_unlock_wait(l) ``` -All of these macros expand to the call of functions from the same header file. Additionally, we saw the `qspinlock` structure from the [include/asm-generic/qspinlock_types.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlock_types.h) header file which represents a queued spinlock in the Linux kernel: +All of these macros expand to the call of functions from the same header file. Additionally, we saw the `qspinlock` structure from the [include/asm-generic/qspinlock_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlock_types.h) header file which represents a queued spinlock in the Linux kernel: ```C typedef struct qspinlock { @@ -227,7 +227,7 @@ struct mcs_spinlock { }; ``` -from the [kernel/locking/mcs_spinlock.h](https://github.com/torvalds/linux/blob/master/kernel/locking/mcs_spinlock.h) header file. The first field represents a pointer to the next thread in the `queue`. The second field represents the state of the current thread in the `queue`, where `1` is `lock` already acquired and `0` in other way. And the last field of the `mcs_spinlock` structure represents nested locks. To understand what is it nested lock, imagine situation when a thread acquired lock, but was interrupted by the hardware [interrupt](https://en.wikipedia.org/wiki/Interrupt) and an [interrupt handler](https://en.wikipedia.org/wiki/Interrupt_handler) tries to take a lock too. For this case, each processor has not just copy of the `mcs_spinlock` structure but array of these structures: +from the [kernel/locking/mcs_spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/mcs_spinlock.h) header file. The first field represents a pointer to the next thread in the `queue`. The second field represents the state of the current thread in the `queue`, where `1` is `lock` already acquired and `0` in other way. And the last field of the `mcs_spinlock` structure represents nested locks. To understand what is it nested lock, imagine situation when a thread acquired lock, but was interrupted by the hardware [interrupt](https://en.wikipedia.org/wiki/Interrupt) and an [interrupt handler](https://en.wikipedia.org/wiki/Interrupt_handler) tries to take a lock too. For this case, each processor has not just copy of the `mcs_spinlock` structure but array of these structures: ```C static DEFINE_PER_CPU_ALIGNED(struct mcs_spinlock, mcs_nodes[4]); @@ -255,7 +255,7 @@ Ok, now we know data structures which represents queued spinlock in the Linux ke #define arch_spin_lock(l) queued_spin_lock(l) ``` -Yes, this function is - `queued_spin_lock`. As we may understand from the function's name, it allows to acquire lock by the thread. This function is defined in the [include/asm-generic/qspinlock_types.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlock_types.h) header file and its implementation looks: +Yes, this function is - `queued_spin_lock`. As we may understand from the function's name, it allows to acquire lock by the thread. This function is defined in the [include/asm-generic/qspinlock_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlock_types.h) header file and its implementation looks: ```C static __always_inline void queued_spin_lock(struct qspinlock *lock) @@ -271,13 +271,13 @@ static __always_inline void queued_spin_lock(struct qspinlock *lock) Looks pretty easy, except the `queued_spin_lock_slowpath` function. We may see that it takes only one parameter. In our case this parameter will represent `queued spinlock` which will be locked. Let's consider the situation that `queue` with locks is empty for now and the first thread wanted to acquire lock. As we may see the `queued_spin_lock` function starts from the call of the `atomic_cmpxchg_acquire` macro. As you may guess from the name of this macro, it executes atomic [CMPXCHG](http://x86.renejeschke.de/html/file_module_x86_id_41.html) instruction which compares value of the second parameter (zero in our case) with the value of the first parameter (current state of the given spinlock) and if they are identical, it stores value of the `_Q_LOCKED_VAL` in the memory location which is pointed by the `&lock->val` and return the initial value from this memory location. -The `atomic_cmpxchg_acquire` macro is defined in the [include/linux/atomic.h](https://github.com/torvalds/linux/blob/master/include/linux/atomic.h) header file and expands to the call of the `atomic_cmpxchg` function: +The `atomic_cmpxchg_acquire` macro is defined in the [include/linux/atomic.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/atomic.h) header file and expands to the call of the `atomic_cmpxchg` function: ```C #define atomic_cmpxchg_acquire atomic_cmpxchg ``` -which is architecture specific. We consider [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, so in our case this header file will be [arch/x86/include/asm/atomic.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h) and the implementation of the `atomic_cmpxchg` function is just returns the result of the `cmpxchg` macro: +which is architecture specific. We consider [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, so in our case this header file will be [arch/x86/include/asm/atomic.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/atomic.h) and the implementation of the `atomic_cmpxchg` function is just returns the result of the `cmpxchg` macro: ```C static __always_inline int atomic_cmpxchg(atomic_t *v, int old, int new) @@ -286,7 +286,7 @@ static __always_inline int atomic_cmpxchg(atomic_t *v, int old, int new) } ``` -This macro is defined in the [arch/x86/include/asm/cmpxchg.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/cmpxchg.h) header file and looks: +This macro is defined in the [arch/x86/include/asm/cmpxchg.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/cmpxchg.h) header file and looks: ```C #define cmpxchg(ptr, old, new) \ @@ -325,7 +325,7 @@ if (likely(val == 0)) From this moment, our first thread will hold a lock. Notice that this behavior differs from the behavior which was described in the `MCS` algorithm. The thread acquired lock, but we didn't add it to the `queue`. As I already wrote the implementation of `queued spinlocks` concept is based on the `MCS` algorithm in the Linux kernel, but in the same time it has some difference like this for optimization purpose. -So the first thread have acquired lock and now let's consider that the second thread tried to acquire the same lock. The second thread will start from the same `queued_spin_lock` function, but the `lock->val` will contain `1` or `_Q_LOCKED_VAL`, because first thread already holds lock. So, in this case the `queued_spin_lock_slowpath` function will be called. The `queued_spin_lock_slowpath` function is defined in the [kernel/locking/qspinlock.c](https://github.com/torvalds/linux/blob/master/kernel/locking/qspinlock.c) source code file and starts from the following checks: +So the first thread have acquired lock and now let's consider that the second thread tried to acquire the same lock. The second thread will start from the same `queued_spin_lock` function, but the `lock->val` will contain `1` or `_Q_LOCKED_VAL`, because first thread already holds lock. So, in this case the `queued_spin_lock_slowpath` function will be called. The `queued_spin_lock_slowpath` function is defined in the [kernel/locking/qspinlock.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/qspinlock.c) source code file and starts from the following checks: ```C void queued_spin_lock_slowpath(struct qspinlock *lock, u32 val) @@ -403,7 +403,7 @@ if (queued_spin_trylock(lock)) goto release; ``` -The `queued_spin_trylock` function is defined in the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/qspinlock.h) header file and just does the same `queued_spin_lock` function that does: +The `queued_spin_trylock` function is defined in the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlock.h) header file and just does the same `queued_spin_lock` function that does: ```C static __always_inline int queued_spin_trylock(struct qspinlock *lock) diff --git a/SyncPrim/sync-3.md b/SyncPrim/sync-3.md index fb07e7c..720d6d2 100644 --- a/SyncPrim/sync-3.md +++ b/SyncPrim/sync-3.md @@ -29,7 +29,7 @@ In the first case, value of `semaphore` may be only `1` or `0`. In the second ca Semaphore API -------------------------------------------------------------------------------- -So, we know a little about `semaphores` from theoretical side, let's look on its implementation in the Linux kernel. All `semaphore` [API](https://en.wikipedia.org/wiki/Application_programming_interface) is located in the [include/linux/semaphore.h](https://github.com/torvalds/linux/blob/master/include/linux/semaphore.h) header file. +So, we know a little about `semaphores` from theoretical side, let's look on its implementation in the Linux kernel. All `semaphore` [API](https://en.wikipedia.org/wiki/Application_programming_interface) is located in the [include/linux/semaphore.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/semaphore.h) header file. We may see that the `semaphore` mechanism is represented by the following structure: @@ -70,7 +70,7 @@ as we may see, the `DEFINE_SEMAPHORE` macro provides ability to initialize only } ``` -The `__SEMAPHORE_INITIALIZER` macro takes the name of the future `semaphore` structure and does initialization of the fields of this structure. First of all we initialize a `spinlock` of the given `semaphore` with the `__RAW_SPIN_LOCK_UNLOCKED` macro. As you may remember from the [previous](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) parts, the `__RAW_SPIN_LOCK_UNLOCKED` is defined in the [include/linux/spinlock_types.h](https://github.com/torvalds/linux/blob/master/include/linux/spinlock_types.h) header file and expands to the `__ARCH_SPIN_LOCK_UNLOCKED` macro which just expands to zero or unlocked state: +The `__SEMAPHORE_INITIALIZER` macro takes the name of the future `semaphore` structure and does initialization of the fields of this structure. First of all we initialize a `spinlock` of the given `semaphore` with the `__RAW_SPIN_LOCK_UNLOCKED` macro. As you may remember from the [previous](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) parts, the `__RAW_SPIN_LOCK_UNLOCKED` is defined in the [include/linux/spinlock_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock_types.h) header file and expands to the `__ARCH_SPIN_LOCK_UNLOCKED` macro which just expands to zero or unlocked state: ```C #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } @@ -78,7 +78,7 @@ The `__SEMAPHORE_INITIALIZER` macro takes the name of the future `semaphore` str The last two fields of the `semaphore` structure `count` and `wait_list` are initialized with the given value which represents count of available resources and empty [list](https://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html). -The second way to initialize a `semaphore` structure is to pass the `semaphore` and number of available resources to the `sema_init` function which is defined in the [include/linux/semaphore.h](https://github.com/torvalds/linux/blob/master/include/linux/semaphore.h) header file: +The second way to initialize a `semaphore` structure is to pass the `semaphore` and number of available resources to the `sema_init` function which is defined in the [include/linux/semaphore.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/semaphore.h) header file: ```C static inline void sema_init(struct semaphore *sem, int val) @@ -108,7 +108,7 @@ The `down_killable` function does the same as the `down_interruptible` function, The `down_trylock` function is similar on the `spin_trylock` function. This function tries to acquire a lock and exit if this operation was unsuccessful. In this case the process which wants to acquire a lock, will not wait. The last `down_timeout` function tries to acquire a lock. It will be interrupted in a waiting state when the given timeout will be expired. Additionally, you may notice that the timeout is in [jiffies](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-1.html) -We just saw definitions of the `semaphore` [API](https://en.wikipedia.org/wiki/Application_programming_interface). We will start from the `down` function. This function is defined in the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/master/kernel/locking/semaphore.c) source code file. Let's look on the implementation function: +We just saw definitions of the `semaphore` [API](https://en.wikipedia.org/wiki/Application_programming_interface). We will start from the `down` function. This function is defined in the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/semaphore.c) source code file. Let's look on the implementation function: ```C void down(struct semaphore *sem) @@ -125,11 +125,11 @@ void down(struct semaphore *sem) EXPORT_SYMBOL(down); ``` -We may see the definition of the `flags` variable at the beginning of the `down` function. This variable will be passed to the `raw_spin_lock_irqsave` and `raw_spin_lock_irqrestore` macros which are defined in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/master/include/linux/spinlock.h) header file and protect a counter of the given `semaphore` here. Actually both of these macro do the same that `spin_lock` and `spin_unlock` macros, but additionally they save/restore current value of interrupt flags and disables [interrupts](https://en.wikipedia.org/wiki/Interrupt). +We may see the definition of the `flags` variable at the beginning of the `down` function. This variable will be passed to the `raw_spin_lock_irqsave` and `raw_spin_lock_irqrestore` macros which are defined in the [include/linux/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock.h) header file and protect a counter of the given `semaphore` here. Actually both of these macro do the same that `spin_lock` and `spin_unlock` macros, but additionally they save/restore current value of interrupt flags and disables [interrupts](https://en.wikipedia.org/wiki/Interrupt). As you already may guess, the main work is done between the `raw_spin_lock_irqsave` and `raw_spin_unlock_irqrestore` macros in the `down` function. We compare the value of the `semaphore` counter with zero and if it is bigger than zero, we may decrement this counter. This means that we already acquired the lock. In other way counter is zero. This means that all available resources already finished and we need to wait to acquire this lock. As we may see, the `__down` function will be called in this case. -The `__down` function is defined in the [same](https://github.com/torvalds/linux/blob/master/kernel/locking/semaphore.c) source code file and its implementation looks: +The `__down` function is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/semaphore.c) source code file and its implementation looks: ```C static noinline void __sched __down(struct semaphore *sem) @@ -171,14 +171,14 @@ static noinline int __sched __down_timeout(struct semaphore *sem, long timeout) } ``` -Now let's look at the implementation of the `__down_common` function. This function is defined in the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/master/kernel/locking/semaphore.c) source code file too and starts from the definition of the two following local variables: +Now let's look at the implementation of the `__down_common` function. This function is defined in the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/semaphore.c) source code file too and starts from the definition of the two following local variables: ```C struct task_struct *task = current; struct semaphore_waiter waiter; ``` -The first represents current task for the local processor which wants to acquire a lock. The `current` is a macro which is defined in the [arch/x86/include/asm/current.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/current.h) header file: +The first represents current task for the local processor which wants to acquire a lock. The `current` is a macro which is defined in the [arch/x86/include/asm/current.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/current.h) header file: ```C #define current get_current() @@ -234,7 +234,7 @@ for (;;) { } ``` -In the previous piece of code we set `waiter.up` to `false`. So, a task will spin in this loop while `up` will not be set to `true`. This loop starts from the check that the current task is in the `pending` state or in other words flags of this task contains `TASK_INTERRUPTIBLE` or `TASK_WAKEKILL` flag. As I already wrote above a task may be interrupted by [signal](https://en.wikipedia.org/wiki/Unix_signal) during wait of ability to acquire a lock. The `signal_pending_state` function is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/master/include/linux/sched.h) source code file and looks: +In the previous piece of code we set `waiter.up` to `false`. So, a task will spin in this loop while `up` will not be set to `true`. This loop starts from the check that the current task is in the `pending` state or in other words flags of this task contains `TASK_INTERRUPTIBLE` or `TASK_WAKEKILL` flag. As I already wrote above a task may be interrupted by [signal](https://en.wikipedia.org/wiki/Unix_signal) during wait of ability to acquire a lock. The `signal_pending_state` function is defined in the [include/linux/sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/sched.h) source code file and looks: ```C static inline int signal_pending_state(long state, struct task_struct *p) @@ -285,11 +285,11 @@ timeout = schedule_timeout(timeout); raw_spin_lock_irq(&sem->lock); ``` -which is defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file. The `schedule_timeout` function makes the current task sleep until the given timeout. +which is defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file. The `schedule_timeout` function makes the current task sleep until the given timeout. That is all about the `__down_common` function. A task which wants to acquire a lock which is already acquired by another task will be spun in the infinite loop while it will not be interrupted by a signal, the given timeout will not be expired or the task which holds a lock will not release it. Now let's look at the implementation of the `up` function. -The `up` function is defined in the [same](https://github.com/torvalds/linux/blob/master/kernel/locking/semaphore.c) source code file as `down` function. As we already know, the main purpose of this function is to release a lock. This function looks: +The `up` function is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/semaphore.c) source code file as `down` function. As we already know, the main purpose of this function is to release a lock. This function looks: ```C void up(struct semaphore *sem) @@ -319,7 +319,7 @@ static noinline void __sched __up(struct semaphore *sem) } ``` -Here we takes the first task from the list of waiters, delete it from the list, set its `waiter-up` to true. From this point the infinite loop from the `__down_common` function will be stopped. The `wake_up_process` function will be called in the end of the `__up` function. As you remember we called the `schedule_timeout` function in the infinite loop from the `__down_common` this function. The `schedule_timeout` function makes the current task sleep until the given timeout will not be expired. So, as our process may sleep right now, we need to wake it up. That's why we call the `wake_up_process` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/master/kernel/sched/core.c) source code file. +Here we takes the first task from the list of waiters, delete it from the list, set its `waiter-up` to true. From this point the infinite loop from the `__down_common` function will be stopped. The `wake_up_process` function will be called in the end of the `__up` function. As you remember we called the `schedule_timeout` function in the infinite loop from the `__down_common` this function. The `schedule_timeout` function makes the current task sleep until the given timeout will not be expired. So, as our process may sleep right now, we need to wake it up. That's why we call the `wake_up_process` function from the [kernel/sched/core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/core.c) source code file. That's all. diff --git a/SyncPrim/sync-4.md b/SyncPrim/sync-4.md index a102e40..2e094bc 100644 --- a/SyncPrim/sync-4.md +++ b/SyncPrim/sync-4.md @@ -47,9 +47,9 @@ struct mutex { }; ``` -structure in the Linux kernel. This structure is defined in the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) header file and contains similar to the `semaphore` structure set of fields. The first field of the `mutex` structure is - `count`. Value of this field represents state of a `mutex`. In a case when the value of the `count` field is `1`, a `mutex` is in `unlocked` state. When the value of the `count` field is `zero`, a `mutex` is in the `locked` state. Additionally value of the `count` field may be `negative`. In this case a `mutex` is in the `locked` state and has possible waiters. +structure in the Linux kernel. This structure is defined in the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) header file and contains similar to the `semaphore` structure set of fields. The first field of the `mutex` structure is - `count`. Value of this field represents state of a `mutex`. In a case when the value of the `count` field is `1`, a `mutex` is in `unlocked` state. When the value of the `count` field is `zero`, a `mutex` is in the `locked` state. Additionally value of the `count` field may be `negative`. In this case a `mutex` is in the `locked` state and has possible waiters. -The next two fields of the `mutex` structure - `wait_lock` and `wait_list` are [spinlock](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) for the protection of a `wait queue` and list of waiters which represents this `wait queue` for a certain lock. As you may notice, the similarity of the `mutex` and `semaphore` structures ends. Remaining fields of the `mutex` structure, as we may see depends on different configuration options of the Linux kernel. +The next two fields of the `mutex` structure - `wait_lock` and `wait_list` are [spinlock](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) for the protection of a `wait queue` and list of waiters which represents this `wait queue` for a certain lock. As you may notice, the similarity of the `mutex` and `semaphore` structures ends. Remaining fields of the `mutex` structure, as we may see depends on different configuration options of the Linux kernel. The first field - `owner` represents [process](https://en.wikipedia.org/wiki/Process_%28computing%29) which acquired a lock. As we may see, existence of this field in the `mutex` structure depends on the `CONFIG_DEBUG_MUTEXES` or `CONFIG_MUTEX_SPIN_ON_OWNER` kernel configuration options. Main point of this field and the next `osq` fields is support of `optimistic spinning` which we will see later. The last two fields - `magic` and `dep_map` are used only in [debugging](https://en.wikipedia.org/wiki/Debugging) mode. The `magic` field is to storing a `mutex` related information for debugging and the second field - `lockdep_map` is for [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) of the Linux kernel. @@ -77,7 +77,7 @@ struct mutex_waiter { }; ``` -structure from the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) header file and will be sleep. Before we will consider [API](https://en.wikipedia.org/wiki/Application_programming_interface) which is provided by the Linux kernel for manipulation with `mutexes`, let's consider the `mutex_waiter` structure. If you have read the [previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html) of this chapter, you may notice that the `mutex_waiter` structure is similar to the `semaphore_waiter` structure from the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/master/kernel/locking/semaphore.c) source code file: +structure from the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) header file and will be sleep. Before we will consider [API](https://en.wikipedia.org/wiki/Application_programming_interface) which is provided by the Linux kernel for manipulation with `mutexes`, let's consider the `mutex_waiter` structure. If you have read the [previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html) of this chapter, you may notice that the `mutex_waiter` structure is similar to the `semaphore_waiter` structure from the [kernel/locking/semaphore.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/semaphore.c) source code file: ```C struct semaphore_waiter { @@ -94,7 +94,7 @@ Now we know what is it `mutex` and how it is represented the Linux kernel. In th Mutex API -------------------------------------------------------------------------------- -Ok, in the previous paragraph we knew what is it `mutex` synchronization primitive and saw the `mutex` structure which represents `mutex` in the Linux kernel. Now it's time to consider [API](https://en.wikipedia.org/wiki/Application_programming_interface) for manipulation of mutexes. Description of the `mutex` API is located in the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) header file. As always, before we will consider how to acquire and release a `mutex`, we need to know how to initialize it. +Ok, in the previous paragraph we knew what is it `mutex` synchronization primitive and saw the `mutex` structure which represents `mutex` in the Linux kernel. Now it's time to consider [API](https://en.wikipedia.org/wiki/Application_programming_interface) for manipulation of mutexes. Description of the `mutex` API is located in the [include/linux/mutex.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) header file. As always, before we will consider how to acquire and release a `mutex`, we need to know how to initialize it. There are two approaches to initialize a `mutex`. The first is to do it statically. For this purpose the Linux kernel provides following: @@ -114,9 +114,9 @@ macro. Let's consider implementation of this macro. As we may see, the `DEFINE_M } ``` -This macro is defined in the [same](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) header file and as we may understand it initializes fields of the `mutex` structure the initial values. The `count` field get initialized with the `1` which represents `unlocked` state of a mutex. The `wait_lock` [spinlock](https://en.wikipedia.org/wiki/Spinlock) get initialized to the unlocked state and the last field `wait_list` to empty [doubly linked list](https://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html). +This macro is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) header file and as we may understand it initializes fields of the `mutex` structure the initial values. The `count` field get initialized with the `1` which represents `unlocked` state of a mutex. The `wait_lock` [spinlock](https://en.wikipedia.org/wiki/Spinlock) get initialized to the unlocked state and the last field `wait_list` to empty [doubly linked list](https://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html). -The second approach allows us to initialize a `mutex` dynamically. To do this we need to call the `__mutex_init` function from the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/master/kernel/locking/mutex.c) source code file. Actually, the `__mutex_init` function rarely called directly. Instead of the `__mutex_init`, the: +The second approach allows us to initialize a `mutex` dynamically. To do this we need to call the `__mutex_init` function from the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/mutex.c) source code file. Actually, the `__mutex_init` function rarely called directly. Instead of the `__mutex_init`, the: ```C # define mutex_init(mutex) \ @@ -150,7 +150,7 @@ As we may see the `__mutex_init` function takes three arguments: * `name` - name of mutex for debugging purpose; * `key` - key for [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt). -At the beginning of the `__mutex_init` function, we may see initialization of the `mutex` state. We set it to `unlocked` state with the `atomic_set` function which atomically set the give variable to the given value. After this we may see initialization of the `spinlock` to the unlocked state which will protect `wait queue` of the `mutex` and initialization of the `wait queue` of the `mutex`. After this we clear owner of the `lock` and initialize optimistic queue by the call of the `osq_lock_init` function from the [include/linux/osq_lock.h](https://github.com/torvalds/linux/blob/master/include/linux/osq_lock.h) header file. This function just sets the tail of the optimistic queue to the unlocked state: +At the beginning of the `__mutex_init` function, we may see initialization of the `mutex` state. We set it to `unlocked` state with the `atomic_set` function which atomically set the give variable to the given value. After this we may see initialization of the `spinlock` to the unlocked state which will protect `wait queue` of the `mutex` and initialization of the `wait queue` of the `mutex`. After this we clear owner of the `lock` and initialize optimistic queue by the call of the `osq_lock_init` function from the [include/linux/osq_lock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/osq_lock.h) header file. This function just sets the tail of the optimistic queue to the unlocked state: ```C static inline bool osq_is_locked(struct optimistic_spin_queue *lock) @@ -161,7 +161,7 @@ static inline bool osq_is_locked(struct optimistic_spin_queue *lock) In the end of the `__mutex_init` function we may see the call of the `debug_mutex_init` function, but as I already wrote in previous parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/index.html), we will not consider debugging related stuff in this chapter. -After the `mutex` structure is initialized, we may go ahead and will look at the `lock` and `unlock` API of `mutex` synchronization primitive. Implementation of `mutex_lock` and `mutex_unlock` functions located in the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/master/kernel/locking/mutex.c) source code file. First of all let's start from the implementation of the `mutex_lock`. It looks: +After the `mutex` structure is initialized, we may go ahead and will look at the `lock` and `unlock` API of `mutex` synchronization primitive. Implementation of `mutex_lock` and `mutex_unlock` functions located in the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/mutex.c) source code file. First of all let's start from the implementation of the `mutex_lock`. It looks: ```C void __sched mutex_lock(struct mutex *lock) @@ -172,9 +172,9 @@ void __sched mutex_lock(struct mutex *lock) } ``` -We may see the call of the `might_sleep` macro from the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/master/include/linux/kernel.h) header file at the beginning of the `mutex_lock` function. Implementation of this macro depends on the `CONFIG_DEBUG_ATOMIC_SLEEP` kernel configuration option and if this option is enabled, this macro just prints a stack trace if it was executed in [atomic](https://en.wikipedia.org/wiki/Linearizability) context. This macro is helper for debugging purposes. In other way this macro does nothing. +We may see the call of the `might_sleep` macro from the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/kernel.h) header file at the beginning of the `mutex_lock` function. Implementation of this macro depends on the `CONFIG_DEBUG_ATOMIC_SLEEP` kernel configuration option and if this option is enabled, this macro just prints a stack trace if it was executed in [atomic](https://en.wikipedia.org/wiki/Linearizability) context. This macro is helper for debugging purposes. In other way this macro does nothing. -After the `might_sleep` macro, we may see the call of the `__mutex_fastpath_lock` function. This function is architecture-specific and as we consider [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture in this book, the implementation of the `__mutex_fastpath_lock` is located in the [arch/x86/include/asm/mutex_64.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/mutex_64.h) header file. As we may understand from the name of the `__mutex_fastpath_lock` function, this function will try to acquire lock in a fast path or in other words this function will try to decrement the value of the `count` of the given mutex. +After the `might_sleep` macro, we may see the call of the `__mutex_fastpath_lock` function. This function is architecture-specific and as we consider [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture in this book, the implementation of the `__mutex_fastpath_lock` is located in the [arch/x86/include/asm/mutex_64.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/mutex_64.h) header file. As we may understand from the name of the `__mutex_fastpath_lock` function, this function will try to acquire lock in a fast path or in other words this function will try to decrement the value of the `count` of the given mutex. Implementation of the `__mutex_fastpath_lock` function consists from two parts. The first part is [inline assembly](https://0xax.gitbooks.io/linux-insides/content/Theory/asm.html) statement. Let's look at it: @@ -186,7 +186,7 @@ asm_volatile_goto(LOCK_PREFIX " decl %0\n" : exit); ``` -First of all, let's pay attention to the `asm_volatile_goto`. This macro is defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/master/include/linux/compiler-gcc.h) header file and just expands to the two inline assembly statements: +First of all, let's pay attention to the `asm_volatile_goto`. This macro is defined in the [include/linux/compiler-gcc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler-gcc.h) header file and just expands to the two inline assembly statements: ```C #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) @@ -217,7 +217,7 @@ will be called after our inline assembly statement. The `fail_fn` is the second mutex_set_owner(lock); ``` -in the end of the `mutex_lock`. The `mutex_set_owner` function is defined in the [kernel/locking/mutex.h](https://github.com/torvalds/linux/blob/master/include/linux/mutex.h) header file and just sets owner of a lock to the current process: +in the end of the `mutex_lock`. The `mutex_set_owner` function is defined in the [kernel/locking/mutex.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/mutex.h) header file and just sets owner of a lock to the current process: ```C static inline void mutex_set_owner(struct mutex *lock) @@ -226,7 +226,7 @@ static inline void mutex_set_owner(struct mutex *lock) } ``` -In other way, let's consider situation when a process which wants to acquire a lock is unable to do it, because another process already acquired the same lock. We already know that the `__mutex_lock_slowpath` function will be called in this case. Let's consider implementation of this function. This function is defined in the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/master/kernel/locking/mutex.c) source code file and starts from the obtaining of the proper mutex by the mutex state given from the `__mutex_fastpath_lock` with the `container_of` macro: +In other way, let's consider situation when a process which wants to acquire a lock is unable to do it, because another process already acquired the same lock. We already know that the `__mutex_lock_slowpath` function will be called in this case. Let's consider implementation of this function. This function is defined in the [kernel/locking/mutex.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/mutex.c) source code file and starts from the obtaining of the proper mutex by the mutex state given from the `__mutex_fastpath_lock` with the `container_of` macro: ```C __visible void __sched @@ -348,7 +348,7 @@ for (;;) { where try to acquire a lock again and exit if this operation was successful. Yes, we try to acquire a lock again right after unsuccessful try before the loop. We need to do it to make sure that we get a wakeup once a lock will be unlocked. Besides this, it allows us to acquire a lock after sleep. In other case we check the current process for pending [signals](https://en.wikipedia.org/wiki/Unix_signal) and exit if the process was interrupted by a `signal` during wait for a lock acquisition. In the end of loop we didn't acquire a lock, so we set the task state for `TASK_UNINTERRUPTIBLE` and go to sleep with call of the `schedule_preempt_disabled` function. -That's all. We have considered all three possible paths through which a process may pass when it will wan to acquire a lock. Now let's consider how `mutex_unlock` is implemented. When the `mutex_unlock` will be called by a process which wants to release a lock, the `__mutex_fastpath_unlock` will be called from the [arch/x86/include/asm/mutex_64.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/mutex_64.h) header file: +That's all. We have considered all three possible paths through which a process may pass when it will wan to acquire a lock. Now let's consider how `mutex_unlock` is implemented. When the `mutex_unlock` will be called by a process which wants to release a lock, the `__mutex_fastpath_unlock` will be called from the [arch/x86/include/asm/mutex_64.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/mutex_64.h) header file: ```C void __sched mutex_unlock(struct mutex *lock) diff --git a/SyncPrim/sync-5.md b/SyncPrim/sync-5.md index baf1df7..a7f6719 100644 --- a/SyncPrim/sync-5.md +++ b/SyncPrim/sync-5.md @@ -27,7 +27,7 @@ struct semaphore { }; ``` -structure. If you will look in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/master/include/linux/rwsem.h) header file, you will find definition of the `rw_semaphore` structure which represents `reader/writer semaphore` in the Linux kernel. Let's look at the definition of this structure: +structure. If you will look in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/rwsem.h) header file, you will find definition of the `rw_semaphore` structure which represents `reader/writer semaphore` in the Linux kernel. Let's look at the definition of this structure: ```C #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK @@ -47,7 +47,7 @@ struct rw_semaphore { }; ``` -Before we will consider fields of the `rw_semaphore` structure, we may notice, that declaration of the `rw_semaphore` structure depends on the `CONFIG_RWSEM_GENERIC_SPINLOCK` kernel configuration option. This option is disabled for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture by default. We can be sure in this by looking at the corresponding kernel configuration file. In our case, this configuration file is - [arch/x86/um/Kconfig](https://github.com/torvalds/linux/blob/master/arch/x86/um/Kconfig): +Before we will consider fields of the `rw_semaphore` structure, we may notice, that declaration of the `rw_semaphore` structure depends on the `CONFIG_RWSEM_GENERIC_SPINLOCK` kernel configuration option. This option is disabled for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture by default. We can be sure in this by looking at the corresponding kernel configuration file. In our case, this configuration file is - [arch/x86/um/Kconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/um/Kconfig): ``` config RWSEM_XCHGADD_ALGORITHM @@ -57,7 +57,7 @@ config RWSEM_GENERIC_SPINLOCK def_bool !RWSEM_XCHGADD_ALGORITHM ``` -So, as this [book](https://0xax.gitbooks.io/linux-insides/content) describes only [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture related stuff, we will skip the case when the `CONFIG_RWSEM_GENERIC_SPINLOCK` kernel configuration is enabled and consider definition of the `rw_semaphore` structure only from the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/master/include/linux/rwsem.h) header file. +So, as this [book](https://0xax.gitbooks.io/linux-insides/content) describes only [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture related stuff, we will skip the case when the `CONFIG_RWSEM_GENERIC_SPINLOCK` kernel configuration is enabled and consider definition of the `rw_semaphore` structure only from the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/rwsem.h) header file. If we will take a look at the definition of the `rw_semaphore` structure, we will notice that first three fields are the same that in the `semaphore` structure. It contains `count` field which represents amount of available resources, the `wait_list` field which represents [doubly linked list](https://0xax.gitbooks.io/linux-insides/content/DataStructures/dlist.html) of processes which are waiting to acquire a lock and `wait_lock` [spinlock](https://en.wikipedia.org/wiki/Spinlock) for protection of this list. Notice that `rw_semaphore.count` field is `long` type unlike the same field in the `semaphore` structure. @@ -79,14 +79,14 @@ That's all. Now we know a little about what is it `reader/writer lock` in genera Reader/Writer semaphore API -------------------------------------------------------------------------------- -So, we know a little about `reader/writer semaphores` from theoretical side, let's look on its implementation in the Linux kernel. All `reader/writer semaphores` related [API](https://en.wikipedia.org/wiki/Application_programming_interface) is located in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/master/include/linux/rwsem.h) header file. +So, we know a little about `reader/writer semaphores` from theoretical side, let's look on its implementation in the Linux kernel. All `reader/writer semaphores` related [API](https://en.wikipedia.org/wiki/Application_programming_interface) is located in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/rwsem.h) header file. As always Before we will consider an [API](https://en.wikipedia.org/wiki/Application_programming_interface) of the `reader/writer semaphore` mechanism in the Linux kernel, we need to know how to initialize the `rw_semaphore` structure. As we already saw in previous parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/index.html), all [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_%28computer_science%29) may be initialized in two ways: * `statically`; * `dynamically`. -And `reader/writer semaphore` is not an exception. First of all, let's take a look at the first approach. We may initialize `rw_semaphore` structure with the help of the `DECLARE_RWSEM` macro in compile time. This macro is defined in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/master/include/linux/rwsem.h) header file and looks: +And `reader/writer semaphore` is not an exception. First of all, let's take a look at the first approach. We may initialize `rw_semaphore` structure with the help of the `DECLARE_RWSEM` macro in compile time. This macro is defined in the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/rwsem.h) header file and looks: ```C #define DECLARE_RWSEM(name) \ @@ -106,7 +106,7 @@ As we may see, the `DECLARE_RWSEM` macro just expands to the definition of the ` } ``` -and expands to the initialization of fields of `rw_semaphore` structure. First of all we initialize `count` field of the `rw_semaphore` structure to the `unlocked` state with `RWSEM_UNLOCKED_VALUE` macro from the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/rwsem.h) architecture specific header file: +and expands to the initialization of fields of `rw_semaphore` structure. First of all we initialize `count` field of the `rw_semaphore` structure to the `unlocked` state with `RWSEM_UNLOCKED_VALUE` macro from the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/rwsem.h) architecture specific header file: ```C #define RWSEM_UNLOCKED_VALUE 0x00000000L @@ -124,7 +124,7 @@ After this we initialize list of a lock waiters with the empty linked list and [ As we may see, the `__RWSEM_OPT_INIT` macro initializes the [MCS lock](http://www.cs.rochester.edu/~scott/papers/1991_TOCS_synch.pdf) lock with `unlocked` state and initial `owner` of a lock with `NULL`. From this moment, a `rw_semaphore` structure will be initialized in a compile time and may be used for data protection. -The second way to initialize a `rw_semaphore` structure is `dynamically` or use the `init_rwsem` macro from the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/master/include/linux/rwsem.h) header file. This macro declares an instance of the `lock_class_key` which is related to the [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) of the Linux kernel and to the call of the `__init_rwsem` function with the given `reader/writer semaphore`: +The second way to initialize a `rw_semaphore` structure is `dynamically` or use the `init_rwsem` macro from the [include/linux/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/rwsem.h) header file. This macro declares an instance of the `lock_class_key` which is related to the [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) of the Linux kernel and to the call of the `__init_rwsem` function with the given `reader/writer semaphore`: ```C #define init_rwsem(sem) \ @@ -135,7 +135,7 @@ do { \ } while (0) ``` -If you will start definition of the `__init_rwsem` function, you will notice that there are couple of source code files which contain it. As you may guess, sometimes we need to initialize additional fields of the `rw_semaphore` structure, like the `osq` and `owner`. But sometimes not. All of this depends on some kernel configuration options. If we will look at the [kernel/locking/Makefile](https://github.com/torvalds/linux/blob/master/kernel/locking/Makefile) makefile, we will see following lines: +If you will start definition of the `__init_rwsem` function, you will notice that there are couple of source code files which contain it. As you may guess, sometimes we need to initialize additional fields of the `rw_semaphore` structure, like the `osq` and `owner`. But sometimes not. All of this depends on some kernel configuration options. If we will look at the [kernel/locking/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/Makefile) makefile, we will see following lines: ```Makefile obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o @@ -149,7 +149,7 @@ config RWSEM_XCHGADD_ALGORITHM def_bool 64BIT ``` -in the [arch/x86/um/Kconfig](https://github.com/torvalds/linux/blob/master/arch/x86/um/Kconfig) kernel configuration file. In this case, implementation of the `__init_rwsem` function will be located in the [kernel/locking/rwsem-xadd.c](https://github.com/torvalds/linux/blob/master/locking/rwsem-xadd.c) source code file for us. Let's take a look at this function: +in the [arch/x86/um/Kconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/um/Kconfig) kernel configuration file. In this case, implementation of the `__init_rwsem` function will be located in the [kernel/locking/rwsem-xadd.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/locking/rwsem-xadd.c) source code file for us. Let's take a look at this function: ```C void __init_rwsem(struct rw_semaphore *sem, const char *name, @@ -180,7 +180,7 @@ So, from now we are able to initialize a `reader/writer semaphore` let's look at * `void up_read(struct rw_semaphore *sem)` - release a read lock; * `void up_write(struct rw_semaphore *sem)` - release a write lock; -Let's start as always from the locking. First of all let's consider implementation of the `down_write` function which executes a try of acquiring of a lock for `write`. This function is [kernel/locking/rwsem.c](https://github.com/torvalds/linux/blob/master/kernel/locking/rwsem.c) source code file and starts from the call of the macro from the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/master/include/linux/kernel.h) header file: +Let's start as always from the locking. First of all let's consider implementation of the `down_write` function which executes a try of acquiring of a lock for `write`. This function is [kernel/locking/rwsem.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/rwsem.c) source code file and starts from the call of the macro from the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/kernel.h) header file: ```C void __sched down_write(struct rw_semaphore *sem) @@ -195,7 +195,7 @@ void __sched down_write(struct rw_semaphore *sem) We already met the `might_sleep` macro in the [previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-4.html). In short words, Implementation of the `might_sleep` macro depends on the `CONFIG_DEBUG_ATOMIC_SLEEP` kernel configuration option and if this option is enabled, this macro just prints a stack trace if it was executed in [atomic](https://en.wikipedia.org/wiki/Linearizability) context. As this macro is mostly for debugging purpose we will skip it and will go ahead. Additionally we will skip the next macro from the `down_read` function - `rwsem_acquire` which is related to the [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) of the Linux kernel, because this is topic of other part. -The only two things that remained in the `down_write` function is the call of the `LOCK_CONTENDED` macro which is defined in the [include/linux/lockdep.h](https://github.com/torvalds/linux/blob/master/include/linux/lockdep.h) header file and setting of owner of a lock with the `rwsem_set_owner` function which sets owner to currently running process: +The only two things that remained in the `down_write` function is the call of the `LOCK_CONTENDED` macro which is defined in the [include/linux/lockdep.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/lockdep.h) header file and setting of owner of a lock with the `rwsem_set_owner` function which sets owner to currently running process: ```C static inline void rwsem_set_owner(struct rw_semaphore *sem) @@ -211,7 +211,7 @@ As you already may guess, the `LOCK_CONTENDED` macro does all job for us. Let's lock(_lock) ``` -As we may see it just calls the `lock` function which is third parameter of the `LOCK_CONTENDED` macro with the given `rw_semaphore`. In our case the third parameter of the `LOCK_CONTENDED` macro is the `__down_write` function which is architecture specific function and located in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/rwsem.h) header file. Let's look at the implementation of the `__down_write` function: +As we may see it just calls the `lock` function which is third parameter of the `LOCK_CONTENDED` macro with the given `rw_semaphore`. In our case the third parameter of the `LOCK_CONTENDED` macro is the `__down_write` function which is architecture specific function and located in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/rwsem.h) header file. Let's look at the implementation of the `__down_write` function: ```C static inline void __down_write(struct rw_semaphore *sem) @@ -249,7 +249,7 @@ As for other synchronization primitives which we saw in this chapter, usually `l #define RWSEM_ACTIVE_BIAS 0x00000001L ``` -or `0xffffffff00000001` to the `count` of the given `reader/writer semaphore` and returns previous value of it. After this we check the active mask in the `rw_semaphore->count`. If it was zero before, this means that there were no-one writer before, so we acquired a lock. In other way we call the `call_rwsem_down_write_failed` function from the [arch/x86/lib/rwsem.S](https://github.com/torvalds/linux/blob/master/arch/x86/lib/rwsem.S) assembly file. The the `call_rwsem_down_write_failed` function just calls the `rwsem_down_write_failed` function from the [kernel/locking/rwsem-xadd.c](https://github.com/torvalds/linux/blob/master/locking/rwsem-xadd.c) source code file anticipatorily save general purpose registers: +or `0xffffffff00000001` to the `count` of the given `reader/writer semaphore` and returns previous value of it. After this we check the active mask in the `rw_semaphore->count`. If it was zero before, this means that there were no-one writer before, so we acquired a lock. In other way we call the `call_rwsem_down_write_failed` function from the [arch/x86/lib/rwsem.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/lib/rwsem.S) assembly file. The the `call_rwsem_down_write_failed` function just calls the `rwsem_down_write_failed` function from the [kernel/locking/rwsem-xadd.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/locking/rwsem-xadd.c) source code file anticipatorily save general purpose registers: ```assembly ENTRY(call_rwsem_down_write_failed) @@ -276,7 +276,7 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct rw_semaphore *sem) } ``` -with the `-RWSEM_ACTIVE_WRITE_BIAS` value. The `rwsem_atomic_update` function is defined in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/rwsem.h) header file and implement exchange and add logic: +with the `-RWSEM_ACTIVE_WRITE_BIAS` value. The `rwsem_atomic_update` function is defined in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/rwsem.h) header file and implement exchange and add logic: ```C static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem) @@ -358,7 +358,7 @@ static inline void __down_read(struct rw_semaphore *sem) which increments value of the given `rw_semaphore->count` and call the `call_rwsem_down_read_failed` if this value is negative. In other way we jump at the label `1:` and exit. After this `read` lock will be successfully acquired. Notice that we check a sign of the `count` value as it may be negative, because as you may remember most significant [word](https://en.wikipedia.org/wiki/Word_%28computer_architecture%29) of the `rw_semaphore->count` contains negated number of active writers. -Let's consider case when a process wants to acquire a lock for `read` operation, but it is already locked. In this case the `call_rwsem_down_read_failed` function from the [arch/x86/lib/rwsem.S](https://github.com/torvalds/linux/blob/master/arch/x86/lib/rwsem.S) assembly file will be called. If you will look at the implementation of this function, you will notice that it does the same that `call_rwsem_down_read_failed` function does. Except it calls the `rwsem_down_read_failed` function instead of `rwsem_dow_write_failed`. Now let's consider implementation of the `rwsem_down_read_failed` function. It starts from the adding a process to the `wait queue` and updating of value of the `rw_semaphore->counter`: +Let's consider case when a process wants to acquire a lock for `read` operation, but it is already locked. In this case the `call_rwsem_down_read_failed` function from the [arch/x86/lib/rwsem.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/lib/rwsem.S) assembly file will be called. If you will look at the implementation of this function, you will notice that it does the same that `call_rwsem_down_read_failed` function does. Except it calls the `rwsem_down_read_failed` function instead of `rwsem_dow_write_failed`. Now let's consider implementation of the `rwsem_down_read_failed` function. It starts from the adding a process to the `wait queue` and updating of value of the `rw_semaphore->counter`: ```C long adjustment = -RWSEM_ACTIVE_READ_BIAS; @@ -375,7 +375,7 @@ count = rwsem_atomic_update(adjustment, sem); Notice that if the `wait queue` was empty before we clear the `rw_semaphore->counter` and undo `read` bias in other way. At the next step we check that there are no active locks and we are first in the `wait queue` we need to join currently active `reader` processes. In other way we go to sleep until a lock will not be able to acquired. -That's all. Now we know how `reader` and `writer` processes will behave in different cases during a lock acquisition. Now let's take a short look at `unlock` operations. The `up_read` and `up_write` functions allows us to unlock a `reader` or `writer` lock. First of all let's take a look at the implementation of the `up_write` function which is defined in the [kernel/locking/rwsem.c](https://github.com/torvalds/linux/blob/master/kernel/locking/rwsem.c) source code file: +That's all. Now we know how `reader` and `writer` processes will behave in different cases during a lock acquisition. Now let's take a short look at `unlock` operations. The `up_read` and `up_write` functions allows us to unlock a `reader` or `writer` lock. First of all let's take a look at the implementation of the `up_write` function which is defined in the [kernel/locking/rwsem.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/rwsem.c) source code file: ```C void up_write(struct rw_semaphore *sem) @@ -396,7 +396,7 @@ static inline void rwsem_clear_owner(struct rw_semaphore *sem) } ``` -The `__up_write` function does all job of unlocking of the lock. The `_up_write` is architecture-specific function, so for our case it will be located in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/rwsem.h) source code file. If we will take a look at the implementation of this function, we will see that it does almost the same that `__down_write` function, but conversely. Instead of adding of the `RWSEM_ACTIVE_WRITE_BIAS` to the `count`, we subtract the same value and check the `sign` of the previous value. +The `__up_write` function does all job of unlocking of the lock. The `_up_write` is architecture-specific function, so for our case it will be located in the [arch/x86/include/asm/rwsem.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/rwsem.h) source code file. If we will take a look at the implementation of this function, we will see that it does almost the same that `__down_write` function, but conversely. Instead of adding of the `RWSEM_ACTIVE_WRITE_BIAS` to the `count`, we subtract the same value and check the `sign` of the previous value. If the previous value of the `rw_semaphore->count` is not negative, a writer process released a lock and now it may be acquired by someone else. In other case, the `rw_semaphore->count` will contain negative values. This means that there is at least one `writer` in a wait queue. In this case the `call_rwsem_wake` function will be called. This function acts like similar functions which we already saw above. It store general purpose registers at the stack for preserving and call the `rwsem_wake` function. diff --git a/SyncPrim/sync-6.md b/SyncPrim/sync-6.md index 78076b3..a74e2ad 100644 --- a/SyncPrim/sync-6.md +++ b/SyncPrim/sync-6.md @@ -43,7 +43,7 @@ Ok, now we know what a `seqlock` synchronization primitive is and how it is repr Sequential lock API -------------------------------------------------------------------------------- -So, now we know a little about `sequentional lock` synchronization primitive from theoretical side, let's look at its implementation in the Linux kernel. All `sequentional locks` [API](https://en.wikipedia.org/wiki/Application_programming_interface) are located in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/master/include/linux/seqlock.h) header file. +So, now we know a little about `sequentional lock` synchronization primitive from theoretical side, let's look at its implementation in the Linux kernel. All `sequentional locks` [API](https://en.wikipedia.org/wiki/Application_programming_interface) are located in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. First of all we may see that the a `sequential lock` machanism is represented by the following type: @@ -81,7 +81,7 @@ ways. Let's look at the first approach. We are able to intialize a `seqlock_t` s seqlock_t x = __SEQLOCK_UNLOCKED(x) ``` -which is defined in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/master/include/linux/seqlock.h) header file. As we may see, the `DEFINE_SEQLOCK` macro takes one argument and expands to the definition and initialization of the `seqlock_t` structure. Initialization occurs with the help of the `__SEQLOCK_UNLOCKED` macro which is defined in the same source code file. Let's look at the implementation of this macro: +which is defined in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. As we may see, the `DEFINE_SEQLOCK` macro takes one argument and expands to the definition and initialization of the `seqlock_t` structure. Initialization occurs with the help of the `__SEQLOCK_UNLOCKED` macro which is defined in the same source code file. Let's look at the implementation of this macro: ```C #define __SEQLOCK_UNLOCKED(lockname) \ @@ -114,9 +114,9 @@ So we just initialize counter of the given sequential lock to zero and additiona #endif ``` -As I already wrote in previous parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/) we will not consider [debugging](https://en.wikipedia.org/wiki/Debugging) and [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) related stuff in this part. So for now we just skip the `SEQCOUNT_DEP_MAP_INIT` macro. The second field of the given `seqlock_t` is `lock` initialized with the `__SPIN_LOCK_UNLOCKED` macro which is defined in the [include/linux/spinlock_types.h](https://github.com/torvalds/linux/blob/master/include/linux/spinlock_types.h) header file. We will not consider implementation of this macro here as it just initialize [rawspinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) with architecture-specific methods (More abot spinlocks you may read in first parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/)). +As I already wrote in previous parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/) we will not consider [debugging](https://en.wikipedia.org/wiki/Debugging) and [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) related stuff in this part. So for now we just skip the `SEQCOUNT_DEP_MAP_INIT` macro. The second field of the given `seqlock_t` is `lock` initialized with the `__SPIN_LOCK_UNLOCKED` macro which is defined in the [include/linux/spinlock_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock_types.h) header file. We will not consider implementation of this macro here as it just initialize [rawspinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) with architecture-specific methods (More abot spinlocks you may read in first parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/)). -We have considered the first way to initialize a sequential lock. Let's consider second way to do the same, but do it dynamically. We can initialize a sequentional lock with the `seqlock_init` macro which is defined in the same [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/master/include/linux/seqlock.h) header file. +We have considered the first way to initialize a sequential lock. Let's consider second way to do the same, but do it dynamically. We can initialize a sequentional lock with the `seqlock_init` macro which is defined in the same [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. Let's look at the implementation of this macro: diff --git a/SysCall/syscall-1.md b/SysCall/syscall-1.md index 4af4ce0..3e8d5ed 100644 --- a/SysCall/syscall-1.md +++ b/SysCall/syscall-1.md @@ -13,7 +13,7 @@ System call. What is it? A system call is just a userspace request of a kernel service. Yes, the operating system kernel provides many services. When your program wants to write to or read from a file, start to listen for connections on a [socket](https://en.wikipedia.org/wiki/Network_socket), delete or create directory, or even to finish its work, a program uses a system call. In other words, a system call is just a [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) kernel space function that user space programs call to handle some request. -The Linux kernel provides a set of these functions and each architecture provides its own set. For example: the [x86_64](https://en.wikipedia.org/wiki/X86-64) provides [322](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl) system calls and the [x86](https://en.wikipedia.org/wiki/X86) provides [358](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_32.tbl) different system calls. Ok, a system call is just a function. Let's look on a simple `Hello world` example that's written in the assembly programming language: +The Linux kernel provides a set of these functions and each architecture provides its own set. For example: the [x86_64](https://en.wikipedia.org/wiki/X86-64) provides [322](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl) system calls and the [x86](https://en.wikipedia.org/wiki/X86) provides [358](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_32.tbl) different system calls. Ok, a system call is just a function. Let's look on a simple `Hello world` example that's written in the assembly programming language: ```assembly .data @@ -76,15 +76,15 @@ by those selector values correspond to the fixed values loaded into the descript caches; the SYSCALL instruction does not ensure this correspondence. ``` -and we are initializing `syscalls` by the writing of the `entry_SYSCALL_64` that defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembler file and represents `SYSCALL` instruction entry to the `IA32_STAR` [Model specific register](https://en.wikipedia.org/wiki/Model-specific_register): +and we are initializing `syscalls` by the writing of the `entry_SYSCALL_64` that defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembler file and represents `SYSCALL` instruction entry to the `IA32_STAR` [Model specific register](https://en.wikipedia.org/wiki/Model-specific_register): ```C wrmsrl(MSR_LSTAR, entry_SYSCALL_64); ``` -in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c) source code file. +in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c) source code file. -So, the `syscall` instruction invokes a handler of a given system call. But how does it know which handler to call? Actually it gets this information from the general purpose [registers](https://en.wikipedia.org/wiki/Processor_register). As you can see in the system call [table](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl), each system call has a unique number. In our example, first system call is - `write` that writes data to the given file. Let's look in the system call table and try to find `write` system call. As we can see, the [write](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L10) system call has number - `1`. We pass the number of this system call through the `rax` register in our example. The next general purpose registers: `%rdi`, `%rsi` and `%rdx` take parameters of the `write` syscall. In our case, they are [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) (`1` is [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29) in our case), second parameter is the pointer to our string, and the third is size of data. Yes, you heard right. Parameters for a system call. As I already wrote above, a system call is a just `C` function in the kernel space. In our case first system call is write. This system call defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/master/fs/read_write.c) source code file and looks like: +So, the `syscall` instruction invokes a handler of a given system call. But how does it know which handler to call? Actually it gets this information from the general purpose [registers](https://en.wikipedia.org/wiki/Processor_register). As you can see in the system call [table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl), each system call has a unique number. In our example, first system call is - `write` that writes data to the given file. Let's look in the system call table and try to find `write` system call. As we can see, the [write](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L10) system call has number - `1`. We pass the number of this system call through the `rax` register in our example. The next general purpose registers: `%rdi`, `%rsi` and `%rdx` take parameters of the `write` syscall. In our case, they are [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) (`1` is [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29) in our case), second parameter is the pointer to our string, and the third is size of data. Yes, you heard right. Parameters for a system call. As I already wrote above, a system call is a just `C` function in the kernel space. In our case first system call is write. This system call defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and looks like: ```C SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, @@ -104,7 +104,7 @@ ssize_t write(int fd, const void *buf, size_t nbytes); Don't worry about the `SYSCALL_DEFINE3` macro for now, we'll come back to it. -The second part of our example is the same, but we call other system call. In this case we call [exit](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L69) system call. This system call gets only one parameter: +The second part of our example is the same, but we call other system call. In this case we call [exit](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L69) system call. This system call gets only one parameter: * Return value @@ -120,7 +120,7 @@ _exit(0) = ? +++ exited with 0 +++ ``` -In the first line of the `strace` output, we can see [execve](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This and other agreement for the `x86_64` architecture explained in the special document - [System V Application Binary Interface. PDF](http://www.x86-64.org/documentation/abi.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: +In the first line of the `strace` output, we can see [execve](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This and other agreement for the `x86_64` architecture explained in the special document - [System V Application Binary Interface. PDF](http://www.x86-64.org/documentation/abi.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: * `rdi`; * `rsi`; @@ -188,7 +188,7 @@ $ sudo cat /proc/1/syscall 232 0x4 0x7ffdf82e11b0 0x1f 0xffffffff 0x100 0x7ffdf82e11bf 0x7ffdf82e11a0 0x7f9114681193 ``` -the system call with number - `232` which is [epoll_wait](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L241) system call that waits for an I/O event on an [epoll](https://en.wikipedia.org/wiki/Epoll) file descriptor. Or for example `emacs` editor where I'm writing this part: +the system call with number - `232` which is [epoll_wait](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L241) system call that waits for an I/O event on an [epoll](https://en.wikipedia.org/wiki/Epoll) file descriptor. Or for example `emacs` editor where I'm writing this part: ``` $ ps ax | grep emacs @@ -201,14 +201,14 @@ $ sudo cat /proc/2093/syscall 270 0xf 0x7fff068a5a90 0x7fff068a5b10 0x0 0x7fff068a59c0 0x7fff068a59d0 0x7fff068a59b0 0x7f777dd8813c ``` -the system call with the number `270` which is [sys_pselect6](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L279) system call that allows `emacs` to monitor multiple file descriptors. +the system call with the number `270` which is [sys_pselect6](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L279) system call that allows `emacs` to monitor multiple file descriptors. Now we know a little about system call, what is it and why we need in it. So let's look at the `write` system call that our program used. Implementation of write system call -------------------------------------------------------------------------------- -Let's look at the implementation of this system call directly in the source code of the Linux kernel. As we already know, the `write` system call is defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/master/fs/read_write.c) source code file and looks like this: +Let's look at the implementation of this system call directly in the source code of the Linux kernel. As we already know, the `write` system call is defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and looks like this: ```C SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, @@ -229,7 +229,7 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, } ``` -First of all, the `SYSCALL_DEFINE3` macro is defined in the [include/linux/syscalls.h](https://github.com/torvalds/linux/blob/master/include/linux/syscalls.h) header file and expands to the definition of the `sys_name(...)` function. Let's look at this macro: +First of all, the `SYSCALL_DEFINE3` macro is defined in the [include/linux/syscalls.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/syscalls.h) header file and expands to the definition of the `sys_name(...)` function. Let's look at this macro: ```C #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) @@ -244,7 +244,7 @@ As we can see the `SYSCALL_DEFINE3` macro takes `name` parameter which will repr * `SYSCALL_METADATA`; * `__SYSCALL_DEFINEx`. -Implementation of the first macro `SYSCALL_METADATA` depends on the `CONFIG_FTRACE_SYSCALLS` kernel configuration option. As we can understand from the name of this option, it allows to enable tracer to catch the syscall entry and exit events. If this kernel configuration option is enabled, the `SYSCALL_METADATA` macro executes initialization of the `syscall_metadata` structure that defined in the [include/trace/syscall.h](https://github.com/torvalds/linux/blob/master/include/trace/syscall.h) header file and contains different useful fields as name of a system call, number of a system call in the system call [table](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl), number of parameters of a system call, list of parameter types and etc: +Implementation of the first macro `SYSCALL_METADATA` depends on the `CONFIG_FTRACE_SYSCALLS` kernel configuration option. As we can understand from the name of this option, it allows to enable tracer to catch the syscall entry and exit events. If this kernel configuration option is enabled, the `SYSCALL_METADATA` macro executes initialization of the `syscall_metadata` structure that defined in the [include/trace/syscall.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/trace/syscall.h) header file and contains different useful fields as name of a system call, number of a system call in the system call [table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl), number of parameters of a system call, list of parameter types and etc: ```C #define SYSCALL_METADATA(sname, nb, ...) \ @@ -329,7 +329,7 @@ As we already know and can see from the code, it takes three arguments: * `buf` - buffer to write; * `count` - length of buffer to write. -and writes data from a buffer declared by the user to a given device or a file. Note that the second parameter `buf`, defined with the `__user` attribute. The main purpose of this attribute is for checking the Linux kernel code with the [sparse](https://en.wikipedia.org/wiki/Sparse) util. It is defined in the [include/linux/compiler.h](https://github.com/torvalds/linux/blob/master/include/linux/compiler.h) header file and depends on the `__CHECKER__` definition in the Linux kernel. That's all about useful meta-information related to our `sys_write` system call, let's try to understand how this system call is implemented. As we can see it starts from the definition of the `f` structure that has `fd` structure type that represent file descriptor in the Linux kernel and we put the result of the call of the `fdget_pos` function. The `fdget_pos` function defined in the same [source](https://github.com/torvalds/linux/blob/master/fs/read_write.c) code file and just expands the call of the `__to_fd` function: +and writes data from a buffer declared by the user to a given device or a file. Note that the second parameter `buf`, defined with the `__user` attribute. The main purpose of this attribute is for checking the Linux kernel code with the [sparse](https://en.wikipedia.org/wiki/Sparse) util. It is defined in the [include/linux/compiler.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler.h) header file and depends on the `__CHECKER__` definition in the Linux kernel. That's all about useful meta-information related to our `sys_write` system call, let's try to understand how this system call is implemented. As we can see it starts from the definition of the `f` structure that has `fd` structure type that represent file descriptor in the Linux kernel and we put the result of the call of the `fdget_pos` function. The `fdget_pos` function defined in the same [source](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) code file and just expands the call of the `__to_fd` function: ```C static inline struct fd fdget_pos(int fd) @@ -347,7 +347,7 @@ static inline loff_t file_pos_read(struct file *file) } ``` -and call the `vfs_write` function. The `vfs_write` function defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/master/fs/read_write.c) source code file and does the work for us - writes given buffer to the given file starting from the given position. We will not dive into details about the `vfs_write` function, because this function is weakly related to the `system call` concept but mostly about [Virtual file system](https://en.wikipedia.org/wiki/Virtual_file_system) concept which we will see in another chapter. After the `vfs_write` has finished its work, we check the result and if it was finished successfully we change the position in the file with the `file_pos_write` function: +and call the `vfs_write` function. The `vfs_write` function defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and does the work for us - writes given buffer to the given file starting from the given position. We will not dive into details about the `vfs_write` function, because this function is weakly related to the `system call` concept but mostly about [Virtual file system](https://en.wikipedia.org/wiki/Virtual_file_system) concept which we will see in another chapter. After the `vfs_write` has finished its work, we check the result and if it was finished successfully we change the position in the file with the `file_pos_write` function: ```C if (ret >= 0) @@ -399,7 +399,7 @@ Links * [System V Application Binary Interface. PDF](http://www.x86-64.org/documentation/abi.pdf) * [GCC](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) * [Intel manual. PDF](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) -* [system call table](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl) +* [system call table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl) * [GCC macro documentation](https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html) * [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) * [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29) diff --git a/SysCall/syscall-2.md b/SysCall/syscall-2.md index cf9d199..483e083 100644 --- a/SysCall/syscall-2.md +++ b/SysCall/syscall-2.md @@ -42,7 +42,7 @@ But anyway, `write` is not a direct system call and not a kernel function. An ap Initialization of the system calls table -------------------------------------------------------------------------------- -From the previous part we know that system call concept is very similar to an interrupt. Furthermore, system calls are implemented as software interrupts. So, when the processor handles a `syscall` instruction from a user application, this instruction causes an exception which transfers control to an exception handler. As we know, all exception handlers (or in other words kernel [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) functions that will react on an exception) are placed in the kernel code. But how does the Linux kernel search for the address of the necessary system call handler for the related system call? The Linux kernel contains a special table called the `system call table`. The system call table is represented by the `sys_call_table` array in the Linux kernel which is defined in the [arch/x86/entry/syscall_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscall_64.c) source code file. Let's look at its implementation: +From the previous part we know that system call concept is very similar to an interrupt. Furthermore, system calls are implemented as software interrupts. So, when the processor handles a `syscall` instruction from a user application, this instruction causes an exception which transfers control to an exception handler. As we know, all exception handlers (or in other words kernel [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) functions that will react on an exception) are placed in the kernel code. But how does the Linux kernel search for the address of the necessary system call handler for the related system call? The Linux kernel contains a special table called the `system call table`. The system call table is represented by the `sys_call_table` array in the Linux kernel which is defined in the [arch/x86/entry/syscall_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscall_64.c) source code file. Let's look at its implementation: ```C asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { @@ -57,7 +57,7 @@ As we can see, the `sys_call_table` is an array of `__NR_syscall_max + 1` size w #define __NR_syscall_max 322 ``` -There will be the same number of system calls in the [arch/x86/entry/syscalls/syscall_64.tbl](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L331) for the `x86_64`. There are two important topics here; the type of the `sys_call_table` array, and the initialization of elements in this array. First of all, the type. The `sys_call_ptr_t` represents a pointer to a system call table. It is defined as [typedef](https://en.wikipedia.org/wiki/Typedef) for a function pointer that returns nothing and does not take arguments: +There will be the same number of system calls in the [arch/x86/entry/syscalls/syscall_64.tbl](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L331) for the `x86_64`. There are two important topics here; the type of the `sys_call_table` array, and the initialization of elements in this array. First of all, the type. The `sys_call_ptr_t` represents a pointer to a system call table. It is defined as [typedef](https://en.wikipedia.org/wiki/Typedef) for a function pointer that returns nothing and does not take arguments: ```C typedef void (*sys_call_ptr_t)(void); @@ -78,7 +78,7 @@ The `-ENOSYS` error tells us that: ENOSYS Function not implemented (POSIX.1) ``` -Also a note on `...` in the initialization of the `sys_call_table`. We can do it with a [GCC](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) compiler extension called - [Designated Initializers](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html). This extension allows us to initialize elements in non-fixed order. As you can see, we include the `asm/syscalls_64.h` header at the end of the array. This header file is generated by the special script at [arch/x86/entry/syscalls/syscalltbl.sh](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscalltbl.sh) and generates our header file from the [syscall table](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl). The `asm/syscalls_64.h` contains definitions of the following macros: +Also a note on `...` in the initialization of the `sys_call_table`. We can do it with a [GCC](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) compiler extension called - [Designated Initializers](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html). This extension allows us to initialize elements in non-fixed order. As you can see, we include the `asm/syscalls_64.h` header at the end of the array. This header file is generated by the special script at [arch/x86/entry/syscalls/syscalltbl.sh](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscalltbl.sh) and generates our header file from the [syscall table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl). The `asm/syscalls_64.h` contains definitions of the following macros: ```C __SYSCALL_COMMON(0, sys_read, sys_read) @@ -91,7 +91,7 @@ __SYSCALL_COMMON(5, sys_newfstat, sys_newfstat) ... ``` -The `__SYSCALL_COMMON` macro is defined in the same source code [file](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscall_64.c) and expands to the `__SYSCALL_64` macro which expands to the function definition: +The `__SYSCALL_COMMON` macro is defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscall_64.c) and expands to the `__SYSCALL_64` macro which expands to the function definition: ```C #define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat) @@ -126,7 +126,7 @@ SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR ``` -it means that we need to put the system call entry in to the `IA32_LSTAR` [model specific register](https://en.wikipedia.org/wiki/Model-specific_register). This operation takes place during the Linux kernel initialization process. If you have read the fourth [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-4.html) of the chapter that describes interrupts and interrupt handling in the Linux kernel, you know that the Linux kernel calls the `trap_init` function during the initialization process. This function is defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) source code file and executes the initialization of the `non-early` exception handlers like divide error, [coprocessor](https://en.wikipedia.org/wiki/Coprocessor) error etc. Besides the initialization of the `non-early` exceptions handlers, this function calls the `cpu_init` function from the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/blob/arch/x86/kernel/cpu/common.c) source code file which besides initialization of `per-cpu` state, calls the `syscall_init` function from the same source code file. +it means that we need to put the system call entry in to the `IA32_LSTAR` [model specific register](https://en.wikipedia.org/wiki/Model-specific_register). This operation takes place during the Linux kernel initialization process. If you have read the fourth [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-4.html) of the chapter that describes interrupts and interrupt handling in the Linux kernel, you know that the Linux kernel calls the `trap_init` function during the initialization process. This function is defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) source code file and executes the initialization of the `non-early` exception handlers like divide error, [coprocessor](https://en.wikipedia.org/wiki/Coprocessor) error etc. Besides the initialization of the `non-early` exceptions handlers, this function calls the `cpu_init` function from the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/blob/arch/x86/kernel/cpu/common.c) source code file which besides initialization of `per-cpu` state, calls the `syscall_init` function from the same source code file. This function performs the initialization of the system call entry point. Let's look on the implementation of this function. It does not take parameters and first of all it fills two model specific registers: @@ -135,7 +135,7 @@ wrmsrl(MSR_STAR, ((u64)__USER32_CS)<<48 | ((u64)__KERNEL_CS)<<32); wrmsrl(MSR_LSTAR, entry_SYSCALL_64); ``` -The first model specific register - `MSR_STAR` contains `63:48` bits of the user code segment. These bits will be loaded to the `CS` and `SS` segment registers for the `sysret` instruction which provides functionality to return from a system call to user code with the related privilege. Also the `MSR_STAR` contains `47:32` bits from the kernel code that will be used as the base selector for `CS` and `SS` segment registers when user space applications execute a system call. In the second line of code we fill the `MSR_LSTAR` register with the `entry_SYSCALL_64` symbol that represents system call entry. The `entry_SYSCALL_64` is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly file and contains code related to the preparation performed before a system call handler will be executed (I already wrote about these preparations, read above). We will not consider the `entry_SYSCALL_64` now, but will return to it later in this chapter. +The first model specific register - `MSR_STAR` contains `63:48` bits of the user code segment. These bits will be loaded to the `CS` and `SS` segment registers for the `sysret` instruction which provides functionality to return from a system call to user code with the related privilege. Also the `MSR_STAR` contains `47:32` bits from the kernel code that will be used as the base selector for `CS` and `SS` segment registers when user space applications execute a system call. In the second line of code we fill the `MSR_LSTAR` register with the `entry_SYSCALL_64` symbol that represents system call entry. The `entry_SYSCALL_64` is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly file and contains code related to the preparation performed before a system call handler will be executed (I already wrote about these preparations, read above). We will not consider the `entry_SYSCALL_64` now, but will return to it later in this chapter. After we have set the entry point for system calls, we need to set the following model specific registers: @@ -164,7 +164,7 @@ In another way, if the `CONFIG_IA32_EMULATION` kernel configuration option is di wrmsrl(MSR_CSTAR, ignore_sysret); ``` -that is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly file and just returns `-ENOSYS` error code: +that is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly file and just returns `-ENOSYS` error code: ```assembly ENTRY(ignore_sysret) @@ -198,13 +198,13 @@ Preparation before system call handler will be called As I already wrote, before a system call or an interrupt handler will be called by the Linux kernel we need to do some preparations. The `idtentry` macro performs the preparations required before an exception handler will be executed, the `interrupt` macro performs the preparations required before an interrupt handler will be called and the `entry_SYSCALL_64` will do the preparations required before a system call handler will be executed. -The `entry_SYSCALL_64` is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly file and starts from the following macro: +The `entry_SYSCALL_64` is defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly file and starts from the following macro: ```assembly SWAPGS_UNSAFE_STACK ``` -This macro is defined in the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irqflags.h) header file and expands to the `swapgs` instruction: +This macro is defined in the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irqflags.h) header file and expands to the `swapgs` instruction: ```C #define SWAPGS_UNSAFE_STACK swapgs @@ -266,7 +266,7 @@ testl $_TIF_WORK_SYSCALL_ENTRY, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) jnz tracesys ``` -The `_TIF_WORK_SYSCALL_ENTRY` macro is defined in the [arch/x86/include/asm/thread_info.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/thread_info.h) header file and provides set of the thread information flags that are related to the system calls tracing: +The `_TIF_WORK_SYSCALL_ENTRY` macro is defined in the [arch/x86/include/asm/thread_info.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/thread_info.h) header file and provides set of the thread information flags that are related to the system calls tracing: ```C #define _TIF_WORK_SYSCALL_ENTRY \ @@ -275,7 +275,7 @@ The `_TIF_WORK_SYSCALL_ENTRY` macro is defined in the [arch/x86/include/asm/thre _TIF_NOHZ) ``` -We will not consider debugging/tracing related stuff in this chapter, but will see it in the separate chapter that will be devoted to the debugging and tracing techniques in the Linux kernel. After the `tracesys` label, the next label is the `entry_SYSCALL_64_fastpath`. In the `entry_SYSCALL_64_fastpath` we check the `__SYSCALL_MASK` that is defined in the [arch/x86/include/asm/unistd.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/unistd.h) header file and +We will not consider debugging/tracing related stuff in this chapter, but will see it in the separate chapter that will be devoted to the debugging and tracing techniques in the Linux kernel. After the `tracesys` label, the next label is the `entry_SYSCALL_64_fastpath`. In the `entry_SYSCALL_64_fastpath` we check the `__SYSCALL_MASK` that is defined in the [arch/x86/include/asm/unistd.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/unistd.h) header file and ```C # ifdef CONFIG_X86_X32_ABI @@ -324,7 +324,7 @@ That's all. We did all the required preparations and the system call handler was Exit from a system call -------------------------------------------------------------------------------- -After a system call handler finishes its work, we will return back to the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S), right after where we have called the system call handler: +After a system call handler finishes its work, we will return back to the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S), right after where we have called the system call handler: ```assembly call *sys_call_table(, %rax, 8) @@ -338,7 +338,7 @@ movq %rax, RAX(%rsp) on the `RAX` place. -After this we can see the call of the `LOCKDEP_SYS_EXIT` macro from the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irqflags.h): +After this we can see the call of the `LOCKDEP_SYS_EXIT` macro from the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irqflags.h): ```assembly LOCKDEP_SYS_EXIT diff --git a/SysCall/syscall-3.md b/SysCall/syscall-3.md index 7cf3916..52b0db7 100644 --- a/SysCall/syscall-3.md +++ b/SysCall/syscall-3.md @@ -11,7 +11,7 @@ We already know what is a `system call`. This is special routine in the Linux ke Introduction to vsyscalls -------------------------------------------------------------------------------- -The `vsyscall` or `virtual system call` is the first and oldest mechanism in the Linux kernel that is designed to accelerate execution of certain system calls. The principle of work of the `vsyscall` concept is simple. The Linux kernel maps into user space a page that contains some variables and the implementation of some system calls. We can find information about this memory space in the Linux kernel [documentation](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt) for the [x86_64](https://en.wikipedia.org/wiki/X86-64): +The `vsyscall` or `virtual system call` is the first and oldest mechanism in the Linux kernel that is designed to accelerate execution of certain system calls. The principle of work of the `vsyscall` concept is simple. The Linux kernel maps into user space a page that contains some variables and the implementation of some system calls. We can find information about this memory space in the Linux kernel [documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt) for the [x86_64](https://en.wikipedia.org/wiki/X86-64): ``` ffffffffff600000 - ffffffffffdfffff (=8 MB) vsyscalls @@ -24,7 +24,7 @@ or: ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] ``` -After this, these system calls will be executed in userspace and this means that there will not be [context switching](https://en.wikipedia.org/wiki/Context_switch). Mapping of the `vsyscall` page occurs in the `map_vsyscall` function that is defined in the [arch/x86/entry/vsyscall/vsyscall_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vsyscall/vsyscall_64.c) source code file. This function is called during the Linux kernel initialization in the `setup_arch` function that is defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) source code file (we saw this function in the fifth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) of the Linux kernel initialization process chapter). +After this, these system calls will be executed in userspace and this means that there will not be [context switching](https://en.wikipedia.org/wiki/Context_switch). Mapping of the `vsyscall` page occurs in the `map_vsyscall` function that is defined in the [arch/x86/entry/vsyscall/vsyscall_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vsyscall/vsyscall_64.c) source code file. This function is called during the Linux kernel initialization in the `setup_arch` function that is defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) source code file (we saw this function in the fifth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) of the Linux kernel initialization process chapter). Note that implementation of the `map_vsyscall` function depends on the `CONFIG_X86_VSYSCALL_EMULATION` kernel configuration option: @@ -49,7 +49,7 @@ void __init map_vsyscall(void) } ``` -As we can see, at the beginning of the `map_vsyscall` function we get the physical address of the `vsyscall` page with the `__pa_symbol` macro (we already saw implementation if this macro in the fourth [path](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html) of the Linux kernel initialization process). The `__vsyscall_page` symbol defined in the [arch/x86/entry/vsyscall/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vsyscall/vsyscall_emu_64.S) assembly source code file and have the following [virtual address](https://en.wikipedia.org/wiki/Virtual_address_space): +As we can see, at the beginning of the `map_vsyscall` function we get the physical address of the `vsyscall` page with the `__pa_symbol` macro (we already saw implementation if this macro in the fourth [path](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html) of the Linux kernel initialization process). The `__vsyscall_page` symbol defined in the [arch/x86/entry/vsyscall/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vsyscall/vsyscall_emu_64.S) assembly source code file and have the following [virtual address](https://en.wikipedia.org/wiki/Virtual_address_space): ``` ffffffff81881000 D __vsyscall_page @@ -149,7 +149,7 @@ BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != (unsigned long)VSYSCALL_ADDR); ``` -That's all. `vsyscall` page is set up. The result of the all the above is the following: If we pass `vsyscall=native` parameter to the kernel command line, virtual system calls will be handled as native `syscall` instructions in the [arch/x86/entry/vsyscall/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vsyscall/vsyscall_emu_64.S). The [glibc](https://en.wikipedia.org/wiki/GNU_C_Library) knows addresses of the virtual system call handlers. Note that virtual system call handlers are aligned by `1024` (or `0x400`) bytes: +That's all. `vsyscall` page is set up. The result of the all the above is the following: If we pass `vsyscall=native` parameter to the kernel command line, virtual system calls will be handled as native `syscall` instructions in the [arch/x86/entry/vsyscall/vsyscall_emu_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vsyscall/vsyscall_emu_64.S). The [glibc](https://en.wikipedia.org/wiki/GNU_C_Library) knows addresses of the virtual system call handlers. Note that virtual system call handlers are aligned by `1024` (or `0x400`) bytes: ```assembly __vsyscall_page: @@ -178,7 +178,7 @@ And the start address of the `vsyscall` page is the `ffffffffff600000` every tim All virtual system call requests will fall into the `__vsyscall_page` + `VSYSCALL_ADDR_vsyscall_name` offset, put the number of a virtual system call to the `rax` general purpose [register](https://en.wikipedia.org/wiki/Processor_register) and the native for the x86_64 `syscall` instruction will be executed. -In the second case, if we pass `vsyscall=emulate` parameter to the kernel command line, an attempt to perform virtual system call handler will cause a [page fault](https://en.wikipedia.org/wiki/Page_fault) exception. Of course, remember, the `vsyscall` page has `__PAGE_KERNEL_VVAR` access rights that forbid execution. The `do_page_fault` function is the `#PF` or page fault handler. It tries to understand the reason of the last page fault. And one of the reason can be situation when virtual system call called and `vsyscall` mode is `emulate`. In this case `vsyscall` will be handled by the `emulate_vsyscall` function that defined in the [arch/x86/entry/vsyscall/vsyscall_64.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vsyscall/vsyscall_64.c) source code file. +In the second case, if we pass `vsyscall=emulate` parameter to the kernel command line, an attempt to perform virtual system call handler will cause a [page fault](https://en.wikipedia.org/wiki/Page_fault) exception. Of course, remember, the `vsyscall` page has `__PAGE_KERNEL_VVAR` access rights that forbid execution. The `do_page_fault` function is the `#PF` or page fault handler. It tries to understand the reason of the last page fault. And one of the reason can be situation when virtual system call called and `vsyscall` mode is `emulate`. In this case `vsyscall` will be handled by the `emulate_vsyscall` function that defined in the [arch/x86/entry/vsyscall/vsyscall_64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vsyscall/vsyscall_64.c) source code file. The `emulate_vsyscall` function gets the number of a virtual system call, checks it, prints error and sends [segmentation fault](https://en.wikipedia.org/wiki/Segmentation_fault) simply: @@ -254,7 +254,7 @@ Here we can see that [uname](https://en.wikipedia.org/wiki/Uname) util was linke The first provides `vDSO` functionality, the second is `C` [standard library](https://en.wikipedia.org/wiki/C_standard_library) and the third is the program interpreter (more about this you can read in the part that describes [linkers](http://0xax.gitbooks.io/linux-insides/content/Misc/linkers.html)). So, the `vDSO` solves limitations of the `vsyscall`. Implementation of the `vDSO` is similar to `vsyscall`. -Initialization of the `vDSO` occurs in the `init_vdso` function that defined in the [arch/x86/entry/vdso/vma.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vma.c) source code file. This function starts from the initialization of the `vDSO` images for 32-bits and 64-bits depends on the `CONFIG_X86_X32_ABI` kernel configuration option: +Initialization of the `vDSO` occurs in the `init_vdso` function that defined in the [arch/x86/entry/vdso/vma.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vma.c) source code file. This function starts from the initialization of the `vDSO` images for 32-bits and 64-bits depends on the `CONFIG_X86_X32_ABI` kernel configuration option: ```C static int __init init_vdso(void) @@ -266,7 +266,7 @@ static int __init init_vdso(void) #endif ``` -Both function initialize the `vdso_image` structure. This structure is defined in the two generated source code files: the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vdso-image-64.c) and the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vdso-image-64.c). These source code files generated by the [vdso2c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vdso2c.c) program from the different source code files, represent different approaches to call a system call like `int 0x80`, `sysenter` and etc. The full set of the images depends on the kernel configuration. +Both function initialize the `vdso_image` structure. This structure is defined in the two generated source code files: the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c) and the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c). These source code files generated by the [vdso2c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso2c.c) program from the different source code files, represent different approaches to call a system call like `int 0x80`, `sysenter` and etc. The full set of the images depends on the kernel configuration. For example for the `x86_64` Linux kernel it will contain `vdso_image_64`: @@ -339,13 +339,13 @@ void __init init_vdso_image(const struct vdso_image *image) } ``` -The `init_vdso` function passed to the `subsys_initcall` macro adds the given function to the `initcalls` list. All functions from this list will be called in the `do_initcalls` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file: +The `init_vdso` function passed to the `subsys_initcall` macro adds the given function to the `initcalls` list. All functions from this list will be called in the `do_initcalls` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file: ```C subsys_initcall(init_vdso); ``` -Ok, we just saw initialization of the `vDSO` and initialization of `page` structures that are related to the memory pages that contain `vDSO` system calls. But to where do their pages map? Actually they are mapped by the kernel, when it loads binary to the memory. The Linux kernel calls the `arch_setup_additional_pages` function from the [arch/x86/entry/vdso/vma.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vma.c) source code file that checks that `vDSO` enabled for the `x86_64` and calls the `map_vdso` function: +Ok, we just saw initialization of the `vDSO` and initialization of `page` structures that are related to the memory pages that contain `vDSO` system calls. But to where do their pages map? Actually they are mapped by the kernel, when it loads binary to the memory. The Linux kernel calls the `arch_setup_additional_pages` function from the [arch/x86/entry/vdso/vma.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vma.c) source code file that checks that `vDSO` enabled for the `x86_64` and calls the `map_vdso` function: ```C int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) @@ -383,7 +383,7 @@ If you have questions or suggestions, feel free to ping me in twitter [0xAX](htt Links -------------------------------------------------------------------------------- -* [x86_64 memory map](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt) +* [x86_64 memory map](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt) * [x86_64](https://en.wikipedia.org/wiki/X86-64) * [context switching](https://en.wikipedia.org/wiki/Context_switch) * [ABI](https://en.wikipedia.org/wiki/Application_binary_interface) diff --git a/SysCall/syscall-4.md b/SysCall/syscall-4.md index 3283a28..5557960 100644 --- a/SysCall/syscall-4.md +++ b/SysCall/syscall-4.md @@ -24,7 +24,7 @@ In this part we will consider the way when we just launch an application from th Let's consider what does occur when we launch an application from the shell, what does shell do when we write program name, what does Linux kernel do etc. But before we will start to consider these interesting things, I want to warn that this book is about the Linux kernel. That's why we will see Linux kernel insides related stuff mostly in this part. We will not consider in details what does shell do, we will not consider complex cases, for example subshells etc. -My default shell is - [bash](https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29), so I will consider how do bash shell launches a program. So let's start. The `bash` shell as well as any program that written with [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) programming language starts from the [main](https://en.wikipedia.org/wiki/Entry_point) function. If you will look on the source code of the `bash` shell, you will find the `main` function in the [shell.c](https://github.com/bminor/bash/blob/master/shell.c#L357) source code file. This function makes many different things before the main thread loop of the `bash` started to work. For example this function: +My default shell is - [bash](https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29), so I will consider how do bash shell launches a program. So let's start. The `bash` shell as well as any program that written with [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) programming language starts from the [main](https://en.wikipedia.org/wiki/Entry_point) function. If you will look on the source code of the `bash` shell, you will find the `main` function in the [shell.c](https://github.com/bminor/bash/blob/bc007799f0e1362100375bb95d952d28de4c62fb/shell.c#L357) source code file. This function makes many different things before the main thread loop of the `bash` started to work. For example this function: * checks and tries to open `/dev/tty`; * check that shell running in debug mode; @@ -33,7 +33,7 @@ My default shell is - [bash](https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29 * loads `.bashrc`, `.profile` and other configuration files; * and many many more. -After all of these operations we can see the call of the `reader_loop` function. This function defined in the [eval.c](https://github.com/bminor/bash/blob/master/eval.c#L67) source code file and represents main thread loop or in other words it reads and executes commands. As the `reader_loop` function made all checks and read the given program name and arguments, it calls the `execute_command` function from the [execute_cmd.c](https://github.com/bminor/bash/blob/master/execute_cmd.c#L378) source code file. The `execute_command` function through the chain of the functions calls: +After all of these operations we can see the call of the `reader_loop` function. This function defined in the [eval.c](https://github.com/bminor/bash/blob/bc007799f0e1362100375bb95d952d28de4c62fb/eval.c#L67) source code file and represents main thread loop or in other words it reads and executes commands. As the `reader_loop` function made all checks and read the given program name and arguments, it calls the `execute_command` function from the [execute_cmd.c](https://github.com/bminor/bash/blob/bc007799f0e1362100375bb95d952d28de4c62fb/execute_cmd.c#L378) source code file. The `execute_command` function through the chain of the functions calls: ``` execute_command @@ -73,7 +73,7 @@ So, a user application (`bash` in our case) calls the system call and as we alre execve system call -------------------------------------------------------------------------------- -We saw preparation before a system call called by a user application and after a system call handler finished its work in the second [part](http://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-2.html) of this chapter. We stopped at the call of the `execve` system call in the previous paragraph. This system call defined in the [fs/exec.c](https://github.com/torvalds/linux/blob/master/fs/exec.c) source code file and as we already know it takes three arguments: +We saw preparation before a system call called by a user application and after a system call handler finished its work in the second [part](http://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-2.html) of this chapter. We stopped at the call of the `execve` system call in the previous paragraph. This system call defined in the [fs/exec.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/exec.c) source code file and as we already know it takes three arguments: ``` SYSCALL_DEFINE3(execve, @@ -115,7 +115,7 @@ if ((current->flags & PF_NPROC_EXCEEDED) && current->flags &= ~PF_NPROC_EXCEEDED; ``` -If these two checks were successful we unset `PF_NPROC_EXCEEDED` flag in the flags of the current process to prevent fail of the `execve`. You can see that in the next step we call the `unshare_files` function that defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/master/kernel/fork.c) and unshares the files of the current task and check the result of this function: +If these two checks were successful we unset `PF_NPROC_EXCEEDED` flag in the flags of the current process to prevent fail of the `execve`. You can see that in the next step we call the `unshare_files` function that defined in the [kernel/fork.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/fork.c) and unshares the files of the current task and check the result of this function: ```C retval = unshare_files(&displaced); @@ -123,7 +123,7 @@ if (retval) goto out_ret; ``` -We need to call this function to eliminate potential leak of the execve'd binary's [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). In the next step we start preparation of the `bprm` that represented by the `struct linux_binprm` structure (defined in the [include/linux/binfmts.h](https://github.com/torvalds/linux/blob/master/linux/binfmts.h) header file). The `linux_binprm` structure is used to hold the arguments that are used when loading binaries. For example it contains `vma` field which has `vm_area_struct` type and represents single memory area over a contiguous interval in a given address space where our application will be loaded, `mm` field which is memory descriptor of the binary, pointer to the top of memory and many other different fields. +We need to call this function to eliminate potential leak of the execve'd binary's [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). In the next step we start preparation of the `bprm` that represented by the `struct linux_binprm` structure (defined in the [include/linux/binfmts.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/linux/binfmts.h) header file). The `linux_binprm` structure is used to hold the arguments that are used when loading binaries. For example it contains `vma` field which has `vm_area_struct` type and represents single memory area over a contiguous interval in a given address space where our application will be loaded, `mm` field which is memory descriptor of the binary, pointer to the top of memory and many other different fields. First of all we allocate memory for this structure with the `kzalloc` function and check the result of the allocation: @@ -199,7 +199,7 @@ if (retval) goto out_unmark; ``` -The `bprm_mm_init` defined in the same source code file and as we can understand from the function's name, it makes initialization of the memory descriptor or in other words the `bprm_mm_init` function initializes `mm_struct` structure. This structure defined in the [include/linux/mm_types.h](https://github.com/torvalds/linux/blob/master/include/mm_types.h) header file and represents address space of a process. We will not consider implementation of the `bprm_mm_init` function because we do not know many important stuff related to the Linux kernel memory manager, but we just need to know that this function initializes `mm_struct` and populate it with a temporary stack `vm_area_struct`. +The `bprm_mm_init` defined in the same source code file and as we can understand from the function's name, it makes initialization of the memory descriptor or in other words the `bprm_mm_init` function initializes `mm_struct` structure. This structure defined in the [include/linux/mm_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/mm_types.h) header file and represents address space of a process. We will not consider implementation of the `bprm_mm_init` function because we do not know many important stuff related to the Linux kernel memory manager, but we just need to know that this function initializes `mm_struct` and populate it with a temporary stack `vm_area_struct`. After this we calculate the count of the command line arguments which are were passed to the our executable binary, the count of the environment variables and set it to the `bprm->argc` and `bprm->envc` respectively: @@ -213,7 +213,7 @@ if ((retval = bprm->envc) < 0) goto out; ``` -As you can see we do this operations with the help of the `count` function that defined in the [same](https://github.com/torvalds/linux/blob/master/fs/exec.c) source code file and calculates the count of strings in the `argv` array. The `MAX_ARG_STRINGS` macro defined in the [include/uapi/linux/binfmts.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/binfmts.h) header file and as we can understand from the macro's name, it represents maximum number of strings that were passed to the `execve` system call. The value of the `MAX_ARG_STRINGS`: +As you can see we do this operations with the help of the `count` function that defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/exec.c) source code file and calculates the count of strings in the `argv` array. The `MAX_ARG_STRINGS` macro defined in the [include/uapi/linux/binfmts.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/binfmts.h) header file and as we can understand from the macro's name, it represents maximum number of strings that were passed to the `execve` system call. The value of the `MAX_ARG_STRINGS`: ```C #define MAX_ARG_STRINGS 0x7FFFFFFF diff --git a/SysCall/syscall-5.md b/SysCall/syscall-5.md index 4707b71..06433c8 100644 --- a/SysCall/syscall-5.md +++ b/SysCall/syscall-5.md @@ -51,7 +51,7 @@ Definition of the open system call If you have read the [fourth part](https://github.com/0xAX/linux-insides/blob/master/SysCall/syscall-4.md) of the [linux-insides](https://0xax.gitbooks.io/linux-insides/content/index.html) book, you should know that system calls are defined with the help of `SYSCALL_DEFINE` macro. So, the `open` system call is not exception. -Definition of the `open` system call is located in the [fs/open.c](https://github.com/torvalds/linux/blob/master/fs/open.c) source code file and looks pretty small for the first view: +Definition of the `open` system call is located in the [fs/open.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/open.c) source code file and looks pretty small for the first view: ```C SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) @@ -63,7 +63,7 @@ SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) } ``` -As you may guess, the `do_sys_open` function from the [same](https://github.com/torvalds/linux/blob/master/fs/open.c) source code file does the main job. But before this function will be called, let's consider the `if` clause from which the implementation of the `open` system call starts: +As you may guess, the `do_sys_open` function from the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/open.c) source code file does the main job. But before this function will be called, let's consider the `if` clause from which the implementation of the `open` system call starts: ```C if (force_o_largefile()) @@ -96,7 +96,7 @@ and > in length. When compiling with _FILE_OFFSET_BITS == 64 this type > is available under the name off_t. -So it is not hard to guess that the `off_t`, `off64_t` and `O_LARGEFILE` are about a file size. In the case of the Linux kernel, the `O_LARGEFILE` is used to disallow opening large files on 32bit systems if the caller didn't specify `O_LARGEFILE` flag during opening of a file. On 64bit systems we force on this flag in open system call. And the `force_o_largefile` macro from the [include/linux/fcntl.h](https://github.com/torvalds/linux/blob/master/include/linux/fcntl.h#L7) linux kernel header file confirms this: +So it is not hard to guess that the `off_t`, `off64_t` and `O_LARGEFILE` are about a file size. In the case of the Linux kernel, the `O_LARGEFILE` is used to disallow opening large files on 32bit systems if the caller didn't specify `O_LARGEFILE` flag during opening of a file. On 64bit systems we force on this flag in open system call. And the `force_o_largefile` macro from the [include/linux/fcntl.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/fcntl.h#L7) linux kernel header file confirms this: ```C #ifndef force_o_largefile @@ -104,11 +104,11 @@ So it is not hard to guess that the `off_t`, `off64_t` and `O_LARGEFILE` are abo #endif ``` -This macro may be architecture-specific as for example for [IA-64](https://en.wikipedia.org/wiki/IA-64) architecture, but in our case the [x86_64](https://en.wikipedia.org/wiki/X86-64) does not provide definition of the `force_o_largefile` and it will be used from [include/linux/fcntl.h](https://github.com/torvalds/linux/blob/master/include/linux/fcntl.h#L7). +This macro may be architecture-specific as for example for [IA-64](https://en.wikipedia.org/wiki/IA-64) architecture, but in our case the [x86_64](https://en.wikipedia.org/wiki/X86-64) does not provide definition of the `force_o_largefile` and it will be used from [include/linux/fcntl.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/fcntl.h#L7). So, as we may see the `force_o_largefile` is just a macro which expands to the `true` value in our case of [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. As we are considering 64-bit architecture, the `force_o_largefile` will be expanded to `true` and the `O_LARGEFILE` flag will be added to the set of flags which were passed to the `open` system call. -Now as we considered meaning of the `O_LARGEFILE` flag and `force_o_largefile` macro, we can proceed to the consideration of the implementation of the `do_sys_open` function. As I wrote above, this function is defined in the [same](https://github.com/torvalds/linux/blob/master/fs/open.c) source code file and looks: +Now as we considered meaning of the `O_LARGEFILE` flag and `force_o_largefile` macro, we can proceed to the consideration of the implementation of the `do_sys_open` function. As I wrote above, this function is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/open.c) source code file and looks: ```C long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) @@ -147,7 +147,7 @@ open(2) flags As you know the `open` system call takes set of `flags` as second argument that control opening a file and `mode` as third argument that specifies permission the permissions of a file if it is created. The `do_sys_open` function starts from the call of the `build_open_flags` function which does some checks that set of the given flags is valid and handles different conditions of flags and mode. -Let's look at the implementation of the `build_open_flags`. This function is defined in the [same](https://github.com/torvalds/linux/blob/master/fs/open.c) kernel file and takes three arguments: +Let's look at the implementation of the `build_open_flags`. This function is defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/open.c) kernel file and takes three arguments: * flags - flags that control opening of a file; * mode - permissions for newly created file; @@ -164,7 +164,7 @@ struct open_flags { }; ``` -which is defined in the [fs/internal.h](https://github.com/torvalds/linux/blob/master/fs/internal.h#L99) header file and as we may see it holds information about flags and access mode for internal kernel purposes. As you already may guess the main goal of the `build_open_flags` function is to fill an instance of this structure. +which is defined in the [fs/internal.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/internal.h#L99) header file and as we may see it holds information about flags and access mode for internal kernel purposes. As you already may guess the main goal of the `build_open_flags` function is to fill an instance of this structure. Implementation of the `build_open_flags` function starts from the definition of local variables and one of them is: @@ -172,7 +172,7 @@ Implementation of the `build_open_flags` function starts from the definition of int acc_mode = ACC_MODE(flags); ``` -This local variable represents access mode and its initial value will be equal to the value of expanded `ACC_MODE` macro. This macro is defined in the [include/linux/fs.h](https://github.com/torvalds/linux/blob/master/include/linux/fs.h) and looks pretty interesting: +This local variable represents access mode and its initial value will be equal to the value of expanded `ACC_MODE` macro. This macro is defined in the [include/linux/fs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/fs.h) and looks pretty interesting: ```C #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) @@ -309,7 +309,7 @@ if (IS_ERR(tmp)) return PTR_ERR(tmp); ``` -The `getname` function is defined in the [fs/namei.c](https://github.com/torvalds/linux/blob/master/fs/namei.c) source code file and looks: +The `getname` function is defined in the [fs/namei.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/namei.c) source code file and looks: ```C struct filename * @@ -319,7 +319,7 @@ getname(const char __user * filename) } ``` -So, it just calls the `getname_flags` function and returns its result. The main goal of the `getname_flags` function is to copy a file path given from userland to kernel space. The `filename` structure is defined in the [include/linux/fs.h](https://github.com/torvalds/linux/blob/master/include/linux/fs.h) linux kernel header file and contains following fields: +So, it just calls the `getname_flags` function and returns its result. The main goal of the `getname_flags` function is to copy a file path given from userland to kernel space. The `filename` structure is defined in the [include/linux/fs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/fs.h) linux kernel header file and contains following fields: * name - pointer to a file path in kernel space; * uptr - original pointer from userland; @@ -351,7 +351,7 @@ if (IS_ERR(f)) { The main goal of this function is to resolve given path name into `file` structure which represents an opened file of a process. If something going wrong and execution of the `do_filp_open` function will be failed, we should free new file descriptor with the `put_unused_fd` or in other way the `file` structure returned by the `do_filp_open` will be stored in the file descriptor table of the current process. -Now let's take a short look at the implementation of the `do_filp_open` function. This function is defined in the [fs/namei.c](https://github.com/torvalds/linux/blob/master/fs/namei.c) linux kernel source code file and starts from initialization of the `nameidata` structure. This structure will provide a link to a file [inode](https://en.wikipedia.org/wiki/Inode). Actually this is one of the main point of the `do_filp_open` function to acquire an `inode` by the filename given to `open` system call. After the `nameidata` structure will be initialized, the `path_openat` function will be called: +Now let's take a short look at the implementation of the `do_filp_open` function. This function is defined in the [fs/namei.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/namei.c) linux kernel source code file and starts from initialization of the `nameidata` structure. This structure will provide a link to a file [inode](https://en.wikipedia.org/wiki/Inode). Actually this is one of the main point of the `do_filp_open` function to acquire an `inode` by the filename given to `open` system call. After the `nameidata` structure will be initialized, the `path_openat` function will be called: ```C filp = path_openat(&nd, op, flags | LOOKUP_RCU); @@ -368,9 +368,9 @@ The `path_openat` function starts from the call of the `get_empty_flip()` functi In this case the `path_init` function will be called. This function performs some preporatory work before actual path lookup. This includes search of start position of path traversal and its metadata like `inode` of the path, `dentry inode` and etc. This can be `root` directory - `/` or current directory as in our case, because we use `AT_CWD` as starting point (see call of the `do_sys_open` at the beginning of the post). -The next step after the `path_init` is the [loop](https://github.com/torvalds/linux/blob/master/fs/namei.c#L3457) which executes the `link_path_walk` and `do_last`. The first function executes name resolution or in other words this function starts process of walking along a given path. It handles everything step by step except the last component of a file path. This handling includes checking of a permissions and getting a file component. As a file component is gotten, it is passed to `walk_component` that updates current directory entry from the `dcache` or asks underlying filesystem. This repeats before all path's components will not be handled in such way. After the `link_path_walk` will be executed, the `do_last` function will populate a `file` structure based on the result of the `link_path_walk`. As we reached last component of the given file path the `vfs_open` function from the `do_last` will be called. +The next step after the `path_init` is the [loop](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/namei.c#L3457) which executes the `link_path_walk` and `do_last`. The first function executes name resolution or in other words this function starts process of walking along a given path. It handles everything step by step except the last component of a file path. This handling includes checking of a permissions and getting a file component. As a file component is gotten, it is passed to `walk_component` that updates current directory entry from the `dcache` or asks underlying filesystem. This repeats before all path's components will not be handled in such way. After the `link_path_walk` will be executed, the `do_last` function will populate a `file` structure based on the result of the `link_path_walk`. As we reached last component of the given file path the `vfs_open` function from the `do_last` will be called. -This function is defined in the [fs/open.c](https://github.com/torvalds/linux/blob/master/fs/open.c) linux kernel source code file and the main goal of this function is to call an `open` operation of underlying filesystem. +This function is defined in the [fs/open.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/open.c) linux kernel source code file and the main goal of this function is to call an `open` operation of underlying filesystem. That's all for now. We didn't consider **full** implementation of the `open` system call. We skip some parts like handling case when we want to open a file from other filesystem with different mount point, resolving symlinks and etc., but it should be not so hard to follow this stuff. This stuff does not included in **generic** implementation of open system call and depends on underlying filesystem. If you are interested in, you may lookup the `file_operations.open` callback function for a certain [filesystem](https://github.com/torvalds/linux/tree/master/fs). diff --git a/SysCall/syscall-6.md b/SysCall/syscall-6.md index 7c5cbed..6cd6a66 100644 --- a/SysCall/syscall-6.md +++ b/SysCall/syscall-6.md @@ -98,14 +98,14 @@ Now let's look at list of available resources: If you're looking into source code of open source projects, you will note that reading or updating of a resource limit is quite widely used operation. -For example: [systemd](https://github.com/systemd/systemd/blob/master/src/core/main.c) +For example: [systemd](https://github.com/systemd/systemd/blob/01a45898fce8def67d51332bccc410eb1e8710e7/src/core/main.c) ```C /* Don't limit the coredump size */ (void) setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY)); ``` -Or [haproxy](https://github.com/haproxy/haproxy/blob/master/src/haproxy.c): +Or [haproxy](https://github.com/haproxy/haproxy/blob/25f067ccec52f53b0248a05caceb7841a3cb99df/src/haproxy.c): ```C getrlimit(RLIMIT_NOFILE, &limit); @@ -151,7 +151,7 @@ SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim) } ``` -Implementations of these system calls are defined in the [kernel/sys.c](https://github.com/torvalds/linux/blob/master/kernel/sys.c) kernel source code file. +Implementations of these system calls are defined in the [kernel/sys.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sys.c) kernel source code file. First of all the `do_prlimit` function executes a check that the given resource is valid: diff --git a/Theory/ELF.md b/Theory/ELF.md index 552d40f..091d1d2 100644 --- a/Theory/ELF.md +++ b/Theory/ELF.md @@ -47,7 +47,7 @@ typedef struct elf64_hdr { } Elf64_Ehdr; ``` -This structure defined in the [elf.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h#L220) +This structure defined in the [elf.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/elf.h#L220) **Sections** @@ -81,7 +81,7 @@ typedef struct elf64_shdr { } Elf64_Shdr; ``` -[elf.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h#L312) +[elf.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/elf.h#L312) **Program header table** @@ -102,7 +102,7 @@ typedef struct elf64_phdr { in the linux kernel source code. -`elf64_phdr` defined in the same [elf.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h#L254). +`elf64_phdr` defined in the same [elf.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/elf.h#L254). The ELF object file also contains other fields/structures which you can find in the [Documentation](http://www.uclibc.org/docs/elf-64-gen.pdf). Now let's a look at the `vmlinux` ELF object. @@ -137,7 +137,7 @@ ELF Header: Here we can see that `vmlinux` is a 64-bit executable file. -We can read from the [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt#L21): +We can read from the [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt#L21): ``` ffffffff80000000 - ffffffffa0000000 (=512 MB) kernel text mapping, from phys 0 @@ -154,7 +154,7 @@ $ readelf -s vmlinux | grep ffffffff81000000 Note that the address of the `startup_64` routine is not `ffffffff80000000`, but `ffffffff81000000` and now I'll explain why. -We can see following definition in the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vmlinux.lds.S): +We can see following definition in the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vmlinux.lds.S): ``` . = __START_KERNEL; diff --git a/Theory/Paging.md b/Theory/Paging.md index 722e737..6691309 100644 --- a/Theory/Paging.md +++ b/Theory/Paging.md @@ -33,7 +33,7 @@ We will only explain the last mode here. To enable the `IA-32e paging` paging mo * set the `CR4.PAE` bit; * set the `IA32_EFER.LME` bit. -We already saw where those bits were set in [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S): +We already saw where those bits were set in [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly movl $(X86_CR0_PG | X86_CR0_PE), %eax @@ -52,7 +52,7 @@ wrmsr Paging structures -------------------------------------------------------------------------------- -Paging divides the linear address space into fixed-size pages. Pages can be mapped into the physical address space or external storage. This fixed size is `4096` bytes for the `x86_64` Linux kernel. To perform the translation from linear address to physical address, special structures are used. Every structure is `4096` bytes and contains `512` entries (this only for `PAE` and `IA32_EFER.LME` modes). Paging structures are hierarchical and the Linux kernel uses 4 level of paging in the `x86_64` architecture. The CPU uses a part of linear addresses to identify the entry in another paging structure which is at the lower level, physical memory region (`page frame`) or physical address in this region (`page offset`). The address of the top level paging structure located in the `cr3` register. We have already seen this in [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S): +Paging divides the linear address space into fixed-size pages. Pages can be mapped into the physical address space or external storage. This fixed size is `4096` bytes for the `x86_64` Linux kernel. To perform the translation from linear address to physical address, special structures are used. Every structure is `4096` bytes and contains `512` entries (this only for `PAE` and `IA32_EFER.LME` modes). Paging structures are hierarchical and the Linux kernel uses 4 level of paging in the `x86_64` architecture. The CPU uses a part of linear addresses to identify the entry in another paging structure which is at the lower level, physical memory region (`page frame`) or physical address in this region (`page offset`). The address of the top level paging structure located in the `cr3` register. We have already seen this in [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly leal pgtable(%ebx), %eax @@ -171,7 +171,7 @@ This solution is `sign extension`. Here we can see that the lower 48 bits of a v * Kernel space * Userspace -Userspace occupies the lower part of the virtual address space, from `0x000000000000000` to `0x00007fffffffffff` and kernel space occupies the highest part from `0xffff8000000000` to `0xffffffffffffffff`. Note that bits `63:48` is 0 for userspace and 1 for kernel space. All addresses which are in kernel space and in userspace or in other words which higher `63:48` bits are zeroes or ones are called `canonical` addresses. There is a `non-canonical` area between these memory regions. Together these two memory regions (kernel space and user space) are exactly `2^48` bits wide. We can find the virtual memory map with 4 level page tables in the [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt): +Userspace occupies the lower part of the virtual address space, from `0x000000000000000` to `0x00007fffffffffff` and kernel space occupies the highest part from `0xffff8000000000` to `0xffffffffffffffff`. Note that bits `63:48` is 0 for userspace and 1 for kernel space. All addresses which are in kernel space and in userspace or in other words which higher `63:48` bits are zeroes or ones are called `canonical` addresses. There is a `non-canonical` area between these memory regions. Together these two memory regions (kernel space and user space) are exactly `2^48` bits wide. We can find the virtual memory map with 4 level page tables in the [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt): ``` 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm @@ -193,7 +193,7 @@ ffffffffff600000 - ffffffffffdfffff (=8 MB) vsyscalls ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole ``` -We can see here the memory map for user space, kernel space and the non-canonical area in-between them. The user space memory map is simple. Let's take a closer look at the kernel space. We can see that it starts from the guard hole which is reserved for the hypervisor. We can find the definition of this guard hole in [arch/x86/include/asm/page_64_types.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/page_64_types.h): +We can see here the memory map for user space, kernel space and the non-canonical area in-between them. The user space memory map is simple. Let's take a closer look at the kernel space. We can see that it starts from the guard hole which is reserved for the hypervisor. We can find the definition of this guard hole in [arch/x86/include/asm/page_64_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/page_64_types.h): ```C #define __PAGE_OFFSET _AC(0xffff880000000000, UL) @@ -258,5 +258,5 @@ Links * [Intel 64 and IA-32 architectures software developer's manual volume 3A](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) * [MMU](http://en.wikipedia.org/wiki/Memory_management_unit) * [ELF64](https://github.com/0xAX/linux-insides/blob/master/Theory/ELF.md) -* [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt) +* [Documentation/x86/x86_64/mm.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/x86_64/mm.txt) * [Last part - Kernel booting process](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) diff --git a/Theory/asm.md b/Theory/asm.md index c1b7991..8e9b4a5 100644 --- a/Theory/asm.md +++ b/Theory/asm.md @@ -59,7 +59,7 @@ __asm__ [volatile] [goto] (AssemblerTemplate All parameters which are marked with squared brackets are optional. You may notice that if we skip the optional parameters and the modifiers `volatile` and `goto` we obtain the `basic` form. -Let's start to consider this in order. The first optional `qualifier` is `volatile`. This specifier tells the compiler that an assembly statement may produce `side effects`. In this case we need to prevent compiler optimizations related to the given assembly statement. In simple terms the `volatile` specifier instructs the compiler not to modify the statement and place it exactly where it was in the original code. As an example let's look at the following function from the [Linux kernel](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h): +Let's start to consider this in order. The first optional `qualifier` is `volatile`. This specifier tells the compiler that an assembly statement may produce `side effects`. In this case we need to prevent compiler optimizations related to the given assembly statement. In simple terms the `volatile` specifier instructs the compiler not to modify the statement and place it exactly where it was in the original code. As an example let's look at the following function from the [Linux kernel](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h): ```C static inline void native_load_gdt(const struct desc_ptr *dtr) diff --git a/Timers/timers-1.md b/Timers/timers-1.md index f565a43..5aaccdc 100644 --- a/Timers/timers-1.md +++ b/Timers/timers-1.md @@ -13,9 +13,9 @@ Let's start. Initialization of non-standard PC hardware clock -------------------------------------------------------------------------------- -After the Linux kernel was decompressed (more about this you can read in the [Kernel decompression](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) part) the architecture non-specific code starts to work in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file. After initialization of the [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt), initialization of [cgroups](https://en.wikipedia.org/wiki/Cgroups) and setting [canary](https://en.wikipedia.org/wiki/Buffer_overflow_protection) value we can see the call of the `setup_arch` function. +After the Linux kernel was decompressed (more about this you can read in the [Kernel decompression](https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) part) the architecture non-specific code starts to work in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file. After initialization of the [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt), initialization of [cgroups](https://en.wikipedia.org/wiki/Cgroups) and setting [canary](https://en.wikipedia.org/wiki/Buffer_overflow_protection) value we can see the call of the `setup_arch` function. -As you may remember, this function (defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c#L842)) prepares/initializes architecture-specific stuff (for example it reserves a place for [bss](https://en.wikipedia.org/wiki/.bss) section, reserves a place for [initrd](https://en.wikipedia.org/wiki/Initrd), parses kernel command line, and many, many other things). Besides this, we can find some time management related functions there. +As you may remember, this function (defined in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c#L842)) prepares/initializes architecture-specific stuff (for example it reserves a place for [bss](https://en.wikipedia.org/wiki/.bss) section, reserves a place for [initrd](https://en.wikipedia.org/wiki/Initrd), parses kernel command line, and many, many other things). Besides this, we can find some time management related functions there. The first is: @@ -23,7 +23,7 @@ The first is: x86_init.timers.wallclock_init(); ``` -We already saw `x86_init` structure in the chapter that describes initialization of the Linux kernel. This structure contains pointers to the default setup functions for the different platforms like [Intel MID](https://en.wikipedia.org/wiki/Mobile_Internet_device#Intel_MID_platforms), [Intel CE4100](http://www.wpgholdings.com/epaper/US/newsRelease_20091215/255874.pdf), etc. The `x86_init` structure is defined in the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/x86_init.c#L36), and as you can see it determines standard PC hardware by default. +We already saw `x86_init` structure in the chapter that describes initialization of the Linux kernel. This structure contains pointers to the default setup functions for the different platforms like [Intel MID](https://en.wikipedia.org/wiki/Mobile_Internet_device#Intel_MID_platforms), [Intel CE4100](http://www.wpgholdings.com/epaper/US/newsRelease_20091215/255874.pdf), etc. The `x86_init` structure is defined in the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/x86_init.c#L36), and as you can see it determines standard PC hardware by default. As we can see, the `x86_init` structure has the `x86_init_ops` type that provides a set of functions for platform specific setup like reserving standard resources, platform specific memory setup, initialization of interrupt handlers, etc. This structure looks like: @@ -69,7 +69,7 @@ Where the `x86_init_noop` is just a function that does nothing: void __cpuinit x86_init_noop(void) { } ``` -for the standard PC hardware. Actually, the `wallclock_init` function is used in the [Intel MID](https://en.wikipedia.org/wiki/Mobile_Internet_device#Intel_MID_platforms) platform. Initialization of the `x86_init.timers.wallclock_init` is located in the [arch/x86/platform/intel-mid/intel-mid.c](https://github.com/torvalds/linux/blob/master/arch/x86/platform/intel-mid/intel-mid.c) source code file in the `x86_intel_mid_early_setup` function: +for the standard PC hardware. Actually, the `wallclock_init` function is used in the [Intel MID](https://en.wikipedia.org/wiki/Mobile_Internet_device#Intel_MID_platforms) platform. Initialization of the `x86_init.timers.wallclock_init` is located in the [arch/x86/platform/intel-mid/intel-mid.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/platform/intel-mid/intel-mid.c) source code file in the `x86_intel_mid_early_setup` function: ```C void __init x86_intel_mid_early_setup(void) @@ -84,7 +84,7 @@ void __init x86_intel_mid_early_setup(void) } ``` -Implementation of the `intel_mid_rtc_init` function is in the [arch/x86/platform/intel-mid/intel_mid_vrtc.c](https://github.com/torvalds/linux/blob/master/arch/x86/platform/intel-mid/intel_mid_vrtc.c) source code file and looks pretty simple. First of all, this function parses [Simple Firmware Interface](https://en.wikipedia.org/wiki/Simple_Firmware_Interface) M-Real-Time-Clock table for getting such devices to the `sfi_mrtc_array` array and initialization of the `set_time` and `get_time` functions: +Implementation of the `intel_mid_rtc_init` function is in the [arch/x86/platform/intel-mid/intel_mid_vrtc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/platform/intel-mid/intel_mid_vrtc.c) source code file and looks pretty simple. First of all, this function parses [Simple Firmware Interface](https://en.wikipedia.org/wiki/Simple_Firmware_Interface) M-Real-Time-Clock table for getting such devices to the `sfi_mrtc_array` array and initialization of the `set_time` and `get_time` functions: ```C void __init intel_mid_rtc_init(void) @@ -110,7 +110,7 @@ That's all, after this a device based on `Intel MID` will be able to get time fr Acquainted with jiffies -------------------------------------------------------------------------------- -If we return to the `setup_arch` function (which is located, as you remember, in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c#L842) source code file), we see the next call of the time management related function: +If we return to the `setup_arch` function (which is located, as you remember, in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c#L842) source code file), we see the next call of the time management related function: ```C register_refined_jiffies(CLOCK_TICK_RATE); @@ -134,7 +134,7 @@ during initialization process. This global variable will be increased each time extern u64 jiffies_64; ``` -Actually, only one of these variables is in use in the Linux kernel, and it depends on the processor type. For the [x86_64](https://en.wikipedia.org/wiki/X86-64) it will be `u64` use and for the [x86](https://en.wikipedia.org/wiki/X86) it's `unsigned long`. We see this looking at the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vmlinux.lds.S) linker script: +Actually, only one of these variables is in use in the Linux kernel, and it depends on the processor type. For the [x86_64](https://en.wikipedia.org/wiki/X86-64) it will be `u64` use and for the [x86](https://en.wikipedia.org/wiki/X86) it's `unsigned long`. We see this looking at the [arch/x86/kernel/vmlinux.lds.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vmlinux.lds.S) linker script: ``` #ifdef CONFIG_X86_32 @@ -162,7 +162,7 @@ In the case of `x86_32` the `jiffies` will be the lower `32` bits of the `jiffie 63 31 0 ``` -Now we know a little theory about `jiffies` and can return to our function. There is no architecture-specific implementation for our function - the `register_refined_jiffies`. This function is located in the generic kernel code - [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/master/kernel/time/jiffies.c) source code file. Main point of the `register_refined_jiffies` is registration of the jiffy `clocksource`. Before we look on the implementation of the `register_refined_jiffies` function, we must know what `clocksource` is. As we can read in the comments: +Now we know a little theory about `jiffies` and can return to our function. There is no architecture-specific implementation for our function - the `register_refined_jiffies`. This function is located in the generic kernel code - [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/jiffies.c) source code file. Main point of the `register_refined_jiffies` is registration of the jiffy `clocksource`. Before we look on the implementation of the `register_refined_jiffies` function, we must know what `clocksource` is. As we can read in the comments: ``` The `clocksource` is hardware abstraction for a free-running counter. @@ -172,9 +172,9 @@ I'm not sure about you, but that description didn't give a good understanding ab For example `x86` has on-chip a 64-bit counter that is called [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) and its frequency can be equal to processor frequency. Or for example the [High Precision Event Timer](https://en.wikipedia.org/wiki/High_Precision_Event_Timer), that consists of a `64-bit` counter of at least `10 MHz` frequency. Two different timers and they are both for `x86`. If we will add timers from other architectures, this only makes this problem more complex. The Linux kernel provides the `clocksource` concept to solve the problem. -The clocksource concept is represented by the `clocksource` structure in the Linux kernel. This structure is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/master/include/linux/clocksource.h) header file and contains a couple of fields that describe a time counter. For example, it contains - `name` field which is the name of a counter, `flags` field that describes different properties of a counter, pointers to the `suspend` and `resume` functions, and many more. +The clocksource concept is represented by the `clocksource` structure in the Linux kernel. This structure is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clocksource.h) header file and contains a couple of fields that describe a time counter. For example, it contains - `name` field which is the name of a counter, `flags` field that describes different properties of a counter, pointers to the `suspend` and `resume` functions, and many more. -Let's look at the `clocksource` structure for jiffies that is defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/master/kernel/time/jiffies.c) source code file: +Let's look at the `clocksource` structure for jiffies that is defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/jiffies.c) source code file: ```C static struct clocksource clocksource_jiffies = { @@ -251,7 +251,7 @@ by default, and the `shift` is #endif ``` -The `jiffies` clock source uses the `NSEC_PER_JIFFY` multiplier conversion to specify the nanosecond over cycle ratio. Note that values of the `JIFFIES_SHIFT` and `NSEC_PER_JIFFY` depend on `HZ` value. The `HZ` represents the frequency of the system timer. This macro defined in the [include/asm-generic/param.h](https://github.com/torvalds/linux/blob/master/include/asm-generic/param.h) and depends on the `CONFIG_HZ` kernel configuration option. The value of `HZ` differs for each supported architecture, but for `x86` it's defined like: +The `jiffies` clock source uses the `NSEC_PER_JIFFY` multiplier conversion to specify the nanosecond over cycle ratio. Note that values of the `JIFFIES_SHIFT` and `NSEC_PER_JIFFY` depend on `HZ` value. The `HZ` represents the frequency of the system timer. This macro defined in the [include/asm-generic/param.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/param.h) and depends on the `CONFIG_HZ` kernel configuration option. The value of `HZ` differs for each supported architecture, but for `x86` it's defined like: ```C #define HZ CONFIG_HZ @@ -271,9 +271,9 @@ Ok, we just saw definition of the `clocksource_jiffies` structure, also we know register_refined_jiffies(CLOCK_TICK_RATE); ``` -function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c#L842) source code file. +function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c#L842) source code file. -As I already wrote, the main purpose of the `register_refined_jiffies` function is to register `refined_jiffies` clocksource. We already saw the `clocksource_jiffies` structure represents standard `jiffies` clock source. Now, if you look in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/master/kernel/time/jiffies.c) source code file, you will find yet another clock source definition: +As I already wrote, the main purpose of the `register_refined_jiffies` function is to register `refined_jiffies` clocksource. We already saw the `clocksource_jiffies` structure represents standard `jiffies` clock source. Now, if you look in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/jiffies.c) source code file, you will find yet another clock source definition: ```C struct clocksource refined_jiffies; @@ -305,7 +305,7 @@ In the next step we need to calculate number of cycles per one tick: cycles_per_tick = (cycles_per_second + HZ/2)/HZ; ``` -Note that we have used `NSEC_PER_SEC` macro as the base of the standard `jiffies` multiplier. Here we are using the `cycles_per_second` which is the first parameter of the `register_refined_jiffies` function. We've passed the `CLOCK_TICK_RATE` macro to the `register_refined_jiffies` function. This macro is defined in the [arch/x86/include/asm/timex.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/timex.h) header file and expands to the: +Note that we have used `NSEC_PER_SEC` macro as the base of the standard `jiffies` multiplier. Here we are using the `cycles_per_second` which is the first parameter of the `register_refined_jiffies` function. We've passed the `CLOCK_TICK_RATE` macro to the `register_refined_jiffies` function. This macro is defined in the [arch/x86/include/asm/timex.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/timex.h) header file and expands to the: ```C #define CLOCK_TICK_RATE PIT_TICK_RATE @@ -337,7 +337,7 @@ do_div(nsec_per_tick, (u32)shift_hz); refined_jiffies.mult = ((u32)nsec_per_tick) << JIFFIES_SHIFT; ``` -In the end of the `register_refined_jiffies` function we register new clock source with the `__clocksource_register` function that is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/master/include/linux/clocksource.h) header file and return: +In the end of the `register_refined_jiffies` function we register new clock source with the `__clocksource_register` function that is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clocksource.h) header file and return: ```C __clocksource_register(&refined_jiffies); @@ -354,7 +354,7 @@ We just saw initialization of two `jiffies` based clock sources in the previous * standard `jiffies` based clock source; * refined `jiffies` based clock source; -Don't worry if you don't understand the calculations here. They look frightening at first. Soon, step by step we will learn these things. So, we just saw initialization of `jiffies` based clock sources and also we know that the Linux kernel has the global variable `jiffies` that holds the number of ticks that have occurred since the kernel started to work. Now, let's look how to use it. To use `jiffies` we just can use the `jiffies` global variable by its name or with the call of the `get_jiffies_64` function. This function defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/master/kernel/time/jiffies.c) source code file and just returns full `64-bit` value of the `jiffies`: +Don't worry if you don't understand the calculations here. They look frightening at first. Soon, step by step we will learn these things. So, we just saw initialization of `jiffies` based clock sources and also we know that the Linux kernel has the global variable `jiffies` that holds the number of ticks that have occurred since the kernel started to work. Now, let's look how to use it. To use `jiffies` we just can use the `jiffies` global variable by its name or with the call of the `get_jiffies_64` function. This function defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/jiffies.c) source code file and just returns full `64-bit` value of the `jiffies`: ```C u64 get_jiffies_64(void) diff --git a/Timers/timers-2.md b/Timers/timers-2.md index 9b6a2e1..e81ba7f 100644 --- a/Timers/timers-2.md +++ b/Timers/timers-2.md @@ -9,7 +9,7 @@ The previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers * `jiffies` * `clocksource` -The first is the global variable that is defined in the [include/linux/jiffies.h](https://github.com/torvalds/linux/blob/master/include/linux/jiffies.h) header file and represents the counter that is increased during each timer interrupt. So if we can access this global variable and we know the timer interrupt rate we can convert `jiffies` to the human time units. As we already know the timer interrupt rate represented by the compile-time constant that is called `HZ` in the Linux kernel. The value of `HZ` is equal to the value of the `CONFIG_HZ` kernel configuration option and if we will look into the [arch/x86/configs/x86_64_defconfig](https://github.com/torvalds/linux/blob/master/arch/x86/configs/x86_64_defconfig) kernel configuration file, we will see that: +The first is the global variable that is defined in the [include/linux/jiffies.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/jiffies.h) header file and represents the counter that is increased during each timer interrupt. So if we can access this global variable and we know the timer interrupt rate we can convert `jiffies` to the human time units. As we already know the timer interrupt rate represented by the compile-time constant that is called `HZ` in the Linux kernel. The value of `HZ` is equal to the value of the `CONFIG_HZ` kernel configuration option and if we will look into the [arch/x86/configs/x86_64_defconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/configs/x86_64_defconfig) kernel configuration file, we will see that: ``` CONFIG_HZ_1000=y @@ -31,7 +31,7 @@ unsigned long later = jiffies + 60*HZ; unsigned long later = jiffies + 5*60*HZ; ``` -This is a very common practice in the Linux kernel. For example, if you will look into the [arch/x86/kernel/smpboot.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/smpboot.c) source code file, you will find the `do_boot_cpu` function. This function boots all processors besides bootstrap processor. You can find a snippet that waits ten seconds for a response from the application processor: +This is a very common practice in the Linux kernel. For example, if you will look into the [arch/x86/kernel/smpboot.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/smpboot.c) source code file, you will find the `do_boot_cpu` function. This function boots all processors besides bootstrap processor. You can find a snippet that waits ten seconds for a response from the application processor: ```C if (!boot_error) { @@ -50,7 +50,7 @@ if (!boot_error) { We assign `jiffies + 10*HZ` value to the `timeout` variable here. As I think you already understood, this means a ten seconds timeout. After this we are entering a loop where we use the `time_before` macro to compare the current `jiffies` value and our timeout. -Or for example if we look into the [sound/isa/sscape.c](https://github.com/torvalds/linux/blob/master/sound/isa/sscape) source code file which represents the driver for the [Ensoniq Soundscape Elite](https://en.wikipedia.org/wiki/Ensoniq_Soundscape_Elite) sound card, we will see the `obp_startup_ack` function that waits upto a given timeout for the On-Board Processor to return its start-up acknowledgement sequence: +Or for example if we look into the [sound/isa/sscape.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/sound/isa/sscape) source code file which represents the driver for the [Ensoniq Soundscape Elite](https://en.wikipedia.org/wiki/Ensoniq_Soundscape_Elite) sound card, we will see the `obp_startup_ack` function that waits upto a given timeout for the On-Board Processor to return its start-up acknowledgement sequence: ```C static int obp_startup_ack(struct soundscape *s, unsigned timeout) @@ -79,7 +79,7 @@ As you can see, the `jiffies` variable is very widely used in the Linux kernel [ Introduction to `clocksource` -------------------------------------------------------------------------------- -The `clocksource` concept represents the generic API for clock sources management in the Linux kernel. Why do we need a separate framework for this? Let's go back to the beginning. The `time` concept is the fundamental concept in the Linux kernel and other operating system kernels. And the timekeeping is one of the necessities to use this concept. For example Linux kernel must know and update the time elapsed since system startup, it must determine how long the current process has been running for every processor and many many more. Where the Linux kernel can get information about time? First of all it is Real Time Clock or [RTC](https://en.wikipedia.org/wiki/Real-time_clock) that represents by the a nonvolatile device. You can find a set of architecture-independent real time clock drivers in the Linux kernel in the [drivers/rtc](https://github.com/torvalds/linux/tree/master/drivers/rtc) directory. Besides this, each architecture can provide a driver for the architecture-dependent real time clock, for example - `CMOS/RTC` - [arch/x86/kernel/rtc.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/rtc.c) for the [x86](https://en.wikipedia.org/wiki/X86) architecture. The second is system timer - timer that excites [interrupts](https://en.wikipedia.org/wiki/Interrupt) with a periodic rate. For example, for [IBM PC](https://en.wikipedia.org/wiki/IBM_Personal_Computer) compatibles it was - [programmable interval timer](https://en.wikipedia.org/wiki/Programmable_interval_timer). +The `clocksource` concept represents the generic API for clock sources management in the Linux kernel. Why do we need a separate framework for this? Let's go back to the beginning. The `time` concept is the fundamental concept in the Linux kernel and other operating system kernels. And the timekeeping is one of the necessities to use this concept. For example Linux kernel must know and update the time elapsed since system startup, it must determine how long the current process has been running for every processor and many many more. Where the Linux kernel can get information about time? First of all it is Real Time Clock or [RTC](https://en.wikipedia.org/wiki/Real-time_clock) that represents by the a nonvolatile device. You can find a set of architecture-independent real time clock drivers in the Linux kernel in the [drivers/rtc](https://github.com/torvalds/linux/tree/master/drivers/rtc) directory. Besides this, each architecture can provide a driver for the architecture-dependent real time clock, for example - `CMOS/RTC` - [arch/x86/kernel/rtc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/rtc.c) for the [x86](https://en.wikipedia.org/wiki/X86) architecture. The second is system timer - timer that excites [interrupts](https://en.wikipedia.org/wiki/Interrupt) with a periodic rate. For example, for [IBM PC](https://en.wikipedia.org/wiki/IBM_Personal_Computer) compatibles it was - [programmable interval timer](https://en.wikipedia.org/wiki/Programmable_interval_timer). We already know that for timekeeping purposes we can use `jiffies` in the Linux kernel. The `jiffies` can be considered as read only global variable which is updated with `HZ` frequency. We know that the `HZ` is a compile-time kernel parameter whose reasonable range is from `100` to `1000` [Hz](https://en.wikipedia.org/wiki/Hertz). So, it is guaranteed to have an interface for time measurement with `1` - `10` milliseconds resolution. Besides standard `jiffies`, we saw the `refined_jiffies` clock source in the previous part that is based on the `i8253/i8254` [programmable interval timer](https://en.wikipedia.org/wiki/Programmable_interval_timer) tick rate which is almost `1193182` hertz. So we can get something about `1` microsecond resolution with the `refined_jiffies`. In this time, [nanoseconds](https://en.wikipedia.org/wiki/Nanosecond) are the favorite choice for the time value units of the given clock source. @@ -92,7 +92,7 @@ Within this framework, each clock source is required to maintain a representatio The clocksource structure -------------------------------------------------------------------------------- -The fundamental of the `clocksource` framework is the `clocksource` structure that defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/master/include/linux/clocksource.h) header file. We already saw some fields that are provided by the `clocksource` structure in the previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-1.html). Let's look on the full definition of this structure and try to describe all of its fields: +The fundamental of the `clocksource` framework is the `clocksource` structure that defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clocksource.h) header file. We already saw some fields that are provided by the `clocksource` structure in the previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-1.html). Let's look on the full definition of this structure and try to describe all of its fields: ```C struct clocksource { @@ -190,7 +190,7 @@ for the `x86` architectures. Where the `vDSO` clock mode can be one of the: #define VCLOCK_PVCLOCK 3 ``` -The last three fields are `wd_list`, `cs_last` and the `wd_last` depends on the `CONFIG_CLOCKSOURCE_WATCHDOG` kernel configuration option. First of all let's try to understand what is it `watchdog`. In a simple words, watchdog is a timer that is used for detection of the computer malfunctions and recovering from it. All of these three fields contain watchdog related data that is used by the `clocksource` framework. If we will grep the Linux kernel source code, we will see that only [arch/x86/KConfig](https://github.com/torvalds/linux/blob/master/arch/x86/Kconfig#L54) kernel configuration file contains the `CONFIG_CLOCKSOURCE_WATCHDOG` kernel configuration option. So, why do `x86` and `x86_64` need in [watchdog](https://en.wikipedia.org/wiki/Watchdog_timer)? You already may know that all `x86` processors has special 64-bit register - [time stamp counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter). This register contains number of [cycles](https://en.wikipedia.org/wiki/Clock_rate) since the reset. Sometimes the time stamp counter needs to be verified against another clock source. We will not see initialization of the `watchdog` timer in this part, before this we must learn more about timers. +The last three fields are `wd_list`, `cs_last` and the `wd_last` depends on the `CONFIG_CLOCKSOURCE_WATCHDOG` kernel configuration option. First of all let's try to understand what is it `watchdog`. In a simple words, watchdog is a timer that is used for detection of the computer malfunctions and recovering from it. All of these three fields contain watchdog related data that is used by the `clocksource` framework. If we will grep the Linux kernel source code, we will see that only [arch/x86/KConfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Kconfig#L54) kernel configuration file contains the `CONFIG_CLOCKSOURCE_WATCHDOG` kernel configuration option. So, why do `x86` and `x86_64` need in [watchdog](https://en.wikipedia.org/wiki/Watchdog_timer)? You already may know that all `x86` processors has special 64-bit register - [time stamp counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter). This register contains number of [cycles](https://en.wikipedia.org/wiki/Clock_rate) since the reset. Sometimes the time stamp counter needs to be verified against another clock source. We will not see initialization of the `watchdog` timer in this part, before this we must learn more about timers. That's all. From this moment we know all fields of the `clocksource` structure. This knowledge will help us to learn insides of the `clocksource` framework. diff --git a/Timers/timers-3.md b/Timers/timers-3.md index ede4d1c..c451c48 100644 --- a/Timers/timers-3.md +++ b/Timers/timers-3.md @@ -10,17 +10,17 @@ This is third part of the [chapter](https://0xax.gitbooks.io/linux-insides/conte register_refined_jiffies(CLOCK_TICK_RATE); ``` -function which defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/master/kernel/time/jiffies.c) source code file and executes initialization of the `refined_jiffies` clock source for us. Recall that this function is called from the `setup_arch` function that defined in the [https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c](arch/x86/kernel/setup.c) source code and executes architecture-specific ([x86_64](https://en.wikipedia.org/wiki/X86-64) in our case) initialization. Look on the implementation of the `setup_arch` and you will note that the call of the `register_refined_jiffies` is the last step before the `setup_arch` function will finish its work. +function which defined in the [kernel/time/jiffies.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/jiffies.c) source code file and executes initialization of the `refined_jiffies` clock source for us. Recall that this function is called from the `setup_arch` function that defined in the [https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c](arch/x86/kernel/setup.c) source code and executes architecture-specific ([x86_64](https://en.wikipedia.org/wiki/X86-64) in our case) initialization. Look on the implementation of the `setup_arch` and you will note that the call of the `register_refined_jiffies` is the last step before the `setup_arch` function will finish its work. There are many different `x86_64` specific things already configured after the end of the `setup_arch` execution. For example some early [interrupt](https://en.wikipedia.org/wiki/Interrupt) handlers already able to handle interrupts, memory space reserved for the [initrd](https://en.wikipedia.org/wiki/Initrd), [DMI](https://en.wikipedia.org/wiki/Desktop_Management_Interface) scanned, the Linux kernel log buffer is already set and this means that the [printk](https://en.wikipedia.org/wiki/Printk) function is able to work, [e820](https://en.wikipedia.org/wiki/E820) parsed and the Linux kernel already knows about available memory and and many many other architecture specific things (if you are interesting, you can read more about the `setup_arch` function and Linux kernel initialization process in the second [chapter](https://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) of this book). -Now, the `setup_arch` finished its work and we can back to the generic Linux kernel code. Recall that the `setup_arch` function was called from the `start_kernel` function which is defined in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file. So, we shall return to this function. You can see that there are many different function are called right after `setup_arch` function inside of the `start_kernel` function, but since our chapter is devoted to timers and time management related stuff, we will skip all code which is not related to this topic. The first function which is related to the time management in the Linux kernel is: +Now, the `setup_arch` finished its work and we can back to the generic Linux kernel code. Recall that the `setup_arch` function was called from the `start_kernel` function which is defined in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file. So, we shall return to this function. You can see that there are many different function are called right after `setup_arch` function inside of the `start_kernel` function, but since our chapter is devoted to timers and time management related stuff, we will skip all code which is not related to this topic. The first function which is related to the time management in the Linux kernel is: ```C tick_init(); ``` -in the `start_kernel`. The `tick_init` function defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-common.c) source code file and does two things: +in the `start_kernel`. The `tick_init` function defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-common.c) source code file and does two things: * Initialization of `tick broadcast` framework related data structures; * Initialization of `full` tickless mode related data structures. @@ -30,7 +30,7 @@ We didn't see anything related to the `tick broadcast` framework in this book an The idle process -------------------------------------------------------------------------------- -First of all, let's look on the implementation of the `tick_init` function. As I already wrote, this function defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-common.c) source code file and consists from the two calls of following functions: +First of all, let's look on the implementation of the `tick_init` function. As I already wrote, this function defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-common.c) source code file and consists from the two calls of following functions: ```C void __init tick_init(void) @@ -40,9 +40,9 @@ void __init tick_init(void) } ``` -As you can understand from the paragraph's title, we are interesting only in the `tick_broadcast_init` function for now. This function defined in the [kernel/time/tick-broadcast.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-broadcast.c) source code file and executes initialization of the `tick broadcast` framework related data structures. Before we will look on the implementation of the `tick_broadcast_init` function and will try to understand what does this function do, we need to know about `tick broadcast` framework. +As you can understand from the paragraph's title, we are interesting only in the `tick_broadcast_init` function for now. This function defined in the [kernel/time/tick-broadcast.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-broadcast.c) source code file and executes initialization of the `tick broadcast` framework related data structures. Before we will look on the implementation of the `tick_broadcast_init` function and will try to understand what does this function do, we need to know about `tick broadcast` framework. -Main point of a central processor is to execute programs. But sometimes a processor may be in a special state when it is not being used by any program. This special state is called - [idle](https://en.wikipedia.org/wiki/Idle_%28CPU%29). When the processor has no anything to execute, the Linux kernel launches `idle` task. We already saw a little about this in the last part of the [Linux kernel initialization process](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-10.html). When the Linux kernel will finish all initialization processes in the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file, it will call the `rest_init` function from the same source code file. Main point of this function is to launch kernel `init` thread and the `kthreadd` thread, to call the `schedule` function to start task scheduling and to go to sleep by calling the `cpu_idle_loop` function that defined in the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/master/kernel/sched/idle.c) source code file. +Main point of a central processor is to execute programs. But sometimes a processor may be in a special state when it is not being used by any program. This special state is called - [idle](https://en.wikipedia.org/wiki/Idle_%28CPU%29). When the processor has no anything to execute, the Linux kernel launches `idle` task. We already saw a little about this in the last part of the [Linux kernel initialization process](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-10.html). When the Linux kernel will finish all initialization processes in the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file, it will call the `rest_init` function from the same source code file. Main point of this function is to launch kernel `init` thread and the `kthreadd` thread, to call the `schedule` function to start task scheduling and to go to sleep by calling the `cpu_idle_loop` function that defined in the [kernel/sched/idle.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/sched/idle.c) source code file. The `cpu_idle_loop` function represents infinite loop which checks the need for rescheduling on each iteration. After the scheduler finds something to execute, the `idle` process will finish its work and the control will be moved to a new runnable task with the call of the `schedule_preempt_disabled` function: @@ -70,7 +70,7 @@ By default, there is the `CONFIG_HZ_PERIODIC` kernel configuration option which The first is to omit scheduling-clock ticks on idle processors. To enable this behaviour in the Linux kernel, we need to enable the `CONFIG_NO_HZ_IDLE` kernel configuration option. This option allows Linux kernel to avoid sending timer interrupts to idle processors. In this case periodic timer interrupts will be replaced with on-demand interrupts. This mode is called - `dyntick-idle` mode. But if the kernel does not handle interrupts of a system timer, how can the kernel decide if the system has nothing to do? -Whenever the idle task is selected to run, the periodic tick is disabled with the call of the `tick_nohz_idle_enter` function that defined in the [kernel/time/tick-sched.c](https://github.com/torvalds/linux/blob/master/kernel/time/tich-sched.c) source code file and enabled with the call of the `tick_nohz_idle_exit` function. There is special concept in the Linux kernel which is called - `clock event devices` that are used to schedule the next interrupt. This concept provides API for devices which can deliver interrupts at a specific time in the future and represented by the `clock_event_device` structure in the Linux kernel. We will not dive into implementation of the `clock_event_device` structure now. We will see it in the next part of this chapter. But there is one interesting moment for us right now. +Whenever the idle task is selected to run, the periodic tick is disabled with the call of the `tick_nohz_idle_enter` function that defined in the [kernel/time/tick-sched.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tich-sched.c) source code file and enabled with the call of the `tick_nohz_idle_exit` function. There is special concept in the Linux kernel which is called - `clock event devices` that are used to schedule the next interrupt. This concept provides API for devices which can deliver interrupts at a specific time in the future and represented by the `clock_event_device` structure in the Linux kernel. We will not dive into implementation of the `clock_event_device` structure now. We will see it in the next part of this chapter. But there is one interesting moment for us right now. The second way is to omit scheduling-clock ticks on processors that are either in `idle` state or that have only one runnable task or in other words busy processor. We can enable this feature with the `CONFIG_NO_HZ_FULL` kernel configuration option and it allows to reduce the number of timer interrupts significantly. @@ -86,7 +86,7 @@ void __init tick_init(void) } ``` -Let's consider the first function. The first `tick_broadcast_init` function defined in the [kernel/time/tick-broadcast.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-broadcast.c) source code file and executes initialization of the `tick broadcast` framework related data structures. Let's look on the implementation of the `tick_broadcast_init` function: +Let's consider the first function. The first `tick_broadcast_init` function defined in the [kernel/time/tick-broadcast.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-broadcast.c) source code file and executes initialization of the `tick broadcast` framework related data structures. Let's look on the implementation of the `tick_broadcast_init` function: ```C void __init tick_broadcast_init(void) @@ -102,7 +102,7 @@ void __init tick_broadcast_init(void) } ``` -As we can see, the `tick_broadcast_init` function allocates different [cpumasks](https://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) with the help of the `zalloc_cpumask_var` function. The `zalloc_cpumask_var` function defined in the [lib/cpumask.c](https://github.com/torvalds/linux/blob/master/lib/cpumask.c) source code file and expands to the call of the following function: +As we can see, the `tick_broadcast_init` function allocates different [cpumasks](https://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) with the help of the `zalloc_cpumask_var` function. The `zalloc_cpumask_var` function defined in the [lib/cpumask.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/lib/cpumask.c) source code file and expands to the call of the following function: ```C bool zalloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) @@ -130,7 +130,7 @@ As we already know, the next three `cpumasks` depends on the `CONFIG_TICK_ONESHO * `periodic` - clock events devices that support periodic events; * `oneshot` - clock events devices that capable of issuing events that happen only once. -The linux kernel defines two mask for such clock events devices in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/master/include/linux/clockchips.h) header file: +The linux kernel defines two mask for such clock events devices in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clockchips.h) header file: ```C #define CLOCK_EVT_FEAT_PERIODIC 0x000001 @@ -148,7 +148,7 @@ We have initialized six `cpumasks` in the `tick broadcast` framework, and now we The `tick broadcast` framework -------------------------------------------------------------------------------- -Hardware may provide some clock source devices. When a processor sleeps and its local timer stopped, there must be additional clock source device that will handle awakening of a processor. The Linux kernel uses these `special` clock source devices which can raise an interrupt at a specified time. We already know that such timers called `clock events` devices in the Linux kernel. Besides `clock events` devices. Actually, each processor in the system has its own local timer which is programmed to issue interrupt at the time of the next deferred task. Also these timers can be programmed to do a periodical job, like updating `jiffies` and etc. These timers represented by the `tick_device` structure in the Linux kernel. This structure defined in the [kernel/time/tick-sched.h](https://github.com/torvalds/linux/blob/master/kernel/time/tick-sched.h) header file and looks: +Hardware may provide some clock source devices. When a processor sleeps and its local timer stopped, there must be additional clock source device that will handle awakening of a processor. The Linux kernel uses these `special` clock source devices which can raise an interrupt at a specified time. We already know that such timers called `clock events` devices in the Linux kernel. Besides `clock events` devices. Actually, each processor in the system has its own local timer which is programmed to issue interrupt at the time of the next deferred task. Also these timers can be programmed to do a periodical job, like updating `jiffies` and etc. These timers represented by the `tick_device` structure in the Linux kernel. This structure defined in the [kernel/time/tick-sched.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-sched.h) header file and looks: ```C struct tick_device { @@ -157,7 +157,7 @@ struct tick_device { }; ``` -Note, that the `tick_device` structure contains two fields. The first field - `evtdev` represents pointer to the `clock_event_device` structure that defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/master/include/linux/clockchips.h) header file and represents descriptor of a clock event device. A `clock event` device allows to register an event that will happen in the future. As I already wrote, we will not consider `clock_event_device` structure and related API in this part, but will see it in the next part. +Note, that the `tick_device` structure contains two fields. The first field - `evtdev` represents pointer to the `clock_event_device` structure that defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clockchips.h) header file and represents descriptor of a clock event device. A `clock event` device allows to register an event that will happen in the future. As I already wrote, we will not consider `clock_event_device` structure and related API in this part, but will see it in the next part. The second field of the `tick_device` structure represents mode of the `tick_device`. As we already know, the mode can be one of the: @@ -168,7 +168,7 @@ enum tick_device_mode { }; ``` -Each `clock events` device in the system registers itself by the call of the `clockevents_register_device` function or `clockevents_config_and_register` function during initialization process of the Linux kernel. During the registration of a new `clock events` device, the Linux kernel calls the `tick_check_new_device` function that defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/tick-common.c) source code file and checks the given `clock events` device should be used by the Linux kernel. After all checks, the `tick_check_new_device` function executes a call of the: +Each `clock events` device in the system registers itself by the call of the `clockevents_register_device` function or `clockevents_config_and_register` function during initialization process of the Linux kernel. During the registration of a new `clock events` device, the Linux kernel calls the `tick_check_new_device` function that defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/tick-common.c) source code file and checks the given `clock events` device should be used by the Linux kernel. After all checks, the `tick_check_new_device` function executes a call of the: ```C tick_install_broadcast_device(newdev); @@ -202,15 +202,15 @@ void tick_install_broadcast_device(struct clock_event_device *dev) } ``` -First of all we get the current `clock event` device from the `tick_broadcast_device`. The `tick_broadcast_device` defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/tick-common.c) source code file: +First of all we get the current `clock event` device from the `tick_broadcast_device`. The `tick_broadcast_device` defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/tick-common.c) source code file: ```C static struct tick_device tick_broadcast_device; ``` -and represents external clock device that keeps track of events for a processor. The first step after we got the current clock device is the call of the `tick_check_broadcast_device` function which checks that a given clock events device can be utilized as broadcast device. The main point of the `tick_check_broadcast_device` function is to check value of the `features` field of the given `clock events` device. As we can understand from the name of this field, the `features` field contains a clock event device features. Available values defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/master/include/linux/clockchips.h) header file and can be one of the `CLOCK_EVT_FEAT_PERIODIC` - which represents a clock events device which supports periodic events and etc. So, the `tick_check_broadcast_device` function check `features` flags for `CLOCK_EVT_FEAT_ONESHOT`, `CLOCK_EVT_FEAT_DUMMY` and other flags and returns `false` if the given clock events device has one of these features. In other way the `tick_check_broadcast_device` function compares `ratings` of the given clock event device and current clock event device and returns the best. +and represents external clock device that keeps track of events for a processor. The first step after we got the current clock device is the call of the `tick_check_broadcast_device` function which checks that a given clock events device can be utilized as broadcast device. The main point of the `tick_check_broadcast_device` function is to check value of the `features` field of the given `clock events` device. As we can understand from the name of this field, the `features` field contains a clock event device features. Available values defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clockchips.h) header file and can be one of the `CLOCK_EVT_FEAT_PERIODIC` - which represents a clock events device which supports periodic events and etc. So, the `tick_check_broadcast_device` function check `features` flags for `CLOCK_EVT_FEAT_ONESHOT`, `CLOCK_EVT_FEAT_DUMMY` and other flags and returns `false` if the given clock events device has one of these features. In other way the `tick_check_broadcast_device` function compares `ratings` of the given clock event device and current clock event device and returns the best. -After the `tick_check_broadcast_device` function, we can see the call of the `try_module_get` function that checks module owner of the clock events. We need to do it to be sure that the given `clock events` device was correctly initialized. The next step is the call of the `clockevents_exchange_device` function that defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/master/kernel/time/clockevents.c) source code file and will release old clock events device and replace the previous functional handler with a dummy handler. +After the `tick_check_broadcast_device` function, we can see the call of the `try_module_get` function that checks module owner of the clock events. We need to do it to be sure that the given `clock events` device was correctly initialized. The next step is the call of the `clockevents_exchange_device` function that defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/clockevents.c) source code file and will release old clock events device and replace the previous functional handler with a dummy handler. In the last step of the `tick_install_broadcast_device` function we check that the `tick_broadcast_mask` is not empty and start the given `clock events` device in periodic mode with the call of the `tick_broadcast_start_periodic` function: @@ -255,7 +255,7 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) } ``` -that defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-common.c) source code file and sets broadcast handler for the given `clock event` device by the call of the following function: +that defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-common.c) source code file and sets broadcast handler for the given `clock event` device by the call of the following function: ```C tick_set_periodic_handler(dev, broadcast); @@ -273,7 +273,7 @@ void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast) } ``` -When an `clock event` device will issue an interrupt, the `dev->event_handler` will be called. For example, let's look on the interrupt handler of the [high precision event timer](https://en.wikipedia.org/wiki/High_Precision_Event_Timer) which is located in the [arch/x86/kernel/hpet.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/hpet.c) source code file: +When an `clock event` device will issue an interrupt, the `dev->event_handler` will be called. For example, let's look on the interrupt handler of the [high precision event timer](https://en.wikipedia.org/wiki/High_Precision_Event_Timer) which is located in the [arch/x86/kernel/hpet.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/hpet.c) source code file: ```C static irqreturn_t hpet_interrupt_handler(int irq, void *data) @@ -321,7 +321,7 @@ If you remember, we have started this part with the call of the `tick_init` func Initialization of dyntick related data structures -------------------------------------------------------------------------------- -We already saw some information about `dyntick` concept in this part and we know that this concept allows kernel to disable system timer interrupts in the `idle` state. The `tick_nohz_init` function makes initialization of the different data structures which are related to this concept. This function defined in the [kernel/time/tick-sched.c](https://github.com/torvalds/linux/blob/master/kernel/time/tich-sched.c) source code file and starts from the check of the value of the `tick_nohz_full_running` variable which represents state of the tick-less mode for the `idle` state and the state when system timer interrups are disabled during a processor has only one runnable task: +We already saw some information about `dyntick` concept in this part and we know that this concept allows kernel to disable system timer interrupts in the `idle` state. The `tick_nohz_init` function makes initialization of the different data structures which are related to this concept. This function defined in the [kernel/time/tick-sched.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tich-sched.c) source code file and starts from the check of the value of the `tick_nohz_full_running` variable which represents state of the tick-less mode for the `idle` state and the state when system timer interrups are disabled during a processor has only one runnable task: ```C if (!tick_nohz_full_running) { @@ -360,7 +360,7 @@ if (!alloc_cpumask_var(&housekeeping_mask, GFP_KERNEL)) { } ``` -This `cpumask` will store number of processor for `housekeeping` or in other words we need at least in one processor that will not be in `NO_HZ` mode, because it will do timekeeping and etc. After this we check the result of the architecture-specific `arch_irq_work_has_interrupt` function. This function checks ability to send inter-processor interrupt for the certain architecture. We need to check this, because system timer of a processor will be disabled during `NO_HZ` mode, so there must be at least one online processor which can send inter-processor interrupt to awake offline processor. This function defined in the [arch/x86/include/asm/irq_work.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irq_work.h) header file for the [x86_64](https://en.wikipedia.org/wiki/X86-64) and just checks that a processor has [APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller) from the [CPUID](https://en.wikipedia.org/wiki/CPUID): +This `cpumask` will store number of processor for `housekeeping` or in other words we need at least in one processor that will not be in `NO_HZ` mode, because it will do timekeeping and etc. After this we check the result of the architecture-specific `arch_irq_work_has_interrupt` function. This function checks ability to send inter-processor interrupt for the certain architecture. We need to check this, because system timer of a processor will be disabled during `NO_HZ` mode, so there must be at least one online processor which can send inter-processor interrupt to awake offline processor. This function defined in the [arch/x86/include/asm/irq_work.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irq_work.h) header file for the [x86_64](https://en.wikipedia.org/wiki/X86-64) and just checks that a processor has [APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller) from the [CPUID](https://en.wikipedia.org/wiki/CPUID): ```C static inline bool arch_irq_work_has_interrupt(void) @@ -407,7 +407,7 @@ for_each_cpu(cpu, tick_nohz_full_mask) context_tracking_cpu_set(cpu); ``` -The `context_tracking_cpu_set` function defined in the [kernel/context_tracking.c](https://github.com/torvalds/linux/blob/master/kernel/context_tracking.c) source code file and main point of this function is to set the `context_tracking.active` [percpu](https://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable to `true`. When the `active` field will be set to `true` for the certain processor, all [context switches](https://en.wikipedia.org/wiki/Context_switch) will be ignored by the Linux kernel context tracking subsystem for this processor. +The `context_tracking_cpu_set` function defined in the [kernel/context_tracking.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/context_tracking.c) source code file and main point of this function is to set the `context_tracking.active` [percpu](https://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable to `true`. When the `active` field will be set to `true` for the certain processor, all [context switches](https://en.wikipedia.org/wiki/Context_switch) will be ignored by the Linux kernel context tracking subsystem for this processor. That's all. This is the end of the `tick_nohz_init` function. After this `NO_HZ` related data structures will be initialzed. We didn't see API of the `NO_HZ` mode, but will see it soon. @@ -432,7 +432,7 @@ Links * [printk](https://en.wikipedia.org/wiki/Printk) * [CPU idle](https://en.wikipedia.org/wiki/Idle_%28CPU%29) * [power management](https://en.wikipedia.org/wiki/Power_management) -* [NO_HZ documentation](https://github.com/torvalds/linux/blob/master/Documentation/timers/NO_HZ.txt) +* [NO_HZ documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/timers/NO_HZ.txt) * [cpumasks](https://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) * [high precision event timer](https://en.wikipedia.org/wiki/High_Precision_Event_Timer) * [irq](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29) diff --git a/Timers/timers-4.md b/Timers/timers-4.md index e0b593e..5ec1775 100644 --- a/Timers/timers-4.md +++ b/Timers/timers-4.md @@ -6,7 +6,7 @@ Timers This is fourth part of the [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html) which describes timers and time management related stuff in the Linux kernel and in the previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-3.html) we knew about the `tick broadcast` framework and `NO_HZ` mode in the Linux kernel. We will continue to dive into the time management related stuff in the Linux kernel in this part and will be acquainted with yet another concept in the Linux kernel - `timers`. Before we will look at timers in the Linux kernel, we have to learn some theory about this concept. Note that we will consider software timers in this part. -The Linux kernel provides a `software timer` concept to allow to kernel functions could be invoked at future moment. Timers are widely used in the Linux kernel. For example, look in the [net/netfilter/ipset/ip_set_list_set.c](https://github.com/torvalds/linux/blob/master/net/netfilter/ipset/ip_set_list_set.c) source code file. This source code file provides implementation of the framework for the managing of groups of [IP](https://en.wikipedia.org/wiki/Internet_Protocol) addresses. +The Linux kernel provides a `software timer` concept to allow to kernel functions could be invoked at future moment. Timers are widely used in the Linux kernel. For example, look in the [net/netfilter/ipset/ip_set_list_set.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/net/netfilter/ipset/ip_set_list_set.c) source code file. This source code file provides implementation of the framework for the managing of groups of [IP](https://en.wikipedia.org/wiki/Internet_Protocol) addresses. We can find the `list_set` structure that contains `gc` filed in this source code file: @@ -18,7 +18,7 @@ struct list_set { }; ``` -Not that the `gc` filed has `timer_list` type. This structure defined in the [include/linux/timer.h](https://github.com/torvalds/linux/blob/master/include/linux/timer.h) header file and main point of this structure is to store `dynamic` timers in the Linux kernel. Actually, the Linux kernel provides two types of timers called dynamic timers and interval timers. First type of timers is used by the kernel, and the second can be used by user mode. The `timer_list` structure contains actual `dynamic` timers. The `list_set` contains `gc` timer in our example represents timer for garbage collection. This timer will be initialized in the `list_set_gc_init` function: +Not that the `gc` filed has `timer_list` type. This structure defined in the [include/linux/timer.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/timer.h) header file and main point of this structure is to store `dynamic` timers in the Linux kernel. Actually, the Linux kernel provides two types of timers called dynamic timers and interval timers. First type of timers is used by the kernel, and the second can be used by user mode. The `timer_list` structure contains actual `dynamic` timers. The `list_set` contains `gc` timer in our example represents timer for garbage collection. This timer will be initialized in the `list_set_gc_init` function: ```C static void @@ -45,13 +45,13 @@ Now let's continue to research source code of Linux kernel which is related to t Introduction to dynamic timers in the Linux kernel -------------------------------------------------------------------------------- -As I already wrote, we knew about the `tick broadcast` framework and `NO_HZ` mode in the previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-3.html). They will be initialized in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file by the call of the `tick_init` function. If we will look at this source code file, we will see that the next time management related function is: +As I already wrote, we knew about the `tick broadcast` framework and `NO_HZ` mode in the previous [part](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-3.html). They will be initialized in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file by the call of the `tick_init` function. If we will look at this source code file, we will see that the next time management related function is: ```C init_timers(); ``` -This function defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file and contains calls of four functions: +This function defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file and contains calls of four functions: ```C void __init init_timers(void) @@ -63,7 +63,7 @@ void __init init_timers(void) } ``` -Let's look on implementation of each function. The first function is `init_timer_cpus` defined in the [same](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file and just calls the `init_timer_cpu` function for each possible processor in the system: +Let's look on implementation of each function. The first function is `init_timer_cpus` defined in the [same](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file and just calls the `init_timer_cpu` function for each possible processor in the system: ```C static void __init init_timer_cpus(void) @@ -77,7 +77,7 @@ static void __init init_timer_cpus(void) If you do not know or do not remember what is it a `possible` cpu, you can read the special [part](https://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) of this book which describes `cpumask` concept in the Linux kernel. In short words, a `possible` processor is a processor which can be plugged in anytime during the life of the system. -The `init_timer_cpu` function does main work for us, namely it executes initialization of the `tvec_base` structure for each processor. This structure defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file and stores data related to a `dynamic` timer for a certain processor. Let's look on the definition of this structure: +The `init_timer_cpu` function does main work for us, namely it executes initialization of the `tvec_base` structure for each processor. This structure defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file and stores data related to a `dynamic` timer for a certain processor. Let's look on the definition of this structure: ```C struct tvec_base { @@ -121,7 +121,7 @@ type. Note that the value of the `TVR_SIZE` depends on the `CONFIG_BASE_SMALL` k that reduces size of the kernel data structures if disabled. The `v1` is array that may contain `64` or `256` elements where an each element represents a dynamic timer that will decay within the next `255` system timer interrupts. Next three fields: `tv2`, `tv3` and `tv4` are lists with dynamic timers too, but they store dynamic timers which will decay the next `2^14 - 1`, `2^20 - 1` and `2^26` respectively. The last `tv5` field represents list which stores dynamic timers with a large expiring period. -So, now we saw the `tvec_base` structure and description of its fields and we can look on the implementation of the `init_timer_cpu` function. As I already wrote, this function defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file and executes initialization of the `tvec_bases`: +So, now we saw the `tvec_base` structure and description of its fields and we can look on the implementation of the `init_timer_cpu` function. As I already wrote, this function defined in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file and executes initialization of the `tvec_bases`: ```C static void __init init_timer_cpu(int cpu) @@ -232,7 +232,7 @@ static int timer_cpu_notify(struct notifier_block *self, } ``` -This chapter will not describe `hotplug` related events in the Linux kernel source code, but if you are interesting in such things, you can find implementation of the `migrate_timers` function in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/master/kernel/time/timer.c) source code file. +This chapter will not describe `hotplug` related events in the Linux kernel source code, but if you are interesting in such things, you can find implementation of the `migrate_timers` function in the [kernel/time/timer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/timer.c) source code file. The last step in the `init_timers` function is the call of the: @@ -240,9 +240,9 @@ The last step in the `init_timers` function is the call of the: open_softirq(TIMER_SOFTIRQ, run_timer_softirq); ``` -function. The `open_softirq` function may be already familar to you if you have read the ninth [part](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) about the interrupts and interrupt handling in the Linux kernel. In short words, the `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/master/kernel/softirq.c) source code file and executes initialization of the deferred interrupt handler. +function. The `open_softirq` function may be already familar to you if you have read the ninth [part](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) about the interrupts and interrupt handling in the Linux kernel. In short words, the `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) source code file and executes initialization of the deferred interrupt handler. -In our case the deferred function is the `run_timer_softirq` function that is will be called after a hardware interrupt in the `do_IRQ` function which defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irq.c) source code file. The main point of this function is to handle a software dynamic timer. The Linux kernel does not do this thing during the hardware timer interrupt handling because this is time consuming operation. +In our case the deferred function is the `run_timer_softirq` function that is will be called after a hardware interrupt in the `do_IRQ` function which defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irq.c) source code file. The main point of this function is to handle a software dynamic timer. The Linux kernel does not do this thing during the hardware timer interrupt handling because this is time consuming operation. Let's look on the implementation of the `run_timer_softirq` function: @@ -256,7 +256,7 @@ static void run_timer_softirq(struct softirq_action *h) } ``` -At the beginning of the `run_timer_softirq` function we get a `dynamic` timer for a current processor and compares the current value of the [jiffies](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-1.html) with the value of the `timer_jiffies` for the current structure by the call of the `time_after_eq` macro which is defined in the [include/linux/jiffies.h](https://github.com/torvalds/linux/blob/master/include/linux/jiffies.h) header file: +At the beginning of the `run_timer_softirq` function we get a `dynamic` timer for a current processor and compares the current value of the [jiffies](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-1.html) with the value of the `timer_jiffies` for the current structure by the call of the `time_after_eq` macro which is defined in the [include/linux/jiffies.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/jiffies.h) header file: ```C #define time_after_eq(a,b) \ @@ -360,7 +360,7 @@ Now let's look usage of `dynamic timers` in the Linux kernel. Usage of dynamic timers -------------------------------------------------------------------------------- -As you already can noted, if the Linux kernel provides a concept, it also provides API for managing of this concept and the `dynamic timers` concept is not exception here. To use a timer in the Linux kernel code, we must define a variable with a `timer_list` type. We can initialize our `timer_list` structure in two ways. The first is to use the `init_timer` macro that defined in the [include/linux/timer.h](https://github.com/torvalds/linux/blob/master/include/linux/timer.h) header file: +As you already can noted, if the Linux kernel provides a concept, it also provides API for managing of this concept and the `dynamic timers` concept is not exception here. To use a timer in the Linux kernel code, we must define a variable with a `timer_list` type. We can initialize our `timer_list` structure in two ways. The first is to use the `init_timer` macro that defined in the [include/linux/timer.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/timer.h) header file: ```C #define init_timer(timer) \ diff --git a/Timers/timers-5.md b/Timers/timers-5.md index dcad4fe..ce6e0a5 100644 --- a/Timers/timers-5.md +++ b/Timers/timers-5.md @@ -6,7 +6,7 @@ Introduction to the `clockevents` framework This is fifth part of the [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html) which describes timers and time management related stuff in the Linux kernel. As you might noted from the title of this part, the `clockevents` framework will be discussed. We already saw one framework in the [second](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-2.html) part of this chapter. It was `clocksource` framework. Both of these frameworks represent timekeeping abstractions in the Linux kernel. -At first let's refresh your memory and try to remember what is it `clocksource` framework and and what its purpose. The main goal of the `clocksource` framework is to provide `timeline`. As described in the [documentation](https://github.com/0xAX/linux/blob/master/Documentation/timers/timekeeping.txt): +At first let's refresh your memory and try to remember what is it `clocksource` framework and and what its purpose. The main goal of the `clocksource` framework is to provide `timeline`. As described in the [documentation](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/Documentation/timers/timekeeping.txt): > For example issuing the command 'date' on a Linux system will eventually read the clock source to determine exactly what time it is. @@ -14,7 +14,7 @@ The Linux kernel supports many different clock sources. You can find some of the Each clock source provides monotonic atomic counter. As I already wrote, the Linux kernel supports a huge set of different clock source and each clock source has own parameters like [frequency](https://en.wikipedia.org/wiki/Frequency). The main goal of the `clocksource` framework is to provide [API](https://en.wikipedia.org/wiki/Application_programming_interface) to select best available clock source in the system i.e. a clock source with the highest frequency. Additional goal of the `clocksource` framework is to represent an atomic counter provided by a clock source in human units. In this time, nanoseconds are the favorite choice for the time value units of the given clock source in the Linux kernel. -The `clocksource` framework represented by the `clocksource` structure which is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/master/include/linux/clocksource.h) header code file which contains `name` of a clock source, rating of certain clock source in the system (a clock source with the higher frequency has the biggest rating in the system), `list` of all registered clock source in the system, `enable` and `disable` fields to enable and disable a clock source, pointer to the `read` function which must return an atomic counter of a clock source and etc. +The `clocksource` framework represented by the `clocksource` structure which is defined in the [include/linux/clocksource.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clocksource.h) header code file which contains `name` of a clock source, rating of certain clock source in the system (a clock source with the higher frequency has the biggest rating in the system), `list` of all registered clock source in the system, `enable` and `disable` fields to enable and disable a clock source, pointer to the `read` function which must return an atomic counter of a clock source and etc. Additionally the `clocksource` structure provides two fields: `mult` and `shift` which are needed for translation of an atomic counter which is provided by a certain clock source to the human units, i.e. [nanoseconds](https://en.wikipedia.org/wiki/Nanosecond). Translation occurs via following formula: @@ -37,7 +37,7 @@ int clocksource_unregister(struct clocksource *cs) and etc. -Additionally to the `clocksource` framework, the Linux kernel provides `clockevents` framework. As described in the [documentation](https://github.com/0xAX/linux/blob/master/Documentation/timers/timekeeping.txt): +Additionally to the `clocksource` framework, the Linux kernel provides `clockevents` framework. As described in the [documentation](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/Documentation/timers/timekeeping.txt): > Clock events are the conceptual reverse of clock sources @@ -48,7 +48,7 @@ Now we know a little about the `clockevents` framework in the Linux kernel, and API of `clockevents` framework ------------------------------------------------------------------------------- -The main structure which described a clock event device is `clock_event_device` structure. This structure is defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/master/include/linux/clockchips.h) header file and contains a huge set of fields. as well as the `clocksource` structure it has `name` fields which contains human readable name of a clock event device, for example [local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller) timer: +The main structure which described a clock event device is `clock_event_device` structure. This structure is defined in the [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clockchips.h) header file and contains a huge set of fields. as well as the `clocksource` structure it has `name` fields which contains human readable name of a clock event device, for example [local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller) timer: ```C static struct clock_event_device lapic_clockevent = { @@ -85,7 +85,7 @@ void clockevents_register_device(struct clock_event_device *dev) } ``` -This function defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/master/kernel/time/clockevents.c) source code file and as we may see, the `clockevents_register_device` function takes only one parameter: +This function defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/clockevents.c) source code file and as we may see, the `clockevents_register_device` function takes only one parameter: * address of a `clock_event_device` structure which represents a clock event device. @@ -138,7 +138,7 @@ After we finished with the initialization of the `at91sam926x` periodic timer, w clockevents_register_device(&data->clkevt); ``` -Now we can consider implementation of the `clockevent_register_device` function. As I already wrote above, this function is defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/master/kernel/time/clockevents.c) source code file and starts from the initialization of the initial event device state: +Now we can consider implementation of the `clockevent_register_device` function. As I already wrote above, this function is defined in the [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/clockevents.c) source code file and starts from the initialization of the initial event device state: ```C clockevent_set_state(dev, CLOCK_EVT_STATE_DETACHED); @@ -213,7 +213,7 @@ First of all we add the given clock event device to the list of clock event devi static LIST_HEAD(clockevent_devices); ``` -At the next step we call the `tick_check_new_device` function which is defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-common.c) source code file and checks do the new registered clock event device should be used or not. The `tick_check_new_device` function checks the given `clock_event_device` gets the current registered tick device which is represented by the `tick_device` structure and compares their ratings and features. Actually `CLOCK_EVT_STATE_ONESHOT` is preferred: +At the next step we call the `tick_check_new_device` function which is defined in the [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-common.c) source code file and checks do the new registered clock event device should be used or not. The `tick_check_new_device` function checks the given `clock_event_device` gets the current registered tick device which is represented by the `tick_device` structure and compares their ratings and features. Actually `CLOCK_EVT_STATE_ONESHOT` is preferred: ```C static bool tick_check_preferred(struct clock_event_device *curdev, @@ -378,7 +378,7 @@ That's all. From this moment we have registered new clock event device. So the u We saw implementation only of the `clockevents_register_device` function. But generally, the clock event layer [API](https://en.wikipedia.org/wiki/Application_programming_interface) is small. Besides the `API` for clock event device registration, the `clockevents` framework provides functions to schedule the next event interrupt, clock event device notification service and support for suspend and resume for clock event devices. -If you want to know more about `clockevents` API you can start to research following source code and header files: [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/master/kernel/time/tick-common.c), [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/master/kernel/time/clockevents.c) and [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/master/include/linux/clockchips.h). +If you want to know more about `clockevents` API you can start to research following source code and header files: [kernel/time/tick-common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/tick-common.c), [kernel/time/clockevents.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/clockevents.c) and [include/linux/clockchips.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clockchips.h). That's all. @@ -394,7 +394,7 @@ If you have questions or suggestions, feel free to ping me in twitter [0xAX](htt Links ------------------------------------------------------------------------------- -* [timekeeping documentation](https://github.com/0xAX/linux/blob/master/Documentation/timers/timekeeping.txt) +* [timekeeping documentation](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/Documentation/timers/timekeeping.txt) * [Intel 8253](https://en.wikipedia.org/wiki/Intel_8253) * [programmable interval timer](https://en.wikipedia.org/wiki/Programmable_interval_timer) * [ACPI pdf](http://uefi.org/sites/default/files/resources/ACPI_5.pdf) diff --git a/Timers/timers-6.md b/Timers/timers-6.md index 0ca4fa2..d69e616 100644 --- a/Timers/timers-6.md +++ b/Timers/timers-6.md @@ -44,7 +44,7 @@ model name : Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz And although Intel manual says that the frequency of the `Time Stamp Counter`, while constant, is not necessarily the maximum qualified frequency of the processor, or the frequency given in the brand string, anyway we may see that it will be much more than frequency of the `ACPI PM` timer or `High Precision Event Timer`. And we can see that the clock source with the best rating or highest frequency is current in the system. -You can note that besides these three clock source, we don't see yet another two familiar us clock sources in the output of the `/sys/devices/system/clocksource/clocksource0/available_clocksource`. These clock sources are `jiffy` and `refined_jiffies`. We don't see them because this filed maps only high resolution clock sources or in other words clock sources with the [CLOCK_SOURCE_VALID_FOR_HRES](https://github.com/torvalds/linux/blob/master/include/linux/clocksource.h#L113) flag. +You can note that besides these three clock source, we don't see yet another two familiar us clock sources in the output of the `/sys/devices/system/clocksource/clocksource0/available_clocksource`. These clock sources are `jiffy` and `refined_jiffies`. We don't see them because this filed maps only high resolution clock sources or in other words clock sources with the [CLOCK_SOURCE_VALID_FOR_HRES](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/clocksource.h#L113) flag. As I already wrote above, we will consider all of these three clock sources in this part. We will consider it in order of their initialization or: @@ -71,14 +71,14 @@ The first clock source is the [High Precision Event Timer](https://en.wikipedia. High Precision Event Timer -------------------------------------------------------------------------------- -The implementation of the `High Precision Event Timer` for the [x86](https://en.wikipedia.org/wiki/X86) architecture is located in the [arch/x86/kernel/hpet.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/hpet.c) source code file. Its initialization starts from the call of the `hpet_enable` function. This function is called during Linux kernel initialization. If we will look into `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file, we will see that after the all architecture-specific stuff initialized, early console is disabled and time management subsystem already ready, call of the following function: +The implementation of the `High Precision Event Timer` for the [x86](https://en.wikipedia.org/wiki/X86) architecture is located in the [arch/x86/kernel/hpet.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/hpet.c) source code file. Its initialization starts from the call of the `hpet_enable` function. This function is called during Linux kernel initialization. If we will look into `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) source code file, we will see that after the all architecture-specific stuff initialized, early console is disabled and time management subsystem already ready, call of the following function: ```C if (late_time_init) late_time_init(); ``` -which does initialization of the late architecture specific timers after early jiffy counter already initialized. The definition of the `late_time_init` function for the `x86` architecture is located in the [arch/x86/kernel/time.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/time.c) source code file. It looks pretty easy: +which does initialization of the late architecture specific timers after early jiffy counter already initialized. The definition of the `late_time_init` function for the `x86` architecture is located in the [arch/x86/kernel/time.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/time.c) source code file. It looks pretty easy: ```C static __init void x86_late_time_init(void) @@ -88,7 +88,7 @@ static __init void x86_late_time_init(void) } ``` -As we may see, it does initialization of the `x86` related timer and initialization of the `Time Stamp Counter`. The seconds we will see in the next paragraph, but now let's consider the call of the `x86_init.timers.timer_init` function. The `timer_init` points to the `hpet_time_init` function from the same source code file. We can verify this by looking on the definition of the `x86_init` structure from the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/x86_init.c): +As we may see, it does initialization of the `x86` related timer and initialization of the `Time Stamp Counter`. The seconds we will see in the next paragraph, but now let's consider the call of the `x86_init.timers.timer_init` function. The `timer_init` points to the `hpet_time_init` function from the same source code file. We can verify this by looking on the definition of the `x86_init` structure from the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/x86_init.c): ```C struct x86_init_ops x86_init __initdata = { @@ -187,7 +187,7 @@ static struct clocksource clocksource_hpet = { }; ``` -After the `clocksource_hpet` is registered, we can return to the `hpet_time_init()` function from the [arch/x86/kernel/time.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/time.c) source code file. We can remember that the last step is the call of the: +After the `clocksource_hpet` is registered, we can return to the `hpet_time_init()` function from the [arch/x86/kernel/time.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/time.c) source code file. We can remember that the last step is the call of the: ```C setup_default_timer_irq(); @@ -208,7 +208,7 @@ function which just reads and returns atomic counter from the `Main Counter Regi ACPI PM timer -------------------------------------------------------------------------------- -The seconds clock source is [ACPI Power Management Timer](http://uefi.org/sites/default/files/resources/ACPI_5.pdf). Implementation of this clock source is located in the [drivers/clocksource/acpi_pm.c](https://github.com/torvalds/linux/blob/master/drivers/clocksource_acpi_pm.c) source code file and starts from the call of the `init_acpi_pm_clocksource` function during `fs` [initcall](http://www.compsoc.man.ac.uk/~moz/kernelnewbies/documents/initcall/kernel.html). +The seconds clock source is [ACPI Power Management Timer](http://uefi.org/sites/default/files/resources/ACPI_5.pdf). Implementation of this clock source is located in the [drivers/clocksource/acpi_pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/clocksource_acpi_pm.c) source code file and starts from the call of the `init_acpi_pm_clocksource` function during `fs` [initcall](http://www.compsoc.man.ac.uk/~moz/kernelnewbies/documents/initcall/kernel.html). If we will look at implementation of the `init_acpi_pm_clocksource` function, we will see that it starts from the check of the value of `pmtmr_ioport` variable: @@ -225,7 +225,7 @@ static int __init init_acpi_pm_clocksource(void) ... ``` -This `pmtmr_ioport` variable contains extended address of the `Power Management Timer Control Register Block`. It gets its value in the `acpi_parse_fadt` function which is defined in the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/acpi/boot.c) source code file. This function parses `FADT` or `Fixed ACPI Description Table` [ACPI](https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface) table and tries to get the values of the `X_PM_TMR_BLK` field which contains extended address of the `Power Management Timer Control Register Block`, represented in `Generic Address Structure` format: +This `pmtmr_ioport` variable contains extended address of the `Power Management Timer Control Register Block`. It gets its value in the `acpi_parse_fadt` function which is defined in the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/acpi/boot.c) source code file. This function parses `FADT` or `Fixed ACPI Description Table` [ACPI](https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface) table and tries to get the values of the `X_PM_TMR_BLK` field which contains extended address of the `Power Management Timer Control Register Block`, represented in `Generic Address Structure` format: ```C static int __init acpi_parse_fadt(struct acpi_table_header *table) @@ -298,7 +298,7 @@ That's all. Now we move to the last clock source in this part - `Time Stamp Coun Time Stamp Counter -------------------------------------------------------------------------------- -The third and last clock source in this part is - [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) clock source and its implementation is located in the [arch/x86/kernel/tsc.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/tsc.c) source code file. We already saw the `x86_late_time_init` function in this part and initialization of the [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) starts from this place. This function calls the `tsc_init()` function from the [arch/x86/kernel/tsc.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/tsc.c) source code file. +The third and last clock source in this part is - [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) clock source and its implementation is located in the [arch/x86/kernel/tsc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/tsc.c) source code file. We already saw the `x86_late_time_init` function in this part and initialization of the [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) starts from this place. This function calls the `tsc_init()` function from the [arch/x86/kernel/tsc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/tsc.c) source code file. At the beginning of the `tsc_init` function we can see check, which checks that a processor has support of the `Time Stamp Counter`: diff --git a/Timers/timers-7.md b/Timers/timers-7.md index 95b8549..137ab09 100644 --- a/Timers/timers-7.md +++ b/Timers/timers-7.md @@ -70,7 +70,7 @@ return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) ?: (void*) (&__gettimeofday_syscall)); ``` -The `gettimeofday` entry is located in the [arch/x86/entry/vdso/vclock_gettime.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vclock_gettime.c) source code file. As we can see the `gettimeofday` is a weak alias of the `__vdso_gettimeofday`: +The `gettimeofday` entry is located in the [arch/x86/entry/vdso/vclock_gettime.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vclock_gettime.c) source code file. As we can see the `gettimeofday` is a weak alias of the `__vdso_gettimeofday`: ```C int gettimeofday(struct timeval *, struct timezone *) @@ -109,7 +109,7 @@ notrace static long vdso_fallback_gtod(struct timeval *tv, struct timezone *tz) } ``` -The `do_realtime` function gets the time data from the `vsyscall_gtod_data` structure which is defined in the [arch/x86/include/asm/vgtod.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/vgtod.h#L16) header file and contains mapping of the `timespec` structure and a couple of fields which are related to the current clock source in the system. This function fills the given `timeval` structure with values from the `vsyscall_gtod_data` which contains a time related data which is updated via timer interrupt. +The `do_realtime` function gets the time data from the `vsyscall_gtod_data` structure which is defined in the [arch/x86/include/asm/vgtod.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/vgtod.h#L16) header file and contains mapping of the `timespec` structure and a couple of fields which are related to the current clock source in the system. This function fills the given `timeval` structure with values from the `vsyscall_gtod_data` which contains a time related data which is updated via timer interrupt. First of all we try to access the `gtod` or `global time of day` the `vsyscall_gtod_data` structure via the call of the `gtod_read_begin` and will continue to do it until it will be successful: @@ -195,7 +195,7 @@ The `clock_id` maybe one of the following: * `CLOCK_PROCESS_CPUTIME_ID` - per-process time consumed by all threads in the process; * `CLOCK_THREAD_CPUTIME_ID` - thread-specific clock. -The `clock_gettime` is not usual syscall too, but as the `gettimeofday`, this system call is placed in the `vDSO` area. Entry of this system call is located in the same source code file - [arch/x86/entry/vdso/vclock_gettime.c](https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vclock_gettime.c)) as for `gettimeofday`. +The `clock_gettime` is not usual syscall too, but as the `gettimeofday`, this system call is placed in the `vDSO` area. Entry of this system call is located in the same source code file - [arch/x86/entry/vdso/vclock_gettime.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vclock_gettime.c)) as for `gettimeofday`. The Implementation of the `clock_gettime` depends on the clock id. If we have passed the `CLOCK_REALTIME` clock id, the `do_realtime` function will be called: @@ -312,7 +312,7 @@ To call system call, we need put the `req` to the `rdi` register, and the `rem` INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args) ``` -which takes the name of the system call, storage for possible error during execution of system call, number of the system call (all `x86_64` system calls you can find in the [system calls table](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl)) and arguments of certain system call. The `INTERNAL_SYSCALL` macro just expands to the call of the `INTERNAL_SYSCALL_NCS` macro, which prepares arguments of system call (puts them into the processor registers in correct order), executes `syscall` instruction and returns the result: +which takes the name of the system call, storage for possible error during execution of system call, number of the system call (all `x86_64` system calls you can find in the [system calls table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl)) and arguments of certain system call. The `INTERNAL_SYSCALL` macro just expands to the call of the `INTERNAL_SYSCALL_NCS` macro, which prepares arguments of system call (puts them into the processor registers in correct order), executes `syscall` instruction and returns the result: ```C # define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ @@ -342,7 +342,7 @@ The `LOAD_ARGS_##nr` macro calls the `LOAD_ARGS_N` macro where the `N` is number ... ``` -After the `syscall` instruction will be executed, the [context switch](https://en.wikipedia.org/wiki/Context_switch) will occur and the kernel will transfer execution to the system call handler. The system call handler for the `nanosleep` system call is located in the [kernel/time/hrtimer.c](https://github.com/torvalds/linux/blob/master/kernel/time/hrtimer.c) source code file and defined with the `SYSCALL_DEFINE2` macro helper: +After the `syscall` instruction will be executed, the [context switch](https://en.wikipedia.org/wiki/Context_switch) will occur and the kernel will transfer execution to the system call handler. The system call handler for the `nanosleep` system call is located in the [kernel/time/hrtimer.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/time/hrtimer.c) source code file and defined with the `SYSCALL_DEFINE2` macro helper: ```C SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp, @@ -418,7 +418,7 @@ Links * [context switch](https://en.wikipedia.org/wiki/Context_switch) * [Introduction to timers in the Linux kernel](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-4.html) * [uptime](https://en.wikipedia.org/wiki/Uptime#Using_uptime) -* [system calls table for x86_64](https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl) +* [system calls table for x86_64](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl) * [High Precision Event Timer](https://en.wikipedia.org/wiki/High_Precision_Event_Timer) * [Time Stamp Counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) * [x86_64](https://en.wikipedia.org/wiki/X86-64) diff --git a/interrupts/interrupts-1.md b/interrupts/interrupts-1.md index 7bd3468..da96185 100644 --- a/interrupts/interrupts-1.md +++ b/interrupts/interrupts-1.md @@ -37,7 +37,7 @@ Addresses of each of the interrupt handlers are maintained in a special location BUG_ON((unsigned)n > 0xFF); ``` -You can find this check within the Linux kernel source code related to interrupt setup (eg. The `set_intr_gate`, `void set_system_intr_gate` in [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h)). The first 32 vector numbers from `0` to `31` are reserved by the processor and used for the processing of architecture-defined exceptions and interrupts. You can find the table with the description of these vector numbers in the second part of the Linux kernel initialization process - [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html). Vector numbers from `32` to `255` are designated as user-defined interrupts and are not reserved by the processor. These interrupts are generally assigned to external I/O devices to enable those devices to send interrupts to the processor. +You can find this check within the Linux kernel source code related to interrupt setup (eg. The `set_intr_gate`, `void set_system_intr_gate` in [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h)). The first 32 vector numbers from `0` to `31` are reserved by the processor and used for the processing of architecture-defined exceptions and interrupts. You can find the table with the description of these vector numbers in the second part of the Linux kernel initialization process - [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html). Vector numbers from `32` to `255` are designated as user-defined interrupts and are not reserved by the processor. These interrupts are generally assigned to external I/O devices to enable those devices to send interrupts to the processor. Now let's talk about the types of interrupts. Broadly speaking, we can split interrupts into 2 major classes: @@ -154,7 +154,7 @@ static void setup_idt(void) } ``` -from the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pm.c). The `Interrupt Descriptor table` can be located anywhere in the linear address space and the base address of it must be aligned on an 8-byte boundary on `x86` or 16-byte boundary on `x86_64`. The base address of the `IDT` is stored in the special register - `IDTR`. There are two instructions on `x86`-compatible processors to modify the `IDTR` register: +from the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c). The `Interrupt Descriptor table` can be located anywhere in the linear address space and the base address of it must be aligned on an 8-byte boundary on `x86` or 16-byte boundary on `x86_64`. The base address of the `IDT` is stored in the special register - `IDTR`. There are two instructions on `x86`-compatible processors to modify the `IDTR` register: * `LIDT` * `SIDT` @@ -343,14 +343,14 @@ We can see its definition in the code: DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union) __visible; ``` -Now, it's time to look at the initialization of the `irq_stack_union`. Besides the `irq_stack_union` definition, we can see the definition of the following per-cpu variables in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/processor.h): +Now, it's time to look at the initialization of the `irq_stack_union`. Besides the `irq_stack_union` definition, we can see the definition of the following per-cpu variables in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/processor.h): ```C DECLARE_PER_CPU(char *, irq_stack_ptr); DECLARE_PER_CPU(unsigned int, irq_count); ``` -The first is the `irq_stack_ptr`. From the variable's name, it is obvious that this is a pointer to the top of the stack. The second - `irq_count` is used to check if a CPU is already on an interrupt stack or not. Initialization of the `irq_stack_ptr` is located in the `setup_per_cpu_areas` function in [arch/x86/kernel/setup_percpu.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup_percpu.c): +The first is the `irq_stack_ptr`. From the variable's name, it is obvious that this is a pointer to the top of the stack. The second - `irq_count` is used to check if a CPU is already on an interrupt stack or not. Initialization of the `irq_stack_ptr` is located in the `setup_per_cpu_areas` function in [arch/x86/kernel/setup_percpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup_percpu.c): ```C void __init setup_per_cpu_areas(void) @@ -374,7 +374,7 @@ for_each_possible_cpu(cpu) { } ``` -Here we go over all the CPUs one-by-one and setup `irq_stack_ptr`. This turns out to be equal to the top of the interrupt stack minus `64`. Why `64`?TODO [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c) source code file is following: +Here we go over all the CPUs one-by-one and setup `irq_stack_ptr`. This turns out to be equal to the top of the interrupt stack minus `64`. Why `64`?TODO [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c) source code file is following: ```C void load_percpu_segment(int cpu) @@ -434,7 +434,7 @@ asmlinkage void nmi(void); asmlinkage void double_fault(void); ``` -defined in the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/entry_64.S) +defined in the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) ```assembly idtentry double_fault do_double_fault has_error_code=1 paranoid=2 diff --git a/interrupts/interrupts-10.md b/interrupts/interrupts-10.md index 0405843..af9ad51 100644 --- a/interrupts/interrupts-10.md +++ b/interrupts/interrupts-10.md @@ -7,7 +7,7 @@ Last part This is the tenth part of the [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) about interrupts and interrupt handling in the Linux kernel and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) we saw a little about deferred interrupts and related concepts like `softirq`, `tasklet` and `workqeue`. In this part we will continue to dive into this theme and now it's time to look at real hardware driver. Let's consider serial driver of the [StrongARM** SA-110/21285 Evaluation Board](http://netwinder.osuosl.org/pub/netwinder/docs/intel/datashts/27813501.pdf) board for example and will look how this driver requests an [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29) line, -what happens when an interrupt is triggered and etc. The source code of this driver is placed in the [drivers/tty/serial/21285.c](https://github.com/torvalds/linux/blob/master/drivers/tty/serial/21285.c) source code file. Ok, we have source code, let's start. +what happens when an interrupt is triggered and etc. The source code of this driver is placed in the [drivers/tty/serial/21285.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/tty/serial/21285.c) source code file. Ok, we have source code, let's start. Initialization of a kernel module -------------------------------------------------------------------------------- @@ -24,7 +24,7 @@ module_init(serial21285_init); module_exit(serial21285_exit); ``` -The most part of device drivers can be compiled as a loadable kernel [module](https://en.wikipedia.org/wiki/Loadable_kernel_module) or in another way they can be statically linked into the Linux kernel. In the first case initialization of a device driver will be produced via the `module_init` and `module_exit` macros that are defined in the [include/linux/init.h](https://github.com/torvalds/linux/blob/master/include/linux/init.h): +The most part of device drivers can be compiled as a loadable kernel [module](https://en.wikipedia.org/wiki/Loadable_kernel_module) or in another way they can be statically linked into the Linux kernel. In the first case initialization of a device driver will be produced via the `module_init` and `module_exit` macros that are defined in the [include/linux/init.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/init.h): ```C #define module_init(initfn) \ @@ -51,14 +51,14 @@ and will be called by the [initcall](http://kernelnewbies.org/Documents/Initcall * `device_initcall` * `late_initcall` -that are called in the `do_initcalls` from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). Otherwise, if a device driver is statically linked into the Linux kernel, implementation of these macros will be following: +that are called in the `do_initcalls` from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). Otherwise, if a device driver is statically linked into the Linux kernel, implementation of these macros will be following: ```C #define module_init(x) __initcall(x); #define module_exit(x) __exitcall(x); ``` -In this way implementation of module loading placed in the [kernel/module.c](https://github.com/torvalds/linux/blob/master/kernel/module.c) source code file and initialization occurs in the `do_init_module` function. We will not dive into details about loadable modules in this chapter, but will see it in the special chapter that will describe Linux kernel modules. Ok, the `module_init` macro takes one parameter - the `serial21285_init` in our case. As we can understand from function's name, this function does stuff related to the driver initialization. Let's look at it: +In this way implementation of module loading placed in the [kernel/module.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/module.c) source code file and initialization occurs in the `do_init_module` function. We will not dive into details about loadable modules in this chapter, but will see it in the special chapter that will describe Linux kernel modules. Ok, the `module_init` macro takes one parameter - the `serial21285_init` in our case. As we can understand from function's name, this function does stuff related to the driver initialization. Let's look at it: ```C static int __init serial21285_init(void) @@ -102,7 +102,7 @@ static struct uart_driver serial21285_reg = { }; ``` -If the driver registered successfully we attach the driver-defined port `serial21285_port` structure with the `uart_add_one_port` function from the [drivers/tty/serial/serial_core.c](https://github.com/torvalds/linux/blob/master/drivers/tty/serial/serial_core.c) source code file and return from the `serial21285_init` function: +If the driver registered successfully we attach the driver-defined port `serial21285_port` structure with the `uart_add_one_port` function from the [drivers/tty/serial/serial_core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/tty/serial/serial_core.c) source code file and return from the `serial21285_init` function: ```C if (ret == 0) @@ -111,7 +111,7 @@ if (ret == 0) return ret; ``` -That's all. Our driver is initialized. When an `uart` port will be opened with the call of the `uart_open` function from the [drivers/tty/serial/serial_core.c](https://github.com/torvalds/linux/blob/master/drivers/tty/serial/serial_core.c), it will call the `uart_startup` function to start up the serial port. This function will call the `startup` function that is part of the `uart_ops` structure. Each `uart` driver has the definition of this structure, in our case it is: +That's all. Our driver is initialized. When an `uart` port will be opened with the call of the `uart_open` function from the [drivers/tty/serial/serial_core.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/tty/serial/serial_core.c), it will call the `uart_startup` function to start up the serial port. This function will call the `startup` function that is part of the `uart_ops` structure. Each `uart` driver has the definition of this structure, in our case it is: ```C static struct uart_ops serial21285_ops = { @@ -149,7 +149,7 @@ static int serial21285_startup(struct uart_port *port) } ``` -First of all about `TX` and `RX`. A serial bus of a device consists of just two wires: one for sending data and another for receiving. As such, serial devices should have two serial pins: the receiver - `RX`, and the transmitter - `TX`. With the call of first two macros: `tx_enabled` and `rx_enabled`, we enable these wires. The following part of these function is the greatest interest for us. Note on `request_irq` functions. This function registers an interrupt handler and enables a given interrupt line. Let's look at the implementation of this function and get into the details. This function defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/master/include/linux/interrupt.h) header file and looks as: +First of all about `TX` and `RX`. A serial bus of a device consists of just two wires: one for sending data and another for receiving. As such, serial devices should have two serial pins: the receiver - `RX`, and the transmitter - `TX`. With the call of first two macros: `tx_enabled` and `rx_enabled`, we enable these wires. The following part of these function is the greatest interest for us. Note on `request_irq` functions. This function registers an interrupt handler and enables a given interrupt line. Let's look at the implementation of this function and get into the details. This function defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/interrupt.h) header file and looks as: ```C static inline int __must_check @@ -168,7 +168,7 @@ As we can see, the `request_irq` function takes five parameters: * `name` - the name of the owner of an interrupt; * `dev` - the pointer used for shared interrupt lines; -Now let's look at the calls of the `request_irq` functions in our example. As we can see the first parameter is `IRQ_CONRX`. We know that it is number of the interrupt, but what is it `CONRX`? This macro defined in the [arch/arm/mach-footbridge/include/mach/irqs.h](https://github.com/torvalds/linux/blob/master/arch/arm/mach-footbridge/include/mach/irqs.h) header file. We can find the full list of interrupts that the `21285` board can generate. Note that in the second call of the `request_irq` function we pass the `IRQ_CONTX` interrupt number. Both these interrupts will handle `RX` and `TX` event in our driver. Implementation of these macros is easy: +Now let's look at the calls of the `request_irq` functions in our example. As we can see the first parameter is `IRQ_CONRX`. We know that it is number of the interrupt, but what is it `CONRX`? This macro defined in the [arch/arm/mach-footbridge/include/mach/irqs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/arm/mach-footbridge/include/mach/irqs.h) header file. We can find the full list of interrupts that the `21285` board can generate. Note that in the second call of the `request_irq` function we pass the `IRQ_CONTX` interrupt number. Both these interrupts will handle `RX` and `TX` event in our driver. Implementation of these macros is easy: ```C #define IRQ_CONRX _DC21285_IRQ(0) @@ -179,7 +179,7 @@ Now let's look at the calls of the `request_irq` functions in our example. As we #define _DC21285_IRQ(x) (16 + (x)) ``` -The [ISA](https://en.wikipedia.org/wiki/Industry_Standard_Architecture) IRQs on this board are from `0` to `15`, so, our interrupts will have first two numbers: `16` and `17`. Second parameters for two calls of the `request_irq` functions are `serial21285_rx_chars` and `serial21285_tx_chars`. These functions will be called when an `RX` or `TX` interrupt occurred. We will not dive in this part into details of these functions, because this chapter covers the interrupts and interrupts handling but not device and drivers. The next parameter - `flags` and as we can see, it is zero in both calls of the `request_irq` function. All acceptable flags are defined as `IRQF_*` macros in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/master/include/linux/interrupt.h). Some of it: +The [ISA](https://en.wikipedia.org/wiki/Industry_Standard_Architecture) IRQs on this board are from `0` to `15`, so, our interrupts will have first two numbers: `16` and `17`. Second parameters for two calls of the `request_irq` functions are `serial21285_rx_chars` and `serial21285_tx_chars`. These functions will be called when an `RX` or `TX` interrupt occurred. We will not dive in this part into details of these functions, because this chapter covers the interrupts and interrupts handling but not device and drivers. The next parameter - `flags` and as we can see, it is zero in both calls of the `request_irq` function. All acceptable flags are defined as `IRQF_*` macros in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/interrupt.h). Some of it: * `IRQF_SHARED` - allows sharing the irq among several devices; * `IRQF_PERCPU` - an interrupt is per cpu; @@ -194,7 +194,7 @@ In our case we pass `0`, so it will be `IRQF_TRIGGER_NONE`. This flag means that static const char serial21285_name[] = "Footbridge UART"; ``` -and will be displayed in the output of the `/proc/interrupts`. And in the last parameter we pass the pointer to the our main `uart_port` structure. Now we know a little about `request_irq` function and its parameters, let's look at its implemenetation. As we can see above, the `request_irq` function just makes a call of the `request_threaded_irq` function inside. The `request_threaded_irq` function defined in the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/master/kernel/irq/manage.c) source code file and allocates a given interrupt line. If we will look at this function, it starts from the definition of the `irqaction` and the `irq_desc`: +and will be displayed in the output of the `/proc/interrupts`. And in the last parameter we pass the pointer to the our main `uart_port` structure. Now we know a little about `request_irq` function and its parameters, let's look at its implemenetation. As we can see above, the `request_irq` function just makes a call of the `request_threaded_irq` function inside. The `request_threaded_irq` function defined in the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/manage.c) source code file and allocates a given interrupt line. If we will look at this function, it starts from the definition of the `irqaction` and the `irq_desc`: ```C int request_threaded_irq(unsigned int irq, irq_handler_t handler, @@ -219,7 +219,7 @@ if (((irqflags & IRQF_SHARED) && !dev_id) || return -EINVAL; ``` -First of all we check that real `dev_id` is passed for the shared interrupt and the `IRQF_COND_SUSPEND` only makes sense for shared interrupts. Otherwise we exit from this function with the `-EINVAL` error. After this we convert the given `irq` number to the `irq` descriptor wit the help of the `irq_to_desc` function that defined in the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/master/kernel/irq/irqdesc.c) source code file and exit from this function with the `-EINVAL` error if it was not successful: +First of all we check that real `dev_id` is passed for the shared interrupt and the `IRQF_COND_SUSPEND` only makes sense for shared interrupts. Otherwise we exit from this function with the `-EINVAL` error. After this we convert the given `irq` number to the `irq` descriptor wit the help of the `irq_to_desc` function that defined in the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/irqdesc.c) source code file and exit from this function with the `-EINVAL` error if it was not successful: ```C desc = irq_to_desc(irq); @@ -271,7 +271,7 @@ action->name = devname; action->dev_id = dev_id; ``` -In the end of the `request_threaded_irq` function we call the `__setup_irq` function from the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/master/kernel/irq/manage.c) and registers a given `irqaction`. Release memory for the `irqaction` and return: +In the end of the `request_threaded_irq` function we call the `__setup_irq` function from the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/manage.c) and registers a given `irqaction`. Release memory for the `irqaction` and return: ```C chip_bus_lock(desc); @@ -316,7 +316,7 @@ Here we iterate over all the cleared bit of the `used_vectors` bitmap starting a int first_system_vector = FIRST_SYSTEM_VECTOR; // 0xef ``` -and set interrupt gates with the `i` vector number and the `irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR)` start address. Only one things is unclear here - the `irq_entries_start`. This symbol defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry_entry_64.S) assembly file and provides `irq` entries. Let's look at it: +and set interrupt gates with the `i` vector number and the `irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR)` start address. Only one things is unclear here - the `irq_entries_start`. This symbol defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry_entry_64.S) assembly file and provides `irq` entries. Let's look at it: ```assembly .align 8 @@ -346,7 +346,7 @@ common_interrupt: interrupt do_IRQ ``` -The macro `interrupt` defined in the same source code file and saves [general purpose](https://en.wikipedia.org/wiki/Processor_register) registers on the stack, change the userspace `gs` on the kernel with the `SWAPGS` assembler instruction if need, increase [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) - `irq_count` variable that shows that we are in interrupt and call the `do_IRQ` function. This function defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irq.c) source code file and handles our device interrupt. Let's look at this function. The `do_IRQ` function takes one parameter - `pt_regs` structure that stores values of the userspace registers: +The macro `interrupt` defined in the same source code file and saves [general purpose](https://en.wikipedia.org/wiki/Processor_register) registers on the stack, change the userspace `gs` on the kernel with the `SWAPGS` assembler instruction if need, increase [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) - `irq_count` variable that shows that we are in interrupt and call the `do_IRQ` function. This function defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irq.c) source code file and handles our device interrupt. Let's look at this function. The `do_IRQ` function takes one parameter - `pt_regs` structure that stores values of the userspace registers: ```C __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) @@ -413,7 +413,7 @@ We already know that when an `IRQ` finishes its work, deferred interrupts will b Exit from interrupt -------------------------------------------------------------------------------- -Ok, the interrupt handler finished its execution and now we must return from the interrupt. When the work of the `do_IRQ` function will be finsihed, we will return back to the assembler code in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry_entry_64.S) to the `ret_from_intr` label. First of all we disable interrupts with the `DISABLE_INTERRUPTS` macro that expands to the `cli` instruction and decreases value of the `irq_count` [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable. Remember, this variable had value - `1`, when we were in interrupt context: +Ok, the interrupt handler finished its execution and now we must return from the interrupt. When the work of the `do_IRQ` function will be finsihed, we will return back to the assembler code in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry_entry_64.S) to the `ret_from_intr` label. First of all we disable interrupts with the `DISABLE_INTERRUPTS` macro that expands to the `cli` instruction and decreases value of the `irq_count` [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable. Remember, this variable had value - `1`, when we were in interrupt context: ```assembly DISABLE_INTERRUPTS(CLBR_NONE) diff --git a/interrupts/interrupts-2.md b/interrupts/interrupts-2.md index 430b104..9adf21a 100644 --- a/interrupts/interrupts-2.md +++ b/interrupts/interrupts-2.md @@ -4,9 +4,9 @@ Interrupts and Interrupt Handling. Part 2. Start to dive into interrupt and exceptions handling in the Linux kernel -------------------------------------------------------------------------------- -We saw some theory about interrupts and exception handling in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html) and as I already wrote in that part, we will start to dive into interrupts and exceptions in the Linux kernel source code in this part. As you already can note, the previous part mostly described theoretical aspects and in this part we will start to dive directly into the Linux kernel source code. We will start to do it as we did it in other chapters, from the very early places. We will not see the Linux kernel source code from the earliest [code lines](https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L292) as we saw it for example in the [Linux kernel booting process](http://0xax.gitbooks.io/linux-insides/content/Booting/index.html) chapter, but we will start from the earliest code which is related to the interrupts and exceptions. In this part we will try to go through the all interrupts and exceptions related stuff which we can find in the Linux kernel source code. +We saw some theory about interrupts and exception handling in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html) and as I already wrote in that part, we will start to dive into interrupts and exceptions in the Linux kernel source code in this part. As you already can note, the previous part mostly described theoretical aspects and in this part we will start to dive directly into the Linux kernel source code. We will start to do it as we did it in other chapters, from the very early places. We will not see the Linux kernel source code from the earliest [code lines](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L292) as we saw it for example in the [Linux kernel booting process](http://0xax.gitbooks.io/linux-insides/content/Booting/index.html) chapter, but we will start from the earliest code which is related to the interrupts and exceptions. In this part we will try to go through the all interrupts and exceptions related stuff which we can find in the Linux kernel source code. -If you've read the previous parts, you can remember that the earliest place in the Linux kernel `x86_64` architecture-specific source code which is related to the interrupt is located in the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pm.c) source code file and represents the first setup of the [Interrupt Descriptor Table](http://en.wikipedia.org/wiki/Interrupt_descriptor_table). It occurs right before the transition into the [protected mode](http://en.wikipedia.org/wiki/Protected_mode) in the `go_to_protected_mode` function by the call of the `setup_idt`: +If you've read the previous parts, you can remember that the earliest place in the Linux kernel `x86_64` architecture-specific source code which is related to the interrupt is located in the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c) source code file and represents the first setup of the [Interrupt Descriptor Table](http://en.wikipedia.org/wiki/Interrupt_descriptor_table). It occurs right before the transition into the [protected mode](http://en.wikipedia.org/wiki/Protected_mode) in the `go_to_protected_mode` function by the call of the `setup_idt`: ```C void go_to_protected_mode(void) @@ -38,16 +38,16 @@ struct gdt_ptr { Of course in our case the `gdt_ptr` does not represent the `GDTR` register, but `IDTR` since we set `Interrupt Descriptor Table`. You will not find an `idt_ptr` structure, because if it had been in the Linux kernel source code, it would have been the same as `gdt_ptr` but with different name. So, as you can understand there is no sense to have two similar structures which differ only by name. You can note here, that we do not fill the `Interrupt Descriptor Table` with entries, because it is too early to handle any interrupts or exceptions at this point. That's why we just fill the `IDT` with `NULL`. -After the setup of the [Interrupt descriptor table](http://en.wikipedia.org/wiki/Interrupt_descriptor_table), [Global Descriptor Table](http://en.wikipedia.org/wiki/GDT) and other stuff we jump into [protected mode](http://en.wikipedia.org/wiki/Protected_mode) in the - [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pmjump.S). You can read more about it in the [part](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-3.html) which describes the transition to protected mode. +After the setup of the [Interrupt descriptor table](http://en.wikipedia.org/wiki/Interrupt_descriptor_table), [Global Descriptor Table](http://en.wikipedia.org/wiki/GDT) and other stuff we jump into [protected mode](http://en.wikipedia.org/wiki/Protected_mode) in the - [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S). You can read more about it in the [part](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-3.html) which describes the transition to protected mode. -We already know from the earliest parts that entry to protected mode is located in the `boot_params.hdr.code32_start` and you can see that we pass the entry of the protected mode and `boot_params` to the `protected_mode_jump` in the end of the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pm.c): +We already know from the earliest parts that entry to protected mode is located in the `boot_params.hdr.code32_start` and you can see that we pass the entry of the protected mode and `boot_params` to the `protected_mode_jump` in the end of the [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c): ```C protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4)); ``` -The `protected_mode_jump` is defined in the [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/pmjump.S) and gets these two parameters in the `ax` and `dx` registers using one of the [8086](http://en.wikipedia.org/wiki/Intel_8086) calling [conventions](http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions): +The `protected_mode_jump` is defined in the [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S) and gets these two parameters in the `ax` and `dx` registers using one of the [8086](http://en.wikipedia.org/wiki/Intel_8086) calling [conventions](http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions): ```assembly GLOBAL(protected_mode_jump) @@ -75,12 +75,12 @@ GLOBAL(in_pm32) ENDPROC(in_pm32) ``` -As you can remember the 32-bit entry point is in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) assembly file, although it contains `_64` in its name. We can see the two similar files in the `arch/x86/boot/compressed` directory: +As you can remember the 32-bit entry point is in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly file, although it contains `_64` in its name. We can see the two similar files in the `arch/x86/boot/compressed` directory: * `arch/x86/boot/compressed/head_32.S`. * `arch/x86/boot/compressed/head_64.S`; -But the 32-bit mode entry point is the second file in our case. The first file is not even compiled for `x86_64`. Let's look at the [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/Makefile): +But the 32-bit mode entry point is the second file in our case. The first file is not even compiled for `x86_64`. Let's look at the [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile): ``` vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ @@ -88,7 +88,7 @@ vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ ... ``` -We can see here that `head_*` depends on the `$(BITS)` variable which depends on the architecture. You can find it in the [arch/x86/Makefile](https://github.com/torvalds/linux/blob/master/arch/x86/Makefile): +We can see here that `head_*` depends on the `$(BITS)` variable which depends on the architecture. You can find it in the [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile): ``` ifeq ($(CONFIG_X86_32),y) @@ -100,7 +100,7 @@ else endif ``` -Now as we jumped on the `startup_32` from the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) we will not find anything related to the interrupt handling here. The `startup_32` contains code that makes preparations before the transition into [long mode](http://en.wikipedia.org/wiki/Long_mode) and directly jumps in to it. The `long mode` entry is located in `startup_64` and it makes preparations before the [kernel decompression](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) that occurs in the `decompress_kernel` from the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c). After the kernel is decompressed, we jump on the `startup_64` from the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S). In the `startup_64` we start to build identity-mapped pages. After we have built identity-mapped pages, checked the [NX](http://en.wikipedia.org/wiki/NX_bit) bit, setup the `Extended Feature Enable Register` (see in links), and updated the early `Global Descriptor Table` with the `lgdt` instruction, we need to setup `gs` register with the following code: +Now as we jumped on the `startup_32` from the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) we will not find anything related to the interrupt handling here. The `startup_32` contains code that makes preparations before the transition into [long mode](http://en.wikipedia.org/wiki/Long_mode) and directly jumps in to it. The `long mode` entry is located in `startup_64` and it makes preparations before the [kernel decompression](http://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-5.html) that occurs in the `decompress_kernel` from the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c). After the kernel is decompressed, we jump on the `startup_64` from the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S). In the `startup_64` we start to build identity-mapped pages. After we have built identity-mapped pages, checked the [NX](http://en.wikipedia.org/wiki/NX_bit) bit, setup the `Extended Feature Enable Register` (see in links), and updated the early `Global Descriptor Table` with the `lgdt` instruction, we need to setup `gs` register with the following code: ```assembly movl $MSR_GS_BASE,%ecx @@ -109,7 +109,7 @@ movl initial_gs+4(%rip),%edx wrmsr ``` -We already saw this code in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html). First of all pay attention on the last `wrmsr` instruction. This instruction writes data from the `edx:eax` registers to the [model specific register](http://en.wikipedia.org/wiki/Model-specific_register) specified by the `ecx` register. We can see that `ecx` contains `$MSR_GS_BASE` which is declared in the [arch/x86/include/uapi/asm/msr-index.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/msr-index.h) and looks like: +We already saw this code in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html). First of all pay attention on the last `wrmsr` instruction. This instruction writes data from the `edx:eax` registers to the [model specific register](http://en.wikipedia.org/wiki/Model-specific_register) specified by the `ecx` register. We can see that `ecx` contains `$MSR_GS_BASE` which is declared in the [arch/x86/include/uapi/asm/msr-index.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/msr-index.h) and looks like: ```C #define MSR_GS_BASE 0xc0000101 @@ -122,14 +122,14 @@ GLOBAL(initial_gs) .quad INIT_PER_CPU_VAR(irq_stack_union) ``` -We pass `irq_stack_union` symbol to the `INIT_PER_CPU_VAR` macro which just concatenates the `init_per_cpu__` prefix with the given symbol. In our case we will get the `init_per_cpu__irq_stack_union` symbol. Let's look at the [linker](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/vmlinux.lds.S) script. There we can see following definition: +We pass `irq_stack_union` symbol to the `INIT_PER_CPU_VAR` macro which just concatenates the `init_per_cpu__` prefix with the given symbol. In our case we will get the `init_per_cpu__irq_stack_union` symbol. Let's look at the [linker](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/vmlinux.lds.S) script. There we can see following definition: ``` #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load INIT_PER_CPU(irq_stack_union); ``` -It tells us that the address of the `init_per_cpu__irq_stack_union` will be `irq_stack_union + __per_cpu_load`. Now we need to understand where `init_per_cpu__irq_stack_union` and `__per_cpu_load` are what they mean. The first `irq_stack_union` is defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/processor.h) with the `DECLARE_INIT_PER_CPU` macro which expands to call the `init_per_cpu_var` macro: +It tells us that the address of the `init_per_cpu__irq_stack_union` will be `irq_stack_union + __per_cpu_load`. Now we need to understand where `init_per_cpu__irq_stack_union` and `__per_cpu_load` are what they mean. The first `irq_stack_union` is defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/processor.h) with the `DECLARE_INIT_PER_CPU` macro which expands to call the `init_per_cpu_var` macro: ```C DECLARE_INIT_PER_CPU(irq_stack_union); @@ -140,7 +140,7 @@ DECLARE_INIT_PER_CPU(irq_stack_union); #define init_per_cpu_var(var) init_per_cpu__##var ``` -If we expand all macros we will get the same `init_per_cpu__irq_stack_union` as we got after expanding the `INIT_PER_CPU` macro, but you can note that it is not just a symbol, but a variable. Let's look at the `typeof(per_cpu_var(var))` expression. Our `var` is `irq_stack_union` and the `per_cpu_var` macro is defined in the [arch/x86/include/asm/percpu.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/percpu.h): +If we expand all macros we will get the same `init_per_cpu__irq_stack_union` as we got after expanding the `INIT_PER_CPU` macro, but you can note that it is not just a symbol, but a variable. Let's look at the `typeof(per_cpu_var(var))` expression. Our `var` is `irq_stack_union` and the `per_cpu_var` macro is defined in the [arch/x86/include/asm/percpu.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/percpu.h): ```C #define PER_CPU_VAR(var) %__percpu_seg:var @@ -154,7 +154,7 @@ where: endif ``` -So, we are accessing `gs:irq_stack_union` and getting its type which is `irq_union`. Ok, we defined the first variable and know its address, now let's look at the second `__per_cpu_load` symbol. There are a couple of `per-cpu` variables which are located after this symbol. The `__per_cpu_load` is defined in the [include/asm-generic/sections.h](https://github.com/torvalds/linux/blob/master/include/asm-generic-sections.h): +So, we are accessing `gs:irq_stack_union` and getting its type which is `irq_union`. Ok, we defined the first variable and know its address, now let's look at the second `__per_cpu_load` symbol. There are a couple of `per-cpu` variables which are located after this symbol. The `__per_cpu_load` is defined in the [include/asm-generic/sections.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic-sections.h): ```C extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; @@ -183,7 +183,7 @@ movl initial_gs+4(%rip),%edx wrmsr ``` -Here we specified a model specific register with `MSR_GS_BASE`, put the 64-bit address of the `initial_gs` to the `edx:eax` pair and execute the `wrmsr` instruction for filling the `gs` register with the base address of the `init_per_cpu__irq_stack_union` which will be at the bottom of the interrupt stack. After this we will jump to the C code on the `x86_64_start_kernel` from the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head64.c). In the `x86_64_start_kernel` function we do the last preparations before we jump into the generic and architecture-independent kernel code and one of these preparations is filling the early `Interrupt Descriptor Table` with the interrupts handlers entries or `early_idt_handlers`. You can remember it, if you have read the part about the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) and can remember following code: +Here we specified a model specific register with `MSR_GS_BASE`, put the 64-bit address of the `initial_gs` to the `edx:eax` pair and execute the `wrmsr` instruction for filling the `gs` register with the base address of the `init_per_cpu__irq_stack_union` which will be at the bottom of the interrupt stack. After this we will jump to the C code on the `x86_64_start_kernel` from the [arch/x86/kernel/head64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head64.c). In the `x86_64_start_kernel` function we do the last preparations before we jump into the generic and architecture-independent kernel code and one of these preparations is filling the early `Interrupt Descriptor Table` with the interrupts handlers entries or `early_idt_handlers`. You can remember it, if you have read the part about the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) and can remember following code: ```C for (i = 0; i < NUM_EXCEPTION_VECTORS; i++) @@ -214,7 +214,7 @@ where `NUM_EXCEPTION_VECTORS` and `EARLY_IDT_HANDLER_SIZE` are defined as: #define EARLY_IDT_HANDLER_SIZE 9 ``` -So, the `early_idt_handler_array` is an array of the interrupts handlers entry points and contains one entry point on every nine bytes. You can remember that previous `early_idt_handlers` was defined in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S). The `early_idt_handler_array` is defined in the same source code file too: +So, the `early_idt_handler_array` is an array of the interrupts handlers entry points and contains one entry point on every nine bytes. You can remember that previous `early_idt_handlers` was defined in the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S). The `early_idt_handler_array` is defined in the same source code file too: ```assembly ENTRY(early_idt_handler_array) @@ -229,9 +229,9 @@ It fills `early_idt_handler_arry` with the `.rept NUM_EXCEPTION_VECTORS` and con Setting stack canary for the interrupt stack ------------------------------------------------------------------------------- -The next stop after the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/head_64.S) is the biggest `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). If you've read the previous [chapter](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) about the Linux kernel initialization process, you must remember it. This function does all initialization stuff before kernel will launch first `init` process with the [pid](https://en.wikipedia.org/wiki/Process_identifier) - `1`. The first thing that is related to the interrupts and exceptions handling is the call of the `boot_init_stack_canary` function. +The next stop after the [arch/x86/kernel/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/head_64.S) is the biggest `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). If you've read the previous [chapter](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) about the Linux kernel initialization process, you must remember it. This function does all initialization stuff before kernel will launch first `init` process with the [pid](https://en.wikipedia.org/wiki/Process_identifier) - `1`. The first thing that is related to the interrupts and exceptions handling is the call of the `boot_init_stack_canary` function. -This function sets the [canary](http://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries) value to protect interrupt stack overflow. We already saw a little some details about implementation of the `boot_init_stack_canary` in the previous part and now let's take a closer look on it. You can find implementation of this function in the [arch/x86/include/asm/stackprotector.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/stackprotector.h) and its depends on the `CONFIG_CC_STACKPROTECTOR` kernel configuration option. If this option is not set this function will not do anything: +This function sets the [canary](http://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries) value to protect interrupt stack overflow. We already saw a little some details about implementation of the `boot_init_stack_canary` in the previous part and now let's take a closer look on it. You can find implementation of this function in the [arch/x86/include/asm/stackprotector.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/stackprotector.h) and its depends on the `CONFIG_CC_STACKPROTECTOR` kernel configuration option. If this option is not set this function will not do anything: ```C #ifdef CONFIG_CC_STACKPROTECTOR @@ -266,7 +266,7 @@ union irq_stack_union { }; ``` -which defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/processor.h). We know that [union](http://en.wikipedia.org/wiki/Union_type) in the [C](http://en.wikipedia.org/wiki/C_%28programming_language%29) programming language is a data structure which stores only one field in a memory. We can see here that structure has first field - `gs_base` which is 40 bytes size and represents bottom of the `irq_stack`. So, after this our check with the `BUILD_BUG_ON` macro should end successfully. (you can read the first part about Linux kernel initialization [process](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html) if you're interesting about the `BUILD_BUG_ON` macro). +which defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/processor.h). We know that [union](http://en.wikipedia.org/wiki/Union_type) in the [C](http://en.wikipedia.org/wiki/C_%28programming_language%29) programming language is a data structure which stores only one field in a memory. We can see here that structure has first field - `gs_base` which is 40 bytes size and represents bottom of the `irq_stack`. So, after this our check with the `BUILD_BUG_ON` macro should end successfully. (you can read the first part about Linux kernel initialization [process](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html) if you're interesting about the `BUILD_BUG_ON` macro). After this we calculate new `canary` value based on the random number and [Time Stamp Counter](http://en.wikipedia.org/wiki/Time_Stamp_Counter): @@ -282,14 +282,14 @@ and write `canary` value to the `irq_stack_union` with the `this_cpu_write` macr this_cpu_write(irq_stack_union.stack_canary, canary); ``` -more about `this_cpu_*` operation you can read in the [Linux kernel documentation](https://github.com/torvalds/linux/blob/master/Documentation/this_cpu_ops.txt). +more about `this_cpu_*` operation you can read in the [Linux kernel documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/this_cpu_ops.txt). Disabling/Enabling local interrupts -------------------------------------------------------------------------------- -The next step in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) which is related to the interrupts and interrupts handling after we have set the `canary` value to the interrupt stack - is the call of the `local_irq_disable` macro. +The next step in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) which is related to the interrupts and interrupts handling after we have set the `canary` value to the interrupt stack - is the call of the `local_irq_disable` macro. -This macro defined in the [include/linux/irqflags.h](https://github.com/torvalds/linux/blob/master/include/linux/irqflags.h) header file and as you can understand, we can disable interrupts for the CPU with the call of this macro. Let's look on its implementation. First of all note that it depends on the `CONFIG_TRACE_IRQFLAGS_SUPPORT` kernel configuration option: +This macro defined in the [include/linux/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irqflags.h) header file and as you can understand, we can disable interrupts for the CPU with the call of this macro. Let's look on its implementation. First of all note that it depends on the `CONFIG_TRACE_IRQFLAGS_SUPPORT` kernel configuration option: ```C #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT @@ -304,7 +304,7 @@ This macro defined in the [include/linux/irqflags.h](https://github.com/torvalds #endif ``` -They are both similar and as you can see have only one difference: the `local_irq_disable` macro contains call of the `trace_hardirqs_off` when `CONFIG_TRACE_IRQFLAGS_SUPPORT` is enabled. There is special feature in the [lockdep](http://lwn.net/Articles/321663/) subsystem - `irq-flags tracing` for tracing `hardirq` and `softirq` state. In our case `lockdep` subsystem can give us interesting information about hard/soft irqs on/off events which are occurs in the system. The `trace_hardirqs_off` function defined in the [kernel/locking/lockdep.c](https://github.com/torvalds/linux/blob/master/kernel/locking/lockdep.c): +They are both similar and as you can see have only one difference: the `local_irq_disable` macro contains call of the `trace_hardirqs_off` when `CONFIG_TRACE_IRQFLAGS_SUPPORT` is enabled. There is special feature in the [lockdep](http://lwn.net/Articles/321663/) subsystem - `irq-flags tracing` for tracing `hardirq` and `softirq` state. In our case `lockdep` subsystem can give us interesting information about hard/soft irqs on/off events which are occurs in the system. The `trace_hardirqs_off` function defined in the [kernel/locking/lockdep.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/lockdep.c): ```C void trace_hardirqs_off(void) @@ -314,7 +314,7 @@ void trace_hardirqs_off(void) EXPORT_SYMBOL(trace_hardirqs_off); ``` -and just calls `trace_hardirqs_off_caller` function. The `trace_hardirqs_off_caller` checks the `hardirqs_enabled` field of the current process and increases the `redundant_hardirqs_off` if call of the `local_irq_disable` was redundant or the `hardirqs_off_events` if it was not. These two fields and other `lockdep` statistic related fields are defined in the [kernel/locking/lockdep_insides.h](https://github.com/torvalds/linux/blob/master/kernel/locking/lockdep_insides.h) and located in the `lockdep_stats` structure: +and just calls `trace_hardirqs_off_caller` function. The `trace_hardirqs_off_caller` checks the `hardirqs_enabled` field of the current process and increases the `redundant_hardirqs_off` if call of the `local_irq_disable` was redundant or the `hardirqs_off_events` if it was not. These two fields and other `lockdep` statistic related fields are defined in the [kernel/locking/lockdep_insides.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/locking/lockdep_insides.h) and located in the `lockdep_stats` structure: ```C struct lockdep_stats { @@ -362,7 +362,7 @@ $ sudo cat /proc/lockdep redundant softirq offs: 0 ``` -Ok, now we know a little about tracing, but more info will be in the separate part about `lockdep` and `tracing`. You can see that the both `local_disable_irq` macros have the same part - `raw_local_irq_disable`. This macro defined in the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irqflags.h) and expands to the call of the: +Ok, now we know a little about tracing, but more info will be in the separate part about `lockdep` and `tracing`. You can see that the both `local_disable_irq` macros have the same part - `raw_local_irq_disable`. This macro defined in the [arch/x86/include/asm/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irqflags.h) and expands to the call of the: ```C static inline void native_irq_disable(void) @@ -380,19 +380,19 @@ static inline void native_irq_enable(void) } ``` -Now we know how `local_irq_disable` and `local_irq_enable` work. It was the first call of the `local_irq_disable` macro, but we will meet these macros many times in the Linux kernel source code. But for now we are in the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) and we just disabled `local` interrupts. Why local and why we did it? Previously kernel provided a method to disable interrupts on all processors and it was called `cli`. This function was [removed](https://lwn.net/Articles/291956/) and now we have `local_irq_{enabled,disable}` to disable or enable interrupts on the current processor. After we've disabled the interrupts with the `local_irq_disable` macro, we set the: +Now we know how `local_irq_disable` and `local_irq_enable` work. It was the first call of the `local_irq_disable` macro, but we will meet these macros many times in the Linux kernel source code. But for now we are in the `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) and we just disabled `local` interrupts. Why local and why we did it? Previously kernel provided a method to disable interrupts on all processors and it was called `cli`. This function was [removed](https://lwn.net/Articles/291956/) and now we have `local_irq_{enabled,disable}` to disable or enable interrupts on the current processor. After we've disabled the interrupts with the `local_irq_disable` macro, we set the: ```C early_boot_irqs_disabled = true; ``` -The `early_boot_irqs_disabled` variable defined in the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/master/include/linux/kernel.h): +The `early_boot_irqs_disabled` variable defined in the [include/linux/kernel.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/kernel.h): ```C extern bool early_boot_irqs_disabled; ``` -and used in the different places. For example it used in the `smp_call_function_many` function from the [kernel/smp.c](https://github.com/torvalds/linux/blob/master/kernel/smp.c) for the checking possible deadlock when interrupts are disabled: +and used in the different places. For example it used in the `smp_call_function_many` function from the [kernel/smp.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/smp.c) for the checking possible deadlock when interrupts are disabled: ```C WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled() @@ -402,7 +402,7 @@ WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled() Early trap initialization during kernel initialization -------------------------------------------------------------------------------- -The next functions after the `local_disable_irq` are `boot_cpu_init` and `page_address_init`, but they are not related to the interrupts and exceptions (more about this functions you can read in the chapter about Linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html)). The next is the `setup_arch` function. As you can remember this function located in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel.setup.c) source code file and makes initialization of many different architecture-dependent [stuff](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html). The first interrupts related function which we can see in the `setup_arch` is the - `early_trap_init` function. This function defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) and fills `Interrupt Descriptor Table` with the couple of entries: +The next functions after the `local_disable_irq` are `boot_cpu_init` and `page_address_init`, but they are not related to the interrupts and exceptions (more about this functions you can read in the chapter about Linux kernel [initialization process](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html)). The next is the `setup_arch` function. As you can remember this function located in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel.setup.c) source code file and makes initialization of many different architecture-dependent [stuff](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-4.html). The first interrupts related function which we can see in the `setup_arch` is the - `early_trap_init` function. This function defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) and fills `Interrupt Descriptor Table` with the couple of entries: ```C void __init early_trap_init(void) @@ -422,7 +422,7 @@ Here we can see calls of three different functions: * `set_system_intr_gate_ist` * `set_intr_gate` -All of these functions defined in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h) and do the similar thing but not the same. The first `set_intr_gate_ist` function inserts new an interrupt gate in the `IDT`. Let's look on its implementation: +All of these functions defined in the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h) and do the similar thing but not the same. The first `set_intr_gate_ist` function inserts new an interrupt gate in the `IDT`. Let's look on its implementation: ```C static inline void set_intr_gate_ist(int n, void *addr, unsigned ist) @@ -540,7 +540,7 @@ Links * [IF](http://en.wikipedia.org/wiki/Interrupt_flag) * [Stack canary](http://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries) * [Union type](http://en.wikipedia.org/wiki/Union_type) -* [this_cpu_* operations](https://github.com/torvalds/linux/blob/master/Documentation/this_cpu_ops.txt) +* [this_cpu_* operations](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/this_cpu_ops.txt) * [vector number](http://en.wikipedia.org/wiki/Interrupt_vector_table) * [Interrupt Stack Table](https://www.kernel.org/doc/Documentation/x86/x86_64/kernel-stacks) * [Privilege level](http://en.wikipedia.org/wiki/Privilege_level) diff --git a/interrupts/interrupts-3.md b/interrupts/interrupts-3.md index 7258f67..55abe0e 100644 --- a/interrupts/interrupts-3.md +++ b/interrupts/interrupts-3.md @@ -126,7 +126,7 @@ asmlinkage void int3(void); You may note `asmlinkage` directive in definitions of these functions. The directive is the special specificator of the [gcc](http://en.wikipedia.org/wiki/GNU_Compiler_Collection). Actually for a `C` functions which are called from assembly, we need in explicit declaration of the function calling convention. In our case, if function maked with `asmlinkage` descriptor, then `gcc` will compile the function to retrieve parameters from stack. -So, both handlers are defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly source code file with the `idtentry` macro: +So, both handlers are defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly source code file with the `idtentry` macro: ```assembly idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK @@ -140,7 +140,7 @@ idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK Each exception handler may be consists from two parts. The first part is generic part and it is the same for all exception handlers. An exception handler should to save [general purpose registers](https://en.wikipedia.org/wiki/Processor_register) on the stack, switch to kernel stack if an exception came from userspace and transfer control to the second part of an exception handler. The second part of an exception handler does certain work depends on certain exception. For example page fault exception handler should find virtual page for given address, invalid opcode exception handler should send `SIGILL` [signal](https://en.wikipedia.org/wiki/Unix_signal) and etc. -As we just saw, an exception handler starts from definition of the `idtentry` macro from the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/entry_64.S) assembly source code file, so let's look at implementation of this macro. As we may see, the `idtentry` macro takes five arguments: +As we just saw, an exception handler starts from definition of the `idtentry` macro from the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) assembly source code file, so let's look at implementation of this macro. As we may see, the `idtentry` macro takes five arguments: * `sym` - defines global symbol with the `.globl name` which will be an an entry of exception handler; * `do_sym` - symbol name which represents a secondary entry of an exception handler; @@ -230,7 +230,7 @@ After we pushed fake error code on the stack, we should allocate space for gener ALLOC_PT_GPREGS_ON_STACK ``` -macro which is defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/master/arch/x86/entry/calling.h) header file. This macro just allocates 15*8 bytes space on the stack to preserve general purpose registers: +macro which is defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/calling.h) header file. This macro just allocates 15*8 bytes space on the stack to preserve general purpose registers: ```assembly .macro ALLOC_PT_GPREGS_ON_STACK addskip=0 @@ -301,7 +301,7 @@ SAVE_C_REGS 8 SAVE_EXTRA_REGS 8 ``` -These both macros are defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/master/arch/x86/entry/calling.h) header file and just move values of general purpose registers to a certain place at the stack, for example: +These both macros are defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/calling.h) header file and just move values of general purpose registers to a certain place at the stack, for example: ```assembly .macro SAVE_EXTRA_REGS offset=0 @@ -359,7 +359,7 @@ movq %rsp, %rdi call sync_regs ``` -Here we put base address of stack pointer `%rdi` register which will be first argument (according to [x86_64 ABI](https://www.uclibc.org/docs/psABI-x86_64.pdf)) of the `sync_regs` function and call this function which is defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) source code file: +Here we put base address of stack pointer `%rdi` register which will be first argument (according to [x86_64 ABI](https://www.uclibc.org/docs/psABI-x86_64.pdf)) of the `sync_regs` function and call this function which is defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) source code file: ```C asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs) @@ -370,7 +370,7 @@ asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs) } ``` -This function takes the result of the `task_ptr_regs` macro which is defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/processor.h) header file, stores it in the stack pointer and return it. The `task_ptr_regs` macro expands to the address of `thread.sp0` which represents pointer to the normal kernel stack: +This function takes the result of the `task_ptr_regs` macro which is defined in the [arch/x86/include/asm/processor.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/processor.h) header file, stores it in the stack pointer and return it. The `task_ptr_regs` macro expands to the address of `thread.sp0` which represents pointer to the normal kernel stack: ```C #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) @@ -488,7 +488,7 @@ After secondary handler will finish its works, we will return to the `idtentry` jmp error_exit ``` -routine. The `error_exit` function defined in the same [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly source code file and the main goal of this function is to know where we are from (from userspace or kernelspace) and execute `SWPAGS` depends on this. Restore registers to previous state and execute `iret` instruction to transfer control to an interrupted task. +routine. The `error_exit` function defined in the same [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly source code file and the main goal of this function is to know where we are from (from userspace or kernelspace) and execute `SWPAGS` depends on this. Restore registers to previous state and execute `iret` instruction to transfer control to an interrupted task. That's all. diff --git a/interrupts/interrupts-4.md b/interrupts/interrupts-4.md index 935a4fb..fc812fd 100644 --- a/interrupts/interrupts-4.md +++ b/interrupts/interrupts-4.md @@ -58,7 +58,7 @@ enum { } ``` -When the `early_trap_pf_init` will be called, the `set_intr_gate` will be expanded to the call of the `_set_gate` which will fill the `IDT` with the handler for the page fault. Now let's look on the implementation of the `page_fault` handler. The `page_fault` handler defined in the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/entry_64.S) assembly source code file as all exceptions handlers. Let's look on it: +When the `early_trap_pf_init` will be called, the `set_intr_gate` will be expanded to the call of the `_set_gate` which will fill the `IDT` with the handler for the page fault. Now let's look on the implementation of the `page_fault` handler. The `page_fault` handler defined in the [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) assembly source code file as all exceptions handlers. Let's look on it: ```assembly trace_idtentry page_fault do_page_fault has_error_code=1 @@ -81,7 +81,7 @@ idtentry \sym \do_sym has_error_code=\has_error_code We will not dive into exceptions [Tracing](https://en.wikipedia.org/wiki/Tracing_%28software%29) now. If `CONFIG_TRACING` is not set, we can see that `trace_idtentry` macro just expands to the normal `idtentry`. We already saw implementation of the `idtentry` macro in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-3.html), so let's start from the `page_fault` exception handler. -As we can see in the `idtentry` definition, the handler of the `page_fault` is `do_page_fault` function which defined in the [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/fault.c) and as all exceptions handlers it takes two arguments: +As we can see in the `idtentry` definition, the handler of the `page_fault` is `do_page_fault` function which defined in the [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/fault.c) and as all exceptions handlers it takes two arguments: * `regs` - `pt_regs` structure that holds state of an interrupted process; * `error_code` - error code of the page fault exception. @@ -99,7 +99,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) } ``` -This register contains a linear address which caused `page fault`. In the next step we make a call of the `exception_enter` function from the [include/linux/context_tracking.h](https://github.com/torvalds/linux/blob/master/include/context_tracking.h). The `exception_enter` and `exception_exit` are functions from context tracking subsystem in the Linux kernel used by the [RCU](https://en.wikipedia.org/wiki/Read-copy-update) to remove its dependency on the timer tick while a processor runs in userspace. Almost in the every exception handler we will see similar code: +This register contains a linear address which caused `page fault`. In the next step we make a call of the `exception_enter` function from the [include/linux/context_tracking.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/context_tracking.h). The `exception_enter` and `exception_exit` are functions from context tracking subsystem in the Linux kernel used by the [RCU](https://en.wikipedia.org/wiki/Read-copy-update) to remove its dependency on the timer tick while a processor runs in userspace. Almost in the every exception handler we will see similar code: ```C enum ctx_state prev_state; @@ -110,7 +110,7 @@ prev_state = exception_enter(); exception_exit(prev_state); ``` -The `exception_enter` function checks that `context tracking` is enabled with the `context_tracking_is_enabled` and if it is in enabled state, we get previous context with the `this_cpu_read` (more about `this_cpu_*` operations you can read in the [Documentation](https://github.com/torvalds/linux/blob/master/Documentation/this_cpu_ops.txt)). After this it calls `context_tracking_user_exit` function which informs the context tracking that the processor is exiting userspace mode and entering the kernel: +The `exception_enter` function checks that `context tracking` is enabled with the `context_tracking_is_enabled` and if it is in enabled state, we get previous context with the `this_cpu_read` (more about `this_cpu_*` operations you can read in the [Documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/this_cpu_ops.txt)). After this it calls `context_tracking_user_exit` function which informs the context tracking that the processor is exiting userspace mode and entering the kernel: ```C static inline enum ctx_state exception_enter(void) @@ -142,7 +142,7 @@ And in the end we return previous context. Between the `exception_enter` and `ex __do_page_fault(regs, error_code, address); ``` -The `__do_page_fault` is defined in the same source code file as `do_page_fault` - [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/fault.c). In the beginning of the `__do_page_fault` we check state of the [kmemcheck](https://www.kernel.org/doc/Documentation/kmemcheck.txt) checker. The `kmemcheck` detects warns about some uses of uninitialized memory. We need to check it because page fault can be caused by kmemcheck: +The `__do_page_fault` is defined in the same source code file as `do_page_fault` - [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/fault.c). In the beginning of the `__do_page_fault` we check state of the [kmemcheck](https://www.kernel.org/doc/Documentation/kmemcheck.txt) checker. The `kmemcheck` detects warns about some uses of uninitialized memory. We need to check it because page fault can be caused by kmemcheck: ```C if (kmemcheck_active(regs)) @@ -202,7 +202,7 @@ Here we can see `proc_root_readdir` function which will be called when the Linux Back to start_kernel -------------------------------------------------------------------------------- -There are many different function calls after the `early_trap_pf_init` in the `setup_arch` function from different kernel subsystems, but there are no one interrupts and exceptions handling related. So, we have to go back where we came from - `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c#L492). The first things after the `setup_arch` is the `trap_init` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/tree/master/arch/x86/kernel/traps.c). This function makes initialization of the remaining exceptions handlers (remember that we already setup 3 handlers for the `#DB` - debug exception, `#BP` - breakpoint exception and `#PF` - page fault exception). The `trap_init` function starts from the check of the [Extended Industry Standard Architecture](https://en.wikipedia.org/wiki/Extended_Industry_Standard_Architecture): +There are many different function calls after the `early_trap_pf_init` in the `setup_arch` function from different kernel subsystems, but there are no one interrupts and exceptions handling related. So, we have to go back where we came from - `start_kernel` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c#L492). The first things after the `setup_arch` is the `trap_init` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/tree/master/arch/x86/kernel/traps.c). This function makes initialization of the remaining exceptions handlers (remember that we already setup 3 handlers for the `#DB` - debug exception, `#BP` - breakpoint exception and `#PF` - page fault exception). The `trap_init` function starts from the check of the [Extended Industry Standard Architecture](https://en.wikipedia.org/wiki/Extended_Industry_Standard_Architecture): ```C #ifdef CONFIG_EISA @@ -329,7 +329,7 @@ __set_fixmap(FIX_RO_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO); idt_descr.address = fix_to_virt(FIX_RO_IDT); ``` -and write its address to the `idt_descr.address` (more about fix-mapped addresses you can read in the second part of the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-2.html) chapter). After this we can see the call of the `cpu_init` function that defined in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c). This function makes initialization of the all `per-cpu` state. In the beginning of the `cpu_init` we do the following things: First of all we wait while current cpu is initialized and than we call the `cr4_init_shadow` function which stores shadow copy of the `cr4` control register for the current cpu and load CPU microcode if need with the following function calls: +and write its address to the `idt_descr.address` (more about fix-mapped addresses you can read in the second part of the [Linux kernel memory management](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-2.html) chapter). After this we can see the call of the `cpu_init` function that defined in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c). This function makes initialization of the all `per-cpu` state. In the beginning of the `cpu_init` we do the following things: First of all we wait while current cpu is initialized and than we call the `cr4_init_shadow` function which stores shadow copy of the `cr4` control register for the current cpu and load CPU microcode if need with the following function calls: ```C wait_for_master_cpu(cpu); @@ -381,7 +381,7 @@ set_tss_desc(cpu, t); load_TR_desc(); ``` -where `set_tss_desc` macro from the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h) writes given descriptor to the `Global Descriptor Table` of the given processor: +where `set_tss_desc` macro from the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h) writes given descriptor to the `Global Descriptor Table` of the given processor: ```C #define set_tss_desc(cpu, addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr) @@ -442,7 +442,7 @@ Links * [Tracing](https://en.wikipedia.org/wiki/Tracing_%28software%29) * [cr2](https://en.wikipedia.org/wiki/Control_register) * [RCU](https://en.wikipedia.org/wiki/Read-copy-update) -* [this_cpu_* operations](https://github.com/torvalds/linux/blob/master/Documentation/this_cpu_ops.txt) +* [this_cpu_* operations](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/this_cpu_ops.txt) * [kmemcheck](https://www.kernel.org/doc/Documentation/kmemcheck.txt) * [prefetchw](http://www.felixcloutier.com/x86/PREFETCHW.html) * [3DNow](https://en.wikipedia.org/?title=3DNow!) diff --git a/interrupts/interrupts-5.md b/interrupts/interrupts-5.md index 3411c2e..124cd6c 100644 --- a/interrupts/interrupts-5.md +++ b/interrupts/interrupts-5.md @@ -4,7 +4,7 @@ Interrupts and Interrupt Handling. Part 5. Implementation of exception handlers -------------------------------------------------------------------------------- -This is the fifth part about an interrupts and exceptions handling in the Linux kernel and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-4.html) we stopped on the setting of interrupt gates to the [Interrupt descriptor Table](https://en.wikipedia.org/wiki/Interrupt_descriptor_table). We did it in the `trap_init` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/tree/master/arch/x86/kernel/traps.c) source code file. We saw only setting of these interrupt gates in the previous part and in the current part we will see implementation of the exception handlers for these gates. The preparation before an exception handler will be executed is in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly file and occurs in the [idtentry](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S#L820) macro that defines exceptions entry points: +This is the fifth part about an interrupts and exceptions handling in the Linux kernel and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-4.html) we stopped on the setting of interrupt gates to the [Interrupt descriptor Table](https://en.wikipedia.org/wiki/Interrupt_descriptor_table). We did it in the `trap_init` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/tree/master/arch/x86/kernel/traps.c) source code file. We saw only setting of these interrupt gates in the previous part and in the current part we will see implementation of the exception handlers for these gates. The preparation before an exception handler will be executed is in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly file and occurs in the [idtentry](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S#L820) macro that defines exceptions entry points: ```assembly idtentry divide_error do_divide_error has_error_code=0 @@ -21,7 +21,7 @@ idtentry alignment_check do_alignment_check has_error_code=1 idtentry simd_coprocessor_error do_simd_coprocessor_error has_error_code=0 ``` -The `idtentry` macro does following preparation before an actual exception handler (`do_divide_error` for the `divide_error`, `do_overflow` for the `overflow` and etc.) will get control. In another words the `idtentry` macro allocates place for the registers ([pt_regs](https://github.com/torvalds/linux/blob/master/arch/x86/include/uapi/asm/ptrace.h#L43) structure) on the stack, pushes dummy error code for the stack consistency if an interrupt/exception has no error code, checks the segment selector in the `cs` segment register and switches depends on the previous state(userspace or kernelspace). After all of these preparations it makes a call of an actual interrupt/exception handler: +The `idtentry` macro does following preparation before an actual exception handler (`do_divide_error` for the `divide_error`, `do_overflow` for the `overflow` and etc.) will get control. In another words the `idtentry` macro allocates place for the registers ([pt_regs](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/ptrace.h#L43) structure) on the stack, pushes dummy error code for the stack consistency if an interrupt/exception has no error code, checks the segment selector in the `cs` segment register and switches depends on the previous state(userspace or kernelspace). After all of these preparations it makes a call of an actual interrupt/exception handler: ```assembly .macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 @@ -73,7 +73,7 @@ More about the `idtentry` macro you can read in the third part of the [http://0x * stack_segment * alignment_check -All these handlers defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) source code file with the `DO_ERROR` macro: +All these handlers defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) source code file with the `DO_ERROR` macro: ```C DO_ERROR(X86_TRAP_DE, SIGFPE, "divide error", divide_error) @@ -127,7 +127,7 @@ enum ctx_state prev_state = exception_enter(); exception_exit(prev_state); ``` -from the [include/linux/context_tracking.h](https://github.com/torvalds/linux/tree/master/include/linux/context_tracking.h). The context tracking in the Linux kernel subsystem which provide kernel boundaries probes to keep track of the transitions between level contexts with two basic initial contexts: `user` or `kernel`. The `exception_enter` function checks that context tracking is enabled. After this if it is enabled, the `exception_enter` reads previous context and compares it with the `CONTEXT_KERNEL`. If the previous context is `user`, we call `context_tracking_exit` function from the [kernel/context_tracking.c](https://github.com/torvalds/linux/blob/master/kernel/context_tracking.c) which inform the context tracking subsystem that a processor is exiting user mode and entering the kernel mode: +from the [include/linux/context_tracking.h](https://github.com/torvalds/linux/tree/master/include/linux/context_tracking.h). The context tracking in the Linux kernel subsystem which provide kernel boundaries probes to keep track of the transitions between level contexts with two basic initial contexts: `user` or `kernel`. The `exception_enter` function checks that context tracking is enabled. After this if it is enabled, the `exception_enter` reads previous context and compares it with the `CONTEXT_KERNEL`. If the previous context is `user`, we call `context_tracking_exit` function from the [kernel/context_tracking.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/context_tracking.c) which inform the context tracking subsystem that a processor is exiting user mode and entering the kernel mode: ```C if (!context_tracking_is_enabled()) @@ -201,7 +201,7 @@ struct atomic_notifier_head { }; ``` -The `atomic_notifier_call_chain` function calls each function in a notifier chain in turn and returns the value of the last notifier function called. If the `notify_die` in the `do_error_trap` does not return `NOTIFY_STOP` we execute `conditional_sti` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) that checks the value of the [interrupt flag](https://en.wikipedia.org/wiki/Interrupt_flag) and enables interrupt depends on it: +The `atomic_notifier_call_chain` function calls each function in a notifier chain in turn and returns the value of the last notifier function called. If the `notify_die` in the `do_error_trap` does not return `NOTIFY_STOP` we execute `conditional_sti` function from the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) that checks the value of the [interrupt flag](https://en.wikipedia.org/wiki/Interrupt_flag) and enables interrupt depends on it: ```C static inline void conditional_sti(struct pt_regs *regs) @@ -247,14 +247,14 @@ if (!fixup_exception(regs)) { } ``` -The `die` function defined in the [arch/x86/kernel/dumpstack.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/dumpstack.c) source code file, prints useful information about stack, registers, kernel modules and caused kernel [oops](https://en.wikipedia.org/wiki/Linux_kernel_oops). If we came from the userspace the `do_trap_no_signal` function will return `-1` and the execution of the `do_trap` function will continue. If we passed through the `do_trap_no_signal` function and did not exit from the `do_trap` after this, it means that previous context was - `user`. Most exceptions caused by the processor are interpreted by Linux as error conditions, for example division by zero, invalid opcode and etc. When an exception occurs the Linux kernel sends a [signal](https://en.wikipedia.org/wiki/Unix_signal) to the interrupted process that caused the exception to notify it of an incorrect condition. So, in the `do_trap` function we need to send a signal with the given number (`SIGFPE` for the divide error, `SIGILL` for the overflow exception and etc...). First of all we save error code and vector number in the current interrupts process with the filling `thread.error_code` and `thread_trap_nr`: +The `die` function defined in the [arch/x86/kernel/dumpstack.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/dumpstack.c) source code file, prints useful information about stack, registers, kernel modules and caused kernel [oops](https://en.wikipedia.org/wiki/Linux_kernel_oops). If we came from the userspace the `do_trap_no_signal` function will return `-1` and the execution of the `do_trap` function will continue. If we passed through the `do_trap_no_signal` function and did not exit from the `do_trap` after this, it means that previous context was - `user`. Most exceptions caused by the processor are interpreted by Linux as error conditions, for example division by zero, invalid opcode and etc. When an exception occurs the Linux kernel sends a [signal](https://en.wikipedia.org/wiki/Unix_signal) to the interrupted process that caused the exception to notify it of an incorrect condition. So, in the `do_trap` function we need to send a signal with the given number (`SIGFPE` for the divide error, `SIGILL` for the overflow exception and etc...). First of all we save error code and vector number in the current interrupts process with the filling `thread.error_code` and `thread_trap_nr`: ```C tsk->thread.error_code = error_code; tsk->thread.trap_nr = trapnr; ``` -After this we make a check do we need to print information about unhandled signals for the interrupted process. We check that `show_unhandled_signals` variable is set, that `unhandled_signal` function from the [kernel/signal.c](https://github.com/torvalds/linux/blob/master/kernel/signal.c) will return unhandled signal(s) and [printk](https://en.wikipedia.org/wiki/Printk) rate limit: +After this we make a check do we need to print information about unhandled signals for the interrupted process. We check that `show_unhandled_signals` variable is set, that `unhandled_signal` function from the [kernel/signal.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/signal.c) will return unhandled signal(s) and [printk](https://en.wikipedia.org/wiki/Printk) rate limit: ```C #ifdef CONFIG_X86_64 diff --git a/interrupts/interrupts-6.md b/interrupts/interrupts-6.md index 0263f69..257796c 100644 --- a/interrupts/interrupts-6.md +++ b/interrupts/interrupts-6.md @@ -21,13 +21,13 @@ A [Non-Maskable](https://en.wikipedia.org/wiki/Non-maskable_interrupt) interrupt * External hardware asserts the non-maskable interrupt [pin](https://en.wikipedia.org/wiki/CPU_socket) on the CPU. * The processor receives a message on the system bus or the APIC serial bus with a delivery mode `NMI`. -When the processor receives a `NMI` from one of these sources, the processor handles it immediately by calling the `NMI` handler pointed to by interrupt vector which has number `2` (see table in the first [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html)). We already filled the [Interrupt Descriptor Table](https://en.wikipedia.org/wiki/Interrupt_descriptor_table) with the [vector number](https://en.wikipedia.org/wiki/Interrupt_vector_table), address of the `nmi` interrupt handler and `NMI_STACK` [Interrupt Stack Table entry](https://github.com/torvalds/linux/blob/master/Documentation/x86/kernel-stacks): +When the processor receives a `NMI` from one of these sources, the processor handles it immediately by calling the `NMI` handler pointed to by interrupt vector which has number `2` (see table in the first [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-1.html)). We already filled the [Interrupt Descriptor Table](https://en.wikipedia.org/wiki/Interrupt_descriptor_table) with the [vector number](https://en.wikipedia.org/wiki/Interrupt_vector_table), address of the `nmi` interrupt handler and `NMI_STACK` [Interrupt Stack Table entry](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/kernel-stacks): ```C set_intr_gate_ist(X86_TRAP_NMI, &nmi, NMI_STACK); ``` -in the `trap_init` function which defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) source code file. In the previous [parts](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) we saw that entry points of the all interrupt handlers are defined with the: +in the `trap_init` function which defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) source code file. In the previous [parts](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) we saw that entry points of the all interrupt handlers are defined with the: ```assembly .macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 @@ -39,7 +39,7 @@ END(\sym) .endm ``` -macro from the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly source code file. But the handler of the `Non-Maskable` interrupts is not defined with this macro. It has own entry point: +macro from the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly source code file. But the handler of the `Non-Maskable` interrupts is not defined with this macro. It has own entry point: ```assembly ENTRY(nmi) @@ -49,7 +49,7 @@ ENTRY(nmi) END(nmi) ``` -in the same [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S) assembly file. Lets dive into it and will try to understand how `Non-Maskable` interrupt handler works. The `nmi` handlers starts from the call of the: +in the same [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly file. Lets dive into it and will try to understand how `Non-Maskable` interrupt handler works. The `nmi` handlers starts from the call of the: ```assembly PARAVIRT_ADJUST_EXCEPTION_FRAME @@ -68,7 +68,7 @@ cmpl $__KERNEL_CS, 16(%rsp) jne first_nmi ``` -The `__KERNEL_CS` macro defined in the [arch/x86/include/asm/segment.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/segment.h) and represented second descriptor in the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table): +The `__KERNEL_CS` macro defined in the [arch/x86/include/asm/segment.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/segment.h) and represented second descriptor in the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table): ```C #define GDT_ENTRY_KERNEL_CS 2 @@ -169,7 +169,7 @@ pushq $-1 ALLOC_PT_GPREGS_ON_STACK ``` -We already saw implementation of the `ALLOC_PT_GREGS_ON_STACK` macro in the third part of the interrupts [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-3.html). This macro defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/master/arch/x86/entry/calling.h) and yet another allocates `120` bytes on stack for the general purpose registers, from the `rdi` to the `r15`: +We already saw implementation of the `ALLOC_PT_GREGS_ON_STACK` macro in the third part of the interrupts [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-3.html). This macro defined in the [arch/x86/entry/calling.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/calling.h) and yet another allocates `120` bytes on stack for the general purpose registers, from the `rdi` to the `r15`: ```assembly .macro ALLOC_PT_GPREGS_ON_STACK addskip=0 @@ -237,7 +237,7 @@ nmi_restore: INTERRUPT_RETURN ``` -where `INTERRUPT_RETURN` is defined in the [arch/x86/include/irqflags.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/irqflags.h) and just expands to the `iret` instruction. That's all. +where `INTERRUPT_RETURN` is defined in the [arch/x86/include/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/irqflags.h) and just expands to the `iret` instruction. That's all. Now let's consider case when another `NMI` interrupt occurred when previous `NMI` interrupt didn't finish its execution. You can remember from the beginning of this part that we've made a check that we came from userspace and jump on the `first_nmi` in this case: @@ -255,12 +255,12 @@ je nested_nmi and if it is set to `1` we jump to the `nested_nmi` label. If it is not `1`, we test the `IST` stack. In the case of nested `NMIs` we check that we are above the `repeat_nmi`. In this case we ignore it, in other way we check that we above than `end_repeat_nmi` and jump on the `nested_nmi_out` label. -Now let's look on the `do_nmi` exception handler. This function defined in the [arch/x86/kernel/nmi.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/nmi.c) source code file and takes two parameters: +Now let's look on the `do_nmi` exception handler. This function defined in the [arch/x86/kernel/nmi.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/nmi.c) source code file and takes two parameters: * address of the `pt_regs`; * error code. -as all exception handlers. The `do_nmi` starts from the call of the `nmi_nesting_preprocess` function and ends with the call of the `nmi_nesting_postprocess`. The `nmi_nesting_preprocess` function checks that we likely do not work with the debug stack and if we on the debug stack set the `update_debug_stack` [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable to `1` and call the `debug_stack_set_zero` function from the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/common.c). This function increases the `debug_stack_use_ctr` per-cpu variable and loads new `Interrupt Descriptor Table`: +as all exception handlers. The `do_nmi` starts from the call of the `nmi_nesting_preprocess` function and ends with the call of the `nmi_nesting_postprocess`. The `nmi_nesting_preprocess` function checks that we likely do not work with the debug stack and if we on the debug stack set the `update_debug_stack` [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable to `1` and call the `debug_stack_set_zero` function from the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c). This function increases the `debug_stack_use_ctr` per-cpu variable and loads new `Interrupt Descriptor Table`: ```C static inline void nmi_nesting_preprocess(struct pt_regs *regs) @@ -310,7 +310,7 @@ That's all. Range Exceeded Exception -------------------------------------------------------------------------------- -The next exception is the `BOUND` range exceeded exception. The `BOUND` instruction determines if the first operand (array index) is within the bounds of an array specified the second operand (bounds operand). If the index is not within bounds, a `BOUND` range exceeded exception or `#BR` is occurred. The handler of the `#BR` exception is the `do_bounds` function that defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c). The `do_bounds` handler starts with the call of the `exception_enter` function and ends with the call of the `exception_exit`: +The next exception is the `BOUND` range exceeded exception. The `BOUND` instruction determines if the first operand (array index) is within the bounds of an array specified the second operand (bounds operand). If the index is not within bounds, a `BOUND` range exceeded exception or `#BR` is occurred. The handler of the `#BR` exception is the `do_bounds` function that defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c). The `do_bounds` handler starts with the call of the `exception_enter` function and ends with the call of the `exception_exit`: ```C prev_state = exception_enter(); @@ -362,7 +362,7 @@ After all of this, there is still only one way when `MPX` is responsible for thi Coprocessor exception and SIMD exception -------------------------------------------------------------------------------- -The next two exceptions are [x87 FPU](https://en.wikipedia.org/wiki/X87) Floating-Point Error exception or `#MF` and [SIMD](https://en.wikipedia.org/wiki/SIMD) Floating-Point Exception or `#XF`. The first exception occurs when the `x87 FPU` has detected floating point error. For example divide by zero, numeric overflow and etc. The second exception occurs when the processor has detected [SSE/SSE2/SSE3](https://en.wikipedia.org/wiki/SSE3) `SIMD` floating-point exception. It can be the same as for the `x87 FPU`. The handlers for these exceptions are `do_coprocessor_error` and `do_simd_coprocessor_error` are defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) and very similar on each other. They both make a call of the `math_error` function from the same source code file but pass different vector number. The `do_coprocessor_error` passes `X86_TRAP_MF` vector number to the `math_error`: +The next two exceptions are [x87 FPU](https://en.wikipedia.org/wiki/X87) Floating-Point Error exception or `#MF` and [SIMD](https://en.wikipedia.org/wiki/SIMD) Floating-Point Exception or `#XF`. The first exception occurs when the `x87 FPU` has detected floating point error. For example divide by zero, numeric overflow and etc. The second exception occurs when the processor has detected [SSE/SSE2/SSE3](https://en.wikipedia.org/wiki/SSE3) `SIMD` floating-point exception. It can be the same as for the `x87 FPU`. The handlers for these exceptions are `do_coprocessor_error` and `do_simd_coprocessor_error` are defined in the [arch/x86/kernel/traps.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) and very similar on each other. They both make a call of the `math_error` function from the same source code file but pass different vector number. The `do_coprocessor_error` passes `X86_TRAP_MF` vector number to the `math_error`: ```C dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) @@ -446,7 +446,7 @@ That's all. Conclusion -------------------------------------------------------------------------------- -It is the end of the sixth part of the [Interrupts and Interrupt Handling](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) chapter and we saw implementation of some exception handlers in this part, like `non-maskable` interrupt, [SIMD](https://en.wikipedia.org/wiki/SIMD) and [x87 FPU](https://en.wikipedia.org/wiki/X87) floating point exception. Finally we have finsihed with the `trap_init` function in this part and will go ahead in the next part. The next our point is the external interrupts and the `early_irq_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). +It is the end of the sixth part of the [Interrupts and Interrupt Handling](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) chapter and we saw implementation of some exception handlers in this part, like `non-maskable` interrupt, [SIMD](https://en.wikipedia.org/wiki/SIMD) and [x87 FPU](https://en.wikipedia.org/wiki/X87) floating point exception. Finally we have finsihed with the `trap_init` function in this part and will go ahead in the next part. The next our point is the external interrupts and the `early_irq_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). If you have any questions or suggestions write me a comment or ping me at [twitter](https://twitter.com/0xAX). @@ -461,7 +461,7 @@ Links * [BOUND instruction](http://pdos.csail.mit.edu/6.828/2005/readings/i386/BOUND.htm) * [CPU socket](https://en.wikipedia.org/wiki/CPU_socket) * [Interrupt Descriptor Table](https://en.wikipedia.org/wiki/Interrupt_descriptor_table) -* [Interrupt Stack Table](https://github.com/torvalds/linux/blob/master/Documentation/x86/kernel-stacks) +* [Interrupt Stack Table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/kernel-stacks) * [Paravirtualization](https://en.wikipedia.org/wiki/Paravirtualization) * [.rept](http://tigcc.ticalc.org/doc/gnuasm.html#SEC116) * [SIMD](https://en.wikipedia.org/wiki/SIMD) diff --git a/interrupts/interrupts-7.md b/interrupts/interrupts-7.md index a301438..a2757a7 100644 --- a/interrupts/interrupts-7.md +++ b/interrupts/interrupts-7.md @@ -4,7 +4,7 @@ Interrupts and Interrupt Handling. Part 7. Introduction to external interrupts -------------------------------------------------------------------------------- -This is the seventh part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-6.html) we have finished with the exceptions which are generated by the processor. In this part we will continue to dive to the interrupt handling and will start with the external hardware interrupt handling. As you can remember, in the previous part we have finished with the `trap_init` function from the [arch/x86/kernel/trap.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/traps.c) and the next step is the call of the `early_irq_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c). +This is the seventh part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-6.html) we have finished with the exceptions which are generated by the processor. In this part we will continue to dive to the interrupt handling and will start with the external hardware interrupt handling. As you can remember, in the previous part we have finished with the `trap_init` function from the [arch/x86/kernel/trap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/traps.c) and the next step is the call of the `early_irq_init` function from the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c). Interrupts are signal that are sent across [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29) or `Interrupt Request Line` by a hardware or software. External hardware interrupts allow devices like keyboard, mouse and etc, to indicate that it needs attention of the processor. Once the processor receives the `Interrupt Request`, it will temporary stop execution of the running program and invoke special routine which depends on an interrupt. We already know that this routine is called interrupt handler (or how we will call it `ISR` or `Interrupt Service Routine` from this part). The `ISR` or `Interrupt Handler Routine` can be found in Interrupt Vector table that is located at fixed address in the memory. After the interrupt is handled processor resumes the interrupted process. At the boot/initialization time, the Linux kernel identifies all devices in the machine, and appropriate interrupt handlers are loaded into the interrupt table. As we saw in the previous parts, most exceptions are handled simply by the sending a [Unix signal](https://en.wikipedia.org/wiki/Unix_signal) to the interrupted process. That's why kernel is can handle an exception quickly. Unfortunately we can not use this approach for the external hardware interrupts, because often they arrive after (and sometimes long after) the process to which they are related has been suspended. So it would make no sense to send a Unix signal to the current process. External interrupt handling depends on the type of an interrupt: @@ -21,10 +21,10 @@ Generally, a handler of an `I/O` interrupt must be flexible enough to service se * Execute the interrupt service routine (next we will call it `ISR`) which is associated with the device; * Restore registers and return from an interrupt; -Ok, we know a little theory and now let's start with the `early_irq_init` function. The implementation of the `early_irq_init` function is in the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/master/kernel/irq/irqdesc.c). This function make early initialization of the `irq_desc` structure. The `irq_desc` structure is the foundation of interrupt management code in the Linux kernel. An array of this structure, which has the same name - `irq_desc`, keeps track of every interrupt request source in the Linux kernel. This structure defined in the [include/linux/irqdesc.h](https://github.com/torvalds/linux/blob/master/include/linux/irqdesc.h) and as you can note it depends on the `CONFIG_SPARSE_IRQ` kernel configuration option. This kernel configuration option enables support for sparse irqs. The `irq_desc` structure contains many different files: +Ok, we know a little theory and now let's start with the `early_irq_init` function. The implementation of the `early_irq_init` function is in the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/irqdesc.c). This function make early initialization of the `irq_desc` structure. The `irq_desc` structure is the foundation of interrupt management code in the Linux kernel. An array of this structure, which has the same name - `irq_desc`, keeps track of every interrupt request source in the Linux kernel. This structure defined in the [include/linux/irqdesc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irqdesc.h) and as you can note it depends on the `CONFIG_SPARSE_IRQ` kernel configuration option. This kernel configuration option enables support for sparse irqs. The `irq_desc` structure contains many different files: * `irq_common_data` - per irq and chip data passed down to chip functions; -* `status_use_accessors` - contains status of the interrupt source which is combination of the values from the `enum` from the [include/linux/irq.h](https://github.com/torvalds/linux/blob/master/include/linux/irq.h) and different macros which are defined in the same source code file; +* `status_use_accessors` - contains status of the interrupt source which is combination of the values from the `enum` from the [include/linux/irq.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irq.h) and different macros which are defined in the same source code file; * `kstat_irqs` - irq stats per-cpu; * `handle_irq` - highlevel irq-events handler; * `action` - identifies the interrupt service routines to be invoked when the [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29) occurs; @@ -78,7 +78,7 @@ As I already wrote, implementation of the `first_online_node` macro depends on t #define first_online_node 0 ``` -The `node_states` is the [enum](https://en.wikipedia.org/wiki/Enumerated_type) which defined in the [include/linux/nodemask.h](https://github.com/torvalds/linux/blob/master/include/linux/nodemask.h) and represent the set of the states of a node. In our case we are searching an online node and it will be `0` if `MAX_NUMNODES` is one or zero. If the `MAX_NUMNODES` is greater than one, the `node_states[N_ONLINE]` will return `1` and the `first_node` macro will be expands to the call of the `__first_node` function which will return `minimal` or the first online node: +The `node_states` is the [enum](https://en.wikipedia.org/wiki/Enumerated_type) which defined in the [include/linux/nodemask.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/nodemask.h) and represent the set of the states of a node. In our case we are searching an online node and it will be `0` if `MAX_NUMNODES` is one or zero. If the `MAX_NUMNODES` is greater than one, the `node_states[N_ONLINE]` will return `1` and the `first_node` macro will be expands to the call of the `__first_node` function which will return `minimal` or the first online node: ```C #define first_node(src) __first_node(&(src)) @@ -189,7 +189,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { The `irq_desc` is array of the `irq` descriptors. It has three already initialized fields: -* `handle_irq` - as I already wrote above, this field is the highlevel irq-event handler. In our case it initialized with the `handle_bad_irq` function that defined in the [kernel/irq/handle.c](https://github.com/torvalds/linux/blob/master/kernel/irq/handle.c) source code file and handles spurious and unhandled irqs; +* `handle_irq` - as I already wrote above, this field is the highlevel irq-event handler. In our case it initialized with the `handle_bad_irq` function that defined in the [kernel/irq/handle.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/handle.c) source code file and handles spurious and unhandled irqs; * `depth` - `0` if the IRQ line is enabled and a positive value if it has been disabled at least once; * `lock` - A spin lock used to serialize the accesses to the `IRQ` descriptor. @@ -223,7 +223,7 @@ cpu3 26648 8 6931 678891 414 0 244 0 0 0 Where the sixth column is the servicing interrupts. After this we allocate [cpumask](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) for the given irq descriptor affinity and initialize the [spinlock](https://en.wikipedia.org/wiki/Spinlock) for the given interrupt descriptor. After this before the [critical section](https://en.wikipedia.org/wiki/Critical_section), the lock will be acquired with a call of the `raw_spin_lock` and unlocked with the call of the `raw_spin_unlock`. In the next step we call the `lockdep_set_class` macro which set the [Lock validator](https://lwn.net/Articles/185666/) `irq_desc_lock_class` class for the lock of the given interrupt descriptor. More about `lockdep`, `spinlock` and other synchronization primitives will be described in the separate chapter. -In the end of the loop we call the `desc_set_defaults` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/master/kernel/irq/irqdesc.c). This function takes four parameters: +In the end of the loop we call the `desc_set_defaults` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/irqdesc.c). This function takes four parameters: * number of a irq; * interrupt descriptor; @@ -243,7 +243,7 @@ desc->irq_data.msi_desc = NULL; ... ``` -The `irq_data.chip` structure provides general `API` like the `irq_set_chip`, `irq_set_irq_type` and etc, for the irq controller [drivers](https://github.com/torvalds/linux/tree/master/drivers/irqchip). You can find it in the [kernel/irq/chip.c](https://github.com/torvalds/linux/blob/master/kernel/irq/chip.c) source code file. +The `irq_data.chip` structure provides general `API` like the `irq_set_chip`, `irq_set_irq_type` and etc, for the irq controller [drivers](https://github.com/torvalds/linux/tree/master/drivers/irqchip). You can find it in the [kernel/irq/chip.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/chip.c) source code file. After this we set the status of the accessor for the given descriptor and set disabled state of the interrupts: @@ -275,14 +275,14 @@ desc->owner = owner; ... ``` -After this we go through the all [possible](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) processor with the [for_each_possible_cpu](https://github.com/torvalds/linux/blob/master/include/linux/cpumask.h#L714) helper and set the `kstat_irqs` to zero for the given interrupt descriptor: +After this we go through the all [possible](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) processor with the [for_each_possible_cpu](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cpumask.h#L714) helper and set the `kstat_irqs` to zero for the given interrupt descriptor: ```C for_each_possible_cpu(cpu) *per_cpu_ptr(desc->kstat_irqs, cpu) = 0; ``` -and call the `desc_smp_init` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/master/kernel/irq/irqdesc.c) that initializes `NUMA` node of the given interrupt descriptor, sets default `SMP` affinity and clears the `pending_mask` of the given interrupt descriptor depends on the value of the `CONFIG_GENERIC_PENDING_IRQ` kernel configuration option: +and call the `desc_smp_init` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/irqdesc.c) that initializes `NUMA` node of the given interrupt descriptor, sets default `SMP` affinity and clears the `pending_mask` of the given interrupt descriptor depends on the value of the `CONFIG_GENERIC_PENDING_IRQ` kernel configuration option: ```C static void desc_smp_init(struct irq_desc *desc, int node) @@ -301,7 +301,7 @@ In the end of the `early_irq_init` function we return the return value of the `a return arch_early_irq_init(); ``` -This function defined in the [kernel/apic/vector.c](https://github.com/torvalds/linux/blob/master/kernel/apic/vector.c) and contains only one call of the `arch_early_ioapic_init` function from the [kernel/apic/io_apic.c](https://github.com/torvalds/linux/blob/master/kernel/apic/io_apic.c). As we can understand from the `arch_early_ioapic_init` function's name, this function makes early initialization of the [I/O APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller). First of all it make a check of the number of the legacy interrupts with the call of the `nr_legacy_irqs` function. If we have no legacy interrupts with the [Intel 8259](https://en.wikipedia.org/wiki/Intel_8259) programmable interrupt controller we set `io_apic_irqs` to the `0xffffffffffffffff`: +This function defined in the [kernel/apic/vector.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/apic/vector.c) and contains only one call of the `arch_early_ioapic_init` function from the [kernel/apic/io_apic.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/apic/io_apic.c). As we can understand from the `arch_early_ioapic_init` function's name, this function makes early initialization of the [I/O APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller). First of all it make a check of the number of the legacy interrupts with the call of the `nr_legacy_irqs` function. If we have no legacy interrupts with the [Intel 8259](https://en.wikipedia.org/wiki/Intel_8259) programmable interrupt controller we set `io_apic_irqs` to the `0xffffffffffffffff`: ```C if (!nr_legacy_irqs()) @@ -356,7 +356,7 @@ But after this we can see the following call: initcnt = arch_probe_nr_irqs(); ``` -The `arch_probe_nr_irqs` function defined in the [arch/x86/kernel/apic/vector.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/apic/vector.c) and calculates count of the pre-allocated irqs and update `nr_irqs` with its number. But stop. Why there are pre-allocated irqs? There is alternative form of interrupts called - [Message Signaled Interrupts](https://en.wikipedia.org/wiki/Message_Signaled_Interrupts) available in the [PCI](https://en.wikipedia.org/wiki/Conventional_PCI). Instead of assigning a fixed number of the interrupt request, the device is allowed to record a message at a particular address of RAM, in fact, the display on the [Local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#Integrated_local_APICs). `MSI` permits a device to allocate `1`, `2`, `4`, `8`, `16` or `32` interrupts and `MSI-X` permits a device to allocate up to `2048` interrupts. Now we know that irqs can be pre-allocated. More about `MSI` will be in a next part, but now let's look on the `arch_probe_nr_irqs` function. We can see the check which assign amount of the interrupt vectors for the each processor in the system to the `nr_irqs` if it is greater and calculate the `nr` which represents number of `MSI` interrupts: +The `arch_probe_nr_irqs` function defined in the [arch/x86/kernel/apic/vector.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/apic/vector.c) and calculates count of the pre-allocated irqs and update `nr_irqs` with its number. But stop. Why there are pre-allocated irqs? There is alternative form of interrupts called - [Message Signaled Interrupts](https://en.wikipedia.org/wiki/Message_Signaled_Interrupts) available in the [PCI](https://en.wikipedia.org/wiki/Conventional_PCI). Instead of assigning a fixed number of the interrupt request, the device is allowed to record a message at a particular address of RAM, in fact, the display on the [Local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#Integrated_local_APICs). `MSI` permits a device to allocate `1`, `2`, `4`, `8`, `16` or `32` interrupts and `MSI-X` permits a device to allocate up to `2048` interrupts. Now we know that irqs can be pre-allocated. More about `MSI` will be in a next part, but now let's look on the `arch_probe_nr_irqs` function. We can see the check which assign amount of the interrupt vectors for the each processor in the system to the `nr_irqs` if it is greater and calculate the `nr` which represents number of `MSI` interrupts: ```C int nr_irqs = NR_IRQS; diff --git a/interrupts/interrupts-8.md b/interrupts/interrupts-8.md index 63fdfd0..758881e 100644 --- a/interrupts/interrupts-8.md +++ b/interrupts/interrupts-8.md @@ -4,9 +4,9 @@ Interrupts and Interrupt Handling. Part 8. Non-early initialization of the IRQs -------------------------------------------------------------------------------- -This is the eighth part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-7.html) we started to dive into the external hardware [interrupts](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29). We looked on the implementation of the `early_irq_init` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/master/kernel/irq/irqdesc.c) source code file and saw the initialization of the `irq_desc` structure in this function. Remind that `irq_desc` structure (defined in the [include/linux/irqdesc.h](https://github.com/torvalds/linux/blob/master/include/linux/irqdesc.h#L46) is the foundation of interrupt management code in the Linux kernel and represents an interrupt descriptor. In this part we will continue to dive into the initialization stuff which is related to the external hardware interrupts. +This is the eighth part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-7.html) we started to dive into the external hardware [interrupts](https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29). We looked on the implementation of the `early_irq_init` function from the [kernel/irq/irqdesc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/irqdesc.c) source code file and saw the initialization of the `irq_desc` structure in this function. Remind that `irq_desc` structure (defined in the [include/linux/irqdesc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irqdesc.h#L46) is the foundation of interrupt management code in the Linux kernel and represents an interrupt descriptor. In this part we will continue to dive into the initialization stuff which is related to the external hardware interrupts. -Right after the call of the `early_irq_init` function in the [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) we can see the call of the `init_IRQ` function. This function is architecture-specific and defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/master/kernel/irqinit.c). The `init_IRQ` function makes initialization of the `vector_irq` [percpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable that defined in the same [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/master/kernel/irqinit.c) source code file: +Right after the call of the `early_irq_init` function in the [init/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/init/main.c) we can see the call of the `init_IRQ` function. This function is architecture-specific and defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irqinit.c). The `init_IRQ` function makes initialization of the `vector_irq` [percpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable that defined in the same [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irqinit.c) source code file: ```C ... @@ -16,7 +16,7 @@ DEFINE_PER_CPU(vector_irq_t, vector_irq) = { ... ``` -and represents `percpu` array of the interrupt vector numbers. The `vector_irq_t` defined in the [arch/x86/include/asm/hw_irq.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/hw_irq.h) and expands to the: +and represents `percpu` array of the interrupt vector numbers. The `vector_irq_t` defined in the [arch/x86/include/asm/hw_irq.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/hw_irq.h) and expands to the: ```C typedef int vector_irq_t[NR_VECTORS]; @@ -43,7 +43,7 @@ void __init init_IRQ(void) } ``` -This `vector_irq` will be used during the first steps of an external hardware interrupt handling in the `do_IRQ` function from the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irq.c): +This `vector_irq` will be used during the first steps of an external hardware interrupt handling in the `do_IRQ` function from the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irq.c): ```C __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) @@ -66,7 +66,7 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) } ``` -Why is `legacy` here? Actually all interrupts are handled by the modern [IO-APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#I.2FO_APICs) controller. But these interrupts (from `0x30` to `0x3f`) by legacy interrupt-controllers like [Programmable Interrupt Controller](https://en.wikipedia.org/wiki/Programmable_Interrupt_Controller). If these interrupts are handled by the `I/O APIC` then this vector space will be freed and re-used. Let's look on this code closer. First of all the `nr_legacy_irqs` defined in the [arch/x86/include/asm/i8259.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/i8259.h) and just returns the `nr_legacy_irqs` field from the `legacy_pic` structure: +Why is `legacy` here? Actually all interrupts are handled by the modern [IO-APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#I.2FO_APICs) controller. But these interrupts (from `0x30` to `0x3f`) by legacy interrupt-controllers like [Programmable Interrupt Controller](https://en.wikipedia.org/wiki/Programmable_Interrupt_Controller). If these interrupts are handled by the `I/O APIC` then this vector space will be freed and re-used. Let's look on this code closer. First of all the `nr_legacy_irqs` defined in the [arch/x86/include/asm/i8259.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/i8259.h) and just returns the `nr_legacy_irqs` field from the `legacy_pic` structure: ```C static inline int nr_legacy_irqs(void) @@ -91,13 +91,13 @@ struct legacy_pic { }; ``` -Actual default maximum number of the legacy interrupts represented by the `NR_IRQ_LEGACY` macro from the [arch/x86/include/asm/irq_vectors.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irq_vectors.h): +Actual default maximum number of the legacy interrupts represented by the `NR_IRQ_LEGACY` macro from the [arch/x86/include/asm/irq_vectors.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irq_vectors.h): ```C #define NR_IRQS_LEGACY 16 ``` -In the loop we are accessing the `vecto_irq` per-cpu array with the `per_cpu` macro by the `IRQ0_VECTOR + i` index and write the legacy vector number there. The `IRQ0_VECTOR` macro defined in the [arch/x86/include/asm/irq_vectors.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irq_vectors.h) header file and expands to the `0x30`: +In the loop we are accessing the `vecto_irq` per-cpu array with the `per_cpu` macro by the `IRQ0_VECTOR + i` index and write the legacy vector number there. The `IRQ0_VECTOR` macro defined in the [arch/x86/include/asm/irq_vectors.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/irq_vectors.h) header file and expands to the `0x30`: ```C #define FIRST_EXTERNAL_VECTOR 0x20 @@ -113,7 +113,7 @@ In the end of the `init_IRQ` function we can see the call of the following funct x86_init.irqs.intr_init(); ``` -from the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/x86_init.c) source code file. If you have read [chapter](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) about the Linux kernel initialization process, you can remember the `x86_init` structure. This structure contains a couple of files which are points to the function related to the platform setup (`x86_64` in our case), for example `resources` - related with the memory resources, `mpparse` - related with the parsing of the [MultiProcessor Configuration Table](https://en.wikipedia.org/wiki/MultiProcessor_Specification) table and etc.). As we can see the `x86_init` also contains the `irqs` field which contains three following fields: +from the [arch/x86/kernel/x86_init.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/x86_init.c) source code file. If you have read [chapter](http://0xax.gitbooks.io/linux-insides/content/Initialization/index.html) about the Linux kernel initialization process, you can remember the `x86_init` structure. This structure contains a couple of files which are points to the function related to the platform setup (`x86_64` in our case), for example `resources` - related with the memory resources, `mpparse` - related with the parsing of the [MultiProcessor Configuration Table](https://en.wikipedia.org/wiki/MultiProcessor_Specification) table and etc.). As we can see the `x86_init` also contains the `irqs` field which contains three following fields: ```C struct x86_init_ops x86_init __initdata @@ -132,13 +132,13 @@ struct x86_init_ops x86_init __initdata } ``` -Now, we are interesting in the `native_init_IRQ`. As we can note, the name of the `native_init_IRQ` function contains the `native_` prefix which means that this function is architecture-specific. It defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/master/kernel/irqinit.c) and executes general initialization of the [Local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#Integrated_local_APICs) and initialization of the [ISA](https://en.wikipedia.org/wiki/Industry_Standard_Architecture) irqs. Let's look on the implementation of the `native_init_IRQ` function and will try to understand what occurs there. The `native_init_IRQ` function starts from the execution of the following function: +Now, we are interesting in the `native_init_IRQ`. As we can note, the name of the `native_init_IRQ` function contains the `native_` prefix which means that this function is architecture-specific. It defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irqinit.c) and executes general initialization of the [Local APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#Integrated_local_APICs) and initialization of the [ISA](https://en.wikipedia.org/wiki/Industry_Standard_Architecture) irqs. Let's look on the implementation of the `native_init_IRQ` function and will try to understand what occurs there. The `native_init_IRQ` function starts from the execution of the following function: ```C x86_init.irqs.pre_vector_init(); ``` -As we can see above, the `pre_vector_init` points to the `init_ISA_irqs` function that defined in the same [source code](https://github.com/torvalds/linux/blob/master/kernel/irqinit.c) file and as we can understand from the function's name, it makes initialization of the `ISA` related interrupts. The `init_ISA_irqs` function starts from the definition of the `chip` variable which has a `irq_chip` type: +As we can see above, the `pre_vector_init` points to the `init_ISA_irqs` function that defined in the same [source code](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irqinit.c) file and as we can understand from the function's name, it makes initialization of the `ISA` related interrupts. The `init_ISA_irqs` function starts from the definition of the `chip` variable which has a `irq_chip` type: ```C void __init init_ISA_irqs(void) @@ -149,7 +149,7 @@ void __init init_ISA_irqs(void) ... ``` -The `irq_chip` structure defined in the [include/linux/irq.h](https://github.com/torvalds/linux/blob/master/include/linux/irq.h) header file and represents hardware interrupt chip descriptor. It contains: +The `irq_chip` structure defined in the [include/linux/irq.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irq.h) header file and represents hardware interrupt chip descriptor. It contains: * `name` - name of a device. Used in the `/proc/interrupts`: @@ -171,7 +171,7 @@ look on the last column; fields. Note that the `irq_data` structure represents set of the per irq chip data passed down to chip functions. It contains `mask` - precomputed bitmask for accessing the chip registers, `irq` - interrupt number, `hwirq` - hardware interrupt number, local to the interrupt domain chip low level interrupt hardware access and etc. -After this depends on the `CONFIG_X86_64` and `CONFIG_X86_LOCAL_APIC` kernel configuration option call the `init_bsp_APIC` function from the [arch/x86/kernel/apic/apic.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/apic/apic.c): +After this depends on the `CONFIG_X86_64` and `CONFIG_X86_LOCAL_APIC` kernel configuration option call the `init_bsp_APIC` function from the [arch/x86/kernel/apic/apic.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/apic/apic.c): ```C #if defined(CONFIG_X86_64) || defined(CONFIG_X86_LOCAL_APIC) @@ -209,7 +209,7 @@ for (i = 0; i < nr_legacy_irqs(); i++) irq_set_chip_and_handler(i, chip, handle_level_irq); ``` -Where can we find `init` function? The `legacy_pic` defined in the [arch/x86/kernel/i8259.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/i8259.c) and it is: +Where can we find `init` function? The `legacy_pic` defined in the [arch/x86/kernel/i8259.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/i8259.c) and it is: ```C struct legacy_pic *legacy_pic = &default_legacy_pic; @@ -231,7 +231,7 @@ struct legacy_pic default_legacy_pic = { The `init_8259A` function defined in the same source code file and executes initialization of the [Intel 8259](https://en.wikipedia.org/wiki/Intel_8259) ``Programmable Interrupt Controller` (more about it will be in the separate chapter about `Programmable Interrupt Controllers` and `APIC`). -Now we can return to the `native_init_IRQ` function, after the `init_ISA_irqs` function finished its work. The next step is the call of the `apic_intr_init` function that allocates special interrupt gates which are used by the [SMP](https://en.wikipedia.org/wiki/Symmetric_multiprocessing) architecture for the [Inter-processor interrupt](https://en.wikipedia.org/wiki/Inter-processor_interrupt). The `alloc_intr_gate` macro from the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/desc.h) used for the interrupt descriptor allocation: +Now we can return to the `native_init_IRQ` function, after the `init_ISA_irqs` function finished its work. The next step is the call of the `apic_intr_init` function that allocates special interrupt gates which are used by the [SMP](https://en.wikipedia.org/wiki/Symmetric_multiprocessing) architecture for the [Inter-processor interrupt](https://en.wikipedia.org/wiki/Inter-processor_interrupt). The `alloc_intr_gate` macro from the [arch/x86/include/asm/desc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/desc.h) used for the interrupt descriptor allocation: ```C #define alloc_intr_gate(n, addr) \ @@ -253,7 +253,7 @@ if (!test_bit(vector, used_vectors)) { } ``` -We already saw the `set_bit` macro, now let's look on the `test_bit` and the `first_system_vector`. The first `test_bit` macro defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/bitops.h) and looks like this: +We already saw the `set_bit` macro, now let's look on the `test_bit` and the `first_system_vector`. The first `test_bit` macro defined in the [arch/x86/include/asm/bitops.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/bitops.h) and looks like this: ```C #define test_bit(nr, addr) \ @@ -392,7 +392,7 @@ for_each_clear_bit_from(i, used_vectors, NR_VECTORS) #endif ``` -Where the `spurious_interrupt` function represent interrupt handler for the `spurious` interrupt. Here the `used_vectors` is the `unsigned long` that contains already initialized interrupt gates. We already filled first `32` interrupt vectors in the `trap_init` function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) source code file: +Where the `spurious_interrupt` function represent interrupt handler for the `spurious` interrupt. Here the `used_vectors` is the `unsigned long` that contains already initialized interrupt gates. We already filled first `32` interrupt vectors in the `trap_init` function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) source code file: ```C for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++) @@ -408,13 +408,13 @@ if (!acpi_ioapic && !of_ioapic && nr_legacy_irqs()) setup_irq(2, &irq2); ``` -First of all let's deal with the condition. The `acpi_ioapic` variable represents existence of [I/O APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#I.2FO_APICs). It defined in the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/acpi/boot.c). This variable set in the `acpi_set_irq_model_ioapic` function that called during the processing `Multiple APIC Description Table`. This occurs during initialization of the architecture-specific stuff in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) (more about it we will know in the other chapter about [APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller)). Note that the value of the `acpi_ioapic` variable depends on the `CONFIG_ACPI` and `CONFIG_X86_LOCAL_APIC` Linux kernel configuration options. If these options did not set, this variable will be just zero: +First of all let's deal with the condition. The `acpi_ioapic` variable represents existence of [I/O APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller#I.2FO_APICs). It defined in the [arch/x86/kernel/acpi/boot.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/acpi/boot.c). This variable set in the `acpi_set_irq_model_ioapic` function that called during the processing `Multiple APIC Description Table`. This occurs during initialization of the architecture-specific stuff in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) (more about it we will know in the other chapter about [APIC](https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller)). Note that the value of the `acpi_ioapic` variable depends on the `CONFIG_ACPI` and `CONFIG_X86_LOCAL_APIC` Linux kernel configuration options. If these options did not set, this variable will be just zero: ```C #define acpi_ioapic 0 ``` -The second condition - `!of_ioapic && nr_legacy_irqs()` checks that we do not use [Open Firmware](https://en.wikipedia.org/wiki/Open_Firmware) `I/O APIC` and legacy interrupt controller. We already know about the `nr_legacy_irqs`. The second is `of_ioapic` variable defined in the [arch/x86/kernel/devicetree.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/devicetree.c) and initialized in the `dtb_ioapic_setup` function that build information about `APICs` in the [devicetree](https://en.wikipedia.org/wiki/Device_tree). Note that `of_ioapic` variable depends on the `CONFIG_OF` Linux kernel configuration option. If this option is not set, the value of the `of_ioapic` will be zero too: +The second condition - `!of_ioapic && nr_legacy_irqs()` checks that we do not use [Open Firmware](https://en.wikipedia.org/wiki/Open_Firmware) `I/O APIC` and legacy interrupt controller. We already know about the `nr_legacy_irqs`. The second is `of_ioapic` variable defined in the [arch/x86/kernel/devicetree.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/devicetree.c) and initialized in the `dtb_ioapic_setup` function that build information about `APICs` in the [devicetree](https://en.wikipedia.org/wiki/Device_tree). Note that `of_ioapic` variable depends on the `CONFIG_OF` Linux kernel configuration option. If this option is not set, the value of the `of_ioapic` will be zero too: ```C #ifdef CONFIG_OF @@ -436,7 +436,7 @@ If the condition will return non-zero value we call the: setup_irq(2, &irq2); ``` -function. First of all about the `irq2`. The `irq2` is the `irqaction` structure that defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irqinit.c) source code file and represents `IRQ 2` line that is used to query devices connected cascade: +function. First of all about the `irq2`. The `irq2` is the `irqaction` structure that defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irqinit.c) source code file and represents `IRQ 2` line that is used to query devices connected cascade: ```C static struct irqaction irq2 = { @@ -465,7 +465,7 @@ Some time ago interrupt controller consisted of two chips and one was connected * `IRQ 6` - drive controller; * `IRQ 7` - `LPT1`. -The `setup_irq` function defined in the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/master/kernel/irq/manage.c) and takes two parameters: +The `setup_irq` function defined in the [kernel/irq/manage.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/irq/manage.c) and takes two parameters: * vector number of an interrupt; * `irqaction` structure related with an interrupt. diff --git a/interrupts/interrupts-9.md b/interrupts/interrupts-9.md index c862e07..13098c0 100644 --- a/interrupts/interrupts-9.md +++ b/interrupts/interrupts-9.md @@ -4,7 +4,7 @@ Interrupts and Interrupt Handling. Part 9. Introduction to deferred interrupts (Softirq, Tasklets and Workqueues) -------------------------------------------------------------------------------- -It is the nine part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [Previous part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-8.html) we saw implementation of the `init_IRQ` from that defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irqinit.c) source code file. So, we will continue to dive into the initialization stuff which is related to the external hardware interrupts in this part. +It is the nine part of the Interrupts and Interrupt Handling in the Linux kernel [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) and in the previous [Previous part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-8.html) we saw implementation of the `init_IRQ` from that defined in the [arch/x86/kernel/irqinit.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irqinit.c) source code file. So, we will continue to dive into the initialization stuff which is related to the external hardware interrupts in this part. Interrupts may have different important characteristics and there are two among them: @@ -49,7 +49,7 @@ The `spawn_ksoftirqd` function starts this these threads. As we can see this fun early_initcall(spawn_ksoftirqd); ``` -Softirqs are determined statically at compile-time of the Linux kernel and the `open_softirq` function takes care of `softirq` initialization. The `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/master/kernel/softirq.c): +Softirqs are determined statically at compile-time of the Linux kernel and the `open_softirq` function takes care of `softirq` initialization. The `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c): ```C @@ -137,7 +137,7 @@ void raise_softirq(unsigned int nr) } ``` -Here we can see the call of the `raise_softirq_irqoff` function between the `local_irq_save` and the `local_irq_restore` macros. The `local_irq_save` defined in the [include/linux/irqflags.h](https://github.com/torvalds/linux/blob/master/include/linux/irqflags.h) header file and saves the state of the [IF](https://en.wikipedia.org/wiki/Interrupt_flag) flag of the [eflags](https://en.wikipedia.org/wiki/FLAGS_register) register and disables interrupts on the local processor. The `local_irq_restore` macro defined in the same header file and does the opposite thing: restores the `interrupt flag` and enables interrupts. We disable interrupts here because a `softirq` interrupt runs in the interrupt context and that one softirq (and no others) will be run. +Here we can see the call of the `raise_softirq_irqoff` function between the `local_irq_save` and the `local_irq_restore` macros. The `local_irq_save` defined in the [include/linux/irqflags.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/irqflags.h) header file and saves the state of the [IF](https://en.wikipedia.org/wiki/Interrupt_flag) flag of the [eflags](https://en.wikipedia.org/wiki/FLAGS_register) register and disables interrupts on the local processor. The `local_irq_restore` macro defined in the same header file and does the opposite thing: restores the `interrupt flag` and enables interrupts. We disable interrupts here because a `softirq` interrupt runs in the interrupt context and that one softirq (and no others) will be run. The `raise_softirq_irqoff` function marks the softirq as deffered by setting the bit corresponding to the given index `nr` in the `softirq` bit mask (`__softirq_pending`) of the local processor. It does it with the help of the: @@ -189,7 +189,7 @@ if (pending) { ... ``` -Checks of the existence of the deferred interrupts performed periodically and there are some points where this check occurs. The main point where this situation occurs is the call of the `do_IRQ` function that defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/irq.c) and provides main possibilities for actual interrupt processing in the Linux kernel. When this function will finish to handle an interrupt, it calls the `exiting_irq` function from the [arch/x86/include/asm/apic.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/apic.h) that expands to the call of the `irq_exit` function. The `irq_exit` checks deferred interrupts, current context and calls the `invoke_softirq` function: +Checks of the existence of the deferred interrupts performed periodically and there are some points where this check occurs. The main point where this situation occurs is the call of the `do_IRQ` function that defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irq.c) and provides main possibilities for actual interrupt processing in the Linux kernel. When this function will finish to handle an interrupt, it calls the `exiting_irq` function from the [arch/x86/include/asm/apic.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/apic.h) that expands to the call of the `irq_exit` function. The `irq_exit` checks deferred interrupts, current context and calls the `invoke_softirq` function: ```C if (!in_interrupt() && local_softirq_pending()) @@ -208,7 +208,7 @@ If you read the source code of the Linux kernel that is related to the `softirq` * `TASKLET_SOFTIRQ`; * `HI_SOFTIRQ`. -In short words, `tasklets` are `softirqs` that can be allocated and initialized at runtime and unlike `softirqs`, tasklets that have the same type cannot be run on multiple processors at a time. Ok, now we know a little bit about the `softirqs`, of course previous text does not cover all aspects about this, but now we can directly look on the code and to know more about the `softirqs` step by step on practice and to know about `tasklets`. Let's return back to the implementation of the `softirq_init` function that we talked about in the beginning of this part. This function is defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/master/kernel/softirq.c) source code file, let's look on its implementation: +In short words, `tasklets` are `softirqs` that can be allocated and initialized at runtime and unlike `softirqs`, tasklets that have the same type cannot be run on multiple processors at a time. Ok, now we know a little bit about the `softirqs`, of course previous text does not cover all aspects about this, but now we can directly look on the code and to know more about the `softirqs` step by step on practice and to know about `tasklets`. Let's return back to the implementation of the `softirq_init` function that we talked about in the beginning of this part. This function is defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) source code file, let's look on its implementation: ```C void __init softirq_init(void) @@ -227,7 +227,7 @@ void __init softirq_init(void) } ``` -We can see definition of the integer `cpu` variable at the beginning of the `softirq_init` function. Next we will use it as parameter for the `for_each_possible_cpu` macro that goes through the all possible processors in the system. If the `possible processor` is the new terminology for you, you can read more about it the [CPU masks](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) chapter. In short words, `possible cpus` is the set of processors that can be plugged in anytime during the life of that system boot. All `possible processors` stored in the `cpu_possible_bits` bitmap, you can find its definition in the [kernel/cpu.c](https://github.com/torvalds/linux/blob/master/kernel/cpu.c): +We can see definition of the integer `cpu` variable at the beginning of the `softirq_init` function. Next we will use it as parameter for the `for_each_possible_cpu` macro that goes through the all possible processors in the system. If the `possible processor` is the new terminology for you, you can read more about it the [CPU masks](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) chapter. In short words, `possible cpus` is the set of processors that can be plugged in anytime during the life of that system boot. All `possible processors` stored in the `cpu_possible_bits` bitmap, you can find its definition in the [kernel/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/cpu.c): ```C static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly; @@ -242,7 +242,7 @@ Ok, we defined the integer `cpu` variable and go through the all possible proces * `tasklet_vec`; * `tasklet_hi_vec`; -These two `per-cpu` variables defined in the same source [code](https://github.com/torvalds/linux/blob/master/kernel/softirq.c) file as the `softirq_init` function and represent two `tasklet_head` structures: +These two `per-cpu` variables defined in the same source [code](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) file as the `softirq_init` function and represent two `tasklet_head` structures: ```C static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); @@ -258,7 +258,7 @@ struct tasklet_head { }; ``` -The `tasklet_struct` structure is defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/master/include/linux/interrupt.h) and represents the `Tasklet`. Previously we did not see this word in this book. Let's try to understand what the `tasklet` is. Actually, the tasklet is one of mechanisms to handle deferred interrupt. Let's look on the implementation of the `tasklet_struct` structure: +The `tasklet_struct` structure is defined in the [include/linux/interrupt.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/interrupt.h) and represents the `Tasklet`. Previously we did not see this word in this book. Let's try to understand what the `tasklet` is. Actually, the tasklet is one of mechanisms to handle deferred interrupt. Let's look on the implementation of the `tasklet_struct` structure: ```C struct tasklet_struct @@ -279,7 +279,7 @@ As we can see this structure contains five fields, they are: * Main callback of the tasklet; * Parameter of the callback. -In our case, we set only for initialize only two arrays of tasklets in the `softirq_init` function: the `tasklet_vec` and the `tasklet_hi_vec`. Tasklets and high-priority tasklets are stored in the `tasklet_vec` and `tasklet_hi_vec` arrays, respectively. So, we have initialized these arrays and now we can see two calls of the `open_softirq` function that is defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/master/kernel/softirq.c) source code file: +In our case, we set only for initialize only two arrays of tasklets in the `softirq_init` function: the `tasklet_vec` and the `tasklet_hi_vec`. Tasklets and high-priority tasklets are stored in the `tasklet_vec` and `tasklet_hi_vec` arrays, respectively. So, we have initialized these arrays and now we can see two calls of the `open_softirq` function that is defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) source code file: ```C open_softirq(TASKLET_SOFTIRQ, tasklet_action); @@ -399,9 +399,9 @@ struct worker_pool { ... ``` -structure that is defined in the [kernel/workqueue.c](https://github.com/torvalds/linux/blob/master/kernel/workqueue.c) source code file in the Linux kernel. I will not write the source code of this structure here, because it has quite a lot of fields, but we will consider some of those fields. +structure that is defined in the [kernel/workqueue.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/workqueue.c) source code file in the Linux kernel. I will not write the source code of this structure here, because it has quite a lot of fields, but we will consider some of those fields. -In its most basic form, the work queue subsystem is an interface for creating kernel threads to handle work that is queued from elsewhere. All of these kernel threads are called -- `worker threads`. The work queue are maintained by the `work_struct` that defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/master/include/linux/workqueue.h). Let's look on this structure: +In its most basic form, the work queue subsystem is an interface for creating kernel threads to handle work that is queued from elsewhere. All of these kernel threads are called -- `worker threads`. The work queue are maintained by the `work_struct` that defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/workqueue.h). Let's look on this structure: ```C struct work_struct { @@ -460,7 +460,7 @@ static inline bool queue_work(struct workqueue_struct *wq, } ``` -The `queue_work` function just calls the `queue_work_on` function that queue work on specific processor. Note that in our case we pass the `WORK_CPU_UNBOUND` to the `queue_work_on` function. It is a part of the `enum` that is defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/master/include/linux/workqueue.h) and represents workqueue which are not bound to any specific processor. The `queue_work_on` function tests and set the `WORK_STRUCT_PENDING_BIT` bit of the given `work` and executes the `__queue_work` function with the `workqueue` for the given processor and given `work`: +The `queue_work` function just calls the `queue_work_on` function that queue work on specific processor. Note that in our case we pass the `WORK_CPU_UNBOUND` to the `queue_work_on` function. It is a part of the `enum` that is defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/workqueue.h) and represents workqueue which are not bound to any specific processor. The `queue_work_on` function tests and set the `WORK_STRUCT_PENDING_BIT` bit of the given `work` and executes the `__queue_work` function with the `workqueue` for the given processor and given `work`: ```C bool queue_work_on(int cpu, struct workqueue_struct *wq, @@ -522,5 +522,5 @@ Links * [eflags](https://en.wikipedia.org/wiki/FLAGS_register) * [CPU masks](http://0xax.gitbooks.io/linux-insides/content/Concepts/cpumask.html) * [per-cpu](http://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) -* [Workqueue](https://github.com/torvalds/linux/blob/master/Documentation/workqueue.txt) +* [Workqueue](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/workqueue.txt) * [Previous part](http://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-8.html) diff --git a/mm/linux-mm-1.md b/mm/linux-mm-1.md index 6bbccd9..bc260b6 100644 --- a/mm/linux-mm-1.md +++ b/mm/linux-mm-1.md @@ -12,7 +12,7 @@ Memblock Memblock is one of the methods of managing memory regions during the early bootstrap period while the usual kernel memory allocators are not up and running yet. Previously it was called `Logical Memory Block`, but with the [patch](https://lkml.org/lkml/2010/7/13/68) by Yinghai Lu, it was renamed to the `memblock`. As Linux kernel for `x86_64` architecture uses this method. We already met `memblock` in the [Last preparations before the kernel entry point](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-3.html) part. And now it's time to get acquainted with it closer. We will see how it is implemented. -We will start to learn `memblock` from the data structures. Definitions of the all data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/master/include/linux/memblock.h) header file. +We will start to learn `memblock` from the data structures. Definitions of the all data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file. The first structure has the same name as this part and it is: @@ -88,7 +88,7 @@ These three structures: `memblock`, `memblock_type` and `memblock_region` are ma Memblock initialization -------------------------------------------------------------------------------- -As all API of the `memblock` are described in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/master/include/linux/memblock.h) header file, all implementations of these functions are in the [mm/memblock.c](https://github.com/torvalds/linux/blob/master/mm/memblock.c) source code file. Let's look at the top of the source code file and we will see the initialization of the `memblock` structure: +As all API of the `memblock` are described in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file, all implementations of these functions are in the [mm/memblock.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/memblock.c) source code file. Let's look at the top of the source code file and we will see the initialization of the `memblock` structure: ```C struct memblock memblock __initdata_memblock = { @@ -155,7 +155,7 @@ On this step the initialization of the `memblock` structure has been finished an Memblock API -------------------------------------------------------------------------------- -Ok we have finished with the initialization of the `memblock` structure and now we can look at the Memblock API and its implementation. As I said above, the implementation of `memblock` is taking place fully in [mm/memblock.c](https://github.com/torvalds/linux/blob/master/mm/memblock.c). To understand how `memblock` works and how it is implemented, let's look at its usage first. There are a couple of [places](http://lxr.free-electrons.com/ident?i=memblock) in the linux kernel where memblock is used. For example let's take `memblock_x86_fill` function from the [arch/x86/kernel/e820.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/e820.c#L1061). This function goes through the memory map provided by the [e820](http://en.wikipedia.org/wiki/E820) and adds memory regions reserved by the kernel to the `memblock` with the `memblock_add` function. Since we have met the `memblock_add` function first, let's start from it. +Ok we have finished with the initialization of the `memblock` structure and now we can look at the Memblock API and its implementation. As I said above, the implementation of `memblock` is taking place fully in [mm/memblock.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/memblock.c). To understand how `memblock` works and how it is implemented, let's look at its usage first. There are a couple of [places](http://lxr.free-electrons.com/ident?i=memblock) in the linux kernel where memblock is used. For example let's take `memblock_x86_fill` function from the [arch/x86/kernel/e820.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/e820.c#L1061). This function goes through the memory map provided by the [e820](http://en.wikipedia.org/wiki/E820) and adds memory regions reserved by the kernel to the `memblock` with the `memblock_add` function. Since we have met the `memblock_add` function first, let's start from it. This function takes a physical base address and the size of the memory region as arguments and add them to the `memblock`. The `memblock_add` function does not do anything special in its body, but just calls the: diff --git a/mm/linux-mm-2.md b/mm/linux-mm-2.md index f43e958..7d1fe56 100644 --- a/mm/linux-mm-2.md +++ b/mm/linux-mm-2.md @@ -16,7 +16,7 @@ NEXT_PAGE(level1_fixmap_pgt) .fill 512,8,0 ``` -As you can see `level2_fixmap_pgt` is right after the `level2_kernel_pgt` which is kernel code+data+bss. Every fix-mapped address is represented by an integer index which is defined in the `fixed_addresses` enum from the [arch/x86/include/asm/fixmap.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/fixmap.h). For example it contains entries for `VSYSCALL_PAGE` - if emulation of legacy vsyscall page is enabled, `FIX_APIC_BASE` for local [apic](http://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller), etc. In virtual memory fix-mapped area is placed in the modules area: +As you can see `level2_fixmap_pgt` is right after the `level2_kernel_pgt` which is kernel code+data+bss. Every fix-mapped address is represented by an integer index which is defined in the `fixed_addresses` enum from the [arch/x86/include/asm/fixmap.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/fixmap.h). For example it contains entries for `VSYSCALL_PAGE` - if emulation of legacy vsyscall page is enabled, `FIX_APIC_BASE` for local [apic](http://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller), etc. In virtual memory fix-mapped area is placed in the modules area: ``` +-----------+-----------------+---------------+------------------+ @@ -137,7 +137,7 @@ $ cat /proc/ioports ... ``` -`/proc/ioports` provides information about which driver uses which address of a `I/O` port region. All of these memory regions, for example `0000-0cf7`, were claimed with the `request_region` function from the [include/linux/ioport.h](https://github.com/torvalds/linux/blob/master/include/linux/ioport.h). Actually `request_region` is a macro which is defined as: +`/proc/ioports` provides information about which driver uses which address of a `I/O` port region. All of these memory regions, for example `0000-0cf7`, were claimed with the `request_region` function from the [include/linux/ioport.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/ioport.h). Actually `request_region` is a macro which is defined as: ```C #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) @@ -184,7 +184,7 @@ struct resource iomem_resource = { }; ``` -As I have mentioned before, `request_regions` is used to register I/O port regions and this macro is used in many [places](http://lxr.free-electrons.com/ident?i=request_region) in the kernel. For example let's look at [drivers/char/rtc.c](https://github.com/torvalds/linux/blob/master/drivers/char/rtc.c). This source code file provides the [Real Time Clock](http://en.wikipedia.org/wiki/Real-time_clock) interface in the linux kernel. As every kernel module, `rtc` module contains `module_init` definition: +As I have mentioned before, `request_regions` is used to register I/O port regions and this macro is used in many [places](http://lxr.free-electrons.com/ident?i=request_region) in the kernel. For example let's look at [drivers/char/rtc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/drivers/char/rtc.c). This source code file provides the [Real Time Clock](http://en.wikipedia.org/wiki/Real-time_clock) interface in the linux kernel. As every kernel module, `rtc` module contains `module_init` definition: ```C module_init(rtc_init); @@ -256,7 +256,7 @@ e0000000-feafffff : PCI Bus 0000:00 ... ``` -Part of these addresses are from the call of the `e820_reserve_resources` function. We can find a call to this function in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/setup.c) and the function itself is defined in [arch/x86/kernel/e820.c](https://github.com/torvalds/linux/blob/master/arch/x86/kernel/e820.c). `e820_reserve_resources` goes through the [e820](http://en.wikipedia.org/wiki/E820) map and inserts memory regions into the root `iomem` resource structure. All `e820` memory regions which are inserted into the `iomem` resource have the following types: +Part of these addresses are from the call of the `e820_reserve_resources` function. We can find a call to this function in the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/setup.c) and the function itself is defined in [arch/x86/kernel/e820.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/e820.c). `e820_reserve_resources` goes through the [e820](http://en.wikipedia.org/wiki/E820) map and inserts memory regions into the root `iomem` resource structure. All `e820` memory regions which are inserted into the `iomem` resource have the following types: ```C static inline const char *e820_type_to_string(int e820_type) @@ -274,13 +274,13 @@ static inline const char *e820_type_to_string(int e820_type) and we can see them in the `/proc/iomem` (read above). -Now let's try to understand how `ioremap` works. We already know a little about `ioremap`, we saw it in the fifth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) about linux kernel initialization. If you have read this part, you can remember the call of the `early_ioremap_init` function from the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/ioremap.c). Initialization of the `ioremap` is split into two parts: there is the early part which we can use before the normal `ioremap` is available and the normal `ioremap` which is available after `vmalloc` initialization and the call of `paging_init`. We do not know anything about `vmalloc` for now, so let's consider early initialization of the `ioremap`. First of all `early_ioremap_init` checks that `fixmap` is aligned on page middle directory boundary: +Now let's try to understand how `ioremap` works. We already know a little about `ioremap`, we saw it in the fifth [part](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-5.html) about linux kernel initialization. If you have read this part, you can remember the call of the `early_ioremap_init` function from the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/ioremap.c). Initialization of the `ioremap` is split into two parts: there is the early part which we can use before the normal `ioremap` is available and the normal `ioremap` which is available after `vmalloc` initialization and the call of `paging_init`. We do not know anything about `vmalloc` for now, so let's consider early initialization of the `ioremap`. First of all `early_ioremap_init` checks that `fixmap` is aligned on page middle directory boundary: ```C BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1)); ``` -more about `BUILD_BUG_ON` you can read in the first part about [Linux Kernel initialization](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html). So `BUILD_BUG_ON` macro raises a compilation error if the given expression is true. In the next step after this check, we can see call of the `early_ioremap_setup` function from the [mm/early_ioremap.c](https://github.com/torvalds/linux/blob/master/mm/early_ioremap.c). This function presents generic initialization of the `ioremap`. `early_ioremap_setup` function fills the `slot_virt` array with the virtual addresses of the early fixmaps. All early fixmaps are after `__end_of_permanent_fixed_addresses` in memory. They start at `FIX_BITMAP_BEGIN` (top) and end with `FIX_BITMAP_END` (down). Actually there are `512` temporary boot-time mappings, used by early `ioremap`: +more about `BUILD_BUG_ON` you can read in the first part about [Linux Kernel initialization](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-1.html). So `BUILD_BUG_ON` macro raises a compilation error if the given expression is true. In the next step after this check, we can see call of the `early_ioremap_setup` function from the [mm/early_ioremap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/early_ioremap.c). This function presents generic initialization of the `ioremap`. `early_ioremap_setup` function fills the `slot_virt` array with the virtual addresses of the early fixmaps. All early fixmaps are after `__end_of_permanent_fixed_addresses` in memory. They start at `FIX_BITMAP_BEGIN` (top) and end with `FIX_BITMAP_END` (down). Actually there are `512` temporary boot-time mappings, used by early `ioremap`: ``` #define NR_FIX_BTMAPS 64 @@ -343,7 +343,7 @@ pmd_populate_kernel(&init_mm, pmd, bm_pte); static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss; ``` -The `pmd_populate_kernel` function is defined in the [arch/x86/include/asm/pgalloc.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/pgalloc.) and populates the page middle directory (`pmd`) provided as an argument with the given page table entries (`bm_pte`): +The `pmd_populate_kernel` function is defined in the [arch/x86/include/asm/pgalloc.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/pgalloc.) and populates the page middle directory (`pmd`) provided as an argument with the given page table entries (`bm_pte`): ```C static inline void pmd_populate_kernel(struct mm_struct *mm, @@ -424,7 +424,7 @@ nrpages = size >> PAGE_SHIFT; idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot; ``` -Now we can fill `fix-mapped` area with the given physical addresses. On every iteration in the loop, we call the `__early_set_fixmap` function from the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/ioremap.c), increase the given physical address by the page size which is `4096` bytes and update the `addresses` index and the number of pages: +Now we can fill `fix-mapped` area with the given physical addresses. On every iteration in the loop, we call the `__early_set_fixmap` function from the [arch/x86/mm/ioremap.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/ioremap.c), increase the given physical address by the page size which is `4096` bytes and update the `addresses` index and the number of pages: ```C while (nrpages > 0) { @@ -462,7 +462,7 @@ flags, so we call `set_pte` function to set the page table entry which works in __flush_tlb_one(addr); ``` -This function is defined in [arch/x86/include/asm/tlbflush.h](https://github.com/torvalds/linux/blob/master) and calls `__flush_tlb_single` or `__flush_tlb` depending on the value of `cpu_has_invlpg`: +This function is defined in [arch/x86/include/asm/tlbflush.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973) and calls `__flush_tlb_single` or `__flush_tlb` depending on the value of `cpu_has_invlpg`: ```C static inline void __flush_tlb_one(unsigned long addr) diff --git a/mm/linux-mm-3.md b/mm/linux-mm-3.md index 0e375d0..9ac6d2c 100644 --- a/mm/linux-mm-3.md +++ b/mm/linux-mm-3.md @@ -127,7 +127,7 @@ menu of the Linux kernel configuration: ![kernel configuration menu](http://oi63.tinypic.com/2pzbog7.jpg) -We may not only enable support of the `kmemcheck` mechanism in the Linux kernel, but it also provides some configuration options for us. We will see all of these options in the next paragraph of this part. Last note before we will consider how does the `kmemcheck` check memory. Now this mechanism is implemented only for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. You can be sure if you will look in the [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/master/arch/x86/Kconfig) `x86` related kernel configuration file, you will see following lines: +We may not only enable support of the `kmemcheck` mechanism in the Linux kernel, but it also provides some configuration options for us. We will see all of these options in the next paragraph of this part. Last note before we will consider how does the `kmemcheck` check memory. Now this mechanism is implemented only for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture. You can be sure if you will look in the [arch/x86/Kconfig](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Kconfig) `x86` related kernel configuration file, you will see following lines: ``` config X86 @@ -155,7 +155,7 @@ We just considered the `kmemcheck` mechanism from theoretical side. Now let's co Implementation of the `kmemcheck` mechanism in the Linux kernel -------------------------------------------------------------------------------- -So, now we know what is it `kmemcheck` and what it does in the Linux kernel. Time to see at its implementation in the Linux kernel. Implementation of the `kmemcheck` is splitted in two parts. The first is generic part is located in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/master/mm/kmemcheck.c) source code file and the second [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture-specific part is located in the [arch/x86/mm/kmemcheck](https://github.com/torvalds/linux/tree/master/arch/x86/mm/kmemcheck) directory. +So, now we know what is it `kmemcheck` and what it does in the Linux kernel. Time to see at its implementation in the Linux kernel. Implementation of the `kmemcheck` is splitted in two parts. The first is generic part is located in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and the second [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture-specific part is located in the [arch/x86/mm/kmemcheck](https://github.com/torvalds/linux/tree/master/arch/x86/mm/kmemcheck) directory. Let's start from the initialization of this mechanism. We already know that to enable the `kmemcheck` mechanism in the Linux kernel, we must enable the `CONFIG_KMEMCHECK` kernel configuration option. But besides this, we need to pass one of following parameters: @@ -167,7 +167,7 @@ to the Linux kernel command line. The first two are clear, but the last needs a ![kernel configuration menu](http://oi66.tinypic.com/y2eeh.jpg) -We know from the seventh [part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-7.html) of the chapter which describes initialization of the Linux kernel that the kernel command line is parsed during initialization of the Linux kernel in `do_initcall_level`, `do_early_param` functions. Actually the `kmemcheck` subsystem consists from two stages. The first stage is early. If we will look at the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/master/mm/kmemcheck.c) source code file, we will see the `param_kmemcheck` function which is will be called during early command line parsing: +We know from the seventh [part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-7.html) of the chapter which describes initialization of the Linux kernel that the kernel command line is parsed during initialization of the Linux kernel in `do_initcall_level`, `do_early_param` functions. Actually the `kmemcheck` subsystem consists from two stages. The first stage is early. If we will look at the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file, we will see the `param_kmemcheck` function which is will be called during early command line parsing: ```C static int __init param_kmemcheck(char *str) @@ -223,7 +223,7 @@ So when the somebody will call: struct my_struct *my_struct = kmalloc(sizeof(struct my_struct), GFP_KERNEL); ``` -through a series of different function calls the `kmem_getpages` function will be called. This function is defined in the [mm/slab.c](https://github.com/torvalds/linux/blob/master/mm/slab.c) source code file and main goal of this function tries to allocate [pages](https://en.wikipedia.org/wiki/Paging) with the given flags. In the end of this function we can see following code: +through a series of different function calls the `kmem_getpages` function will be called. This function is defined in the [mm/slab.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/slab.c) source code file and main goal of this function tries to allocate [pages](https://en.wikipedia.org/wiki/Paging) with the given flags. In the end of this function we can see following code: ```C if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) { @@ -236,7 +236,7 @@ if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) { } ``` -So, here we check that the if `kmemcheck` is enabled and the `SLAB_NOTRACK` bit is not set in flags we set `non-present` bit for the just allocated page. The `SLAB_NOTRACK` bit tell us to not track uninitialized memory. Additionally we check if a cache object has constructor (details will be considered in next parts) we mark allocated page as uninitilized or unallocated in other way. The `kmemcheck_alloc_shadow` function is defined in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/master/mm/kmemcheck.c) source code file and does following things: +So, here we check that the if `kmemcheck` is enabled and the `SLAB_NOTRACK` bit is not set in flags we set `non-present` bit for the just allocated page. The `SLAB_NOTRACK` bit tell us to not track uninitialized memory. Additionally we check if a cache object has constructor (details will be considered in next parts) we mark allocated page as uninitilized or unallocated in other way. The `kmemcheck_alloc_shadow` function is defined in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and does following things: ```C void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node) @@ -278,7 +278,7 @@ void kmemcheck_hide_pages(struct page *p, unsigned int n) Here we go through all pages and and tries to get `page table entry` for each page. If this operation was successful, we unset present bit and set hidden bit in each page. In the end we flush [translation lookaside buffer](https://en.wikipedia.org/wiki/Translation_lookaside_buffer), because some pages was changed. From this point allocated pages are tracked by the `kmemcheck`. Now, as `present` bit is unset, the [page fault](https://en.wikipedia.org/wiki/Page_fault) execution will be occured right after the `kmalloc` will return pointer to allocated space and a code will try to access this memory. -As you may remember from the [second part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) of the Linux kernel initialization chapter, the `page fault` handler is located in the [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/fault.c) source code file and represented by the `do_page_fault` function. We can see following check from the beginning of the `do_page_fault` function: +As you may remember from the [second part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) of the Linux kernel initialization chapter, the `page fault` handler is located in the [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/fault.c) source code file and represented by the `do_page_fault` function. We can see following check from the beginning of the `do_page_fault` function: ```C static noinline void @@ -343,7 +343,7 @@ The `kmemcheck` mechanism declares special [tasklet](https://0xax.gitbooks.io/li static DECLARE_TASKLET(kmemcheck_tasklet, &do_wakeup, 0); ``` -which runs the `do_wakeup` function from the [arch/x86/mm/kmemcheck/error.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/kmemcheck/error.c) source code file when it will be scheduled to run. +which runs the `do_wakeup` function from the [arch/x86/mm/kmemcheck/error.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/kmemcheck/error.c) source code file when it will be scheduled to run. The `do_wakeup` function will call the `kmemcheck_error_recall` function which will print errors collected by `kmemcheck`. As we already saw the: From fc5cdbb0e798e7d1492ac1d55e3846781e576cab Mon Sep 17 00:00:00 2001 From: Chandan Rai Date: Wed, 2 Aug 2017 00:12:24 +0530 Subject: [PATCH 010/179] corrected typos --- Misc/program_startup.md | 8 ++++---- SyncPrim/sync-4.md | 6 +++--- SyncPrim/sync-6.md | 10 +++++----- SysCall/README.md | 2 +- SysCall/syscall-4.md | 2 +- Timers/timers-3.md | 4 ++-- Timers/timers-4.md | 8 ++++---- contributors.md | 1 + interrupts/interrupts-3.md | 12 ++++++------ interrupts/interrupts-6.md | 2 +- mm/linux-mm-2.md | 4 ++-- mm/linux-mm-3.md | 20 ++++++++++---------- 12 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Misc/program_startup.md b/Misc/program_startup.md index afc31a2..14c66ac 100644 --- a/Misc/program_startup.md +++ b/Misc/program_startup.md @@ -135,11 +135,11 @@ SYSCALL_DEFINE3(execve, } ``` -It takes executable file name, set of command line arguments and set of enviroment variables. As you may guess, everything is done by the `do_execve` function. I will not describe implementation of the `do_execve` function in details because you can read about this in [here](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html). But in short words, the `do_execve` function does many checks like `filename` is valid, limit of launched processes is not exceed in our system and etc. After all of these checks, this function parses our executable file which is represented in [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) format, creates memory descriptor for newly executed executable file and fills it with the appropriate values like area for the stack, heap and etc. When the setup of new binary image is done, the `start_thread` function will set up one new process. This function is architecture-specific and for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, its definition will be located in the [arch/x86/kernel/process_64.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/arch/x86/kernel/process_64.c#L239) source code file. +It takes executable file name, set of command line arguments and set of environment variables. As you may guess, everything is done by the `do_execve` function. I will not describe implementation of the `do_execve` function in details because you can read about this in [here](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html). But in short words, the `do_execve` function does many checks like `filename` is valid, limit of launched processes is not exceed in our system and etc. After all of these checks, this function parses our executable file which is represented in [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) format, creates memory descriptor for newly executed executable file and fills it with the appropriate values like area for the stack, heap and etc. When the setup of new binary image is done, the `start_thread` function will set up one new process. This function is architecture-specific and for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, its definition will be located in the [arch/x86/kernel/process_64.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/arch/x86/kernel/process_64.c#L239) source code file. The `start_thread` function sets new value to [segment registers](https://en.wikipedia.org/wiki/X86_memory_segmentation) and program execution address. From this point, new process is ready to start. Once the [context switch](https://en.wikipedia.org/wiki/Context_switch) will be done, control will be returned to the userspace with new values of registers and new executable will be started to execute. -That's all from the kernel side. The Linux kernel prepares binary image for execution and its execution starts right after context switch and returns controll to userspace when it is finished. But it does not answer on questions like where is from `_start` come and others. Let's try to answer on these questions in the next paragraph. +That's all from the kernel side. The Linux kernel prepares binary image for execution and its execution starts right after context switch and returns control to userspace when it is finished. But it does not answer on questions like where is from `_start` come and others. Let's try to answer on these questions in the next paragraph. How does program start in userspace -------------------------------------------------------------------------------- @@ -150,7 +150,7 @@ In the previous paragraph we saw how an executable file is prepared to run by th $ gcc -Wall program.c -o sum ``` -You may guess that `_start` comes from [stanard libray](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass `-v` option to gcc which will enable `verbose mode`, you will see following long output. Full output is not interesting for us, let's look at the following steps: +You may guess that `_start` comes from [standard library](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass `-v` option to gcc which will enable `verbose mode`, you will see following long output. Full output is not interesting for us, let's look at the following steps: First of all, our program should be compiled with `gcc`: @@ -329,7 +329,7 @@ mov $__libc_csu_init, %RCX_LP mov $main, %RDI_LP ``` -After stack aligning we push address of the stack, move addresses of contstructor and destructor to the `r8` and `rcx` registers and address of the `main` symbol to the `rdi`. From this moment we can call the `__libc_start_main` function from the [csu/libc-start.c](https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=0fb98f1606bab475ab5ba2d0fe08c64f83cce9df;hb=HEAD). +After stack aligning we push address of the stack, move addresses of constructor and destructor to the `r8` and `rcx` registers and address of the `main` symbol to the `rdi`. From this moment we can call the `__libc_start_main` function from the [csu/libc-start.c](https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=0fb98f1606bab475ab5ba2d0fe08c64f83cce9df;hb=HEAD). Before we look at the `__libc_start_main` function, let's add the `/lib64/crt1.o` and try to compile our program again: diff --git a/SyncPrim/sync-4.md b/SyncPrim/sync-4.md index 2e094bc..0078c27 100644 --- a/SyncPrim/sync-4.md +++ b/SyncPrim/sync-4.md @@ -239,7 +239,7 @@ __mutex_lock_slowpath(atomic_t *lock_count) } ``` -and call the `__mutex_lock_common` function with the obtained `mutex`. The `__mutex_lock_common` function starts from [preemtion](https://en.wikipedia.org/wiki/Preemption_%28computing%29) disabling until rescheduling: +and call the `__mutex_lock_common` function with the obtained `mutex`. The `__mutex_lock_common` function starts from [preemption](https://en.wikipedia.org/wiki/Preemption_%28computing%29) disabling until rescheduling: ```C preempt_disable(); @@ -279,7 +279,7 @@ while (true) { } ``` -and try to acquire a lock. First of all we try to take current owner and if the owner exists (it may not exists in a case when a process already released a mutex) and we wait for it in the `mutex_spin_on_owner` function before the owner will release a lock. If new task with higher priority have appeared during wait of the lock owner, we break the loop and go to sleep. In other case, the process already may release a lock, so we try to acquire a lock with the `mutex_try_to_acquired`. If this operation finished successfully, we set new owner for the given mutex, removes ourself from the `MCS` wait queue and exit from the `mutex_optimistic_spin` function. At this state a lock will be acquired by a process and we enable [preemtion](https://en.wikipedia.org/wiki/Preemption_%28computing%29) and exit from the `__mutex_lock_common` function: +and try to acquire a lock. First of all we try to take current owner and if the owner exists (it may not exists in a case when a process already released a mutex) and we wait for it in the `mutex_spin_on_owner` function before the owner will release a lock. If new task with higher priority have appeared during wait of the lock owner, we break the loop and go to sleep. In other case, the process already may release a lock, so we try to acquire a lock with the `mutex_try_to_acquired`. If this operation finished successfully, we set new owner for the given mutex, removes ourself from the `MCS` wait queue and exit from the `mutex_optimistic_spin` function. At this state a lock will be acquired by a process and we enable [preemption](https://en.wikipedia.org/wiki/Preemption_%28computing%29) and exit from the `__mutex_lock_common` function: ```C if (mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx)) { @@ -435,6 +435,6 @@ Links * [Memory barrier](https://en.wikipedia.org/wiki/Memory_barrier) * [Lock instruction](http://x86.renejeschke.de/html/file_module_x86_id_159.html) * [JNS instruction](http://unixwiz.net/techtips/x86-jumps.html) -* [preemtion](https://en.wikipedia.org/wiki/Preemption_%28computing%29) +* [preemption](https://en.wikipedia.org/wiki/Preemption_%28computing%29) * [Unix signals](https://en.wikipedia.org/wiki/Unix_signal) * [Previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html) diff --git a/SyncPrim/sync-6.md b/SyncPrim/sync-6.md index a74e2ad..313ee26 100644 --- a/SyncPrim/sync-6.md +++ b/SyncPrim/sync-6.md @@ -6,7 +6,7 @@ Introduction This is the sixth part of the chapter which describes [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_(computer_science)) in the Linux kernel and in the previous parts we finished to consider different [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) synchronization primitives. We will continue to learn synchronization primitives in this part and start to consider a similar synchronization primitive which can be used to avoid the `writer starvation` problem. The name of this synchronization primitive is - `seqlock` or `sequential locks`. -We know from the previous [part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) that [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) is a special lock mechanism which allows concurrent access for read-only operations, but an exclusive lock is needed for writing or modifying data. As we may guess, it may lead to a problem which is called `writer starvation`. In other words, a writer process can't acquire a lock as long as at least one reader process which aqcuired a lock holds it. So, in the situation when contention is high, it will lead to situation when a writer process which wants to acquire a lock will wait for it for a long time. +We know from the previous [part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) that [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) is a special lock mechanism which allows concurrent access for read-only operations, but an exclusive lock is needed for writing or modifying data. As we may guess, it may lead to a problem which is called `writer starvation`. In other words, a writer process can't acquire a lock as long as at least one reader process which acquired a lock holds it. So, in the situation when contention is high, it will lead to situation when a writer process which wants to acquire a lock will wait for it for a long time. The `seqlock` synchronization primitive can help solve this problem. @@ -43,9 +43,9 @@ Ok, now we know what a `seqlock` synchronization primitive is and how it is repr Sequential lock API -------------------------------------------------------------------------------- -So, now we know a little about `sequentional lock` synchronization primitive from theoretical side, let's look at its implementation in the Linux kernel. All `sequentional locks` [API](https://en.wikipedia.org/wiki/Application_programming_interface) are located in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. +So, now we know a little about `sequential lock` synchronization primitive from theoretical side, let's look at its implementation in the Linux kernel. All `sequential locks` [API](https://en.wikipedia.org/wiki/Application_programming_interface) are located in the [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. -First of all we may see that the a `sequential lock` machanism is represented by the following type: +First of all we may see that the a `sequential lock` mechanism is represented by the following type: ```C typedef struct { @@ -74,7 +74,7 @@ We saw in the previous parts that often the Linux kernel provides two approaches * `statically`; * `dynamically`. -ways. Let's look at the first approach. We are able to intialize a `seqlock_t` statically with the `DEFINE_SEQLOCK` macro: +ways. Let's look at the first approach. We are able to initialize a `seqlock_t` statically with the `DEFINE_SEQLOCK` macro: ```C #define DEFINE_SEQLOCK(x) \ @@ -116,7 +116,7 @@ So we just initialize counter of the given sequential lock to zero and additiona As I already wrote in previous parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/) we will not consider [debugging](https://en.wikipedia.org/wiki/Debugging) and [lock validator](https://www.kernel.org/doc/Documentation/locking/lockdep-design.txt) related stuff in this part. So for now we just skip the `SEQCOUNT_DEP_MAP_INIT` macro. The second field of the given `seqlock_t` is `lock` initialized with the `__SPIN_LOCK_UNLOCKED` macro which is defined in the [include/linux/spinlock_types.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/spinlock_types.h) header file. We will not consider implementation of this macro here as it just initialize [rawspinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) with architecture-specific methods (More abot spinlocks you may read in first parts of this [chapter](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/)). -We have considered the first way to initialize a sequential lock. Let's consider second way to do the same, but do it dynamically. We can initialize a sequentional lock with the `seqlock_init` macro which is defined in the same [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. +We have considered the first way to initialize a sequential lock. Let's consider second way to do the same, but do it dynamically. We can initialize a sequential lock with the `seqlock_init` macro which is defined in the same [include/linux/seqlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/seqlock.h) header file. Let's look at the implementation of this macro: diff --git a/SysCall/README.md b/SysCall/README.md index 4549e70..dccf51c 100644 --- a/SysCall/README.md +++ b/SysCall/README.md @@ -7,4 +7,4 @@ This chapter describes the `system call` concept in the linux kernel. * [vsyscall and vDSO](syscall-3.md) - third part describes `vsyscall` and `vDSO` concepts. * [How the Linux kernel runs a program](syscall-4.md) - this part describes startup process of a program. * [Implementation of the open system call](syscall-5.md) - this part describes implementation of the [open](http://man7.org/linux/man-pages/man2/open.2.html) system call. -* [Limits on resources in Linux](https://github.com/0xAX/linux-insides/blob/master/SysCall/syscall-6.md) - this part descrbies implementation of the [getrlimit/setrlimit](https://linux.die.net/man/2/getrlimit) system calls. +* [Limits on resources in Linux](https://github.com/0xAX/linux-insides/blob/master/SysCall/syscall-6.md) - this part describes implementation of the [getrlimit/setrlimit](https://linux.die.net/man/2/getrlimit) system calls. diff --git a/SysCall/syscall-4.md b/SysCall/syscall-4.md index 5557960..4b3edcc 100644 --- a/SysCall/syscall-4.md +++ b/SysCall/syscall-4.md @@ -249,7 +249,7 @@ And set the pointer to the top of new program's stack that we set in the `bprm_m bprm->exec = bprm->p; ``` -The top of the stack will contain the program filename and we store this fileneme to the `exec` field of the `linux_bprm` structure. +The top of the stack will contain the program filename and we store this filename to the `exec` field of the `linux_bprm` structure. Now we have filled `linux_bprm` structure, we call the `exec_binprm` function: diff --git a/Timers/timers-3.md b/Timers/timers-3.md index c451c48..14583cf 100644 --- a/Timers/timers-3.md +++ b/Timers/timers-3.md @@ -316,7 +316,7 @@ if (bc_local) which actually represents interrupt handler of the local timer of a processor. After this a processor will wake up. That is all about `tick broadcast` framework in the Linux kernel. We have missed some aspects of this framework, for example reprogramming of a `clock event` device and broadcast with the oneshot timer and etc. But the Linux kernel is very big, it is not real to cover all aspects of it. I think it will be interesting to dive into with yourself. -If you remember, we have started this part with the call of the `tick_init` function. We just consider the `tick_broadcast_init` function and releated theory, but the `tick_init` function contains another call of a function and this function is - `tick_nohz_init`. Let's look on the implementation of this function. +If you remember, we have started this part with the call of the `tick_init` function. We just consider the `tick_broadcast_init` function and related theory, but the `tick_init` function contains another call of a function and this function is - `tick_nohz_init`. Let's look on the implementation of this function. Initialization of dyntick related data structures -------------------------------------------------------------------------------- @@ -409,7 +409,7 @@ for_each_cpu(cpu, tick_nohz_full_mask) The `context_tracking_cpu_set` function defined in the [kernel/context_tracking.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/context_tracking.c) source code file and main point of this function is to set the `context_tracking.active` [percpu](https://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) variable to `true`. When the `active` field will be set to `true` for the certain processor, all [context switches](https://en.wikipedia.org/wiki/Context_switch) will be ignored by the Linux kernel context tracking subsystem for this processor. -That's all. This is the end of the `tick_nohz_init` function. After this `NO_HZ` related data structures will be initialzed. We didn't see API of the `NO_HZ` mode, but will see it soon. +That's all. This is the end of the `tick_nohz_init` function. After this `NO_HZ` related data structures will be initialized. We didn't see API of the `NO_HZ` mode, but will see it soon. Conclusion -------------------------------------------------------------------------------- diff --git a/Timers/timers-4.md b/Timers/timers-4.md index 5ec1775..067752c 100644 --- a/Timers/timers-4.md +++ b/Timers/timers-4.md @@ -240,7 +240,7 @@ The last step in the `init_timers` function is the call of the: open_softirq(TIMER_SOFTIRQ, run_timer_softirq); ``` -function. The `open_softirq` function may be already familar to you if you have read the ninth [part](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) about the interrupts and interrupt handling in the Linux kernel. In short words, the `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) source code file and executes initialization of the deferred interrupt handler. +function. The `open_softirq` function may be already familiar to you if you have read the ninth [part](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) about the interrupts and interrupt handling in the Linux kernel. In short words, the `open_softirq` function defined in the [kernel/softirq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/kernel/softirq.c) source code file and executes initialization of the deferred interrupt handler. In our case the deferred function is the `run_timer_softirq` function that is will be called after a hardware interrupt in the `do_IRQ` function which defined in the [arch/x86/kernel/irq.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/irq.c) source code file. The main point of this function is to handle a software dynamic timer. The Linux kernel does not do this thing during the hardware timer interrupt handling because this is time consuming operation. @@ -383,9 +383,9 @@ function which fields the given `timer` with default values. The second way is t __TIMER_INITIALIZER((_function), (_expires), (_data), 0) ``` -macro which will initilize the given `timer_list` structure too. +macro which will initialize the given `timer_list` structure too. -After a `dynamic timer` is initialzed we can start this `timer` with the call of the: +After a `dynamic timer` is initialized we can start this `timer` with the call of the: ```C void add_timer(struct timer_list * timer); @@ -404,7 +404,7 @@ That's all. Conclusion -------------------------------------------------------------------------------- -This is the end of the fourth part of the chapter that describes timers and timer management related stuff in the Linux kernel. In the previous part we got acquainted with the two new concepts: the `tick broadcast` framework and the `NO_HZ` mode. In this part we continued to dive into time managemented related stuff and got acquainted with the new concept - `dynamic timer` or software timer. We didn't saw implementation of a `dynamic timers` management code in details in this part but saw data structures and API around this concept. +This is the end of the fourth part of the chapter that describes timers and timer management related stuff in the Linux kernel. In the previous part we got acquainted with the two new concepts: the `tick broadcast` framework and the `NO_HZ` mode. In this part we continued to dive into time management related stuff and got acquainted with the new concept - `dynamic timer` or software timer. We didn't saw implementation of a `dynamic timers` management code in details in this part but saw data structures and API around this concept. In the next part we will continue to dive into timer management related things in the Linux kernel and will see new concept for us - `timers`. diff --git a/contributors.md b/contributors.md index 59aace9..eb4d34d 100644 --- a/contributors.md +++ b/contributors.md @@ -106,3 +106,4 @@ Thank you to all contributors: * [Sachin Patil](https://github.com/psachin) * [Stéphan Gorget](https://github.com/phantez) * [Adrian Reyes](https://github.com/int3rrupt) +* [Chandan Rai](https://github.com/crowchirp) diff --git a/interrupts/interrupts-3.md b/interrupts/interrupts-3.md index 55abe0e..94c03b0 100644 --- a/interrupts/interrupts-3.md +++ b/interrupts/interrupts-3.md @@ -6,7 +6,7 @@ Exception Handling This is the third part of the [chapter](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) about an interrupts and an exceptions handling in the Linux kernel and in the previous [part](http://0xax.gitbooks.io/linux-insides/content/interrupts/index.html) we stopped at the `setup_arch` function from the [arch/x86/kernel/setup.c](https://github.com/torvalds/linux/blame/master/arch/x86/kernel/setup.c) source code file. -We already know that this function executes initialization of architecture-specfic stuff. In our case the `setup_arch` function does [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture related initializations. The `setup_arch` is big function, and in the previous part we stopped on the setting of the two exceptions handlers for the two following exceptions: +We already know that this function executes initialization of architecture-specific stuff. In our case the `setup_arch` function does [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture related initializations. The `setup_arch` is big function, and in the previous part we stopped on the setting of the two exceptions handlers for the two following exceptions: * `#DB` - debug exception, transfers control from the interrupted process to the debug handler; * `#BP` - breakpoint exception, caused by the `int 3` instruction. @@ -124,7 +124,7 @@ and asmlinkage void int3(void); ``` -You may note `asmlinkage` directive in definitions of these functions. The directive is the special specificator of the [gcc](http://en.wikipedia.org/wiki/GNU_Compiler_Collection). Actually for a `C` functions which are called from assembly, we need in explicit declaration of the function calling convention. In our case, if function maked with `asmlinkage` descriptor, then `gcc` will compile the function to retrieve parameters from stack. +You may note `asmlinkage` directive in definitions of these functions. The directive is the special specificator of the [gcc](http://en.wikipedia.org/wiki/GNU_Compiler_Collection). Actually for a `C` functions which are called from assembly, we need in explicit declaration of the function calling convention. In our case, if function made with `asmlinkage` descriptor, then `gcc` will compile the function to retrieve parameters from stack. So, both handlers are defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembly source code file with the `idtentry` macro: @@ -425,12 +425,12 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code); will be for `int 3` exception. In this part we will not see implementations of secondary handlers, because of they are very specific, but will see some of them in one of next parts. -We just considered first case when an exception occured in userspace. Let's consider last two. +We just considered first case when an exception occurred in userspace. Let's consider last two. -An exception with paranoid > 0 occured in kernelspace +An exception with paranoid > 0 occurred in kernelspace -------------------------------------------------------------------------------- -In this case an exception was occured in kernelspace and `idtentry` macro is defined with `paranoid=1` for this exception. This value of `paranoid` means that we should use slower way that we saw in the beginning of this part to check do we really came from kernelspace or not. The `paranoid_entry` routing allows us to know this: +In this case an exception was occurred in kernelspace and `idtentry` macro is defined with `paranoid=1` for this exception. This value of `paranoid` means that we should use slower way that we saw in the beginning of this part to check do we really came from kernelspace or not. The `paranoid_entry` routing allows us to know this: ```assembly ENTRY(paranoid_entry) @@ -448,7 +448,7 @@ ENTRY(paranoid_entry) END(paranoid_entry) ``` -As you may see, this function representes the same that we covered before. We use second (slow) method to get information about previous state of an interrupted task. As we checked this and executed `SWAPGS` in a case if we came from userspace, we should to do the same that we did before: We need to put pointer to a strucutre which holds general purpose registers to the `%rdi` (which will be first parameter of a secondary handler) and put error code if an exception provides it to the `%rsi` (which will be second parameter of a secondary handler): +As you may see, this function represents the same that we covered before. We use second (slow) method to get information about previous state of an interrupted task. As we checked this and executed `SWAPGS` in a case if we came from userspace, we should to do the same that we did before: We need to put pointer to a structure which holds general purpose registers to the `%rdi` (which will be first parameter of a secondary handler) and put error code if an exception provides it to the `%rsi` (which will be second parameter of a secondary handler): ```assembly movq %rsp, %rdi diff --git a/interrupts/interrupts-6.md b/interrupts/interrupts-6.md index 257796c..65f9b5d 100644 --- a/interrupts/interrupts-6.md +++ b/interrupts/interrupts-6.md @@ -402,7 +402,7 @@ First of all the `math_error` function defines current interrupted task, address return; ``` -After this we check that we are from the kernel mode and if yes we will try to fix an excetpion with the `fixup_exception` function. If we cannot we fill the task with the exception's error code and vector number and die: +After this we check that we are from the kernel mode and if yes we will try to fix an exception with the `fixup_exception` function. If we cannot we fill the task with the exception's error code and vector number and die: ```C if (!user_mode(regs)) { diff --git a/mm/linux-mm-2.md b/mm/linux-mm-2.md index 7d1fe56..2aa335c 100644 --- a/mm/linux-mm-2.md +++ b/mm/linux-mm-2.md @@ -92,7 +92,7 @@ The `virt_to_fix` takes a virtual address, checks that this address is between ` As we may see, the `__virt_to_fix` macro clears the first `12` bits in the given virtual address, subtracts it from the last address the of `fix-mapped` area (`FIXADDR_TOP`) and shifts the result right on `PAGE_SHIFT` which is `12`. Let me explain how it works. -As in previous example (in `__fix_to_virt` macro), we start from the top of the fix-mapped area. We also go back to bottom from the top to search an index of a fix-mapped area corresponding to the given virtual address. As you may see, forst of all we will clear the first `12` bits in the given virtual address with `x & PAGE_MASK` expression. This allows us to get base address of page. We need to do this for case when the given virtual address points somewhere in a beginning/middle or end of a page, but not to the base address of it. At the next step subtract this from the `FIXADDR_TOP` and this gives us virtual address of a correspinding page in a fix-mapped area. In the end we just divide value of this address on `PAGE_SHIFT`. This gives us index of a fix-mapped area corresponding to the given virtual address. It may looks hard, but if you will go through this step by step, you will be sure that the `__virt_to_fix` macro is pretty easy. +As in previous example (in `__fix_to_virt` macro), we start from the top of the fix-mapped area. We also go back to bottom from the top to search an index of a fix-mapped area corresponding to the given virtual address. As you may see, first of all we will clear the first `12` bits in the given virtual address with `x & PAGE_MASK` expression. This allows us to get base address of page. We need to do this for case when the given virtual address points somewhere in a beginning/middle or end of a page, but not to the base address of it. At the next step subtract this from the `FIXADDR_TOP` and this gives us virtual address of a corresponding page in a fix-mapped area. In the end we just divide value of this address on `PAGE_SHIFT`. This gives us index of a fix-mapped area corresponding to the given virtual address. It may looks hard, but if you will go through this step by step, you will be sure that the `__virt_to_fix` macro is pretty easy. That's all. For this moment we know a little about `fix-mapped` addresses, but this is enough to go next. @@ -161,7 +161,7 @@ struct resource { }; ``` -and contains start and end addresses of the resource, the name, etc. Every `resource` structure contains pointers to the `parent`, `sibling` and `child` resources. As it has a parent and a childs, it means that every subset of resources has root `resource` structure. For example, for `I/O` ports it is the `ioport_resource` structure: +and contains start and end addresses of the resource, the name, etc. Every `resource` structure contains pointers to the `parent`, `sibling` and `child` resources. As it has a parent and a child, it means that every subset of resources has root `resource` structure. For example, for `I/O` ports it is the `ioport_resource` structure: ```C struct resource ioport_resource = { diff --git a/mm/linux-mm-3.md b/mm/linux-mm-3.md index 9ac6d2c..af9ba99 100644 --- a/mm/linux-mm-3.md +++ b/mm/linux-mm-3.md @@ -67,7 +67,7 @@ So, before we will move on to the non-early [memory management](https://en.wikip As you already may guess from the title of this part, we will start to consider memory mechanisms from the [kmemcheck](https://www.kernel.org/doc/Documentation/kmemcheck.txt). As we always did in other [chapters](https://0xax.gitbooks.io/linux-insides/content/), we will start to consider from theoretical side and will learn what is `kmemcheck` mechanism in general and only after this, we will see how it is implemented in the Linux kernel. -So let's start. What is it `kmemcheck` in the Linux kernel? As you may gues from the name of this mechanism, the `kmemcheck` checks memory. That's true. Main point of the `kmemcheck` mechanism is to check that some kernel code accesses `uninitialized memory`. Let's take following simple [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) program: +So let's start. What is it `kmemcheck` in the Linux kernel? As you may guess from the name of this mechanism, the `kmemcheck` checks memory. That's true. Main point of the `kmemcheck` mechanism is to check that some kernel code accesses `uninitialized memory`. Let's take following simple [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) program: ```C #include @@ -114,7 +114,7 @@ The [compiler](https://en.wikipedia.org/wiki/GNU_Compiler_Collection) will not s ... ``` -Actually the `kmemcheck` mechanism does the same for the kernel, what the `valgrind` does for userspace programs. It check unitilized memory. +Actually the `kmemcheck` mechanism does the same for the kernel, what the `valgrind` does for userspace programs. It check uninitialized memory. To enable this mechanism in the Linux kernel, you need to enable the `CONFIG_KMEMCHECK` kernel configuration option in the: @@ -148,14 +148,14 @@ Ok, so we know that `kmemcheck` provides mechanism to check usage of `uninitiali struct my_struct *my_struct = kmalloc(sizeof(struct my_struct), GFP_KERNEL); ``` -or in other words somebody wants to access a [page](https://en.wikipedia.org/wiki/Page_%28computer_memory%29), a [page fault](https://en.wikipedia.org/wiki/Page_fault) exception is generated. This is achieved by the fact that the `kmemcheck` marks memory pages as `non-present` (more about this you can read in the special part which is devoted to [paging](https://0xax.gitbooks.io/linux-insides/content/Theory/Paging.html)). If a `page fault` exception is occured, the exception handler knows about it and in a case when the `kmemcheck` is enabled it transfers control to it. After the `kmemcheck` will finish its checks, the page will be marked as `present` and the interrupted code will be able to continue execution. There is little subtlety in this chain. When the first instruction of interrupted code will be executed, the `kmemcheck` will mark the page as `non-present` again. In this way next access to memory will be catched again. +or in other words somebody wants to access a [page](https://en.wikipedia.org/wiki/Page_%28computer_memory%29), a [page fault](https://en.wikipedia.org/wiki/Page_fault) exception is generated. This is achieved by the fact that the `kmemcheck` marks memory pages as `non-present` (more about this you can read in the special part which is devoted to [paging](https://0xax.gitbooks.io/linux-insides/content/Theory/Paging.html)). If a `page fault` exception is occurred, the exception handler knows about it and in a case when the `kmemcheck` is enabled it transfers control to it. After the `kmemcheck` will finish its checks, the page will be marked as `present` and the interrupted code will be able to continue execution. There is little subtlety in this chain. When the first instruction of interrupted code will be executed, the `kmemcheck` will mark the page as `non-present` again. In this way next access to memory will be caught again. We just considered the `kmemcheck` mechanism from theoretical side. Now let's consider how it is implemented in the Linux kernel. Implementation of the `kmemcheck` mechanism in the Linux kernel -------------------------------------------------------------------------------- -So, now we know what is it `kmemcheck` and what it does in the Linux kernel. Time to see at its implementation in the Linux kernel. Implementation of the `kmemcheck` is splitted in two parts. The first is generic part is located in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and the second [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture-specific part is located in the [arch/x86/mm/kmemcheck](https://github.com/torvalds/linux/tree/master/arch/x86/mm/kmemcheck) directory. +So, now we know what is it `kmemcheck` and what it does in the Linux kernel. Time to see at its implementation in the Linux kernel. Implementation of the `kmemcheck` is split in two parts. The first is generic part is located in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and the second [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture-specific part is located in the [arch/x86/mm/kmemcheck](https://github.com/torvalds/linux/tree/master/arch/x86/mm/kmemcheck) directory. Let's start from the initialization of this mechanism. We already know that to enable the `kmemcheck` mechanism in the Linux kernel, we must enable the `CONFIG_KMEMCHECK` kernel configuration option. But besides this, we need to pass one of following parameters: @@ -190,7 +190,7 @@ early_param("kmemcheck", param_kmemcheck); As we already saw, the `param_kmemcheck` may have one of the following values: `0` (enabled), `1` (disabled) or `2` (one-shot). The implementation of the `param_kmemcheck` is pretty simple. We just convert string value of the `kmemcheck` command line option to integer representation and set it to the `kmemcheck_enabled` variable. -The second stage will be executed during initialization of the Linux kernel, rather during intialization of early [initcalls](https://0xax.gitbooks.io/linux-insides/content/Concepts/initcall.html). The second stage is represented by the `kmemcheck_init`: +The second stage will be executed during initialization of the Linux kernel, rather during initialization of early [initcalls](https://0xax.gitbooks.io/linux-insides/content/Concepts/initcall.html). The second stage is represented by the `kmemcheck_init`: ```C int __init kmemcheck_init(void) @@ -236,7 +236,7 @@ if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) { } ``` -So, here we check that the if `kmemcheck` is enabled and the `SLAB_NOTRACK` bit is not set in flags we set `non-present` bit for the just allocated page. The `SLAB_NOTRACK` bit tell us to not track uninitialized memory. Additionally we check if a cache object has constructor (details will be considered in next parts) we mark allocated page as uninitilized or unallocated in other way. The `kmemcheck_alloc_shadow` function is defined in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and does following things: +So, here we check that the if `kmemcheck` is enabled and the `SLAB_NOTRACK` bit is not set in flags we set `non-present` bit for the just allocated page. The `SLAB_NOTRACK` bit tell us to not track uninitialized memory. Additionally we check if a cache object has constructor (details will be considered in next parts) we mark allocated page as uninitialized or unallocated in other way. The `kmemcheck_alloc_shadow` function is defined in the [mm/kmemcheck.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/mm/kmemcheck.c) source code file and does following things: ```C void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node) @@ -276,7 +276,7 @@ void kmemcheck_hide_pages(struct page *p, unsigned int n) } ``` -Here we go through all pages and and tries to get `page table entry` for each page. If this operation was successful, we unset present bit and set hidden bit in each page. In the end we flush [translation lookaside buffer](https://en.wikipedia.org/wiki/Translation_lookaside_buffer), because some pages was changed. From this point allocated pages are tracked by the `kmemcheck`. Now, as `present` bit is unset, the [page fault](https://en.wikipedia.org/wiki/Page_fault) execution will be occured right after the `kmalloc` will return pointer to allocated space and a code will try to access this memory. +Here we go through all pages and and tries to get `page table entry` for each page. If this operation was successful, we unset present bit and set hidden bit in each page. In the end we flush [translation lookaside buffer](https://en.wikipedia.org/wiki/Translation_lookaside_buffer), because some pages was changed. From this point allocated pages are tracked by the `kmemcheck`. Now, as `present` bit is unset, the [page fault](https://en.wikipedia.org/wiki/Page_fault) execution will be occurred right after the `kmalloc` will return pointer to allocated space and a code will try to access this memory. As you may remember from the [second part](https://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) of the Linux kernel initialization chapter, the `page fault` handler is located in the [arch/x86/mm/fault.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/mm/fault.c) source code file and represented by the `do_page_fault` function. We can see following check from the beginning of the `do_page_fault` function: @@ -296,7 +296,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, } ``` -The `kmemcheck_active` gets `kmemcheck_context` [per-cpu](https://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) structure and return the result of comparision of the `balance` field of this structure with zero: +The `kmemcheck_active` gets `kmemcheck_context` [per-cpu](https://0xax.gitbooks.io/linux-insides/content/Concepts/per-cpu.html) structure and return the result of comparison of the `balance` field of this structure with zero: ``` bool kmemcheck_active(struct pt_regs *regs) @@ -307,7 +307,7 @@ bool kmemcheck_active(struct pt_regs *regs) } ``` -The `kmemcheck_context` is structure which describes current state of the `kmemcheck` mechanism. It stored unitialized addresses, number of such addresses and etc. The `balance` field of this structure represents current state of the `kmemcheck` or in other words it can tell us did `kmemcheck` already hid pages or not yet. If the `data->balance` is greater than zero, the `kmemcheck_hide` function will be called. This means than `kmemecheck` already set `present` bit for given pages and now we need to hide pages again to cause next step to page fault. This function will hide addresses of pages again by unsetting of `present` bit. This means that one session of `kmemcheck` already finished and new page fault occured. At the first step the `kmemcheck_active` will return false as the `data->balance` is zero for the start and the `kmemcheck_hide` will not be called. Next, we may see following line of code in the `do_page_fault`: +The `kmemcheck_context` is structure which describes current state of the `kmemcheck` mechanism. It stored uninitialized addresses, number of such addresses and etc. The `balance` field of this structure represents current state of the `kmemcheck` or in other words it can tell us did `kmemcheck` already hid pages or not yet. If the `data->balance` is greater than zero, the `kmemcheck_hide` function will be called. This means than `kmemecheck` already set `present` bit for given pages and now we need to hide pages again to cause next step to page fault. This function will hide addresses of pages again by unsetting of `present` bit. This means that one session of `kmemcheck` already finished and new page fault occurred. At the first step the `kmemcheck_active` will return false as the `data->balance` is zero for the start and the `kmemcheck_hide` will not be called. Next, we may see following line of code in the `do_page_fault`: ```C if (kmemcheck_fault(regs, address, error_code)) @@ -403,7 +403,7 @@ if (!(regs->flags & X86_EFLAGS_TF)) data->flags = regs->flags; ``` -We need to do it because we need to hide pages again after first executed instruction after a page fault will be handled. In a case when the `TF` flag, so the processor will switch into single-step mode after the first instruction will be executed. In this case `debug` exception will occured. From this moment pages will be hidden again and execution will be continued. As pages hidden from this moment, page fault exception will occur again and `kmemcheck` continue to check/collect errors again and print them from time to time. +We need to do it because we need to hide pages again after first executed instruction after a page fault will be handled. In a case when the `TF` flag, so the processor will switch into single-step mode after the first instruction will be executed. In this case `debug` exception will occurred. From this moment pages will be hidden again and execution will be continued. As pages hidden from this moment, page fault exception will occur again and `kmemcheck` continue to check/collect errors again and print them from time to time. That's all. From 976c7754714867778eda749aa31087c760bc8d16 Mon Sep 17 00:00:00 2001 From: Chandan Rai Date: Wed, 2 Aug 2017 00:44:53 +0530 Subject: [PATCH 011/179] corrected typos --- Initialization/linux-initialization-8.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Initialization/linux-initialization-8.md b/Initialization/linux-initialization-8.md index 24da32c..6d98f14 100644 --- a/Initialization/linux-initialization-8.md +++ b/Initialization/linux-initialization-8.md @@ -58,7 +58,7 @@ void switch_to_new_gdt(int cpu) } ``` -The `gdt_descr` variable represents pointer to the `GDT` descriptor here (we already saw defnition of a `desc_ptr` structure in the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) part). We get the address and the size of the `GDT` descriptor for the `CPU` with the given `id`. The `GDT_SIZE` is `256` or: +The `gdt_descr` variable represents pointer to the `GDT` descriptor here (we already saw definition of a `desc_ptr` structure in the [Early interrupt and exception handling](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-2.html) part). We get the address and the size of the `GDT` descriptor for the `CPU` with the given `id`. The `GDT_SIZE` is `256` or: ```C #define GDT_SIZE (GDT_ENTRIES * 8) @@ -270,7 +270,7 @@ Our current point is the `sched_init` function from the [kernel/sched/core.c](ht sched_clock_init(); ``` -The `sched_clock_init` is pretty easy function and as we may see it just sets `sched_clock_init` varaible: +The `sched_clock_init` is pretty easy function and as we may see it just sets `sched_clock_init` variable: ```C void sched_clock_init(void) @@ -320,9 +320,9 @@ The `SCHED_NORMAL` is used for the most normal applications, the amount of cpu e The `real-time` policies are also supported for the time-critical applications: `SCHED_FIFO` and `SCHED_RR`. If you've read something about the Linux kernel scheduler, you can know that it is modular. It means that it supports different algorithms to schedule different types of processes. Usually this modularity is called `scheduler classes`. These modules encapsulate scheduling policy details and are handled by the scheduler core without knowing too much about them. -Now let's get back to the our code and look on the two configuration options: `CONFIG_FAIR_GROUP_SCHED` and `CONFIG_RT_GROUP_SCHED`. The least unit which scheduler operates is an individual task or thread. But a process is not only one type of entities of which the scheduller may operate. Both of these options provides support for group scheduling. The first one option provides support for group scheduling with `completely fair scheduler` policies and the second with `real-time` policies respectively. +Now let's get back to the our code and look on the two configuration options: `CONFIG_FAIR_GROUP_SCHED` and `CONFIG_RT_GROUP_SCHED`. The least unit which scheduler operates is an individual task or thread. But a process is not only one type of entities of which the scheduler may operate. Both of these options provides support for group scheduling. The first one option provides support for group scheduling with `completely fair scheduler` policies and the second with `real-time` policies respectively. -In simple words, group scheduling is a feature that allows us to schedule a set of tasks as if a single task. For example, if you create a group with two tasks on the group, then this group is just like one normal task, from the kernel perspective. After a group is scheduled, the scheduler will pick a task from this group and it will be scheduled inside the group. So, such mechanism allows us to build hierarchies and manage their resources. Although a minimal unit of scheduling is a process, the Linux kernel scheduler does not use `task_struct` structure under the hood. There is special `sched_entity` strcture that is used by the Linux kernel scheduler as scheduling unit. +In simple words, group scheduling is a feature that allows us to schedule a set of tasks as if a single task. For example, if you create a group with two tasks on the group, then this group is just like one normal task, from the kernel perspective. After a group is scheduled, the scheduler will pick a task from this group and it will be scheduled inside the group. So, such mechanism allows us to build hierarchies and manage their resources. Although a minimal unit of scheduling is a process, the Linux kernel scheduler does not use `task_struct` structure under the hood. There is special `sched_entity` structure that is used by the Linux kernel scheduler as scheduling unit. So, the current goal is to calculate a space to allocate for a `sched_entity(ies)` of the root task group and we do it two times with: @@ -335,7 +335,7 @@ So, the current goal is to calculate a space to allocate for a `sched_entity(ies #endif ``` -The first is for case when scheduling of task groups is enabled with `completely fair` scheduler and the second is for the same purpose by in a case of `real-time` scheduler. So here we calculate size which is equal to size of a pointer multipled on amount of CPUs in the system and multipled to `2`. We need to multiply this on `2` as we will need to allocate a space for two things: +The first is for case when scheduling of task groups is enabled with `completely fair` scheduler and the second is for the same purpose by in a case of `real-time` scheduler. So here we calculate size which is equal to size of a pointer multiplied on amount of CPUs in the system and multiplied to `2`. We need to multiply this on `2` as we will need to allocate a space for two things: * scheduler entity structure; * `runqueue`. From c546f39a95b8a08a71aaf728928e89e0de7db01c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Cayrou Date: Fri, 4 Aug 2017 12:22:11 +0200 Subject: [PATCH 012/179] Fix typo linux-initialization-3 --- Initialization/linux-initialization-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-3.md b/Initialization/linux-initialization-3.md index 520c718..2784e1c 100644 --- a/Initialization/linux-initialization-3.md +++ b/Initialization/linux-initialization-3.md @@ -260,7 +260,7 @@ and reserves memory region for the given base address and size. `memblock_reserv First touch of the linux kernel memory manager framework -------------------------------------------------------------------------------- -In the previous paragraph we stopped at the call of the `memblock_reserve` function and as i sad before it is the first function from the memory manager framework. Let's try to understand how it works. `memblock_reserve` function just calls: +In the previous paragraph we stopped at the call of the `memblock_reserve` function and as i said before it is the first function from the memory manager framework. Let's try to understand how it works. `memblock_reserve` function just calls: ```C memblock_reserve_region(base, size, MAX_NUMNODES, 0); From b96b249fdf1ab1e5047eced2d32644987216c31a Mon Sep 17 00:00:00 2001 From: JB Cayrou Date: Fri, 4 Aug 2017 15:44:22 +0200 Subject: [PATCH 013/179] Fix arch_local_irq_disable C code extract In linux-initialization-4.md part, 'arch_local_irq_disable' is explained but the code displayed is the 'arch_local_irq_enable' function. --- Initialization/linux-initialization-4.md | 6 +++--- contributors.md | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Initialization/linux-initialization-4.md b/Initialization/linux-initialization-4.md index 058ed4b..d8bf219 100644 --- a/Initialization/linux-initialization-4.md +++ b/Initialization/linux-initialization-4.md @@ -218,13 +218,13 @@ this_cpu_write(irq_stack_union.stack_canary, canary); // read below about this_c Again, we will not dive into details here, we will cover it in the part about [IRQs](http://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29). As canary is set, we disable local and early boot IRQs and register the bootstrap CPU in the CPU maps. We disable local IRQs (interrupts for current CPU) with the `local_irq_disable` macro which expands to the call of the `arch_local_irq_disable` function from [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h): ```C -static inline notrace void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_disable(void) { - native_irq_enable(); + native_irq_disable(); } ``` -Where `native_irq_enable` is `cli` instruction for `x86_64`. As interrupts are disabled we can register the current CPU with the given ID in the CPU bitmap. +Where `native_irq_disable` is `cli` instruction for `x86_64`. As interrupts are disabled we can register the current CPU with the given ID in the CPU bitmap. The first processor activation --------------------------------------------------------------------------------- diff --git a/contributors.md b/contributors.md index 59aace9..f1da0e7 100644 --- a/contributors.md +++ b/contributors.md @@ -106,3 +106,4 @@ Thank you to all contributors: * [Sachin Patil](https://github.com/psachin) * [Stéphan Gorget](https://github.com/phantez) * [Adrian Reyes](https://github.com/int3rrupt) +* [JB Cayrou](https://github.com/jbcayrou) From 4b0704fecf216ca50a2ccecc9022e897849a133a Mon Sep 17 00:00:00 2001 From: Cornelius Diekmann Date: Thu, 10 Aug 2017 14:15:14 +0200 Subject: [PATCH 014/179] Minor language improvement There are multiple different system calls. Starting the introduction in plural gives a better bridge to the examples "like to read or to write to a file, to open a socket" ... --- SysCall/syscall-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SysCall/syscall-3.md b/SysCall/syscall-3.md index 52b0db7..e3435ea 100644 --- a/SysCall/syscall-3.md +++ b/SysCall/syscall-3.md @@ -6,7 +6,7 @@ vsyscalls and vDSO This is the third part of the [chapter](http://0xax.gitbooks.io/linux-insides/content/SysCall/index.html) that describes system calls in the Linux kernel and we saw preparations after a system call caused by a userspace application and process of handling of a system call in the previous [part](http://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-2.html). In this part we will look at two concepts that are very close to the system call concept, they are called `vsyscall` and `vdso`. -We already know what is a `system call`. This is special routine in the Linux kernel which userspace application asks to do privileged tasks, like to read or to write to a file, to open a socket and etc. As you may know, invoking a system call is an expensive operation in the Linux kernel, because the processor must interrupt the currently executing task and switch context to kernel mode, subsequently jumping again into userspace after the system call handler finishes its work. These two mechanisms - `vsyscall` and `vdso` are designed to speed up this process for certain system calls and in this part we will try to understand how these mechanisms work. +We already know what `system call`s are. They are special routines in the Linux kernel which userspace applications ask to do privileged tasks, like to read or to write to a file, to open a socket, etc. As you may know, invoking a system call is an expensive operation in the Linux kernel, because the processor must interrupt the currently executing task and switch context to kernel mode, subsequently jumping again into userspace after the system call handler finishes its work. These two mechanisms - `vsyscall` and `vdso` are designed to speed up this process for certain system calls and in this part we will try to understand how these mechanisms work. Introduction to vsyscalls -------------------------------------------------------------------------------- From a87d46fd660ad6b8bcc2a9685ff7df4401c0760e Mon Sep 17 00:00:00 2001 From: Cornelius Diekmann Date: Thu, 10 Aug 2017 14:55:35 +0200 Subject: [PATCH 015/179] Clarify: vDSO is linked automatically with glibc Change is partly a verbatim copy of https://www.kernel.org/doc/Documentation/ABI/stable/vdso Quote: "Programs that dynamically link to glibc will use the vDSO automatically. Otherwise, you can use the reference parser in tools/testing/selftests/vDSO/parse_vdso.c." The old version of the book was slightly imprecise. It was unclear to me whether this is an optional or a default behavior. --- SysCall/syscall-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SysCall/syscall-3.md b/SysCall/syscall-3.md index e3435ea..40b1124 100644 --- a/SysCall/syscall-3.md +++ b/SysCall/syscall-3.md @@ -230,7 +230,7 @@ That's all. Now let's look on the modern concept - `vDSO`. Introduction to vDSO -------------------------------------------------------------------------------- -As I already wrote above, `vsyscall` is an obsolete concept and replaced by the `vDSO` or `virtual dynamic shared object`. The main difference between the `vsyscall` and `vDSO` mechanisms is that `vDSO` maps memory pages into each process in a shared object [form](https://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries), but `vsyscall` is static in memory and has the same address every time. For the `x86_64` architecture it is called -`linux-vdso.so.1`. All userspace applications linked with this shared library via the `glibc`. For example: +As I already wrote above, `vsyscall` is an obsolete concept and replaced by the `vDSO` or `virtual dynamic shared object`. The main difference between the `vsyscall` and `vDSO` mechanisms is that `vDSO` maps memory pages into each process in a shared object [form](https://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries), but `vsyscall` is static in memory and has the same address every time. For the `x86_64` architecture it is called -`linux-vdso.so.1`. All userspace applications that dynamically link to `glibc` will use the `vDSO` automatically. For example: ``` ~$ ldd /bin/uname From 8dbc839a8a82362ab91f942b8291245e08fccf8f Mon Sep 17 00:00:00 2001 From: Cornelius Diekmann Date: Thu, 10 Aug 2017 18:36:59 +0200 Subject: [PATCH 016/179] Language: Added articles. Content: exec* family Language improvement: Added articles like `the`, `a`, ... Content: The `exec*` family is a `C` wrapper, the syscall is usually only `execve`. --- Misc/program_startup.md | 62 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Misc/program_startup.md b/Misc/program_startup.md index afc31a2..e787ca5 100644 --- a/Misc/program_startup.md +++ b/Misc/program_startup.md @@ -6,9 +6,9 @@ Introduction Despite the [linux-insides](https://www.gitbook.com/book/0xax/linux-insides/details) described mostly Linux kernel related stuff, I have decided to write this one part which mostly related to userspace. -There is already fourth [part](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html) of [System calls](https://en.wikipedia.org/wiki/System_call) chapter which describes what does the Linux kernel do when we want to start a program. In this part I want to explore what happens when we run a program on Linux machine from userspace perspective. +There is already fourth [part](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html) of [System calls](https://en.wikipedia.org/wiki/System_call) chapter which describes what does the Linux kernel do when we want to start a program. In this part I want to explore what happens when we run a program on a Linux machine from userspace perspective. -I don't know how about you, but in my university I learn that a `C` program starts to execute from the function which is called `main`. And that's partly true. Whenever we are starting to write new program, we start our program from the following lines of code: +I don't know how about you, but in my university I learn that a `C` program starts executing from the function which is called `main`. And that's partly true. Whenever we are starting to write new program, we start our program from the following lines of code: ```C int main(int argc, char *argv[]) { @@ -16,7 +16,7 @@ int main(int argc, char *argv[]) { } ``` -But if you are interested in low-level programming, you may already know that the `main` function isn't actual entry point of a program. You will believe it's true after you look at this simple program in debugger: +But if you are interested in low-level programming, you may already know that the `main` function isn't the actual entry point of a program. You will believe it's true after you look at this simple program in debugger: ```C int main(int argc, char *argv[]) { @@ -69,7 +69,7 @@ Local exec file: 0x0000000000601034 - 0x0000000000601038 is .bss ``` -Note on `Entry point: 0x400430` line. Now we know the actual address of entry point of our program. Let's put breakpoint by this address, run our program and see what happens: +Note on `Entry point: 0x400430` line. Now we know the actual address of entry point of our program. Let's put a breakpoint by this address, run our program and see what happens: ``` (gdb) break *0x400430 @@ -80,9 +80,9 @@ Starting program: /home/alex/program Breakpoint 1, 0x0000000000400430 in _start () ``` -Interesting. We don't see execution of `main` function here, but we have seen that another function is called. This function is `_start` and as debugger shows us, it is actual entry point of our program. Where is this function from? Who does call `main` and when is it called. I will try to answer all the questions in the following post. +Interesting. We don't see execution of the `main` function here, but we have seen that another function is called. This function is `_start` and as our debugger shows us, it is the actual entry point of our program. Where is this function from? Who does call `main` and when is it called? I will try to answer all these questions in the following post. -How kernel does start new program +How the kernel starts a new program -------------------------------------------------------------------------------- First of all, let's take a look at the following simple `C` program: @@ -119,11 +119,11 @@ $ ./sum x + y + z = 6 ``` -Ok, everything looks pretty good up to now. You may already know that there is special family of [system calls](https://en.wikipedia.org/wiki/System_call) - [exec*](http://man7.org/linux/man-pages/man3/execl.3.html) system calls. As we read in the man page: +Ok, everything looks pretty good up to now. You may already know that there is a special family of functions - [exec*](http://man7.org/linux/man-pages/man3/execl.3.html). As we read in the man page: > The exec() family of functions replaces the current process image with a new process image. -If you have read fourth [part](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html) of the chapter which describes [system calls](https://en.wikipedia.org/wiki/System_call), you may know that for example [execve](http://linux.die.net/man/2/execve) system call is defined in the [files/exec.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/fs/exec.c#L1888) source code file and looks like: +All the `exec*` functions are simple frontends to the [execve](http://man7.org/linux/man-pages/man2/execve.2.html) system call. If you have read the fourth [part](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html) of the chapter which describes [system calls](https://en.wikipedia.org/wiki/System_call), you may know that the [execve](http://linux.die.net/man/2/execve) system call is defined in the [files/exec.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/fs/exec.c#L1888) source code file and looks like: ```C SYSCALL_DEFINE3(execve, @@ -135,22 +135,22 @@ SYSCALL_DEFINE3(execve, } ``` -It takes executable file name, set of command line arguments and set of enviroment variables. As you may guess, everything is done by the `do_execve` function. I will not describe implementation of the `do_execve` function in details because you can read about this in [here](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html). But in short words, the `do_execve` function does many checks like `filename` is valid, limit of launched processes is not exceed in our system and etc. After all of these checks, this function parses our executable file which is represented in [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) format, creates memory descriptor for newly executed executable file and fills it with the appropriate values like area for the stack, heap and etc. When the setup of new binary image is done, the `start_thread` function will set up one new process. This function is architecture-specific and for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, its definition will be located in the [arch/x86/kernel/process_64.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/arch/x86/kernel/process_64.c#L239) source code file. +It takes an executable file name, set of command line arguments, and set of enviroment variables. As you may guess, everything is done by the `do_execve` function. I will not describe the implementation of the `do_execve` function in detail because you can read about this in [here](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-4.html). But in short words, the `do_execve` function does many checks like `filename` is valid, limit of launched processes is not exceed in our system and etc. After all of these checks, this function parses our executable file which is represented in [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) format, creates memory descriptor for newly executed executable file and fills it with the appropriate values like area for the stack, heap and etc. When the setup of new binary image is done, the `start_thread` function will set up one new process. This function is architecture-specific and for the [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture, its definition will be located in the [arch/x86/kernel/process_64.c](https://github.com/torvalds/linux/blob/08e4e0d0456d0ca8427b2d1ddffa30f1c3e774d7/arch/x86/kernel/process_64.c#L239) source code file. -The `start_thread` function sets new value to [segment registers](https://en.wikipedia.org/wiki/X86_memory_segmentation) and program execution address. From this point, new process is ready to start. Once the [context switch](https://en.wikipedia.org/wiki/Context_switch) will be done, control will be returned to the userspace with new values of registers and new executable will be started to execute. +The `start_thread` function sets new value to [segment registers](https://en.wikipedia.org/wiki/X86_memory_segmentation) and program execution address. From this point, our new process is ready to start. Once the [context switch](https://en.wikipedia.org/wiki/Context_switch) will be done, control will be returned to userspace with new values of registers and the new executable will be started to execute. -That's all from the kernel side. The Linux kernel prepares binary image for execution and its execution starts right after context switch and returns controll to userspace when it is finished. But it does not answer on questions like where is from `_start` come and others. Let's try to answer on these questions in the next paragraph. +That's all from the kernel side. The Linux kernel prepares the binary image for execution and its execution starts right after the context switch and returns controll to userspace when it is finished. But it does not answer our questions like where does `_start` come from and others. Let's try to answer these questions in the next paragraph. -How does program start in userspace +How does a program start in userspace -------------------------------------------------------------------------------- -In the previous paragraph we saw how an executable file is prepared to run by the Linux kernel. Let's look at the same, but from userspace side. We already know that entry point of each program is `_start` function. But where is this function from? It may came from a library. But if you remember correctly we didn't link our program with any libraries during compilation of our program: +In the previous paragraph we saw how an executable file is prepared to run by the Linux kernel. Let's look at the same, but from userspace side. We already know that the entry point of each program is its `_start` function. But where is this function from? It may came from a library. But if you remember correctly we didn't link our program with any libraries during compilation of our program: ``` $ gcc -Wall program.c -o sum ``` -You may guess that `_start` comes from [stanard libray](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass `-v` option to gcc which will enable `verbose mode`, you will see following long output. Full output is not interesting for us, let's look at the following steps: +You may guess that `_start` comes from the [stanard libray](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass the `-v` option to gcc which will enable `verbose mode`, you will see a long output. The full output is not interesting for us, let's look at the following steps: First of all, our program should be compiled with `gcc`: @@ -165,7 +165,7 @@ $ gcc -v -ggdb program.c -o sum ... ``` -The `cc1` compiler will compile our `C` source code and produce assembly `/tmp/ccvUWZkF.s` file. After this we can see that our assembly file will be compiled into object file with `GNU as` assembler: +The `cc1` compiler will compile our `C` source code and an produce assembly named `/tmp/ccvUWZkF.s` file. After this we can see that our assembly file will be compiled into object file with the `GNU as` assembler: ``` $ gcc -v -ggdb program.c -o sum @@ -200,7 +200,7 @@ $ ldd program /lib64/ld-linux-x86-64.so.2 (0x0000556198231000) ``` -as we use some stuff from there like `printf` and etc. But not only. That's why we will get error when we will pass `-nostdlib` option to the compiler: +as we use some stuff from there like `printf` and etc. But not only. That's why we will get an error when we pass `-nostdlib` option to the compiler: ``` $ gcc -nostdlib program.c -o program @@ -210,14 +210,14 @@ $ gcc -nostdlib program.c -o program collect2: error: ld returned 1 exit status ``` -Besides other errors, we also see that `_start` symbol is undefined. So now we are sure that the `_start` function comes from standard library. But even if we link it with standard library, it will not be compiled successfully anyway: +Besides other errors, we also see that `_start` symbol is undefined. So now we are sure that the `_start` function comes from standard library. But even if we link it with the standard library, it will not be compiled successfully anyway: ``` $ gcc -nostdlib -lc -ggdb program.c -o program /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400350 ``` -Ok, compiler does not complain about undefined reference of standard library functions as we linked our program with `/usr/lib64/libc.so.6`, but the `_start` symbol isn't resolved yet. Let's return to the verbose output of `gcc` and look at the parameters of `collect2`. The most important thing that we may see is that our program is linked not only with standard library, but also with some object files. The first object file is: `/lib64/crt1.o`. And if we look inside this object file with `objdump` util, we will see the `_start` symbol: +Ok, the compiler does not complain about undefined reference of standard library functions anymore as we linked our program with `/usr/lib64/libc.so.6`, but the `_start` symbol isn't resolved yet. Let's return to the verbose output of `gcc` and look at the parameters of `collect2`. The most important thing that we may see is that our program is linked not only with the standard library, but also with some object files. The first object file is: `/lib64/crt1.o`. And if we look inside this object file with `objdump`, we will see the `_start` symbol: ``` $ objdump -d /lib64/crt1.o @@ -264,7 +264,7 @@ As described in the [ELF](http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf) spe > Similarly, shared objects may have termination functions, which are executed with the atexit (BA_OS) > mechanism after the base process begins its termination sequence. -So we need to put address of termination function to the `r9` register as it will be passed `__libc_start_main` in future as sixth argument. Note that the address of the termination function initially is located in the `rdx` register. Other registers besides `rdx` and `rsp` contain unspecified values. Actually main point of the `_start` function is to call `__libc_start_main`. So the next action is to prepare for this function. +So we need to put the address of the termination function to the `r9` register as it will be passed to `__libc_start_main` in future as sixth argument. Note that the address of the termination function initially is located in the `rdx` register. Other registers besides `rdx` and `rsp` contain unspecified values. Actually the main point of the `_start` function is to call `__libc_start_main`. So the next action is to prepare for this function. The signature of the `__libc_start_main` function is located in the [csu/libc-start.c](https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=9a56dcbbaeb7ef85c495b4df9ab1d0b13454c043;hb=HEAD#l107) source code file. Let's look on it: @@ -278,7 +278,7 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **), void *stack_end) ``` -It takes address of the `main` function of a program, `argc` and `argv`. `init` and `fini` functions are constructor and destructor of the program. The `rtld_fini` is termination function which will be called after the program will be exited to terminate and free dynamic section. The last parameter of the `__libc_start_main` is the pointer to the stack of the program. Before we can call the `__libc_start_main` function, all of these parameters must be prepared and passed to it. Let's return to the [sysdeps/x86_64/start.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/start.S;h=f1b961f5ba2d6a1ebffee0005f43123c4352fbf4;hb=HEAD) assembly file and continue to see what happens before the `__libc_start_main` function will be called from there. +It takes the address of the `main` function of a program, `argc` and `argv`. `init` and `fini` functions are constructor and destructor of the program. The `rtld_fini` is the termination function which will be called after the program will be exited to terminate and free its dynamic section. The last parameter of the `__libc_start_main` is a pointer to the stack of the program. Before we can call the `__libc_start_main` function, all of these parameters must be prepared and passed to it. Let's return to the [sysdeps/x86_64/start.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/start.S;h=f1b961f5ba2d6a1ebffee0005f43123c4352fbf4;hb=HEAD) assembly file and continue to see what happens before the `__libc_start_main` function will be called from there. We can get all the arguments we need for `__libc_start_main` function from the stack. As `_start` is called, our stack looks like: @@ -296,7 +296,7 @@ We can get all the arguments we need for `__libc_start_main` function from the s +-----------------+ ``` -After we cleared `ebp` register and saved address of the termination function in the `r9` register, we pop element from the stack to the `rsi` register, so after this `rsp` will point to the `argv` array and `rsi` will contain count of command line arguemnts passed to the program: +After we cleared `ebp` register and saved the address of the termination function in the `r9` register, we pop an element from the stack to the `rsi` register, so after this `rsp` will point to the `argv` array and `rsi` will contain count of command line arguemnts passed to the program: ``` +-----------------+ @@ -310,14 +310,14 @@ After we cleared `ebp` register and saved address of the termination function in +-----------------+ ``` -After this we move address of the `argv` array to the `rdx` register +After this we move the address of the `argv` array to the `rdx` register ```assembly popq %rsi mov %RSP_LP, %RDX_LP ``` -From this moment we have `argc`, `argv`. We still need to put pointers to the construtor, destructor in appropriate registers and pass pointer to the stack. At the first following three lines we align stack to `16` bytes boundary as suggested in [ABI](https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf) and push `rax` which contains garbage: +From this moment we have `argc`cand `argv`. We still need to put pointers to the construtor, destructor in appropriate registers and pass pointer to the stack. At the first following three lines we align stack to `16` bytes boundary as suggested in [ABI](https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf) and push `rax` which contains garbage: ```assembly and $~15, %RSP_LP @@ -329,7 +329,7 @@ mov $__libc_csu_init, %RCX_LP mov $main, %RDI_LP ``` -After stack aligning we push address of the stack, move addresses of contstructor and destructor to the `r8` and `rcx` registers and address of the `main` symbol to the `rdi`. From this moment we can call the `__libc_start_main` function from the [csu/libc-start.c](https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=0fb98f1606bab475ab5ba2d0fe08c64f83cce9df;hb=HEAD). +After stack aligning we push the address of the stack, move the addresses of contstructor and destructor to the `r8` and `rcx` registers and address of the `main` symbol to the `rdi`. From this moment we can call the `__libc_start_main` function from the [csu/libc-start.c](https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=0fb98f1606bab475ab5ba2d0fe08c64f83cce9df;hb=HEAD). Before we look at the `__libc_start_main` function, let's add the `/lib64/crt1.o` and try to compile our program again: @@ -342,7 +342,7 @@ $ gcc -nostdlib /lib64/crt1.o -lc -ggdb program.c -o program collect2: error: ld returned 1 exit status ``` -Now we see another error that both `__libc_csu_fini` and `__libc_csu_init` functions are not found. We know that addresses of these two functions are passed to the `__libc_start_main` as parameters and also these functions are constructor and destructor of our programs. But what do `constructor` and `destructor` in terms of `C` program means? We already saw the quote from the [ELF](http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf) specification: +Now we see another error that both `__libc_csu_fini` and `__libc_csu_init` functions are not found. We know that the addresses of these two functions are passed to the `__libc_start_main` as parameters and also these functions are constructor and destructor of our programs. But what do `constructor` and `destructor` in terms of `C` program means? We already saw the quote from the [ELF](http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf) specification: > After the dynamic linker has built the process image and performed the relocations, each shared object > gets the opportunity to execute some initialization code. @@ -355,7 +355,7 @@ So the linker creates two special sections besides usual sections like `.text`, * `.init` * `.fini` -We can find them with `readelf` util: +We can find them with the `readelf` util: ``` $ readelf -e test | grep init @@ -365,9 +365,9 @@ $ readelf -e test | grep fini [15] .fini PROGBITS 0000000000400504 00000504 ``` -Both of these sections will be placed at the start and end of binary image and contain routines which are called constructor and destructor respectively. The main point of these routines is to do some initialization/finalization like initialization of global variables, such as [errno](http://man7.org/linux/man-pages/man3/errno.3.html), allocation and deallocation of memory for system routines and etc., before actual code of a program is executed. +Both of these sections will be placed at the start and end of the binary image and contain routines which are called constructor and destructor respectively. The main point of these routines is to do some initialization/finalization like initialization of global variables, such as [errno](http://man7.org/linux/man-pages/man3/errno.3.html), allocation and deallocation of memory for system routines and etc., before the actual code of a program is executed. -You may infer from names of these functions, they will be called before `main` function and after the `main` function. Definitions of `.init` and `.fini` sections are located in the `/lib64/crti.o` and if we add this object file: +You may infer from the names of these functions, they will be called before the `main` function and after the `main` function. Definitions of `.init` and `.fini` sections are located in the `/lib64/crti.o` and if we add this object file: ``` $ gcc -nostdlib /lib64/crt1.o /lib64/crti.o -lc -ggdb program.c -o program @@ -380,7 +380,7 @@ $ ./program Segmentation fault (core dumped) ``` -Yeah, we got segmentation fault. Let's look inside of the `lib64/crti.o` with `objdump` util: +Yeah, we got segmentation fault. Let's look inside of the `lib64/crti.o` with `objdump`: ``` $ objdump -D /lib64/crti.o @@ -420,7 +420,7 @@ _init: call PREINIT_FUNCTION ``` -It contains definition of the `.init` section and assembly code does 16-byte stack alignment and next we move address of the `PREINIT_FUNCTION` and if it is zero we don't call it: +It contains the definition of the `.init` section and assembly code does 16-byte stack alignment and next we move address of the `PREINIT_FUNCTION` and if it is zero we don't call it: ``` 00000000004003c8 <_init>: @@ -433,7 +433,7 @@ It contains definition of the `.init` section and assembly code does 16-byte sta 4003e1: c3 retq ``` -where the `PREINIT_FUNCTION` is the `__gmon_start__` which does setup for profiling. You may note that we have no return instruction in the [sysdeps/x86_64/crti.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/crti.S;h=e9d86ed08ab134a540e3dae5f97a9afb82cdb993;hb=HEAD). Actually that's why we got segmentation fault. Prolog of `_init` and `_fini` is placed in the [sysdeps/x86_64/crtn.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/crtn.S;h=e9d86ed08ab134a540e3dae5f97a9afb82cdb993;hb=HEAD) assembly file: +where the `PREINIT_FUNCTION` is the `__gmon_start__` which does setup for profiling. You may note that we have no return instruction in the [sysdeps/x86_64/crti.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/crti.S;h=e9d86ed08ab134a540e3dae5f97a9afb82cdb993;hb=HEAD). Actually that's why we got a segmentation fault. Prolog of `_init` and `_fini` is placed in the [sysdeps/x86_64/crtn.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/crtn.S;h=e9d86ed08ab134a540e3dae5f97a9afb82cdb993;hb=HEAD) assembly file: ```assembly .section .init,"ax",@progbits From 9f269b41dffa7e1bc67147c1e54212dff318d654 Mon Sep 17 00:00:00 2001 From: diekmann Date: Fri, 11 Aug 2017 12:17:23 +0200 Subject: [PATCH 017/179] Improved picture of stack layout * Added dots around envp and argv since those are arrays of pointers. While argc and NULL are just 8B, argv and envp are of variable size, usually more than 8B. The dots visualize this. * In the first image, moved rsp to point to argc. This is the initial stack and register layout at the beginning of _start. Only after libc popped the top of the stack into rsi, rsp will point to beginning of argv. (*) (*) I verified this by writing my own _start implementation: https://github.com/diekmann/x86_64-dump-startup-stack/blob/039ac7c03c4001f0cba4082b4eaf1bdbd2cfefd4/start.asm#L61 --- Misc/program_startup.md | 16 ++++++++++++---- contributors.md | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Misc/program_startup.md b/Misc/program_startup.md index e787ca5..5f680db 100644 --- a/Misc/program_startup.md +++ b/Misc/program_startup.md @@ -280,19 +280,23 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **), It takes the address of the `main` function of a program, `argc` and `argv`. `init` and `fini` functions are constructor and destructor of the program. The `rtld_fini` is the termination function which will be called after the program will be exited to terminate and free its dynamic section. The last parameter of the `__libc_start_main` is a pointer to the stack of the program. Before we can call the `__libc_start_main` function, all of these parameters must be prepared and passed to it. Let's return to the [sysdeps/x86_64/start.S](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/start.S;h=f1b961f5ba2d6a1ebffee0005f43123c4352fbf4;hb=HEAD) assembly file and continue to see what happens before the `__libc_start_main` function will be called from there. -We can get all the arguments we need for `__libc_start_main` function from the stack. As `_start` is called, our stack looks like: +We can get all the arguments we need for `__libc_start_main` function from the stack. At the very beginning, when `_start` is called, our stack looks like: ``` +-----------------+ | NULL | +-----------------+ +| ... | | envp | +| ... | +-----------------+ | NULL | +------------------ -| argv | <- rsp +| ... | +| argv | +| ... | +------------------ -| argc | +| argc | <- rsp +-----------------+ ``` @@ -302,11 +306,15 @@ After we cleared `ebp` register and saved the address of the termination functio +-----------------+ | NULL | +-----------------+ +| ... | | envp | +| ... | +-----------------+ | NULL | +------------------ -| argv | <- rsp +| ... | +| argv | +| ... | <- rsp +-----------------+ ``` diff --git a/contributors.md b/contributors.md index f1da0e7..3e3bd2f 100644 --- a/contributors.md +++ b/contributors.md @@ -107,3 +107,4 @@ Thank you to all contributors: * [Stéphan Gorget](https://github.com/phantez) * [Adrian Reyes](https://github.com/int3rrupt) * [JB Cayrou](https://github.com/jbcayrou) +* [Cornelius Diekmann](https://github.com/diekmann) From 3e9f17385102402eb14ece3305d8b6fe125456fb Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Wed, 16 Aug 2017 00:08:32 +0800 Subject: [PATCH 018/179] Fix merge conflicts for timer-7.md --- Timers/timers-7.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Timers/timers-7.md b/Timers/timers-7.md index 137ab09..ab7e026 100644 --- a/Timers/timers-7.md +++ b/Timers/timers-7.md @@ -10,11 +10,7 @@ This is the seventh and last part [chapter](https://0xax.gitbooks.io/linux-insid * `gettimeofday`; * `nanosleep`. -<<<<<<< HEAD -We will start from simple userspace [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) program and see all way from the call of the [standard library](https://en.wikipedia.org/wiki/Standard_library) function to the implementation of certain system call. As each [architecture](https://github.com/torvalds/linux/tree/master/arch) provides its own implementation of certain system call, we will consider only [x86_64](https://en.wikipedia.org/wiki/X86-64) specific implementations of system calls, as this book is related to this architecture. -======= We will start from a simple userspace [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) program and see all way from the call of the [standard library](https://en.wikipedia.org/wiki/Standard_library) function to the implementation of certain system calls. As each [architecture](https://github.com/torvalds/linux/tree/master/arch) provides its own implementation of certain system calls, we will consider only [x86_64](https://en.wikipedia.org/wiki/X86-64) specific implementations of system calls, as this book is related to this architecture. ->>>>>>> b9d8ea78bb41df5ffd2ea94b745298c91c8d171c Additionally, we will not consider the concept of system calls in this part, but only implementations of these three system calls in the Linux kernel. If you are interested in what is a `system call`, there is a special [chapter](https://0xax.gitbooks.io/linux-insides/content/SysCall/index.html) about this. From 00457714155647bb15188a8e32e69a2b1a52fcf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E4=B8=80?= Date: Sat, 2 Sep 2017 12:04:58 +0800 Subject: [PATCH 019/179] fix: ccs to css (cgroup subsystem stage) --- Cgroups/cgroups1.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cgroups/cgroups1.md b/Cgroups/cgroups1.md index f178fc6..65fccf5 100644 --- a/Cgroups/cgroups1.md +++ b/Cgroups/cgroups1.md @@ -275,7 +275,7 @@ struct cgroup_subsys { } ``` -Where for example `ccs_online` and `ccs_offline` callbacks are called after a cgroup successfully will complete all allocations and a cgroup will be before releasing respectively. The `early_init` flags marks subsystems which may/should be initialized early. The `id` and `name` fields represents unique identifier in the array of registered subsystems for a cgroup and `name` of a subsystem respectively. The last - `root` fields represents pointer to the root of of a cgroup hierarchy. +Where for example `css_online` and `css_offline` callbacks are called after a cgroup successfully will complete all allocations and a cgroup will be before releasing respectively. The `early_init` flags marks subsystems which may/should be initialized early. The `id` and `name` fields represents unique identifier in the array of registered subsystems for a cgroup and `name` of a subsystem respectively. The last - `root` fields represents pointer to the root of of a cgroup hierarchy. Of course the `cgroup_subsys` structure bigger and has other fields, but it is enough for now. Now as we got to know important structures related to `cgroups` mechanism, let's return to the `cgroup_init_early` function. Main purpose of this function is to do early initialization of some subsystems. As you already may guess, these `early` subsystems should have `cgroup_subsys->early_init = 1`. Let's look what subsystems may be initialized early. @@ -292,7 +292,7 @@ Here we may see call of the `init_cgroup_root` function which will execute initi struct cgroup_root cgrp_dfl_root; ``` -Its `cgrp` field represented by the `cgroup` structure which represents a `cgroup` as you already may guess and defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cgroup-defs.h) header file. We already know that a process which is represented by the `task_struct` in the Linux kernel. The `task_struct` does not contain direct link to a `cgroup` where this task is attached. But it may be reached via `ccs_set` field of the `task_struct`. This `ccs_set` structure holds pointer to the array of subsystem states: +Its `cgrp` field represented by the `cgroup` structure which represents a `cgroup` as you already may guess and defined in the [include/linux/cgroup-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/cgroup-defs.h) header file. We already know that a process which is represented by the `task_struct` in the Linux kernel. The `task_struct` does not contain direct link to a `cgroup` where this task is attached. But it may be reached via `css_set` field of the `task_struct`. This `css_set` structure holds pointer to the array of subsystem states: ```C struct css_set { @@ -358,7 +358,7 @@ So, the overall picture of `cgroups` related data structure is following: -So, the `init_cgroup_root` fills the `cgrp_dfl_root` with the default values. The next thing is assigning initial `ccs_set` to the `init_task` which represents first process in the system: +So, the `init_cgroup_root` fills the `cgrp_dfl_root` with the default values. The next thing is assigning initial `css_set` to the `init_task` which represents first process in the system: ```C RCU_INIT_POINTER(init_task.cgroups, &init_css_set); From 4f16103d446f8877bd140f5dbcb795f225c4c43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E4=B8=80?= Date: Sat, 2 Sep 2017 23:30:00 +0800 Subject: [PATCH 020/179] Corrected the wrong path name in Cgroups/cgroups1.md --- Cgroups/cgroups1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cgroups/cgroups1.md b/Cgroups/cgroups1.md index 65fccf5..d5f1312 100644 --- a/Cgroups/cgroups1.md +++ b/Cgroups/cgroups1.md @@ -70,7 +70,7 @@ dr-xr-xr-x 5 root root 0 Dec 2 22:37 systemd As you already may guess that `control groups` mechanism is not such mechanism which was invented only directly to the needs of the Linux kernel, but mostly for userspace needs. To use a `control group`, we should create it at first. We may create a `cgroup` via two ways. -The first way is to create subdirectory in any subsystem from `sys/fs/cgroup` and add a pid of a task to a `tasks` file which will be created automatically right after we will create the subdirectory. +The first way is to create subdirectory in any subsystem from `/sys/fs/cgroup` and add a pid of a task to a `tasks` file which will be created automatically right after we will create the subdirectory. The second way is to create/destroy/manage `cgroups` with utils from `libcgroup` library (`libcgroup-tools` in Fedora). @@ -108,7 +108,7 @@ $ cd /sys/fs/cgroup And now let's go to the `devices` subdirectory which represents kind of resources that allows or denies access to devices by tasks in a `cgroup`: ``` -# cd /devices +# cd devices ``` and create `cgroup_test_group` directory there: From b420e581fe3cfee64d9c65103740d4fd98127b6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Dost=C3=A1l?= Date: Tue, 5 Sep 2017 22:48:58 +0200 Subject: [PATCH 021/179] Fix Wikipedia links containing () MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on: https://stackoverflow.com/questions/13824669/how-do-you-write-a-link-containing-a-closing-bracket-in-markdown-syntax Signed-off-by: Radek Dostál --- Cgroups/cgroups1.md | 8 ++++---- SyncPrim/sync-6.md | 8 ++++---- SysCall/syscall-5.md | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cgroups/cgroups1.md b/Cgroups/cgroups1.md index d5f1312..3c292e8 100644 --- a/Cgroups/cgroups1.md +++ b/Cgroups/cgroups1.md @@ -19,7 +19,7 @@ One `control group subsystem` represents one kind of resources like a processor * `freezer` - allows to suspend/resume for a task(s) from a group; * `net_cls` - allows to mark network packets from task(s) from a group; * `net_prio` - provides a way to dynamically set the priority of network traffic per network interface for a group; -* `perf_event` - provides access to [perf events](https://en.wikipedia.org/wiki/Perf_(Linux)) to a group; +* `perf_event` - provides access to [perf events](https://en.wikipedia.org/wiki/Perf_\(Linux\)) to a group; * `hugetlb` - activates support for [huge pages](https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt) for a group; * `pid` - sets limit to number of processes in a group. @@ -174,7 +174,7 @@ print line ./cgroup_test_script.sh: line 5: /dev/tty: Operation not permitted ``` -Similar situation will be when you will run you [docker](https://en.wikipedia.org/wiki/Docker_(software)) containers for example: +Similar situation will be when you will run you [docker](https://en.wikipedia.org/wiki/Docker_\(software\)) containers for example: ``` ~$ docker ps @@ -444,6 +444,6 @@ Links * [cgroups kernel documentation](https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt) * [cgroups v2](https://www.kernel.org/doc/Documentation/cgroup-v2.txt) * [bash](https://www.gnu.org/software/bash/) -* [docker](https://en.wikipedia.org/wiki/Docker_(software)) -* [perf events](https://en.wikipedia.org/wiki/Perf_(Linux)) +* [docker](https://en.wikipedia.org/wiki/Docker_\(software\)) +* [perf events](https://en.wikipedia.org/wiki/Perf_\(Linux\)) * [Previous chapter](https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-1.html) diff --git a/SyncPrim/sync-6.md b/SyncPrim/sync-6.md index 313ee26..b62e45a 100644 --- a/SyncPrim/sync-6.md +++ b/SyncPrim/sync-6.md @@ -4,7 +4,7 @@ Synchronization primitives in the Linux kernel. Part 6. Introduction -------------------------------------------------------------------------------- -This is the sixth part of the chapter which describes [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_(computer_science)) in the Linux kernel and in the previous parts we finished to consider different [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) synchronization primitives. We will continue to learn synchronization primitives in this part and start to consider a similar synchronization primitive which can be used to avoid the `writer starvation` problem. The name of this synchronization primitive is - `seqlock` or `sequential locks`. +This is the sixth part of the chapter which describes [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_\(computer_science\)) in the Linux kernel and in the previous parts we finished to consider different [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) synchronization primitives. We will continue to learn synchronization primitives in this part and start to consider a similar synchronization primitive which can be used to avoid the `writer starvation` problem. The name of this synchronization primitive is - `seqlock` or `sequential locks`. We know from the previous [part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) that [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) is a special lock mechanism which allows concurrent access for read-only operations, but an exclusive lock is needed for writing or modifying data. As we may guess, it may lead to a problem which is called `writer starvation`. In other words, a writer process can't acquire a lock as long as at least one reader process which acquired a lock holds it. So, in the situation when contention is high, it will lead to situation when a writer process which wants to acquire a lock will wait for it for a long time. @@ -321,7 +321,7 @@ static inline void write_sequnlock_irq(seqlock_t *sl) As we may see, these functions differ only in the initialization of spinlock. They call `spin_lock_irq` and `spin_unlock_irq` instead of `spin_lock` and `spin_unlock`. -Or for example `write_seqlock_irqsave` and `write_sequnlock_irqrestore` functions which are the same but used `spin_lock_irqsave` and `spin_unlock_irqsave` macro to use in [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture)) handlers. +Or for example `write_seqlock_irqsave` and `write_sequnlock_irqrestore` functions which are the same but used `spin_lock_irqsave` and `spin_unlock_irqsave` macro to use in [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_\(PC_architecture\)) handlers. That's all. @@ -337,7 +337,7 @@ If you have questions or suggestions, feel free to ping me in twitter [0xAX](htt Links -------------------------------------------------------------------------------- -* [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_(computer_science)) +* [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_\(computer_science\)) * [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) * [spinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) * [critical section](https://en.wikipedia.org/wiki/Critical_section) @@ -348,5 +348,5 @@ Links * [Timers and time management in the Linux kernel](https://0xax.gitbooks.io/linux-insides/content/Timers/) * [interrupt handlers](https://en.wikipedia.org/wiki/Interrupt_handler) * [softirq](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html) -* [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture)) +* [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_\(PC_architecture\)) * [Previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) diff --git a/SysCall/syscall-5.md b/SysCall/syscall-5.md index 06433c8..dd8f37d 100644 --- a/SysCall/syscall-5.md +++ b/SysCall/syscall-5.md @@ -216,7 +216,7 @@ At the next step we check that a file is not tried to be opened via [fanotify](h flags &= ~FMODE_NONOTIFY & ~O_CLOEXEC; ``` -We do this to not leak a [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). By default, the new file descriptor is set to remain open across an `execve` system call, but the `open` system call supports `O_CLOEXEC` flag that can be used to change this default behaviour. So we do this to prevent leaking of a file descriptor when one thread opens a file to set `O_CLOEXEC` flag and in the same time the second process does a [fork](https://en.wikipedia.org/wiki/Fork_(system_call)) + [execve](https://en.wikipedia.org/wiki/Exec_(system_call)) and as you may remember that child will have copies of the parent's set of open file descriptors. +We do this to not leak a [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). By default, the new file descriptor is set to remain open across an `execve` system call, but the `open` system call supports `O_CLOEXEC` flag that can be used to change this default behaviour. So we do this to prevent leaking of a file descriptor when one thread opens a file to set `O_CLOEXEC` flag and in the same time the second process does a [fork](https://en.wikipedia.org/wiki/Fork_\(system_call\)) + [execve](https://en.wikipedia.org/wiki/Exec_\(system_call\)) and as you may remember that child will have copies of the parent's set of open file descriptors. At the next step we check that if our flags contains `O_SYNC` flag, we apply `O_DSYNC` flag too: @@ -393,8 +393,8 @@ Links * [x86_64](https://en.wikipedia.org/wiki/X86-64) * [opendir](http://man7.org/linux/man-pages/man3/opendir.3.html) * [fanotify](http://man7.org/linux/man-pages/man7/fanotify.7.html) -* [fork](https://en.wikipedia.org/wiki/Fork_(system_call)) -* [execve](https://en.wikipedia.org/wiki/Exec_(system_call)) +* [fork](https://en.wikipedia.org/wiki/Fork_\(system_call\)) +* [execve](https://en.wikipedia.org/wiki/Exec_\(system_call\)) * [symlink](https://en.wikipedia.org/wiki/Symbolic_link) * [audit](https://linux.die.net/man/8/auditd) * [inode](https://en.wikipedia.org/wiki/Inode) From f71365fbbeba3339ed5d00a8d7edd14188b0258c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Dost=C3=A1l?= Date: Tue, 5 Sep 2017 22:59:00 +0200 Subject: [PATCH 022/179] Delete "and last" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This chapter is no longer last one from syscalls. Currently "Limits on resources in Linux" is the last chapter. Signed-off-by: Radek Dostál --- SysCall/syscall-4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SysCall/syscall-4.md b/SysCall/syscall-4.md index 4b3edcc..4379265 100644 --- a/SysCall/syscall-4.md +++ b/SysCall/syscall-4.md @@ -394,7 +394,7 @@ That's all. From this point our program will be executed. Conclusion -------------------------------------------------------------------------------- -This is the end of the fourth and last part of the about the system calls concept in the Linux kernel. We saw almost all related stuff to the `system call` concept in these four parts. We started from the understanding of the `system call` concept, we have learned what is it and why do users applications need in this concept. Next we saw how does the Linux handle a system call from a user application. We met two similar concepts to the `system call` concept, they are `vsyscall` and `vDSO` and finally we saw how does Linux kernel run a user program. +This is the end of the fourth part of the about the system calls concept in the Linux kernel. We saw almost all related stuff to the `system call` concept in these four parts. We started from the understanding of the `system call` concept, we have learned what is it and why do users applications need in this concept. Next we saw how does the Linux handle a system call from a user application. We met two similar concepts to the `system call` concept, they are `vsyscall` and `vDSO` and finally we saw how does Linux kernel run a user program. If you have questions or suggestions, feel free to ping me in twitter [0xAX](https://twitter.com/0xAX), drop me [email](anotherworldofworld@gmail.com) or just create [issue](https://github.com/0xAX/linux-insides/issues/new). From 8d765498282ead0b468d6e987e7ee45eec7fa5db Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sun, 10 Sep 2017 17:19:17 +0600 Subject: [PATCH 023/179] boot: remove informatnion about query_mca() as it was removed in the: https://github.com/torvalds/linux/commit/949163015ce6fdb76a5e846a3582d3c40c23c001#diff-25ea8b4d2857dbd7b7ae86277dd464e8 commit. --- Booting/linux-bootstrap-2.md | 73 ++---------------------------------- 1 file changed, 4 insertions(+), 69 deletions(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index ec319d9..65ad0d2 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -401,13 +401,16 @@ Keyboard initialization -------------------------------------------------------------------------------- The next step is the initialization of the keyboard with the call of the [`keyboard_init()`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L65) function. At first `keyboard_init` initializes registers using the `initregs` function and calling the [0x16](http://www.ctyme.com/intr/rb-1756.htm) interrupt for getting the keyboard status. + ```c initregs(&ireg); ireg.ah = 0x02; /* Get keyboard status */ intcall(0x16, &ireg, &oreg); boot_params.kbd_status = oreg.al; ``` + After this it calls [0x16](http://www.ctyme.com/intr/rb-1757.htm) again to set repeat rate and delay. + ```c ireg.ax = 0x0305; /* Set keyboard repeat rate */ intcall(0x16, &ireg, NULL); @@ -418,75 +421,7 @@ Querying The next couple of steps are queries for different parameters. We will not dive into details about these queries but will get back to it in later parts. Let's take a short look at these functions: -The [query_mca](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/mca.c#L18) routine calls the [0x15](http://www.ctyme.com/intr/rb-1594.htm) BIOS interrupt to get the machine model number, sub-model number, BIOS revision level, and other hardware-specific attributes: - -```c -int query_mca(void) -{ - struct biosregs ireg, oreg; - u16 len; - - initregs(&ireg); - ireg.ah = 0xc0; - intcall(0x15, &ireg, &oreg); - - if (oreg.eflags & X86_EFLAGS_CF) - return -1; /* No MCA present */ - - set_fs(oreg.es); - len = rdfs16(oreg.bx); - - if (len > sizeof(boot_params.sys_desc_table)) - len = sizeof(boot_params.sys_desc_table); - - copy_from_fs(&boot_params.sys_desc_table, oreg.bx, len); - return 0; -} -``` - -It fills the `ah` register with `0xc0` and calls the `0x15` BIOS interruption. After the interrupt execution it checks the [carry flag](http://en.wikipedia.org/wiki/Carry_flag) and if it is set to 1, the BIOS doesn't support [**MCA**](https://en.wikipedia.org/wiki/Micro_Channel_architecture). If carry flag is set to 0, `ES:BX` will contain a pointer to the system information table, which looks like this: - -``` -Offset Size Description - 00h WORD number of bytes following - 02h BYTE model (see #00515) - 03h BYTE submodel (see #00515) - 04h BYTE BIOS revision: 0 for first release, 1 for 2nd, etc. - 05h BYTE feature byte 1 (see #00510) - 06h BYTE feature byte 2 (see #00511) - 07h BYTE feature byte 3 (see #00512) - 08h BYTE feature byte 4 (see #00513) - 09h BYTE feature byte 5 (see #00514) ----AWARD BIOS--- - 0Ah N BYTEs AWARD copyright notice ----Phoenix BIOS--- - 0Ah BYTE ??? (00h) - 0Bh BYTE major version - 0Ch BYTE minor version (BCD) - 0Dh 4 BYTEs ASCIZ string "PTL" (Phoenix Technologies Ltd) ----Quadram Quad386--- - 0Ah 17 BYTEs ASCII signature string "Quadram Quad386XT" ----Toshiba (Satellite Pro 435CDS at least)--- - 0Ah 7 BYTEs signature "TOSHIBA" - 11h BYTE ??? (8h) - 12h BYTE ??? (E7h) product ID??? (guess) - 13h 3 BYTEs "JPN" - ``` - -Next, we call the `set_fs` routine and pass the value of the `es` register to it. The implementation of `set_fs` is pretty simple: - -```c -static inline void set_fs(u16 seg) -{ - asm volatile("movw %0,%%fs" : : "rm" (seg)); -} -``` - -This function contains inline assembly which gets the value of the `seg` parameter and puts it into the `fs` register. There are many functions in [boot.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/boot.h) like `set_fs`, for example `set_gs`, `fs`, `gs` for reading a value in it etc... - -At the end of `query_mca` it just copies the table pointed to by `es:bx` to the `boot_params.sys_desc_table`. - -The next step is getting [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) information by calling the `query_ist` function. First of all, it checks the CPU level and if it is correct, calls `0x15` for getting info and saves the result to `boot_params`. +The first step is getting [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) information by calling the `query_ist` function. First of all, it checks the CPU level and if it is correct, calls `0x15` for getting info and saves the result to `boot_params`. The following [query_apm_bios](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/apm.c#L21) function gets [Advanced Power Management](http://en.wikipedia.org/wiki/Advanced_Power_Management) information from the BIOS. `query_apm_bios` calls the `0x15` BIOS interruption too, but with `ah` = `0x53` to check `APM` installation. After the `0x15` execution, `query_apm_bios` functions check the `PM` signature (it must be `0x504d`), carry flag (it must be 0 if `APM` supported) and value of the `cx` register (if it's 0x02, protected mode interface is supported). From 117dbf29a13f9204587ddf221bacd30406b27125 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sun, 10 Sep 2017 17:27:51 +0600 Subject: [PATCH 024/179] boot: add missed set_bios_mode() --- Booting/linux-bootstrap-2.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index 65ad0d2..b4bc0b3 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -397,6 +397,24 @@ You can see the result of this in the `dmesg` output, something like: [ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved ``` +Next we may see call of the `set_bios_mode` function after physical memory is detected. As we may see, this function is implemented only for the `x86_64` mode: + +```C +static void set_bios_mode(void) +{ +#ifdef CONFIG_X86_64 + struct biosregs ireg; + + initregs(&ireg); + ireg.ax = 0xec00; + ireg.bx = 2; + intcall(0x15, &ireg, NULL); +#endif +} +``` + +The `set_bios_mode` executes `0x15` BIOS interrupt to tell the BIOS that [long mode](https://en.wikipedia.org/wiki/Long_mode) (in a case of `bx = 2`) will be used. + Keyboard initialization -------------------------------------------------------------------------------- From 6703f0ace42b555a1d90fda562741888cfde109a Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sun, 10 Sep 2017 17:55:03 +0600 Subject: [PATCH 025/179] boot: fix boot-3 --- Booting/linux-bootstrap-3.md | 76 ++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index 2eee109..34e6abc 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -5,19 +5,20 @@ Video mode initialization and transition to protected mode -------------------------------------------------------------------------------- This is the third part of the `Kernel booting process` series. In the previous [part](linux-bootstrap-2.md#kernel-booting-process-part-2), we stopped right before the call of the `set_video` routine from [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L181). In this part, we will see: -- video mode initialization in the kernel setup code, -- preparation before switching into protected mode, -- transition to protected mode + +* video mode initialization in the kernel setup code, +* preparation before switching into protected mode, +* transition to protected mode **NOTE** If you don't know anything about protected mode, you can find some information about it in the previous [part](linux-bootstrap-2.md#protected-mode). Also, there are a couple of [links](linux-bootstrap-2.md#links) which can help you. -As I wrote above, we will start from the `set_video` function which is defined in the [arch/x86/boot/video.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/video.c#L315) source code file. We can see that it starts by first getting the video mode from the `boot_params.hdr` structure: +As I wrote above, we will start from the `set_video` function which is defined in the [arch/x86/boot/video.c](https://github.com/torvalds/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/arch/x86/boot/video.c#L319) source code file. We can see that it starts by first getting the video mode from the `boot_params.hdr` structure: ```C u16 mode = boot_params.hdr.vid_mode; ``` -which we filled in the `copy_boot_params` function (you can read about it in the previous post). `vid_mode` is an obligatory field which is filled by the bootloader. You can find information about it in the kernel boot protocol: +which we filled in the `copy_boot_params` function (you can read about it in the previous post). The `vid_mode` is an obligatory field which is filled by the bootloader. You can find information about it in the kernel `boot protocol`: ``` Offset Proto Name Meaning @@ -123,7 +124,7 @@ That's all. Now we have a simple API for heap and can setup video mode. Set up video mode -------------------------------------------------------------------------------- -Now we can move directly to video mode initialization. We stopped at the `RESET_HEAP()` call in the `set_video` function. Next is the call to `store_mode_params` which stores video mode parameters in the `boot_params.screen_info` structure which is defined in [include/uapi/linux/screen_info.h](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/include/uapi/linux/screen_info.h). +Now we can move directly to video mode initialization. We stopped at the `RESET_HEAP()` call in the `set_video` function. Next is the call to `store_mode_params` which stores video mode parameters in the `boot_params.screen_info` structure which is defined in [include/uapi/linux/screen_info.h](https://github.com/0xAX/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/include/uapi/linux/screen_info.h). If we look at the `store_mode_params` function, we can see that it starts with the call to the `store_cursor_position` function. As you can understand from the function name, it gets information about cursor and stores it. @@ -131,14 +132,14 @@ First of all, `store_cursor_position` initializes two variables which have type After `store_cursor_position` is executed, the `store_video_mode` function will be called. It just gets the current video mode and stores it in `boot_params.screen_info.orig_video_mode`. -After this, it checks the current video mode and sets the `video_segment`. After the BIOS transfers control to the boot sector, the following addresses are for video memory: +After this, the `store_mode_params` checks the current video mode and sets the `video_segment`. After the BIOS transfers control to the boot sector, the following addresses are for video memory: ``` 0xB000:0x0000 32 Kb Monochrome Text Video Memory 0xB800:0x0000 32 Kb Color Text Video Memory ``` -So we set the `video_segment` variable to `0xB000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0xB800` if the current video mode is in color mode. After setting up the address of the video segment, font size needs to be stored in `boot_params.screen_info.orig_video_points` with: +So we set the `video_segment` variable to `0xb000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0bB800` if the current video mode is in color mode. After setting up the address of the video segment, font size needs to be stored in `boot_params.screen_info.orig_video_points` with: ```C set_fs(0); @@ -148,9 +149,9 @@ boot_params.screen_info.orig_video_points = font_size; First of all, we put 0 in the `FS` register with the `set_fs` function. We already saw functions like `set_fs` in the previous part. They are all defined in [boot.h](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/boot.h). Next, we read the value which is located at address `0x485` (this memory location is used to get the font size) and save the font size in `boot_params.screen_info.orig_video_points`. -``` - x = rdfs16(0x44a); - y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1; +```C +x = rdfs16(0x44a); +y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1; ``` Next, we get the amount of columns by address `0x44a` and rows by address `0x484` and store them in `boot_params.screen_info.orig_video_cols` and `boot_params.screen_info.orig_video_lines`. After this, execution of `store_mode_params` is finished. @@ -174,7 +175,7 @@ if (!heap_free(saved.x*saved.y*sizeof(u16)+512)) and allocates space in the heap if it is enough and stores `saved_screen` in it. -The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting moment, we can see the loop: +The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting moment, we can see the loop: ```C for (card = video_cards; card < video_cards_end; card++) { @@ -278,7 +279,7 @@ Last preparation before transition into protected mode We can see the last function call - `go_to_protected_mode` - in [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L184). As the comment says: `Do the last things and invoke protected mode`, so let's see these last things and switch into protected mode. -`go_to_protected_mode` is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what they do and how it works. +The `go_to_protected_mode` is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what they do and how it works. First is the call to the `realmode_switch_hook` function in `go_to_protected_mode`. This function invokes the real mode switch hook if it is present and disables [NMI](http://en.wikipedia.org/wiki/Non-maskable_interrupt). Hooks are used if the bootloader runs in a hostile environment. You can read more about hooks in the [boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) (see **ADVANCED BOOT LOADER HOOKS**). @@ -319,7 +320,7 @@ static int a20_test(int loops) saved = ctr = rdfs32(A20_TEST_ADDR); - while (loops--) { + while (loops--) { wrfs32(++ctr, A20_TEST_ADDR); io_delay(); /* Serialize and make delay constant */ ok = rdgs32(A20_TEST_ADDR+0x10) ^ ctr; @@ -346,17 +347,21 @@ die: ``` After the A20 gate is successfully enabled, the `reset_coprocessor` function is called: - ```C + +```C outb(0, 0xf0); outb(0, 0xf1); ``` + This function clears the Math Coprocessor by writing `0` to `0xf0` and then resets it by writing `0` to `0xf1`. After this, the `mask_all_interrupts` function is called: + ```C outb(0xff, 0xa1); /* Mask all interrupts on the secondary PIC */ outb(0xfb, 0x21); /* Mask all but cascade on the primary PIC */ ``` + This masks all interrupts on the secondary PIC (Programmable Interrupt Controller) and primary PIC except for IRQ2 on the primary PIC. And after all of these preparations, we can see the actual transition into protected mode. @@ -375,6 +380,7 @@ static void setup_idt(void) ``` which sets up the Interrupt Descriptor Table (describes interrupt handlers and etc.). For now, the IDT is not installed (we will see it later), but now we just the load IDT with the `lidtl` instruction. `null_idt` contains address and size of IDT, but now they are just zero. `null_idt` is a `gdt_ptr` structure, it as defined as: + ```C struct gdt_ptr { u16 len; @@ -390,14 +396,17 @@ Set up Global Descriptor Table Next is the setup of the Global Descriptor Table (GDT). We can see the `setup_gdt` function which sets up GDT (you can read about it in the [Kernel booting process. Part 2.](linux-bootstrap-2.md#protected-mode)). There is a definition of the `boot_gdt` array in this function, which contains the definition of the three segments: ```C - static const u64 boot_gdt[] __attribute__((aligned(16))) = { - [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff), - [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff), - [GDT_ENTRY_BOOT_TSS] = GDT_ENTRY(0x0089, 4096, 103), - }; +static const u64 boot_gdt[] __attribute__((aligned(16))) = { + [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff), + [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff), + [GDT_ENTRY_BOOT_TSS] = GDT_ENTRY(0x0089, 4096, 103), +}; ``` -For code, data and TSS (Task State Segment). We will not use the task state segment for now, it was added there to make Intel VT happy as we can see in the comment line (if you're interested you can find commit which describes it - [here](https://github.com/torvalds/linux/commit/88089519f302f1296b4739be45699f06f728ec31)). Let's look at `boot_gdt`. First of all note that it has the `__attribute__((aligned(16)))` attribute. It means that this structure will be aligned by 16 bytes. Let's look at a simple example: +for code, data and TSS (Task State Segment). We will not use the task state segment for now, it was added there to make Intel VT happy as we can see in the comment line (if you're interested you can find commit which describes it - [here](https://github.com/torvalds/linux/commit/88089519f302f1296b4739be45699f06f728ec31)). Let's look at `boot_gdt`. First of all note that it has the `__attribute__((aligned(16)))` attribute. It means that this structure will be aligned by 16 bytes. + +Let's look at a simple example: + ```C #include @@ -429,9 +438,9 @@ Not aligned - 4 Aligned - 16 ``` -`GDT_ENTRY_BOOT_CS` has index - 2 here, `GDT_ENTRY_BOOT_DS` is `GDT_ENTRY_BOOT_CS + 1` and etc. It starts from 2, because first is a mandatory null descriptor (index - 0) and the second is not used (index - 1). +The `GDT_ENTRY_BOOT_CS` has index - 2 here, `GDT_ENTRY_BOOT_DS` is `GDT_ENTRY_BOOT_CS + 1` and etc. It starts from 2, because first is a mandatory null descriptor (index - 0) and the second is not used (index - 1). -`GDT_ENTRY` is a macro which takes flags, base, limit and builds GDT entry. For example, let's look at the code segment entry. `GDT_ENTRY` takes following values: +The `GDT_ENTRY` is a macro which takes flags, base, limit and builds GDT entry. For example, let's look at the code segment entry. `GDT_ENTRY` takes following values: * base - 0 * limit - 0xfffff @@ -489,7 +498,9 @@ This is the end of the `go_to_protected_mode` function. We loaded IDT, GDT, disa protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4)); ``` -which is defined in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S#L26). It takes two parameters: +which is defined in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S#L26). + +It takes two parameters: * address of protected mode entry point * address of `boot_params` @@ -521,11 +532,12 @@ and make a long jump to protected mode: .word __BOOT_CS ``` -where -* `0x66` is the operand-size prefix which allows us to mix 16-bit and 32-bit code, -* `0xea` - is the jump opcode, +where: + +* `0x66` is the operand-size prefix which allows us to mix 16-bit and 32-bit code +* `0xea` - is the jump opcode * `in_pm32` is the segment offset -* `__BOOT_CS` is the code segment. +* `__BOOT_CS` is the code segment After this we are finally in the protected mode: @@ -544,7 +556,13 @@ movl %ecx, %gs movl %ecx, %ss ``` -If you paid attention, you can remember that we saved `$__BOOT_DS` in the `cx` register. Now we fill it with all segment registers besides `cs` (`cs` is already `__BOOT_CS`). Next we zero out all general purpose registers besides `eax` with: +If you paid attention, you can remember that we saved `$__BOOT_DS` in the `cx` register. And setup valid stack for debugging purposes: + +```assembly +addl %ebx, %esp +``` + +Now we fill it with all segment registers besides `cs` (`cs` is already `__BOOT_CS`). Next we zero out all general purpose registers besides `eax` with: ```assembly xorl %ecx, %ecx From b5d147bf72d56a1b6777c9114236c8e395793484 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sun, 10 Sep 2017 17:58:45 +0600 Subject: [PATCH 026/179] boot/pm: fix some expressions --- Booting/linux-bootstrap-3.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index 34e6abc..5d61773 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -556,13 +556,15 @@ movl %ecx, %gs movl %ecx, %ss ``` -If you paid attention, you can remember that we saved `$__BOOT_DS` in the `cx` register. And setup valid stack for debugging purposes: +If you paid attention, you can remember that we saved `$__BOOT_DS` in the `cx` register. Now we fill it with all segment registers besides `cs` (`cs` is already `__BOOT_CS`). + +And setup valid stack for debugging purposes: ```assembly addl %ebx, %esp ``` -Now we fill it with all segment registers besides `cs` (`cs` is already `__BOOT_CS`). Next we zero out all general purpose registers besides `eax` with: +The last step before jump into 32-bit entry point is clearing of general purpose registers: ```assembly xorl %ecx, %ecx From 96afdad6f40454a7a5de4c7941c7d48356308cd9 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Tue, 12 Sep 2017 00:49:33 +0600 Subject: [PATCH 027/179] mm/fixmaps: read_cr3() was splited on __read_cr3() and read_cr3_pa() --- mm/linux-mm-2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/linux-mm-2.md b/mm/linux-mm-2.md index 2aa335c..fd32c32 100644 --- a/mm/linux-mm-2.md +++ b/mm/linux-mm-2.md @@ -317,7 +317,7 @@ static unsigned long slot_virt[FIX_BTMAPS_SLOTS] __initdata; ```C static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) { - pgd_t *base = __va(read_cr3()); + pgd_t *base = __va(read_cr3_pa()); pgd_t *pgd = &base[pgd_index(addr)]; pud_t *pud = pud_offset(pgd, addr); pmd_t *pmd = pmd_offset(pud, addr); @@ -477,7 +477,7 @@ static inline void __flush_tlb_one(unsigned long addr) The `__flush_tlb_one` function invalidates the given address in the [TLB](http://en.wikipedia.org/wiki/Translation_lookaside_buffer). As you just saw we updated the paging structure, but `TLB` is not informed of the changes, that's why we need to do it manually. There are two ways to do it. The first is to update the `cr3` control register and the `__flush_tlb` function does this: ```C -native_write_cr3(native_read_cr3()); +native_write_cr3(__native_read_cr3()); ``` The second method is to use the `invlpg` instruction to invalidate the `TLB` entry. Let's look at the `__flush_tlb_one` implementation. As you can see, first of all the function checks `cpu_has_invlpg` which is defined as: From 220d3378f7217f50373370f1e88b56b29406ed7f Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Tue, 12 Sep 2017 00:53:18 +0600 Subject: [PATCH 028/179] boot: STACK_SIZE is 1024 now since https://github.com/torvalds/linux/commit/d594aa0277e541bb997aef0bc0a55172d8138340#diff-0af1468d3dc7f373d70011eda7be1592 --- Booting/linux-bootstrap-1.md | 2 +- Booting/linux-bootstrap-2.md | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index d60496e..31930c5 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -432,7 +432,7 @@ Field name: loadflags functionality will be disabled. ``` -If the `CAN_USE_HEAP` bit is set, we put `heap_end_ptr` into `dx` (which points to `_end`) and add `STACK_SIZE` (minimum stack size, `512` bytes) to it. After this, if `dx` is not carried (it will not be carried, `dx = _end + 512`), jump to label `2` (as in the previous case) and make a correct stack. +If the `CAN_USE_HEAP` bit is set, we put `heap_end_ptr` into `dx` (which points to `_end`) and add `STACK_SIZE` (minimum stack size, `1024` bytes) to it. After this, if `dx` is not carried (it will not be carried, `dx = _end + 1024`), jump to label `2` (as in the previous case) and make a correct stack. ![stack](http://oi62.tinypic.com/dr7b5w.jpg) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index b4bc0b3..e82c4f2 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -329,10 +329,12 @@ First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds or in other words `stack_end = esp - STACK_SIZE`. Then there is the `heap_end` calculation: -```c - heap_end = (char *)((size_t)boot_params.hdr.heap_end_ptr + 0x200); + +```C + heap_end = (char *)((size_t)boot_params.hdr.heap_end_ptr + 0x200); ``` -which means `heap_end_ptr` or `_end` + `512`(`0x200h`). The last check is whether `heap_end` is greater than `stack_end`. If it is then `stack_end` is assigned to `heap_end` to make them equal. + +which means `heap_end_ptr` or `_end` + `512` (`0x200h`). The last check is whether `heap_end` is greater than `stack_end`. If it is then `stack_end` is assigned to `heap_end` to make them equal. Now the heap is initialized and we can use it using the `GET_HEAP` method. We will see how it is used, how to use it and how it is implemented in the next posts. From ab8d15afd09017251f2f093b9f9a6fb051101f82 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Tue, 12 Sep 2017 00:57:21 +0600 Subject: [PATCH 029/179] boot: update linux-bootstrap-4.md --- Booting/linux-bootstrap-4.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index d6fa3d3..b806d3a 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -8,7 +8,7 @@ This is the fourth part of the `Kernel booting process` where we will see first **NOTE: there will be much assembly code in this part, so if you are not familiar with that, you might want to consult a book about it** -In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md) we stopped at the jump to the 32-bit entry point in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S): +In the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md) we stopped at the jump to the `32-bit` entry point in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pmjump.S): ```assembly jmpl *%eax @@ -41,12 +41,14 @@ fs 0x18 24 gs 0x18 24 ``` -We can see here that `cs` register contains - `0x10` (as you will remember from the previous part, this is the second index in the Global Descriptor Table), `eip` register is `0x100000` and the base address of all segments including the code segment are zero. So we can get the physical address, it will be `0:0x100000` or just `0x100000`, as specified by the boot protocol. Now let's start with the 32-bit entry point. +We can see here that `cs` register contains - `0x10` (as you may remember from the [previous part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md), this is the second index in the `Global Descriptor Table`), `eip` register contains `0x100000` and the base address of all segments including the code segment are zero. + +So we can get the physical address, it will be `0:0x100000` or just `0x100000`, as specified by the boot protocol. Now let's start with the `32-bit` entry point. 32-bit entry point -------------------------------------------------------------------------------- -We can find the definition of the 32-bit entry point in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file: +We can find the definition of the `32-bit` entry point in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly source code file: ```assembly __HEAD @@ -58,14 +60,14 @@ ENTRY(startup_32) ENDPROC(startup_32) ``` -First of all, why `compressed` directory? Actually `bzimage` is a gzipped `vmlinux + header + kernel setup code`. We saw the kernel setup code in all of the previous parts. So, the main goal of the `head_64.S` is to prepare for entering long mode, enter into it and then decompress the kernel. We will see all of the steps up to kernel decompression in this part. +First of all, why the directory is named `compressed`? Actually `bzimage` is a gzipped `vmlinux + header + kernel setup code`. We saw the kernel setup code in all of the previous parts. So, the main goal of the `head_64.S` is to prepare for entering long mode, enter into it and then decompress the kernel. We will see all of the steps up to kernel decompression in this part. -There were two files in the `arch/x86/boot/compressed` directory: +You may find two files in the `arch/x86/boot/compressed` directory: * [head_32.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_32.S) * [head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) -but we will see only `head_64.S` because, as you may remember, this book is only `x86_64` related; `head_32.S` is not used in our case. Let's look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile). There we can see the following target: +but we will consider only `head_64.S` source code file because, as you may remember, this book is only `x86_64` related; Let's look at [arch/x86/boot/compressed/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/Makefile). We can find the following `make` target here: ```Makefile vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ @@ -73,7 +75,9 @@ vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ $(obj)/piggy.o $(obj)/cpuflags.o ``` -Note `$(obj)/head_$(BITS).o`. This means that we will select which file to link based on what `$(BITS)` is set to, either head_32.o or head_64.o. `$(BITS)` is defined elsewhere in [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile) based on the .config file: +Take a look on the `$(obj)/head_$(BITS).o`. + +This means that we will select which file to link based on what `$(BITS)` is set to, either `head_32.o` or `head_64.o`. The `$(BITS)` variable is defined elsewhere in [arch/x86/Makefile](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/Makefile) based on the kernel configuration: ```Makefile ifeq ($(CONFIG_X86_32),y) @@ -96,7 +100,7 @@ As indicated above, we start in the [arch/x86/boot/compressed/head_64.S](https:/ ```assembly __HEAD - .code32 + .code32 ENTRY(startup_32) ``` From 2bbbbb952497813ba041e8a7bd235216737b91fa Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Tue, 12 Sep 2017 00:57:41 +0600 Subject: [PATCH 030/179] boot: e820entry renamed to e820_entry --- Booting/linux-bootstrap-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index e82c4f2..ab9b6fc 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -381,7 +381,7 @@ Next is a loop where data about the memory will be collected. It starts from the ireg.ebx = oreg.ebx; ``` -Ultimately, it does iterations in the loop to collect data from the address allocation table and writes this data into the `e820entry` array: +Ultimately, it does iterations in the loop to collect data from the address allocation table and writes this data into the `e820_entry` array: * start of memory segment * size of memory segment From 6d1ac7ac20e097dfeca5e8d570beeb08e1145460 Mon Sep 17 00:00:00 2001 From: Ding Fei Date: Tue, 12 Sep 2017 17:59:40 +0800 Subject: [PATCH 031/179] Update how_kernel_compiled.md --- Misc/how_kernel_compiled.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/how_kernel_compiled.md b/Misc/how_kernel_compiled.md index 4c69990..9a62500 100644 --- a/Misc/how_kernel_compiled.md +++ b/Misc/how_kernel_compiled.md @@ -129,7 +129,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \ -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ ) ``` -As you can see, it executes the [uname](https://en.wikipedia.org/wiki/Uname) util that prints information about machine, operating system and architecture. As it gets the output of `uname`, it parses the output and assigns the result to the `SUBARCH` variable. Now that we have `SUBARCH`, we set the `SRCARCH` variable that provides the directory of the certain architecture and `hfr-arch` that provides the directory for the header files: +As you can see, it executes the [uname](https://en.wikipedia.org/wiki/Uname) util that prints information about machine, operating system and architecture. As it gets the output of `uname`, it parses the output and assigns the result to the `SUBARCH` variable. Now that we have `SUBARCH`, we set the `SRCARCH` variable that provides the directory of the certain architecture and `hdr-arch` that provides the directory for the header files: ```Makefile ifeq ($(ARCH),i386) From ebb1280c2aae47866d07211f1168412a9fdc3552 Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Fri, 15 Sep 2017 00:22:15 +0300 Subject: [PATCH 032/179] interrupts-9.md: rephrased a bit on bottom halves --- interrupts/interrupts-9.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interrupts/interrupts-9.md b/interrupts/interrupts-9.md index 13098c0..d177246 100644 --- a/interrupts/interrupts-9.md +++ b/interrupts/interrupts-9.md @@ -16,7 +16,7 @@ As you can understand, it is almost impossible to make so that both characterist * Top half; * Bottom half; -Once the Linux kernel was one of the ways the organization postprocessing, and which was called: `the bottom half` of the processor, but now it is already not actual. Now this term has remained as a common noun referring to all the different ways of organizing deferred processing of an interrupt.The deferred processing of an interrupt suggests that some of the actions for an interrupt may be postponed to a later execution when the system will be less loaded. As you can suggests, an interrupt handler can do large amount of work that is impermissible as it executes in the context where interrupts are disabled. That's why processing of an interrupt can be split on two different parts. In the first part, the main handler of an interrupt does only minimal and the most important job. After this it schedules the second part and finishes its work. When the system is less busy and context of the processor allows to handle interrupts, the second part starts its work and finishes to process remaining part of a deferred interrupt. +In the past there was one way to defer interrupt handling in Linux kernel. And it was called: `the bottom half` of the processor, but now it is already not actual. Now this term has remained as a common noun referring to all the different ways of organizing deferred processing of an interrupt.The deferred processing of an interrupt suggests that some of the actions for an interrupt may be postponed to a later execution when the system will be less loaded. As you can suggest, an interrupt handler can do large amount of work that is impermissible as it executes in the context where interrupts are disabled. That's why processing of an interrupt can be split on two different parts. In the first part, the main handler of an interrupt does only minimal and the most important job. After this it schedules the second part and finishes its work. When the system is less busy and context of the processor allows to handle interrupts, the second part starts its work and finishes to process remaining part of a deferred interrupt. There are three types of `deferred interrupts` in the Linux kernel: From 9015d6ed1f5b3b4824bb7e3a511d451f706445c9 Mon Sep 17 00:00:00 2001 From: Ding Fei Date: Fri, 15 Sep 2017 12:51:11 +0800 Subject: [PATCH 033/179] Update linux-bootstrap-3.md --- Booting/linux-bootstrap-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index 5d61773..6cb565a 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -507,7 +507,7 @@ It takes two parameters: Let's look inside `protected_mode_jump`. As I wrote above, you can find it in `arch/x86/boot/pmjump.S`. The first parameter will be in the `eax` register and the second one is in `edx`. -First of all, we put the address of `boot_params` in the `esi` register and the address of code segment register `cs` (0x1000) in `bx`. After this, we shift `bx` by 4 bits and add the address of label `2` to it (we will have the physical address of label `2` in the `bx` after this) and jump to label `1`. Next we put data segment and task state segment in the `cs` and `di` registers with: +First of all, we put the address of `boot_params` in the `esi` register and the address of code segment register `cs` (0x1000) in `bx`. After this, we shift `bx` by 4 bits and add it to the memory location labeled `2` (which is `bx << 4 + in_pm32`, the physical address to jump after transitioned to 32-bit mode) and jump to label `1`. Next we put data segment and task state segment in the `cx` and `di` registers with: ```assembly movw $__BOOT_DS, %cx From 19daf93f3fda4c04278a2852bff0be917dffd4ae Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Fri, 15 Sep 2017 21:51:22 +0300 Subject: [PATCH 034/179] interrupts-9.md: fix a typo in workqueues' info s/function that queue/function that queues --- interrupts/interrupts-9.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interrupts/interrupts-9.md b/interrupts/interrupts-9.md index 13098c0..1f28c36 100644 --- a/interrupts/interrupts-9.md +++ b/interrupts/interrupts-9.md @@ -460,7 +460,7 @@ static inline bool queue_work(struct workqueue_struct *wq, } ``` -The `queue_work` function just calls the `queue_work_on` function that queue work on specific processor. Note that in our case we pass the `WORK_CPU_UNBOUND` to the `queue_work_on` function. It is a part of the `enum` that is defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/workqueue.h) and represents workqueue which are not bound to any specific processor. The `queue_work_on` function tests and set the `WORK_STRUCT_PENDING_BIT` bit of the given `work` and executes the `__queue_work` function with the `workqueue` for the given processor and given `work`: +The `queue_work` function just calls the `queue_work_on` function that queues work on specific processor. Note that in our case we pass the `WORK_CPU_UNBOUND` to the `queue_work_on` function. It is a part of the `enum` that is defined in the [include/linux/workqueue.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/workqueue.h) and represents workqueue which are not bound to any specific processor. The `queue_work_on` function tests and set the `WORK_STRUCT_PENDING_BIT` bit of the given `work` and executes the `__queue_work` function with the `workqueue` for the given processor and given `work`: ```C bool queue_work_on(int cpu, struct workqueue_struct *wq, From 1a1991991074633161c0a8037eb6c2966604bc6a Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Sat, 16 Sep 2017 15:11:17 +0300 Subject: [PATCH 035/179] interrupts-10.md: fix a typo in othe way -> otherwise --- interrupts/interrupts-10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interrupts/interrupts-10.md b/interrupts/interrupts-10.md index af9ad51..e71512c 100644 --- a/interrupts/interrupts-10.md +++ b/interrupts/interrupts-10.md @@ -243,7 +243,7 @@ if (!irq_settings_can_request(desc) || WARN_ON(irq_settings_is_per_cpu_devid(des return -EINVAL; ``` -and exit with the `-EINVAL` in othre way. After this we check the given interrupt handler. If it was not passed to the `request_irq` function, we check the `thread_fn`. If both handlers are `NULL`, we return with the `-EINVAL`. If an interrupt handler was not passed to the `request_irq` function, but the `thread_fn` is not null, we set handler to the `irq_default_primary_handler`: +and exit with the `-EINVAL`otherways. After this we check the given interrupt handler. If it was not passed to the `request_irq` function, we check the `thread_fn`. If both handlers are `NULL`, we return with the `-EINVAL`. If an interrupt handler was not passed to the `request_irq` function, but the `thread_fn` is not null, we set handler to the `irq_default_primary_handler`: ```C if (!handler) { From 3f38f871877c1a7842f7b2fe04e7ff7350bb595f Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Sat, 16 Sep 2017 15:26:40 +0300 Subject: [PATCH 036/179] interrupts-10.md: a couple more typos s/locl/Lock s/bus/busses s/is nest/is nested/ s/one things/one thing --- interrupts/interrupts-10.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interrupts/interrupts-10.md b/interrupts/interrupts-10.md index af9ad51..7693ad1 100644 --- a/interrupts/interrupts-10.md +++ b/interrupts/interrupts-10.md @@ -284,7 +284,7 @@ if (retval) return retval; ``` -Note that the call of the `__setup_irq` function is placed between the `chip_bus_lock` and the `chip_bus_sync_unlock` functions. These functions locl/unlock access to slow bus (like [i2c](https://en.wikipedia.org/wiki/I%C2%B2C)) chips. Now let's look at the implementation of the `__setup_irq` function. In the beginning of the `__setup_irq` function we can see a couple of different checks. First of all we check that the given interrupt descriptor is not `NULL`, `irqchip` is not `NULL` and that given interrupt descriptor module owner is not `NULL`. After this we check is interrupt nest into another interrupt thread or not, and if it is nested we replace the `irq_default_primary_handler` with the `irq_nested_primary_handler`. +Note that the call of the `__setup_irq` function is placed between the `chip_bus_lock` and the `chip_bus_sync_unlock` functions. These functions lock/unlock access to slow busses (like [i2c](https://en.wikipedia.org/wiki/I%C2%B2C)) chips. Now let's look at the implementation of the `__setup_irq` function. In the beginning of the `__setup_irq` function we can see a couple of different checks. First of all we check that the given interrupt descriptor is not `NULL`, `irqchip` is not `NULL` and that given interrupt descriptor module owner is not `NULL`. After this we check if the interrupt is nested into another interrupt thread or not, and if it is nested we replace the `irq_default_primary_handler` with the `irq_nested_primary_handler`. In the next step we create an irq handler thread with the `kthread_create` function, if the given interrupt is not nested and the `thread_fn` is not `NULL`: @@ -316,7 +316,7 @@ Here we iterate over all the cleared bit of the `used_vectors` bitmap starting a int first_system_vector = FIRST_SYSTEM_VECTOR; // 0xef ``` -and set interrupt gates with the `i` vector number and the `irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR)` start address. Only one things is unclear here - the `irq_entries_start`. This symbol defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry_entry_64.S) assembly file and provides `irq` entries. Let's look at it: +and set interrupt gates with the `i` vector number and the `irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR)` start address. Only one thing is unclear here - the `irq_entries_start`. This symbol defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry_entry_64.S) assembly file and provides `irq` entries. Let's look at it: ```assembly .align 8 From 1389e484e0838c49b76cfbd5b4855ac352bdcd46 Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Sat, 16 Sep 2017 20:39:45 +0300 Subject: [PATCH 037/179] syscalls-1.md: fix typos s/does not enabled/is not enabled s/empty string/an empty string s/represent/represents d/the/the our s/call/calls --- SysCall/syscall-1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SysCall/syscall-1.md b/SysCall/syscall-1.md index 3e8d5ed..e833b89 100644 --- a/SysCall/syscall-1.md +++ b/SysCall/syscall-1.md @@ -268,7 +268,7 @@ Implementation of the first macro `SYSCALL_METADATA` depends on the `CONFIG_FTRA *__p_syscall_meta_##sname = &__syscall_meta_##sname; ``` -If the `CONFIG_FTRACE_SYSCALLS` kernel option does not enabled during kernel configuration, in this way the `SYSCALL_METADATA` macro expands to empty string: +If the `CONFIG_FTRACE_SYSCALLS` kernel option is not enabled during kernel configuration, the `SYSCALL_METADATA` macro expands to an empty string: ```C #define SYSCALL_METADATA(sname, nb, ...) @@ -329,7 +329,7 @@ As we already know and can see from the code, it takes three arguments: * `buf` - buffer to write; * `count` - length of buffer to write. -and writes data from a buffer declared by the user to a given device or a file. Note that the second parameter `buf`, defined with the `__user` attribute. The main purpose of this attribute is for checking the Linux kernel code with the [sparse](https://en.wikipedia.org/wiki/Sparse) util. It is defined in the [include/linux/compiler.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler.h) header file and depends on the `__CHECKER__` definition in the Linux kernel. That's all about useful meta-information related to our `sys_write` system call, let's try to understand how this system call is implemented. As we can see it starts from the definition of the `f` structure that has `fd` structure type that represent file descriptor in the Linux kernel and we put the result of the call of the `fdget_pos` function. The `fdget_pos` function defined in the same [source](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) code file and just expands the call of the `__to_fd` function: +and writes data from a buffer declared by the user to a given device or a file. Note that the second parameter `buf`, defined with the `__user` attribute. The main purpose of this attribute is for checking the Linux kernel code with the [sparse](https://en.wikipedia.org/wiki/Sparse) util. It is defined in the [include/linux/compiler.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/compiler.h) header file and depends on the `__CHECKER__` definition in the Linux kernel. That's all about useful meta-information related to our `sys_write` system call, let's try to understand how this system call is implemented. As we can see it starts from the definition of the `f` structure that has `fd` structure type that represents file descriptor in the Linux kernel and we put the result of the call of the `fdget_pos` function. The `fdget_pos` function defined in the same [source](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) code file and just expands the call of the `__to_fd` function: ```C static inline struct fd fdget_pos(int fd) @@ -338,7 +338,7 @@ static inline struct fd fdget_pos(int fd) } ``` -The main purpose of the `fdget_pos` is to convert the given file descriptor which is just a number to the `fd` structure. Through the long chain of function calls, the `fdget_pos` function gets the file descriptor table of the current process, `current->files`, and tries to find a corresponding file descriptor number there. As we got the `fd` structure for the given file descriptor number, we check it and return if it does not exist. We get the current position in the file with the call of the `file_pos_read` function that just returns `f_pos` field of the our file: +The main purpose of the `fdget_pos` is to convert the given file descriptor which is just a number to the `fd` structure. Through the long chain of function calls, the `fdget_pos` function gets the file descriptor table of the current process, `current->files`, and tries to find a corresponding file descriptor number there. As we got the `fd` structure for the given file descriptor number, we check it and return if it does not exist. We get the current position in the file with the call of the `file_pos_read` function that just returns `f_pos` field of our file: ```C static inline loff_t file_pos_read(struct file *file) @@ -347,7 +347,7 @@ static inline loff_t file_pos_read(struct file *file) } ``` -and call the `vfs_write` function. The `vfs_write` function defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and does the work for us - writes given buffer to the given file starting from the given position. We will not dive into details about the `vfs_write` function, because this function is weakly related to the `system call` concept but mostly about [Virtual file system](https://en.wikipedia.org/wiki/Virtual_file_system) concept which we will see in another chapter. After the `vfs_write` has finished its work, we check the result and if it was finished successfully we change the position in the file with the `file_pos_write` function: +and calls the `vfs_write` function. The `vfs_write` function defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and does the work for us - writes given buffer to the given file starting from the given position. We will not dive into details about the `vfs_write` function, because this function is weakly related to the `system call` concept but mostly about [Virtual file system](https://en.wikipedia.org/wiki/Virtual_file_system) concept which we will see in another chapter. After the `vfs_write` has finished its work, we check the result and if it was finished successfully we change the position in the file with the `file_pos_write` function: ```C if (ret >= 0) From 339539f9b7eca470526c1fe1c58e2cb7f797d3b8 Mon Sep 17 00:00:00 2001 From: Georgii Staroselskii Date: Sun, 17 Sep 2017 02:55:20 +0300 Subject: [PATCH 038/179] syscall-3.md: fix typos - delete a comma - s/receiving/received - s/Both function/Both functions - s/vsyscal/vsyscall --- SysCall/syscall-3.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SysCall/syscall-3.md b/SysCall/syscall-3.md index 40b1124..f3d962b 100644 --- a/SysCall/syscall-3.md +++ b/SysCall/syscall-3.md @@ -80,7 +80,7 @@ __vsyscall_page: ret ``` -Let's go back to the implementation of the `map_vsyscall` function and return to the implementation of the `__vsyscall_page`, later. After we receiving the physical address of the `__vsyscall_page`, we check the value of the `vsyscall_mode` variable and set the [fix-mapped](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-2.html) address for the `vsyscall` page with the `__set_fixmap` macro: +Let's go back to the implementation of the `map_vsyscall` function and return to the implementation of the `__vsyscall_page` later. After we received the physical address of the `__vsyscall_page`, we check the value of the `vsyscall_mode` variable and set the [fix-mapped](http://0xax.gitbooks.io/linux-insides/content/mm/linux-mm-2.html) address for the `vsyscall` page with the `__set_fixmap` macro: ```C if (vsyscall_mode != NONE) @@ -266,7 +266,7 @@ static int __init init_vdso(void) #endif ``` -Both function initialize the `vdso_image` structure. This structure is defined in the two generated source code files: the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c) and the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c). These source code files generated by the [vdso2c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso2c.c) program from the different source code files, represent different approaches to call a system call like `int 0x80`, `sysenter` and etc. The full set of the images depends on the kernel configuration. +Both functions initialize the `vdso_image` structure. This structure is defined in the two generated source code files: the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c) and the [arch/x86/entry/vdso/vdso-image-64.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso-image-64.c). These source code files generated by the [vdso2c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/vdso/vdso2c.c) program from the different source code files, represent different approaches to call a system call like `int 0x80`, `sysenter` and etc. The full set of the images depends on the kernel configuration. For example for the `x86_64` Linux kernel it will contain `vdso_image_64`: @@ -357,7 +357,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) } ``` -The `map_vdso` function is defined in the same source code file and maps pages for the `vDSO` and for the shared `vDSO` variables. That's all. The main differences between the `vsyscall` and the `vDSO` concepts is that `vsyscal` has a static address of `ffffffffff600000` and implements `3` system calls, whereas the `vDSO` loads dynamically and implements four system calls: +The `map_vdso` function is defined in the same source code file and maps pages for the `vDSO` and for the shared `vDSO` variables. That's all. The main differences between the `vsyscall` and the `vDSO` concepts is that `vsyscall` has a static address of `ffffffffff600000` and implements `3` system calls, whereas the `vDSO` loads dynamically and implements four system calls: * `__vdso_clock_gettime`; * `__vdso_getcpu`; From 26ebd67859656893557d69cc5dce03c62ef1e595 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sat, 23 Sep 2017 00:06:01 +0600 Subject: [PATCH 039/179] update linux kernel boostrap parts to the last kernel from upstream --- Booting/linux-bootstrap-4.md | 82 +++++++++++------- Booting/linux-bootstrap-5.md | 155 ++++++++++++----------------------- 2 files changed, 106 insertions(+), 131 deletions(-) diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index b806d3a..3ccce83 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -144,7 +144,7 @@ Bit 6 (write): KEEP_SEGMENTS a base of 0 (or the equivalent for their environment). ``` -So, if the `KEEP_SEGMENTS` bit is not set in the `loadflags`, we need to reset `ds`, `ss` and `es` segment registers to a flat segment with base `0`. That we do: +So, if the `KEEP_SEGMENTS` bit is not set in the `loadflags`, we need to set `ds`, `ss` and `es` segment registers to the index of data segment with base `0`. That we do: ```C testb $(1 << 6), BP_loadflags(%esi) @@ -172,23 +172,23 @@ Disassembly of section .head.text: 1: f6 86 11 02 00 00 40 testb $0x40,0x211(%rsi) ``` -The `objdump` util tells us that the address of the `startup_32` is `0` but actually it's not so. Our current goal is to know where actually we are. It is pretty simple to do in [long mode](https://en.wikipedia.org/wiki/Long_mode) because it support `rip` relative addressing but currently we are in [protected mode](https://en.wikipedia.org/wiki/Protected_mode). We will use common pattern to know the address of the `startup_32`. We need to define a label and make a call to this label and pop the top of the stack to a register: +The `objdump` util tells us that the address of the `startup_32` is `0` but actually it's not so. Our current goal is to know where actually we are. It is pretty simple to do in [long mode](https://en.wikipedia.org/wiki/Long_mode) because it support `rip` relative addressing, but currently we are in [protected mode](https://en.wikipedia.org/wiki/Protected_mode). We will use common pattern to know the address of the `startup_32`. We need to define a label and make a call to this label and pop the top of the stack to a register: ```assembly call label label: pop %reg ``` -After this, a register will contain the address of a label. Let's look at the similar code which searches address of the `startup_32` in the Linux kernel: +After this, a `%reg` register will contain the address of a label. Let's look at the similar code which searches address of the `startup_32` in the Linux kernel: ```assembly leal (BP_scratch+4)(%esi), %esp call 1f -1: popl %ebp +1: popl %ebp subl $1b, %ebp ``` -As you remember from the previous part, the `esi` register contains the address of the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113) structure which was filled before we moved to the protected mode. The `boot_params` structure contains a special field `scratch` with offset `0x1e4`. These four bytes field will be temporary stack for `call` instruction. We are getting the address of the `scratch` field + 4 bytes and putting it in the `esp` register. We add `4` bytes to the base of the `BP_scratch` field because, as just described, it will be a temporary stack and the stack grows from top to down in `x86_64` architecture. So our stack pointer will point to the top of the stack. Next, we can see the pattern that I've described above. We make a call to the `1f` label and put the address of this label to the `ebp` register because we have return address on the top of stack after the `call` instruction will be executed. So, for now we have an address of the `1f` label and now it is easy to get address of the `startup_32`. We just need to subtract address of label from the address which we got from the stack: +As you remember from the previous part, the `esi` register contains the address of the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113) structure which was filled before we moved to the protected mode. The `boot_params` structure contains a special field `scratch` with offset `0x1e4`. These four bytes field will be temporary stack for `call` instruction. We are getting the address of the `scratch` field + `4` bytes and putting it in the `esp` register. We add `4` bytes to the base of the `BP_scratch` field because, as just described, it will be a temporary stack and the stack grows from top to down in `x86_64` architecture. So our stack pointer will point to the top of the stack. Next, we can see the pattern that I've described above. We make a call to the `1f` label and put the address of this label to the `ebp` register because we have return address on the top of stack after the `call` instruction will be executed. So, for now we have an address of the `1f` label and now it is easy to get address of the `startup_32`. We just need to subtract address of label from the address which we got from the stack: ``` startup_32 (0x0) +-----------------------+ @@ -206,7 +206,7 @@ startup_32 (0x0) +-----------------------+ +-----------------------+ ``` -`startup_32` is linked to run at address `0x0` and this means that `1f` has the address `0x0 + offset to 1f`, approximately `0x21` bytes. The `ebp` register contains the real physical address of the `1f` label. So, if we subtract `1f` from the `ebp` we will get the real physical address of the `startup_32`. The Linux kernel [boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) describes that the base of the protected mode kernel is `0x100000`. We can verify this with [gdb](https://en.wikipedia.org/wiki/GNU_Debugger). Let's start the debugger and put breakpoint to the `1f` address, which is `0x100021`. If this is correct we will see `0x100021` in the `ebp` register: +The `startup_32` is linked to run at address `0x0` and this means that `1f` has the address `0x0 + offset to 1f`, approximately `0x21` bytes. The `ebp` register contains the real physical address of the `1f` label. So, if we subtract `1f` from the `ebp` we will get the real physical address of the `startup_32`. The Linux kernel [boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) describes that the base of the protected mode kernel is `0x100000`. We can verify this with [gdb](https://en.wikipedia.org/wiki/GNU_Debugger). Let's start the debugger and put breakpoint to the `1f` address, which is `0x100021`. If this is correct we will see `0x100021` in the `ebp` register: ``` $ gdb @@ -241,10 +241,14 @@ gs 0x18 0x18 If we execute the next instruction, `subl $1b, %ebp`, we will see: ``` -nexti +(gdb) nexti +... +... ... ebp 0x100000 0x100000 ... +... +... ``` Ok, that's true. The address of the `startup_32` is `0x100000`. After we know the address of the `startup_32` label, we can prepare for the transition to [long mode](https://en.wikipedia.org/wiki/Long_mode). Our next goal is to setup the stack and verify that the CPU supports long mode and [SSE](http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions). @@ -343,20 +347,29 @@ Remember that the value of the `ebp` register is the physical address of the `st As we can see it just expands to the aligned `CONFIG_PHYSICAL_ALIGN` value which represents the physical address of where to load the kernel. After comparison of the `LOAD_PHYSICAL_ADDR` and value of the `ebx` register, we add the offset from the `startup_32` where to decompress the compressed kernel image. If the `CONFIG_RELOCATABLE` option is not enabled during kernel configuration, we just put the default address where to load kernel and add `z_extract_offset` to it. -After all of these calculations, we will have `ebp` which contains the address where we loaded it and `ebx` set to the address of where kernel will be moved after decompression. +After all of these calculations, we will have `ebp` which contains the address where we loaded it and `ebx` set to the address of where kernel will be moved after decompression. But that is not the end. The compressed kernel image should be moved to the end of the decompression buffer to simplify calculations where kernel will be located later. For this: + +```assembly +movl BP_init_size(%esi), %eax +subl $_end, %eax +addl %eax, %ebx +``` + +we put value from the `boot_params.BP_init_size` (or kernel setup header value from the `hdr.init_size`) to the `eax` register. The `BP_init_size` contains larger value between compressed and uncompressed [vmlinux](https://en.wikipedia.org/wiki/Vmlinux). Next we subtract address of the `_end` symbol from this value and add the result of subtraction to `ebx` register which will stores base address for kernel decompression. Preparation before entering long mode -------------------------------------------------------------------------------- -When we have the base address where we will relocate the compressed kernel image, we need to do one last step before we can transition to 64-bit mode. First, we need to update the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table): +When we have the base address where we will relocate the compressed kernel image, we need to do one last step before we can transition to 64-bit mode. First, we need to update the [Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table) with 64-bit segments because an relocatable kernel may be runned at any address below 512G: ```assembly - leal gdt(%ebp), %eax - movl %eax, gdt+2(%ebp) + addl %ebp, gdt+2(%ebp) lgdt gdt(%ebp) ``` -Here we put the base address from `ebp` register with `gdt` offset into the `eax` register. Next we put this address into `ebp` register with offset `gdt+2` and load the `Global Descriptor Table` with the `lgdt` instruction. To understand the magic with `gdt` offsets we need to look at the definition of the `Global Descriptor Table`. We can find its definition in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): +Here we adjust base address of the Global Descriptor table to the address where we actually loaded and load the `Global Descriptor Table` with the `lgdt` instruction. + +To understand the magic with `gdt` offsets we need to look at the definition of the `Global Descriptor Table`. We can find its definition in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly .data @@ -364,7 +377,7 @@ gdt: .word gdt_end - gdt .long gdt .word 0 - .quad 0x0000000000000000 /* NULL descriptor */ + .quad 0x00cf9a000000ffff /* __KERNEL32_CS */ .quad 0x00af9a000000ffff /* __KERNEL_CS */ .quad 0x00cf92000000ffff /* __KERNEL_DS */ .quad 0x0080890000000000 /* TS descriptor */ @@ -372,14 +385,11 @@ gdt: gdt_end: ``` -We can see that it is located in the `.data` section and contains five descriptors: `null` descriptor, kernel code segment, kernel data segment and two task descriptors. We already loaded the `Global Descriptor Table` in the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md), and now we're doing almost the same here, but descriptors with `CS.L = 1` and `CS.D = 0` for execution in `64` bit mode. As we can see, the definition of the `gdt` starts from two bytes: `gdt_end - gdt` which represents the last byte in the `gdt` table or table limit. The next four bytes contains base address of the `gdt`. Remember that the `Global Descriptor Table` is stored in the `48-bits GDTR` which consists of two parts: - -* size(16-bit) of global descriptor table; -* address(32-bit) of the global descriptor table. +We can see that it is located in the `.data` section and contains five descriptors: the first is `32-bit` descriptor for kernel code segment, `64-bit` kernel segment, kernel data segment and two task descriptors. -So, we put address of the `gdt` to the `eax` register and then we put it to the `.long gdt` or `gdt+2` in our assembly code. From now we have formed structure for the `GDTR` register and can load the `Global Descriptor Table` with the `lgtd` instruction. +We already loaded the `Global Descriptor Table` in the previous [part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-3.md), and now we're doing almost the same here, but descriptors with `CS.L = 1` and `CS.D = 0` for execution in `64` bit mode. As we can see, the definition of the `gdt` starts from two bytes: `gdt_end - gdt` which represents the last byte in the `gdt` table or table limit. The next four bytes contains base address of the `gdt`. -After we have loaded the `Global Descriptor Table`, we must enable [PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension) mode by putting the value of the `cr4` register into `eax`, setting 5 bit in it and loading it again into `cr4`: +After we have loaded the `Global Descriptor Table` with `lgdt` instruction, we must enable [PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension) mode by putting the value of the `cr4` register into `eax`, setting 5 bit in it and loading it again into `cr4`: ```assembly movl %cr4, %eax @@ -392,7 +402,7 @@ Now we are almost finished with all preparations before we can move into 64-bit Long mode -------------------------------------------------------------------------------- -[Long mode](https://en.wikipedia.org/wiki/Long_mode) is the native mode for [x86_64](https://en.wikipedia.org/wiki/X86-64) processors. First, let's look at some differences between `x86_64` and the `x86`. +The [Long mode](https://en.wikipedia.org/wiki/Long_mode) is the native mode for [x86_64](https://en.wikipedia.org/wiki/X86-64) processors. First, let's look at some differences between `x86_64` and the `x86`. The `64-bit` mode provides features such as: @@ -434,22 +444,35 @@ Let's look at the implementation of this. First of all, we clear the buffer for ```assembly leal pgtable(%ebx), %edi xorl %eax, %eax - movl $((4096*6)/4), %ecx + movl $(BOOT_INIT_PGT_SIZE/4), %ecx rep stosl ``` -We put the address of `pgtable` plus `ebx` (remember that `ebx` contains the address to relocate the kernel for decompression) in the `edi` register, clear the `eax` register and set the `ecx` register to `6144`. The `rep stosl` instruction will write the value of the `eax` to `edi`, increase value of the `edi` register by `4` and decrease the value of the `ecx` register by `1`. This operation will be repeated while the value of the `ecx` register is greater than zero. That's why we put `6144` in `ecx`. +We put the address of `pgtable` plus `ebx` (remember that `ebx` contains the address to relocate the kernel for decompression) in the `edi` register, clear the `eax` register and set the `ecx` register to `6144`. -`pgtable` is defined at the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly file and is: +The `rep stosl` instruction will write the value of the `eax` to `edi`, increase value of the `edi` register by `4` and decrease the value of the `ecx` register by `1`. This operation will be repeated while the value of the `ecx` register is greater than zero. That's why we put `6144` or `BOOT_INIT_PGT_SIZE/4` in `ecx`. + +The `pgtable` is defined at the end of [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) assembly file and is: ```assembly .section ".pgtable","a",@nobits .balign 4096 pgtable: - .fill 6*4096, 1, 0 + .fill BOOT_PGT_SIZE, 1, 0 ``` -As we can see, it is located in the `.pgtable` section and its size is `24` kilobytes. +As we can see, it is located in the `.pgtable` section and its size depends on the `CONFIG_X86_VERBOSE_BOOTUP` kernel configuration option: + +```C +# ifdef CONFIG_X86_VERBOSE_BOOTUP +# define BOOT_PGT_SIZE (19*4096) +# else /* !CONFIG_X86_VERBOSE_BOOTUP */ +# define BOOT_PGT_SIZE (17*4096) +# endif +# else /* !CONFIG_RANDOMIZE_BASE */ +# define BOOT_PGT_SIZE BOOT_INIT_PGT_SIZE +# endif +``` After we have got buffer for the `pgtable` structure, we can start to build the top level page table - `PML4` - with: @@ -480,7 +503,7 @@ We put the base address of the page directory pointer which is `4096` or `0x1000 leal pgtable + 0x2000(%ebx), %edi movl $0x00000183, %eax movl $2048, %ecx -1: movl %eax, 0(%edi) +1: movl %eax, 0(%edi) addl $0x00200000, %eax addl $8, %edi decl %ecx @@ -527,7 +550,8 @@ In the next step, we push the address of the kernel segment code to the stack (w After this we push this address to the stack and enable paging by setting `PG` and `PE` bits in the `cr0` register: ```assembly - movl $(X86_CR0_PG | X86_CR0_PE), %eax + pushl %eax + movl $(X86_CR0_PG | X86_CR0_PE), %eax movl %eax, %cr0 ``` @@ -537,7 +561,9 @@ and execute: lret ``` -instruction. Remember that we pushed the address of the `startup_64` function to the stack in the previous step, and after the `lret` instruction, the CPU extracts the address of it and jumps there. +instruction. + +Remember that we pushed the address of the `startup_64` function to the stack in the previous step, and after the `lret` instruction, the CPU extracts the address of it and jumps there. After all of these steps we're finally in 64-bit mode: diff --git a/Booting/linux-bootstrap-5.md b/Booting/linux-bootstrap-5.md index 8722ed1..0cb5716 100644 --- a/Booting/linux-bootstrap-5.md +++ b/Booting/linux-bootstrap-5.md @@ -9,7 +9,7 @@ This is the fifth part of the `Kernel booting process` series. We saw transition Preparation before kernel decompression -------------------------------------------------------------------------------- -We stopped right before the jump on the 64-bit entry point - `startup_64` which is located in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) source code file. We already saw the jump to the `startup_64` in the `startup_32`: +We stopped right before the jump on the `64-bit` entry point - `startup_64` which is located in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S) source code file. We already saw the jump to the `startup_64` in the `startup_32`: ```assembly pushl $__KERNEL_CS @@ -24,7 +24,7 @@ We stopped right before the jump on the 64-bit entry point - `startup_64` which lret ``` -in the previous part, `startup_64` starts to work. Since we loaded the new Global Descriptor Table and there was CPU transition in other mode (64-bit mode in our case), we can see the setup of the data segments: +in the previous part. Since we loaded the new `Global Descriptor Table` and there was CPU transition in other mode (`64-bit` mode in our case), we can see the setup of the data segments: ```assembly .code64 @@ -38,7 +38,7 @@ ENTRY(startup_64) movl %eax, %gs ``` -in the beginning of the `startup_64`. All segment registers besides `cs` now point to the `ds` which is `0x18` (if you don't understand why it is `0x18`, read the previous part). +in the beginning of the `startup_64`. All segment registers besides `cs` register now reseted as we joined into the `long mode`. The next step is computation of difference between where the kernel was compiled and where it was loaded: @@ -55,10 +55,12 @@ The next step is computation of difference between where the kernel was compiled #endif movq $LOAD_PHYSICAL_ADDR, %rbp 1: - leaq z_extract_offset(%rbp), %rbx + movl BP_init_size(%rsi), %ebx + subl $_end, %ebx + addq %rbp, %rbx ``` -`rbp` contains the decompressed kernel start address and after this code executes `rbx` register will contain address to relocate the kernel code for decompression. We already saw code like this in the `startup_32` ( you can read about it in the previous part - [Calculate relocation address](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-4.md#calculate-relocation-address)), but we need to do this calculation again because the bootloader can use 64-bit boot protocol and `startup_32` just will not be executed in this case. +The `rbp` contains the decompressed kernel start address and after this code executes `rbx` register will contain address to relocate the kernel code for decompression. We already saw code like this in the `startup_32` ( you can read about it in the previous part - [Calculate relocation address](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-4.md#calculate-relocation-address)), but we need to do this calculation again because the bootloader can use 64-bit boot protocol and `startup_32` just will not be executed in this case. In the next step we can see setup of the stack pointer and resetting of the flags register: @@ -171,24 +173,21 @@ In the previous paragraph we saw that the `.text` section starts with the `reloc We need to initialize the `.bss` section, because we'll soon jump to [C](https://en.wikipedia.org/wiki/C_%28programming_language%29) code. Here we just clear `eax`, put the address of `_bss` in `rdi` and `_ebss` in `rcx`, and fill it with zeros with the `rep stosq` instruction. -At the end, we can see the call to the `decompress_kernel` function: +At the end, we can see the call to the `extract_kernel` function: ```assembly pushq %rsi - movq $z_run_size, %r9 - pushq %r9 movq %rsi, %rdi leaq boot_heap(%rip), %rsi leaq input_data(%rip), %rdx movl $z_input_len, %ecx movq %rbp, %r8 movq $z_output_len, %r9 - call decompress_kernel - popq %r9 + call extract_kernel popq %rsi ``` -Again we set `rdi` to a pointer to the `boot_params` structure and call `decompress_kernel` from [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) with seven arguments: +Again we set `rdi` to a pointer to the `boot_params` structure and preserve it on the stack. In the same time we set `rsi` to point to the area which should be usedd for kernel uncompression. The last step is preparation of the `extract_kernel` parameters and call of this function which will uncompres the kernel. The `extract_kernel` function is defined in the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) source code file and takes six arguments: * `rmode` - pointer to the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973//arch/x86/include/uapi/asm/bootparam.h#L114) structure which is filled by bootloader or during early kernel initialization; * `heap` - pointer to the `boot_heap` which represents start address of the early boot heap; @@ -196,14 +195,13 @@ Again we set `rdi` to a pointer to the `boot_params` structure and call `decompr * `input_len` - size of the compressed kernel; * `output` - start address of the future decompressed kernel; * `output_len` - size of decompressed kernel; -* `run_size` - amount of space needed to run the kernel including `.bss` and `.brk` sections. All arguments will be passed through the registers according to [System V Application Binary Interface](http://www.x86-64.org/documentation/abi.pdf). We've finished all preparation and can now look at the kernel decompression. Kernel decompression -------------------------------------------------------------------------------- -As we saw in previous paragraph, the `decompress_kernel` function is defined in the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) source code file and takes seven arguments. This function starts with the video/console initialization that we already saw in the previous parts. We need to do this again because we don't know if we started in [real mode](https://en.wikipedia.org/wiki/Real_mode) or a bootloader was used, or whether the bootloader used the 32 or 64-bit boot protocol. +As we saw in previous paragraph, the `extract_kernel` function is defined in the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c) source code file and takes six arguments. This function starts with the video/console initialization that we already saw in the previous parts. We need to do this again because we don't know if we started in [real mode](https://en.wikipedia.org/wiki/Real_mode) or a bootloader was used, or whether the bootloader used the `32` or `64-bit` boot protocol. After the first initialization steps, we store pointers to the start of the free memory and to the end of it: @@ -212,7 +210,7 @@ free_mem_ptr = heap; free_mem_end_ptr = heap + BOOT_HEAP_SIZE; ``` -where the `heap` is the second parameter of the `decompress_kernel` function which we got in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): +where the `heap` is the second parameter of the `extract_kernel` function which we got in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S): ```assembly leaq boot_heap(%rip), %rsi @@ -225,34 +223,20 @@ boot_heap: .fill BOOT_HEAP_SIZE, 1, 0 ``` -where the `BOOT_HEAP_SIZE` is macro which expands to `0x8000` (`0x400000` in a case of `bzip2` kernel) and represents the size of the heap. +where the `BOOT_HEAP_SIZE` is macro which expands to `0x10000` (`0x400000` in a case of `bzip2` kernel) and represents the size of the heap. After heap pointers initialization, the next step is the call of the `choose_random_location` function from [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file. As we can guess from the function name, it chooses the memory location where the kernel image will be decompressed. It may look weird that we need to find or even `choose` location where to decompress the compressed kernel image, but the Linux kernel supports [kASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) which allows decompression of the kernel into a random address, for security reasons. Let's open the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file and look at `choose_random_location`. -First, `choose_random_location` tries to find the `kaslr` option in the Linux kernel command line if `CONFIG_HIBERNATION` is set, and `nokaslr` otherwise: +First, `choose_random_location` tries to find the `nokaslr` option in the Linux kernel command line: ```C -#ifdef CONFIG_HIBERNATION - if (!cmdline_find_option_bool("kaslr")) { - debug_putstr("KASLR disabled by default...\n"); - goto out; - } -#else - if (cmdline_find_option_bool("nokaslr")) { - debug_putstr("KASLR disabled by cmdline...\n"); - goto out; - } -#endif -``` - -If the `CONFIG_HIBERNATION` kernel configuration option is enabled during kernel configuration and there is no `kaslr` option in the Linux kernel command line, it prints `KASLR disabled by default...` and jumps to the `out` label: - -```C -out: - return (unsigned char *)choice; +if (cmdline_find_option_bool("nokaslr")) { + debug_putstr("KASLR disabled by cmdline...\n"); + return; +} ``` -which just returns the `output` parameter which we passed to the `choose_random_location`, unchanged. If the `CONFIG_HIBERNATION` kernel configuration option is disabled and the `nokaslr` option is in the kernel command line, we jump to `out` again. +and exit if the option is present. For now, let's assume the kernel was configured with randomization enabled and try to understand what `kASLR` is. We can find information about it in the [documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt): @@ -268,12 +252,11 @@ hibernation will be disabled. It means that we can pass the `kaslr` option to the kernel's command line and get a random address for the decompressed kernel (you can read more about ASLR [here](https://en.wikipedia.org/wiki/Address_space_layout_randomization)). So, our current goal is to find random address where we can `safely` to decompress the Linux kernel. I repeat: `safely`. What does it mean in this context? You may remember that besides the code of decompressor and directly the kernel image, there are some unsafe places in memory. For example, the [initrd](https://en.wikipedia.org/wiki/Initrd) image is in memory too, and we must not overlap it with the decompressed kernel. -The next function will help us to find a safe place where we can decompress kernel. This function is `mem_avoid_init`. It defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c), and takes four arguments that we already saw in the `decompress_kernel` function: +The next function will help us to build identity mappig pages to avoid non-safe places in RAM and decompress kernel. And after this we should find a safe place where we can decompress kernel. This function is `mem_avoid_init`. It defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c), and takes four arguments that we already saw in the `extract_kernel` function: * `input_data` - pointer to the start of the compressed kernel, or in other words, the pointer to `arch/x86/boot/compressed/vmlinux.bin.bz2`; * `input_len` - the size of the compressed kernel; * `output` - the start address of the future decompressed kernel; -* `output_len` - the size of decompressed kernel. The main point of this function is to fill array of the `mem_vector` structures: @@ -337,7 +320,9 @@ Offset Proto Name Meaning So we're taking `ext_ramdisk_image` and `ext_ramdisk_size`, shifting them left on `32` (now they will contain low 32-bits in the high 32-bit bits) and getting start address of the `initrd` and size of it. After this we store these values in the `mem_avoid` array. -The next step after we've collected all unsafe memory regions in the `mem_avoid` array will be searching for a random address that does not overlap with the unsafe regions, using the `find_random_addr` function. First of all we can see the alignment of the output address in the `find_random_addr` function: +The next step after we've collected all unsafe memory regions in the `mem_avoid` array will be searching for a random address that does not overlap with the unsafe regions, using the `find_random_phys_addr` function. + +First of all we can see the alignment of the output address in the `find_random_addr` function: ```C minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); @@ -346,87 +331,51 @@ minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); You can remember `CONFIG_PHYSICAL_ALIGN` configuration option from the previous part. This option provides the value to which kernel should be aligned and it is `0x200000` by default. Once we have the aligned output address, we go through the memory regions which we got with the help of the BIOS [e820](https://en.wikipedia.org/wiki/E820) service and collect regions suitable for the decompressed kernel image: ```C -for (i = 0; i < real_mode->e820_entries; i++) { - process_e820_entry(&real_mode->e820_map[i], minimum, size); -} +process_e820_entries(minimum, image_size); ``` -Recall that we collected `e820_entries` in the second part of the [Kernel booting process part 2](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-2.md#memory-detection). The `process_e820_entry` function does some checks that an `e820` memory region is not `non-RAM`, that the start address of the memory region is not bigger than maximum allowed `aslr` offset, and that the memory region is above the minimum load location: +Recall that we collected `e820_entries` in the second part of the [Kernel booting process part 2](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-2.md#memory-detection). The `process_e820_entries` function does some checks that an `e820` memory region is not `non-RAM`, that the start address of the memory region is not bigger than maximum allowed `aslr` offset, and that the memory region is above the minimum load location: ```C -struct mem_vector region, img; - -if (entry->type != E820_RAM) - return; - -if (entry->addr >= CONFIG_RANDOMIZE_BASE_MAX_OFFSET) - return; - -if (entry->addr + entry->size < minimum) - return; +for (i = 0; i < boot_params->e820_entries; i++) { + ... + ... + ... + process_mem_region(®ion, minimum, image_size); + ... + ... + ... +} ``` -After this, we store an `e820` memory region start address and the size in the `mem_vector` structure (we saw definition of this structure above): +and calls the `process_mem_region` for acceptable memory regions. The `process_mem_region` function processes the given memory region and stores memory regions in the `slot_areas` array of `slot_area` structures which are defined. ```C -region.start = entry->addr; -region.size = entry->size; -``` - -As we store these values, we align the `region.start` as we did it in the `find_random_addr` function and check that we didn't get an address that is outside the original memory region: +#define MAX_SLOT_AREA 100 -```C -region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN); +static struct slot_area slot_areas[MAX_SLOT_AREA]; -if (region.start > entry->addr + entry->size) - return; +struct slot_area { + unsigned long addr; + int num; +}; ``` -In the next step, we reduce the size of the memory region to not include rejected regions at the start, and ensure that the last address in the memory region is smaller than `CONFIG_RANDOMIZE_BASE_MAX_OFFSET`, so that the end of the kernel image will be less than the maximum `aslr` offset: +After the `process_mem_region` is done, we will have an array of addresses that are safe for the decompressed kernel. Then we call `slots_fetch_random` function to get a random item from this array: ```C -region.size -= region.start - entry->addr; +slot = kaslr_get_random_long("Physical") % slot_max; -if (region.start + region.size > CONFIG_RANDOMIZE_BASE_MAX_OFFSET) - region.size = CONFIG_RANDOMIZE_BASE_MAX_OFFSET - region.start; -``` - -Finally, we go through all unsafe memory regions and check that the region does not overlap unsafe areas, such as kernel command line, initrd, etc...: - -```C -for (img.start = region.start, img.size = image_size ; - mem_contains(®ion, &img) ; - img.start += CONFIG_PHYSICAL_ALIGN) { - if (mem_avoid_overlap(&img)) - continue; - slots_append(img.start); +for (i = 0; i < slot_area_index; i++) { + if (slot >= slot_areas[i].num) { + slot -= slot_areas[i].num; + continue; } + return slot_areas[i].addr + slot * CONFIG_PHYSICAL_ALIGN; +} ``` -If the memory region does not overlap unsafe regions we call the `slots_append` function with the start address of the region. `slots_append` function just collects start addresses of memory regions to the `slots` array: - -```C -slots[slot_max++] = addr; -``` - -which is defined as: - -```C -static unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / - CONFIG_PHYSICAL_ALIGN]; -static unsigned long slot_max; -``` - -After `process_e820_entry` is done, we will have an array of addresses that are safe for the decompressed kernel. Then we call `slots_fetch_random` function to get a random item from this array: - -```C -if (slot_max == 0) - return 0; - -return slots[get_random_long() % slot_max]; -``` - -where `get_random_long` function checks different CPU flags as `X86_FEATURE_RDRAND` or `X86_FEATURE_TSC` and chooses a method for getting random number (it can be the RDRAND instruction, the time stamp counter, the programmable interval timer, etc...). After retrieving the random address, execution of the `choose_random_location` is finished. +where the `kaslr_get_random_long` function checks different CPU flags as `X86_FEATURE_RDRAND` or `X86_FEATURE_TSC` and chooses a method for getting random number (it can be the RDRAND instruction, the time stamp counter, the programmable interval timer, etc...). After retrieving the random address, execution of the `choose_random_location` is finished. Now let's back to [misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c#L404). After getting the address for the kernel image, there need to be some checks to be sure that the retrieved random address is correctly aligned and address is not wrong. @@ -526,9 +475,9 @@ and if it's not valid, it prints an error message and halts. If we got a valid ` } ``` -That's all. From now on, all loadable segments are in the correct place. The last `handle_relocations` function adjusts addresses in the kernel image, and is called only if the `kASLR` was enabled during kernel configuration. +That's all. From now on, all loadable segments are in the correct place. Implementation of the last `handle_relocations` function depends on the `CONFIG_X86_NEED_RELOCS` kernel configuration option and if it is enabled, this function adjusts addresses in the kernel image, and is called only if the `kASLR` was enabled during kernel configuration. -After the kernel is relocated, we return back from the `decompress_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S). The address of the kernel will be in the `rax` register and we jump to it: +After the kernel is relocated, we return back from the `extract_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S). The address of the kernel will be in the `rax` register and we jump to it: ```assembly jmp *%rax From 16bcb1025418afe64b610baee16c9b9a672c80cc Mon Sep 17 00:00:00 2001 From: dimtass Date: Sat, 23 Sep 2017 17:57:21 +0100 Subject: [PATCH 040/179] Simple typo fix --- Concepts/per-cpu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/per-cpu.md b/Concepts/per-cpu.md index 26c0323..88150ec 100644 --- a/Concepts/per-cpu.md +++ b/Concepts/per-cpu.md @@ -12,7 +12,7 @@ The kernel provides an API for creating per-cpu variables - the `DEFINE_PER_CPU` This macro defined in the [include/linux/percpu-defs.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/percpu-defs.h) as many other macros for work with per-cpu variables. Now we will see how this feature is implemented. -Take a look at the `DECLARE_PER_CPU` definition. We see that it takes 2 parameters: `type` and `name`, so we can use it to create per-cpu variables, for example like this: +Take a look at the `DEFINE_PER_CPU` definition. We see that it takes 2 parameters: `type` and `name`, so we can use it to create per-cpu variables, for example like this: ```C DEFINE_PER_CPU(int, per_cpu_n) From 349e7e6657365b3820cfc080f357be12538f8bd3 Mon Sep 17 00:00:00 2001 From: jyhuang91 Date: Thu, 28 Sep 2017 17:00:40 -0500 Subject: [PATCH 041/179] topo fix --- SyncPrim/sync-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SyncPrim/sync-1.md b/SyncPrim/sync-1.md index f3f5d7a..76ea46f 100644 --- a/SyncPrim/sync-1.md +++ b/SyncPrim/sync-1.md @@ -6,7 +6,7 @@ Introduction This part opens new chapter in the [linux-insides](http://0xax.gitbooks.io/linux-insides/content/) book. Timers and time management related stuff was described in the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html). Now time to go next. As you may understand from the part's title, this chapter will describe [synchronization](https://en.wikipedia.org/wiki/Synchronization_%28computer_science%29) primitives in the Linux kernel. -As always, before we will consider something synchronization related, we will try to know what is `synchronization primitive` in general. Actually, synchronization primitive is a software mechanism which provides ability to two or more [parallel](https://en.wikipedia.org/wiki/Parallel_computing) processes or threads to not execute simultaneously one the same segment of a code. For example let's look on the following piece of code: +As always, before we will consider something synchronization related, we will try to know what is `synchronization primitive` in general. Actually, synchronization primitive is a software mechanism which provides ability to two or more [parallel](https://en.wikipedia.org/wiki/Parallel_computing) processes or threads to not execute simultaneously on the same segment of a code. For example let's look on the following piece of code: ```C mutex_lock(&clocksource_mutex); From b9842476307c3fe3657d1ec02ab419c9dab033e6 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Wed, 11 Oct 2017 00:23:04 +0600 Subject: [PATCH 042/179] return notification_chains.md back --- Concepts/notification_chains.md | 369 ++++++++++++++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 Concepts/notification_chains.md diff --git a/Concepts/notification_chains.md b/Concepts/notification_chains.md new file mode 100644 index 0000000..f1366fe --- /dev/null +++ b/Concepts/notification_chains.md @@ -0,0 +1,369 @@ +Notification Chains in Linux Kernel +================================================================================ + +Introduction +-------------------------------------------------------------------------------- + +The Linux kernel is huge piece of [C](https://en.wikipedia.org/wiki/C_(programming_language)) code which consists from many different subsystems. Each subsystem has its own purpose which is independent of other subsystems. But often one subsystem wants to know something from other subsystem(s). There is special mechanism in the Linux kernel which allows to solve this problem partly. The name of this mechanism is - `notification chains` and its main purpose to provide a way for different subsystems to subscribe on asynchronous events from other subsystems. Note that this mechanism is only for communication inside kernel, but there are other mechanisms for communication between kernel and userspace. + +Before we will consider `notification chains` [API](https://en.wikipedia.org/wiki/Application_programming_interface) and implementation of this API, let's look at `Notification chains` mechanism from theoretical side as we did it in other parts of this book. Everything which is related to `notification chains` mechanism is located in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) header file and [kernel/notifier.c](https://github.com/torvalds/linux/blob/master/kernel/notifier.c) source code file. So let's open them and start to dive. + +Notification Chains related data structures +-------------------------------------------------------------------------------- + +Let's start to consider `notification chains` mechanism from related data structures. As I wrote above, main data structures should be located in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) header file, so the Linux kernel provides generic API which does not depend on certain architecture. In general, the `notification chains` mechanism represents a list (that's why it named `chains`) of [callback](https://en.wikipedia.org/wiki/Callback_(computer_programming)) functions which are will be executed when an event will be occurred. + +All of these callback functions are represented as `notifier_fn_t` type in the Linux kernel: + +```C +typedef int (*notifier_fn_t)(struct notifier_block *nb, unsigned long action, void *data); +``` + +So we may see that it takes three following arguments: + +* `nb` - is linked list of function pointers (will see it now); +* `action` - is type of an event. A notification chain may support multiple events, so we need this parameter to distinguish an event from other events; +* `data` - is storage for private information. Actually it allows to provide additional data information about an event. + +Additionally we may see that `notifier_fn_t` returns an integer value. This integer value maybe one of: + +* `NOTIFY_DONE` - subscriber does not interested in notification; +* `NOTIFY_OK` - notification was processed correctly; +* `NOTIFY_BAD` - something went wrong; +* `NOTIFY_STOP` - notification is done, but no further callbacks should be called for this event. + +All of these results defined as macros in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) header file: + +```C +#define NOTIFY_DONE 0x0000 +#define NOTIFY_OK 0x0001 +#define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) +#define NOTIFY_STOP (NOTIFY_OK|NOTIFY_STOP_MASK) +``` + +Where `NOTIFY_STOP_MASK` represented by the: + +```C +#define NOTIFY_STOP_MASK 0x8000 +``` + +macro and means that callbacks will not be called during next notifications. + +Each part of the Linux kernel which wants to be notified on a certain event will should provide own `notifier_fn_t` callback function. Main role of the `notification chains` mechanism is to call certain callbacks when an asynchronous event occurred. + +The main building block of the `notification chains` mechanism is the `notifier_block` structure: + +```C +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block __rcu *next; + int priority; +}; +``` + +which is defined in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) file. This struct contains pointer to callback function - `notifier_call`, link to the next notification callback and `priority` of a callback function as functions with higher priority are executed first. + +The Linux kernel provides notification chains of four following types: + +* Blocking notifier chains; +* SRCU notifier chains; +* Atomic notifier chains; +* Raw notifier chains. + +Let's consider all of these types of notification chains by order: + +In the first case for the `blocking notifier chains`, callbacks will be called/executed in process context. This means that the calls in a notification chain may be blocked. + +The second `SRCU notifier chains` represent alternative form of `blocking notifier chains`. In the first case, blocking notifier chains uses `rw_semaphore` synchronization primitive to protect chain links. `SRCU` notifier chains run in process context too, but uses special form of [RCU](https://en.wikipedia.org/wiki/Read-copy-update) mechanism which is permissible to block in an read-side critical section. + +In the third case for the `atomic notifier chains` runs in interrupt or atomic context and protected by [spinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) synchronization primitive. The last `raw notifier chains` provides special type of notifier chains without any locking restrictions on callbacks. This means that protection rests on the shoulders of caller side. It is very useful when we want to protect our chain with very specific locking mechanism. + +If we will look at the implementation of the `notifier_block` structure, we will see that it contains pointer to the `next` element from a notification chain list, but we have no head. Actually a head of such list is in separate structure depends on type of a notification chain. For example for the `blocking notifier chains`: + +```C +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block __rcu *head; +}; +``` + +or for `atomic notification chains`: + +```C +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block __rcu *head; +}; +``` + +Now as we know a little about `notification chains` mechanism let's consider implementation of its API. + +Notification Chains +-------------------------------------------------------------------------------- + +Usually there are two sides in a publish/subscriber mechanisms. One side who wants to get notifications and other side(s) who generates these notifications. We will consider notification chains mechanism from both sides. We will consider `blocking notification chains` in this part, because of other types of notification chains are similar to it and differs mostly in protection mechanisms. + +Before a notification producer is able to produce notification, first of all it should initialize head of a notification chain. For example let's consider notification chains related to kernel [loadable modules](https://en.wikipedia.org/wiki/Loadable_kernel_module). If we will look in the [kernel/module.c](https://github.com/torvalds/linux/blob/master/kernel/module.c) source code file, we will see following definition: + +```C +static BLOCKING_NOTIFIER_HEAD(module_notify_list); +``` + +which defines head for loadable modules blocking notifier chain. The `BLOCKING_NOTIFIER_HEAD` macro is defined in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) header file and expands to the following code: + +```C +#define BLOCKING_INIT_NOTIFIER_HEAD(name) do { \ + init_rwsem(&(name)->rwsem); \ + (name)->head = NULL; \ + } while (0) +``` + +So we may see that it takes name of a name of a head of a blocking notifier chain and initializes read/write [semaphore](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html) and set head to `NULL`. Besides the `BLOCKING_INIT_NOTIFIER_HEAD` macro, the Linux kernel additionally provides `ATOMIC_INIT_NOTIFIER_HEAD`, `RAW_INIT_NOTIFIER_HEAD` macros and `srcu_init_notifier` function for initialization atomic and other types of notification chains. + +After initialization of a head of a notification chain, a subsystem which wants to receive notification from the given notification chain it should register with certain function which is depends on type of notification. If you will look in the [include/linux/notifier.h](https://github.com/torvalds/linux/blob/master/include/linux/notifier.h) header file, you will see following four function for this: + +```C +extern int atomic_notifier_chain_register(struct atomic_notifier_head *nh, + struct notifier_block *nb); + +extern int blocking_notifier_chain_register(struct blocking_notifier_head *nh, + struct notifier_block *nb); + +extern int raw_notifier_chain_register(struct raw_notifier_head *nh, + struct notifier_block *nb); + +extern int srcu_notifier_chain_register(struct srcu_notifier_head *nh, + struct notifier_block *nb); +``` + +As I already wrote above, we will cover only blocking notification chains in the part, so let's consider implementation of the `blocking_notifier_chain_register` function. Implementation of this function is located in the [kernel/notifier.c](https://github.com/torvalds/linux/blob/master/kernel/notifier.c) source code file and as we may see the `blocking_notifier_chain_register` takes two parameters: + +* `nh` - head of a notification chain; +* `nb` - notification descriptor. + +Now let's look at the implementation of the `blocking_notifier_chain_register` function: + +```C +int raw_notifier_chain_register(struct raw_notifier_head *nh, + struct notifier_block *n) +{ + return notifier_chain_register(&nh->head, n); +} +``` + +As we may see it just returns result of the `notifier_chain_register` function from the same source code file and as we may understand this function does all job for us. Definition of the `notifier_chain_register` function looks: + +```C +int blocking_notifier_chain_register(struct blocking_notifier_head *nh, + struct notifier_block *n) +{ + int ret; + + if (unlikely(system_state == SYSTEM_BOOTING)) + return notifier_chain_register(&nh->head, n); + + down_write(&nh->rwsem); + ret = notifier_chain_register(&nh->head, n); + up_write(&nh->rwsem); + return ret; +} +``` + +As we may see implementation of the `blocking_notifier_chain_register` is pretty simple. First of all there is check which check current system state and if a system in rebooting state we just call the `notifier_chain_register`. In other way we do the same call of the `notifier_chain_register` but as you may see this call is protected with read/write semaphores. Now let's look at the implementation of the `notifier_chain_register` function: + +```C +static int notifier_chain_register(struct notifier_block **nl, + struct notifier_block *n) +{ + while ((*nl) != NULL) { + if (n->priority > (*nl)->priority) + break; + nl = &((*nl)->next); + } + n->next = *nl; + rcu_assign_pointer(*nl, n); + return 0; +} +``` + +This function just inserts new `notifier_block` (given by a subsystem which wants to get notifications) to the notification chain list. Besides subscribing on an event, subscriber may unsubscribe from a certain events with the set of `unsubscribe` functions: + +```C +extern int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh, + struct notifier_block *nb); + +extern int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh, + struct notifier_block *nb); + +extern int raw_notifier_chain_unregister(struct raw_notifier_head *nh, + struct notifier_block *nb); + +extern int srcu_notifier_chain_unregister(struct srcu_notifier_head *nh, + struct notifier_block *nb); +``` + +When a producer of notifications wants to notify subscribers about an event, the `*.notifier_call_chain` function will be called. As you already may guess each type of notification chains provides own function to produce notification: + +```C +extern int atomic_notifier_call_chain(struct atomic_notifier_head *nh, + unsigned long val, void *v); + +extern int blocking_notifier_call_chain(struct blocking_notifier_head *nh, + unsigned long val, void *v); + +extern int raw_notifier_call_chain(struct raw_notifier_head *nh, + unsigned long val, void *v); + +extern int srcu_notifier_call_chain(struct srcu_notifier_head *nh, + unsigned long val, void *v); +``` + +Let's consider implementation of the `blocking_notifier_call_chain` function. This function is defined in the [kernel/notifier.c](https://github.com/torvalds/linux/blob/master/kernel/notifier.c) source code file: + +```C +int blocking_notifier_call_chain(struct blocking_notifier_head *nh, + unsigned long val, void *v) +{ + return __blocking_notifier_call_chain(nh, val, v, -1, NULL); +} +``` + +and as we may see it just returns result of the `__blocking_notifier_call_chain` function. As we may see, the `blocking_notifer_call_chain` takes three parameters: + +* `nh` - head of notification chain list; +* `val` - type of a notification; +* `v` - input parameter which may be used by handlers. + +But the `__blocking_notifier_call_chain` function takes five parameters: + +```C +int __blocking_notifier_call_chain(struct blocking_notifier_head *nh, + unsigned long val, void *v, + int nr_to_call, int *nr_calls) +{ + ... + ... + ... +} +``` + +Where `nr_to_call` and `nr_calls` are number of notifier functions to be called and number of sent notifications. As you may guess the main goal of the `__blocking_notifer_call_chain` function and other functions for other notification types is to call callback function when an event occurred. Implementation of the `__blocking_notifier_call_chain` is pretty simple, it just calls the `notifier_call_chain` function from the same source code file protected with read/write semaphore: + +```C +int __blocking_notifier_call_chain(struct blocking_notifier_head *nh, + unsigned long val, void *v, + int nr_to_call, int *nr_calls) +{ + int ret = NOTIFY_DONE; + + if (rcu_access_pointer(nh->head)) { + down_read(&nh->rwsem); + ret = notifier_call_chain(&nh->head, val, v, nr_to_call, + nr_calls); + up_read(&nh->rwsem); + } + return ret; +} +``` + +and returns its result. In this case all job is done by the `notifier_call_chain` function. Main purpose of this function informs registered notifiers about an asynchronous event: + +```C +static int notifier_call_chain(struct notifier_block **nl, + unsigned long val, void *v, + int nr_to_call, int *nr_calls) +{ + ... + ... + ... + ret = nb->notifier_call(nb, val, v); + ... + ... + ... + return ret; +} +``` + +That's all. In generall all looks pretty simple. + +Now let's consider on a simple example related to [loadable modules](https://en.wikipedia.org/wiki/Loadable_kernel_module). If we will look in the [kernel/module.c](https://github.com/torvalds/linux/blob/master/kernel/module.c). As we already saw in this part, there is: + +```C +static BLOCKING_NOTIFIER_HEAD(module_notify_list); +``` + +definition of the `module_notify_list` in the [kernel/module.c](https://github.com/torvalds/linux/blob/master/kernel/module.c) source code file. This definition determines head of list of blocking notifier chains related to kernel modules. There are at least three following events: + +* MODULE_STATE_LIVE +* MODULE_STATE_COMING +* MODULE_STATE_GOING + +in which maybe interested some subsystems of the Linux kernel. For example tracing of kernel modules states. Instead of direct call of the `atomic_notifier_chain_register`, `blocking_notifier_chain_register` and etc., most notification chains come with a set of wrappers used to register to them. Registatrion on these modules events is going with the help of such wrapper: + +```C +int register_module_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&module_notify_list, nb); +} +``` + +If we will look in the [kernel/tracepoint.c](https://github.com/torvalds/linux/blob/master/kernel/tracepoint.c) source code file, we will see such registration during initialization of [tracepoints](https://www.kernel.org/doc/Documentation/trace/tracepoints.txt): + +```C +static __init int init_tracepoints(void) +{ + int ret; + + ret = register_module_notifier(&tracepoint_module_nb); + if (ret) + pr_warn("Failed to register tracepoint module enter notifier\n"); + + return ret; +} +``` + +Where `tracepoint_module_nb` provides callback function: + +```C +static struct notifier_block tracepoint_module_nb = { + .notifier_call = tracepoint_module_notify, + .priority = 0, +}; +``` + +When one of the `MODULE_STATE_LIVE`, `MODULE_STATE_COMING` or `MODULE_STATE_GOING` events occurred. For example the `MODULE_STATE_LIVE` the `MODULE_STATE_COMING` notifications will be sent during execution of the [init_module](http://man7.org/linux/man-pages/man2/init_module.2.html) [system call](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-1.html). Or for example `MODULE_STATE_GOING` will be sent during execution of the [delete_module](http://man7.org/linux/man-pages/man2/delete_module.2.html) `system call`: + +```C +SYSCALL_DEFINE2(delete_module, const char __user *, name_user, + unsigned int, flags) +{ + ... + ... + ... + blocking_notifier_call_chain(&module_notify_list, + MODULE_STATE_GOING, mod); + ... + ... + ... +} +``` + +Thus when one of these system call will be called from userspace, the Linux kernel will send certain notification depends on a system call and the `tracepoint_module_notify` callback function will be called. + +That's all. + +Links +-------------------------------------------------------------------------------- + +* [C programming langauge](https://en.wikipedia.org/wiki/C_(programming_language)) +* [API](https://en.wikipedia.org/wiki/Application_programming_interface) +* [callback](https://en.wikipedia.org/wiki/Callback_(computer_programming)) +* [RCU](https://en.wikipedia.org/wiki/Read-copy-update) +* [spinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html) +* [loadable modules](https://en.wikipedia.org/wiki/Loadable_kernel_module) +* [semaphore](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html) +* [tracepoints](https://www.kernel.org/doc/Documentation/trace/tracepoints.txt) +* [system call](https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-1.html) +* [init_module system call](http://man7.org/linux/man-pages/man2/init_module.2.html) +* [delete_module](http://man7.org/linux/man-pages/man2/delete_module.2.html) +* [previous part](https://0xax.gitbooks.io/linux-insides/content/Concepts/initcall.html) From 7b3bade1277d16ae2ead100fc2cada43787223b0 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Wed, 11 Oct 2017 00:24:22 +0600 Subject: [PATCH 043/179] update SUMMARY.md --- Concepts/README.md | 1 + SUMMARY.md | 1 + 2 files changed, 2 insertions(+) diff --git a/Concepts/README.md b/Concepts/README.md index 91eaf12..324ab98 100644 --- a/Concepts/README.md +++ b/Concepts/README.md @@ -5,3 +5,4 @@ This chapter describes various concepts which are used in the Linux kernel. * [Per-CPU variables](per-cpu.md) * [CPU masks](cpumask.md) * [The initcall mechanism](initcall.md) +* [Notification Chains](notification_chains.md) \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index 0bf8766..cfb74f3 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -63,6 +63,7 @@ * [Per-CPU variables](Concepts/per-cpu.md) * [Cpumasks](Concepts/cpumask.md) * [The initcall mechanism](Concepts/initcall.md) + * [Notification Chains](Concepts/notification_chains.md) * [Data Structures in the Linux Kernel](DataStructures/README.md) * [Doubly linked list](DataStructures/dlist.md) * [Radix tree](DataStructures/radix-tree.md) From 311a318f58485831e94c40810a92369b7185991f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Rojas=20Guerrero?= Date: Wed, 18 Oct 2017 16:25:21 +0200 Subject: [PATCH 044/179] Add location coreboot source code --- Booting/linux-bootstrap-1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index 31930c5..c550387 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -73,7 +73,7 @@ The starting address is formed by adding the base address to the value in the EI '0xfffffff0' ``` -We get `0xfffffff0`, which is 16 bytes below 4GB. This point is called the [Reset vector](http://en.wikipedia.org/wiki/Reset_vector). This is the memory location at which the CPU expects to find the first instruction to execute after reset. It contains a [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`) instruction that usually points to the BIOS entry point. For example, if we look in the [coreboot](http://www.coreboot.org/) source code, we will see: +We get `0xfffffff0`, which is 16 bytes below 4GB. This point is called the [Reset vector](http://en.wikipedia.org/wiki/Reset_vector). This is the memory location at which the CPU expects to find the first instruction to execute after reset. It contains a [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`) instruction that usually points to the BIOS entry point. For example, if we look in the [coreboot](http://www.coreboot.org/) source code (src/cpu/x86/16bit/reset16.inc), we will see: ```assembly .section ".reset" @@ -87,7 +87,7 @@ reset_vector: Here we can see the `jmp` instruction [opcode](http://ref.x86asm.net/coder32.html#xE9), which is `0xe9`, and its destination address at `_start - ( . + 2)`. -We can also see that the `reset` section is `16` bytes and that is compiled to start from `0xfffffff0` address: +We can also see that the `reset` section is `16` bytes and that is compiled to start from `0xfffffff0` address (src/cpu/x86/16bit/reset16.lds): ``` SECTIONS { From a94cefa191abb9d23d177caf1c88bae45d58da4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Rojas=20Guerrero?= Date: Wed, 18 Oct 2017 16:37:19 +0200 Subject: [PATCH 045/179] Add location coreboot source code --- Booting/linux-bootstrap-1.md | 4 ++-- contributors.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index c550387..3892230 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -73,7 +73,7 @@ The starting address is formed by adding the base address to the value in the EI '0xfffffff0' ``` -We get `0xfffffff0`, which is 16 bytes below 4GB. This point is called the [Reset vector](http://en.wikipedia.org/wiki/Reset_vector). This is the memory location at which the CPU expects to find the first instruction to execute after reset. It contains a [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`) instruction that usually points to the BIOS entry point. For example, if we look in the [coreboot](http://www.coreboot.org/) source code (src/cpu/x86/16bit/reset16.inc), we will see: +We get `0xfffffff0`, which is 16 bytes below 4GB. This point is called the [Reset vector](http://en.wikipedia.org/wiki/Reset_vector). This is the memory location at which the CPU expects to find the first instruction to execute after reset. It contains a [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`) instruction that usually points to the BIOS entry point. For example, if we look in the [coreboot](http://www.coreboot.org/) source code (`src/cpu/x86/16bit/reset16.inc`), we will see: ```assembly .section ".reset" @@ -87,7 +87,7 @@ reset_vector: Here we can see the `jmp` instruction [opcode](http://ref.x86asm.net/coder32.html#xE9), which is `0xe9`, and its destination address at `_start - ( . + 2)`. -We can also see that the `reset` section is `16` bytes and that is compiled to start from `0xfffffff0` address (src/cpu/x86/16bit/reset16.lds): +We can also see that the `reset` section is `16` bytes and that is compiled to start from `0xfffffff0` address (`src/cpu/x86/16bit/reset16.lds`): ``` SECTIONS { diff --git a/contributors.md b/contributors.md index 52c083a..446cb6d 100644 --- a/contributors.md +++ b/contributors.md @@ -109,3 +109,4 @@ Thank you to all contributors: * [Chandan Rai](https://github.com/crowchirp) * [JB Cayrou](https://github.com/jbcayrou) * [Cornelius Diekmann](https://github.com/diekmann) +* [Andrés Rojas](https://github.com/c0r3dump3d) From 360efa83bd84bf231dfc0aa5c4a210f95957d64c Mon Sep 17 00:00:00 2001 From: Jeremy Wong Date: Mon, 23 Oct 2017 00:05:41 +1100 Subject: [PATCH 046/179] fix typo of "subsys" --- Concepts/initcall.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/initcall.md b/Concepts/initcall.md index dd155dd..d09390d 100644 --- a/Concepts/initcall.md +++ b/Concepts/initcall.md @@ -39,7 +39,7 @@ The Linux kernel calls all architecture-specific `initcalls` before the `fs` rel * `core`; * `postcore`; * `arch`; -* `susys`; +* `subsys`; * `fs`; * `device`; * `late`. From cacd5e487b9f33ab05afb332d54e8eec3fc5fd0c Mon Sep 17 00:00:00 2001 From: Shaun Smiley Date: Tue, 24 Oct 2017 22:45:27 -0700 Subject: [PATCH 047/179] Grammar fixes in Booting Part 1 --- Booting/linux-bootstrap-1.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index 31930c5..4c96a75 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -4,9 +4,9 @@ Kernel booting process. Part 1. From the bootloader to the kernel -------------------------------------------------------------------------------- -If you have been reading my previous [blog posts](https://0xax.github.io/categories/assembler/), then you can see that, for some time ago, I have been starting to get involved into low-level programming. I have written some posts about assembly programming for `x86_64` Linux and, at the same time, I have also started to dive into the Linux kernel source code. +If you have been reading my previous [blog posts](https://0xax.github.io/categories/assembler/), then you can see that, for some time now, I have been starting to get involved with low-level programming. I have written some posts about assembly programming for `x86_64` Linux and, at the same time, I have also started to dive into the Linux kernel source code. -I have a great interest in understanding how low-level things work, how programs run on my computer, how are they located in memory, how the kernel manages processes and memory, how the network stack works at a low level, and many many other things. So, I have decided to write yet another series of posts about the Linux kernel for **x86_64** architecture. +I have a great interest in understanding how low-level things work, how programs run on my computer, how they are located in memory, how the kernel manages processes and memory, how the network stack works at a low level, and many many other things. So, I have decided to write yet another series of posts about the Linux kernel for the **x86_64** architecture. Note that I'm not a professional kernel hacker and I don't write code for the kernel at work. It's just a hobby. I just like low-level stuff, and it is interesting for me to see how these things work. So if you notice anything confusing, or if you have any questions/remarks, ping me on Twitter [0xAX](https://twitter.com/0xAX), drop me an [email](anotherworldofworld@gmail.com) or just create an [issue](https://github.com/0xAX/linux-insides/issues/new). I appreciate it. @@ -19,16 +19,16 @@ All posts will also be accessible at [github repo](https://github.com/0xAX/linux * Understanding C code * Understanding assembly code (AT&T syntax) -Anyway, if you just start to learn such tools, I will try to explain some parts during this and the following posts. Alright, this is the end of the simple introduction, and now we can start to dive into the Linux kernel and low-level stuff. +Anyway, if you are just starting to learn such tools, I will try to explain some parts during this and the following posts. Alright, this is the end of the simple introduction, and now we can start to dive into the Linux kernel and low-level stuff. -I've started to write this book in a time of Linux kernel `3.18` and many things might change from that time. If there are changes, I will update the posts accordingly. +I've started to write this book at the time of the `3.18` Linux kernel, and many things might change from that time. If there are changes, I will update the posts accordingly. The Magical Power Button, What happens next? -------------------------------------------------------------------------------- Although this is a series of posts about the Linux kernel, we will not be starting directly from the kernel code - at least not, in this paragraph. As soon as you press the magical power button on your laptop or desktop computer, it starts working. The motherboard sends a signal to the [power supply](https://en.wikipedia.org/wiki/Power_supply) device. After receiving the signal, the power supply provides the proper amount of electricity to the computer. Once the motherboard receives the [power good signal](https://en.wikipedia.org/wiki/Power_good_signal), it tries to start the CPU. The CPU resets all leftover data in its registers and sets up predefined values for each of them. -[80386](https://en.wikipedia.org/wiki/Intel_80386) CPU and later CPUs define the following predefined data in CPU registers after the computer resets: +The [80386](https://en.wikipedia.org/wiki/Intel_80386) CPU and later define the following predefined data in CPU registers after the computer resets: ``` IP 0xfff0 @@ -60,7 +60,7 @@ But, if we take the largest segment selector and offset, `0xffff:0xffff`, then t '0x10ffef' ``` -which is `65520` bytes past the first megabyte. Since only one megabyte is accessible in real mode, `0x10ffef` becomes `0x00ffef` with disabled [A20 line](https://en.wikipedia.org/wiki/A20_line). +which is `65520` bytes past the first megabyte. Since only one megabyte is accessible in real mode, `0x10ffef` becomes `0x00ffef` with the [A20 line](https://en.wikipedia.org/wiki/A20_line) disabled. Ok, now we know a little bit about real mode and memory addressing in this mode. Let's get back to discussing register values after reset. From bb4c0ee9e330cb8b431cf24e5412a756abce7280 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Thu, 26 Oct 2017 18:50:57 +0300 Subject: [PATCH 048/179] Fix broken link. --- SysCall/syscall-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SysCall/syscall-1.md b/SysCall/syscall-1.md index e833b89..99ab140 100644 --- a/SysCall/syscall-1.md +++ b/SysCall/syscall-1.md @@ -120,7 +120,7 @@ _exit(0) = ? +++ exited with 0 +++ ``` -In the first line of the `strace` output, we can see [execve](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This and other agreement for the `x86_64` architecture explained in the special document - [System V Application Binary Interface. PDF](http://www.x86-64.org/documentation/abi.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: +In the first line of the `strace` output, we can see [execve](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This and other agreement for the `x86_64` architecture explained in the special document - [System V Application Binary Interface. PDF](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: * `rdi`; * `rsi`; From f8cf93cd4c9249bf933be31e35fa88482b5cfa61 Mon Sep 17 00:00:00 2001 From: NeoCui Date: Sun, 29 Oct 2017 11:20:49 +0800 Subject: [PATCH 049/179] update the "kernel stack" link in the linux-initialization-5.md --- Initialization/linux-initialization-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-5.md b/Initialization/linux-initialization-5.md index 4e4d8b0..5382bab 100644 --- a/Initialization/linux-initialization-5.md +++ b/Initialization/linux-initialization-5.md @@ -31,7 +31,7 @@ We already saw implementation of the `set_intr_gate` in the previous part about * base address of the interrupt/exception handler; * third parameter is - `Interrupt Stack Table`. `IST` is a new mechanism in the `x86_64` and part of the [TSS](http://en.wikipedia.org/wiki/Task_state_segment). Every active thread in kernel mode has own kernel stack which is `16` kilobytes. While a thread in user space, this kernel stack is empty. -In addition to per-thread stacks, there are a couple of specialized stacks associated with each CPU. All about these stack you can read in the linux kernel documentation - [Kernel stacks](https://www.kernel.org/doc/Documentation/x86/x86_64/kernel-stacks). `x86_64` provides feature which allows to switch to a new `special` stack for during any events as non-maskable interrupt and etc... And the name of this feature is - `Interrupt Stack Table`. There can be up to 7 `IST` entries per CPU and every entry points to the dedicated stack. In our case this is `DEBUG_STACK`. +In addition to per-thread stacks, there are a couple of specialized stacks associated with each CPU. All about these stack you can read in the linux kernel documentation - [Kernel stacks](https://www.kernel.org/doc/Documentation/x86/kernel-stacks). `x86_64` provides feature which allows to switch to a new `special` stack for during any events as non-maskable interrupt and etc... And the name of this feature is - `Interrupt Stack Table`. There can be up to 7 `IST` entries per CPU and every entry points to the dedicated stack. In our case this is `DEBUG_STACK`. `set_intr_gate_ist` and `set_system_intr_gate_ist` work by the same principle as `set_intr_gate` with only one difference. Both of these functions checks interrupt number and call `_set_gate` inside: From 657c37e03fef5bcfc447192e5d1d7d81d8976979 Mon Sep 17 00:00:00 2001 From: NeoCui Date: Sun, 29 Oct 2017 11:33:26 +0800 Subject: [PATCH 050/179] update the entry_64.S link in the linux-initialization-5.md file --- Initialization/linux-initialization-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-5.md b/Initialization/linux-initialization-5.md index 5382bab..93cbf4b 100644 --- a/Initialization/linux-initialization-5.md +++ b/Initialization/linux-initialization-5.md @@ -54,7 +54,7 @@ As you can read above, we passed address of the `#DB` handler as `&debug` in the asmlinkage void debug(void); ``` -We can see `asmlinkage` attribute which tells to us that `debug` is function written with [assembly](http://en.wikipedia.org/wiki/Assembly_language). Yeah, again and again assembly :). Implementation of the `#DB` handler as other handlers is in this [arch/x86/kernel/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/entry_64.S) and defined with the `idtentry` assembly macro: +We can see `asmlinkage` attribute which tells to us that `debug` is function written with [assembly](http://en.wikipedia.org/wiki/Assembly_language). Yeah, again and again assembly :). Implementation of the `#DB` handler as other handlers is in this [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) and defined with the `idtentry` assembly macro: ```assembly idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK From 3dbb92c6faa314b38c59c9f93e826ca9c216cb81 Mon Sep 17 00:00:00 2001 From: Dou Liyang Date: Tue, 31 Oct 2017 10:19:43 +0800 Subject: [PATCH 051/179] Fix the mm range of guard hole s/0xffff80ffffffffff/0xffff87ffffffffff/ --- Theory/Paging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Theory/Paging.md b/Theory/Paging.md index 6691309..9242672 100644 --- a/Theory/Paging.md +++ b/Theory/Paging.md @@ -199,7 +199,7 @@ We can see here the memory map for user space, kernel space and the non-canonica #define __PAGE_OFFSET _AC(0xffff880000000000, UL) ``` -Previously this guard hole and `__PAGE_OFFSET` was from `0xffff800000000000` to `0xffff80ffffffffff` to prevent access to non-canonical area, but was later extended by 3 bits for the hypervisor. +Previously this guard hole and `__PAGE_OFFSET` was from `0xffff800000000000` to `0xffff87ffffffffff` to prevent access to non-canonical area, but was later extended by 3 bits for the hypervisor. Next is the lowest usable address in kernel space - `ffff880000000000`. This virtual memory region is for direct mapping of all the physical memory. After the memory space which maps all the physical addresses, the guard hole. It needs to be between the direct mapping of all the physical memory and the vmalloc area. After the virtual memory map for the first terabyte and the unused hole after it, we can see the `kasan` shadow memory. It was added by [commit](https://github.com/torvalds/linux/commit/ef7f0d6a6ca8c9e4b27d78895af86c2fbfaeedb2) and provides the kernel address sanitizer. After the next unused hole we can see the `esp` fixup stacks (we will talk about it in other parts of this book) and the start of the kernel text mapping from the physical address - `0`. We can find the definition of this address in the same file as the `__PAGE_OFFSET`: From c7bf68bfa113f3b88778b812cd0217f42391412d Mon Sep 17 00:00:00 2001 From: Low Jeng Lam Date: Thu, 2 Nov 2017 14:59:12 +0800 Subject: [PATCH 052/179] Update link to refer to the correct line number --- Booting/linux-bootstrap-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index ab9b6fc..f675a7c 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -316,7 +316,7 @@ Heap initialization After the stack and bss section were prepared in [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) (see previous [part](linux-bootstrap-1.md)), the kernel needs to initialize the [heap](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. -First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L21) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) in the kernel setup header and calculates the end of the stack if this flag was set: +First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L22) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) in the kernel setup header and calculates the end of the stack if this flag was set: ```C char *stack_end; From 0294cff63ef9f6f41f1db5d3d0f8d9575be6a48e Mon Sep 17 00:00:00 2001 From: Low Jeng Lam Date: Mon, 6 Nov 2017 23:31:50 +0800 Subject: [PATCH 053/179] Update link for check_cpu function --- Booting/linux-bootstrap-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index f675a7c..c175353 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -343,7 +343,7 @@ CPU validation The next step as we can see is cpu validation by `validate_cpu` from [arch/x86/boot/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpu.c). -It calls the [`check_cpu`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpucheck.c#L102) function and passes cpu level and required cpu level to it and checks that the kernel launches on the right cpu level. +It calls the [`check_cpu`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpucheck.c#L112) function and passes cpu level and required cpu level to it and checks that the kernel launches on the right cpu level. ```c check_cpu(&cpu_level, &req_level, &err_flags); if (cpu_level < req_level) { From b2e3637faa8df2cdb5d2e9fb3a041f955e4afa62 Mon Sep 17 00:00:00 2001 From: 0xF0D0 Date: Fri, 10 Nov 2017 19:17:17 +0900 Subject: [PATCH 054/179] add name to contributor list Signed-off-by: 0xF0D0 --- contributors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.md b/contributors.md index 446cb6d..cdecae5 100644 --- a/contributors.md +++ b/contributors.md @@ -110,3 +110,4 @@ Thank you to all contributors: * [JB Cayrou](https://github.com/jbcayrou) * [Cornelius Diekmann](https://github.com/diekmann) * [Andrés Rojas](https://github.com/c0r3dump3d) +* [Beomsu Kim](https://github.com/0xF0D0) From 06bc4a8f6aa8cc66bfa3536ab401dbd65ef9aae4 Mon Sep 17 00:00:00 2001 From: 0xF0D0 Date: Fri, 10 Nov 2017 19:17:52 +0900 Subject: [PATCH 055/179] typo fixed (0bB800 -> 0xb800) Signed-off-by: 0xF0D0 --- Booting/linux-bootstrap-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index 6cb565a..c454afc 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -139,7 +139,7 @@ After this, the `store_mode_params` checks the current video mode and sets the ` 0xB800:0x0000 32 Kb Color Text Video Memory ``` -So we set the `video_segment` variable to `0xb000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0bB800` if the current video mode is in color mode. After setting up the address of the video segment, font size needs to be stored in `boot_params.screen_info.orig_video_points` with: +So we set the `video_segment` variable to `0xb000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0xb800` if the current video mode is in color mode. After setting up the address of the video segment, font size needs to be stored in `boot_params.screen_info.orig_video_points` with: ```C set_fs(0); From 6c1827bf74ab83d2c9a39fe26ff2cfeffa4f8f38 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Mon, 20 Nov 2017 00:25:17 +0600 Subject: [PATCH 056/179] fix #546 --- Cgroups/cgroups1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cgroups/cgroups1.md b/Cgroups/cgroups1.md index 3c292e8..93ecf8b 100644 --- a/Cgroups/cgroups1.md +++ b/Cgroups/cgroups1.md @@ -277,7 +277,7 @@ struct cgroup_subsys { Where for example `css_online` and `css_offline` callbacks are called after a cgroup successfully will complete all allocations and a cgroup will be before releasing respectively. The `early_init` flags marks subsystems which may/should be initialized early. The `id` and `name` fields represents unique identifier in the array of registered subsystems for a cgroup and `name` of a subsystem respectively. The last - `root` fields represents pointer to the root of of a cgroup hierarchy. -Of course the `cgroup_subsys` structure bigger and has other fields, but it is enough for now. Now as we got to know important structures related to `cgroups` mechanism, let's return to the `cgroup_init_early` function. Main purpose of this function is to do early initialization of some subsystems. As you already may guess, these `early` subsystems should have `cgroup_subsys->early_init = 1`. Let's look what subsystems may be initialized early. +Of course the `cgroup_subsys` structure is bigger and has other fields, but it is enough for now. Now as we got to know important structures related to `cgroups` mechanism, let's return to the `cgroup_init_early` function. Main purpose of this function is to do early initialization of some subsystems. As you already may guess, these `early` subsystems should have `cgroup_subsys->early_init = 1`. Let's look what subsystems may be initialized early. After the definition of the two local variables we may see following lines of code: From abf4f684a5e20033bcf657babba1c77025292227 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Mon, 27 Nov 2017 00:55:54 +0600 Subject: [PATCH 057/179] bootstrap1: .org directive is useless in a case of binary output so we may remove one. Thank you @slo Signed-off-by: Alexander Kuleshov --- Booting/linux-bootstrap-1.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index 65d24f1..cb03244 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -110,7 +110,6 @@ For example: ; Note: this example is written in Intel Assembly syntax ; [BITS 16] -[ORG 0x7c00] boot: mov al, '!' From ec3fa13996a07c505a0dc7b76558e0dc44e5ac55 Mon Sep 17 00:00:00 2001 From: Fupan Li Date: Wed, 29 Nov 2017 11:58:37 +0800 Subject: [PATCH 058/179] spinlock: fix the wrong function name of arch_spin_lock It should be arch_spin_unlock instead of arch_spin_lock. Signed-off-by: Fupan Li --- SyncPrim/sync-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SyncPrim/sync-1.md b/SyncPrim/sync-1.md index 76ea46f..b58e9c6 100644 --- a/SyncPrim/sync-1.md +++ b/SyncPrim/sync-1.md @@ -373,7 +373,7 @@ If one process held a lock and a second process started to execute the `arch_spi and the next iteration of the loop will be started. If these values will be equal, this means that the process which held this lock, released this lock and the next process may acquire the lock. -The `spin_unlock` operation goes through the all macros/function as `spin_lock`, of course with `unlock` prefix. In the end the `arch_spin_unlock` function will be called. If we will look at the implementation of the `arch_spin_lock` function, we will see that it increases `head` of the `lock tickets` list: +The `spin_unlock` operation goes through the all macros/function as `spin_lock`, of course with `unlock` prefix. In the end the `arch_spin_unlock` function will be called. If we will look at the implementation of the `arch_spin_unlock` function, we will see that it increases `head` of the `lock tickets` list: ```C __add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX); From 723b07605cadbd70a3bdf0339790b5169e8b0ba3 Mon Sep 17 00:00:00 2001 From: Firo Yang Date: Wed, 29 Nov 2017 16:21:45 +0800 Subject: [PATCH 059/179] In the following expression, we add the value of phys_base to the rax register, not the address of phys_base. addq phys_base(%rip), %rax BTW, the value of phys_base = the actual loaded physical address of kernel after relocation - the likned physical address of kernel. Signed-off-by: Firo Yang --- Initialization/linux-initialization-1.md | 2 +- contributors.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Initialization/linux-initialization-1.md b/Initialization/linux-initialization-1.md index b0fecd5..eb5ff1e 100644 --- a/Initialization/linux-initialization-1.md +++ b/Initialization/linux-initialization-1.md @@ -270,7 +270,7 @@ That's all for now. Our early paging is prepared and we just need to finish last Last preparation before jump at the kernel entry point -------------------------------------------------------------------------------- -After that we jump to the label `1` we enable `PAE`, `PGE` (Paging Global Extension) and put the physical address of the `phys_base` (see above) to the `rax` register and fill `cr3` register with it: +After that we jump to the label `1` we enable `PAE`, `PGE` (Paging Global Extension) and put the content of the `phys_base` (see above) to the `rax` register and fill `cr3` register with it: ```assembly 1: diff --git a/contributors.md b/contributors.md index cdecae5..fd60e7a 100644 --- a/contributors.md +++ b/contributors.md @@ -111,3 +111,4 @@ Thank you to all contributors: * [Cornelius Diekmann](https://github.com/diekmann) * [Andrés Rojas](https://github.com/c0r3dump3d) * [Beomsu Kim](https://github.com/0xF0D0) +* [Firo Yang](https://github.com/firogh) From 70cfea09068ec1e799c730dfb56632567ca60bd2 Mon Sep 17 00:00:00 2001 From: Edward Hu Date: Thu, 30 Nov 2017 21:24:32 -0600 Subject: [PATCH 060/179] grammer adjustment and concept clarifying --- contributors.md | 1 + mm/linux-mm-1.md | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contributors.md b/contributors.md index fd60e7a..c4ef5d0 100644 --- a/contributors.md +++ b/contributors.md @@ -112,3 +112,4 @@ Thank you to all contributors: * [Andrés Rojas](https://github.com/c0r3dump3d) * [Beomsu Kim](https://github.com/0xF0D0) * [Firo Yang](https://github.com/firogh) +* [Edward Hu](https://github.com/BDHU) \ No newline at end of file diff --git a/mm/linux-mm-1.md b/mm/linux-mm-1.md index bc260b6..9a7c195 100644 --- a/mm/linux-mm-1.md +++ b/mm/linux-mm-1.md @@ -12,7 +12,7 @@ Memblock Memblock is one of the methods of managing memory regions during the early bootstrap period while the usual kernel memory allocators are not up and running yet. Previously it was called `Logical Memory Block`, but with the [patch](https://lkml.org/lkml/2010/7/13/68) by Yinghai Lu, it was renamed to the `memblock`. As Linux kernel for `x86_64` architecture uses this method. We already met `memblock` in the [Last preparations before the kernel entry point](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-3.html) part. And now it's time to get acquainted with it closer. We will see how it is implemented. -We will start to learn `memblock` from the data structures. Definitions of the all data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file. +We will start to learn `memblock` from the data structures. Definitions of all logical memory block related data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file. The first structure has the same name as this part and it is: @@ -28,7 +28,7 @@ struct memblock { }; ``` -This structure contains five fields. First is `bottom_up` which allows allocating memory in bottom-up mode when it is `true`. Next field is `current_limit`. This field describes the limit size of the memory block. The next three fields describe the type of the memory block. It can be: reserved, memory and physical memory if the `CONFIG_HAVE_MEMBLOCK_PHYS_MAP` configuration option is enabled. Now we see yet another data structure - `memblock_type`. Let's look at its definition: +This structure contains five fields. First is `bottom_up` which allows allocating memory in bottom-up mode when it is `true`. Next field is `current_limit`. This field describes the limit size of the memory block. The next three fields describe the type of the memory block. It can be: reserved, memory and physical memory (physical memory is available if the `CONFIG_HAVE_MEMBLOCK_PHYS_MAP` configuration option is enabled). Now we see yet another data structure - `memblock_type`. Let's look at its definition: ```C struct memblock_type { @@ -39,7 +39,7 @@ struct memblock_type { }; ``` -This structure provides information about the memory type. It contains fields which describe the number of memory regions which are inside the current memory block, the size of all memory regions, the size of the allocated array of the memory regions and pointer to the array of the `memblock_region` structures. `memblock_region` is a structure which describes a memory region. Its definition is: +This structure provides information about the memory type. It contains fields which describe the number of memory regions inside the current memory block, the size of all memory regions, the size of the allocated array of the memory regions, and a pointer to the array of the `memblock_region` structures. `memblock_region` is a structure which describes a memory region. Its definition is: ```C struct memblock_region { From a7b68a882567aa1b774344762a26ac0c8a66c3f5 Mon Sep 17 00:00:00 2001 From: Edward Hu Date: Thu, 30 Nov 2017 21:27:03 -0600 Subject: [PATCH 061/179] word change --- mm/linux-mm-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/linux-mm-1.md b/mm/linux-mm-1.md index 9a7c195..931ce39 100644 --- a/mm/linux-mm-1.md +++ b/mm/linux-mm-1.md @@ -12,7 +12,7 @@ Memblock Memblock is one of the methods of managing memory regions during the early bootstrap period while the usual kernel memory allocators are not up and running yet. Previously it was called `Logical Memory Block`, but with the [patch](https://lkml.org/lkml/2010/7/13/68) by Yinghai Lu, it was renamed to the `memblock`. As Linux kernel for `x86_64` architecture uses this method. We already met `memblock` in the [Last preparations before the kernel entry point](http://0xax.gitbooks.io/linux-insides/content/Initialization/linux-initialization-3.html) part. And now it's time to get acquainted with it closer. We will see how it is implemented. -We will start to learn `memblock` from the data structures. Definitions of all logical memory block related data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file. +We will start to learn `memblock` from the data structures. Definitions of all logical-memory-block-related data structures can be found in the [include/linux/memblock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/memblock.h) header file. The first structure has the same name as this part and it is: From afe7d23ed551568235b421e4bc94fcf05ea7550b Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Fri, 29 Dec 2017 23:57:43 +0600 Subject: [PATCH 062/179] fill up linker script Signed-off-by: Alexander Kuleshov --- Booting/linux-bootstrap-4.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index 3ccce83..a1b793f 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -120,7 +120,11 @@ SECTIONS _head = . ; HEAD_TEXT _ehead = . ; - } + } + ... + ... + ... +} ``` If you are not familiar with the syntax of `GNU LD` linker scripting language, you can find more information in the [documentation](https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts). In short, the `.` symbol is a special variable of linker - location counter. The value assigned to it is an offset relative to the offset of the segment. In our case, we assign zero to location counter. This means that our code is linked to run from the `0` offset in memory. Moreover, we can find this information in comments: From 04f10187e0c92a546d7f57a66977d581c26b2d01 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sat, 30 Dec 2017 00:41:20 +0600 Subject: [PATCH 063/179] alignment fixed Signed-off-by: Alexander Kuleshov --- Booting/linux-bootstrap-4.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index a1b793f..da75594 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -186,10 +186,10 @@ label: pop %reg After this, a `%reg` register will contain the address of a label. Let's look at the similar code which searches address of the `startup_32` in the Linux kernel: ```assembly - leal (BP_scratch+4)(%esi), %esp - call 1f -1: popl %ebp - subl $1b, %ebp + leal (BP_scratch+4)(%esi), %esp + call 1f +1: popl %ebp + subl $1b, %ebp ``` As you remember from the previous part, the `esi` register contains the address of the [boot_params](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113) structure which was filled before we moved to the protected mode. The `boot_params` structure contains a special field `scratch` with offset `0x1e4`. These four bytes field will be temporary stack for `call` instruction. We are getting the address of the `scratch` field + `4` bytes and putting it in the `esp` register. We add `4` bytes to the base of the `BP_scratch` field because, as just described, it will be a temporary stack and the stack grows from top to down in `x86_64` architecture. So our stack pointer will point to the top of the stack. Next, we can see the pattern that I've described above. We make a call to the `1f` label and put the address of this label to the `ebp` register because we have return address on the top of stack after the `call` instruction will be executed. So, for now we have an address of the `1f` label and now it is easy to get address of the `startup_32`. We just need to subtract address of label from the address which we got from the stack: From 6b4aa3e3d6d1e0b308b83d2c08022f8423d0bc5c Mon Sep 17 00:00:00 2001 From: Aleksey Lagoshin Date: Sat, 30 Dec 2017 00:34:36 +0200 Subject: [PATCH 064/179] Fixed mistakes in the segment descriptors part --- Booting/linux-bootstrap-2.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index c175353..d4628ad 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -60,21 +60,24 @@ where the `lgdt` instruction loads the base address and limit(size) of global de As mentioned above the GDT contains `segment descriptors` which describe memory segments. Each descriptor is 64-bits in size. The general scheme of a descriptor is: ``` -31 24 19 16 7 0 + 63 56 51 48 45 39 32 ------------------------------------------------------------ | | |B| |A| | | | |0|E|W|A| | -| BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | 4 +| BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | | | |D| |L| 19:16 | | | |1|C|R|A| | +------------------------------------------------------------ + + 31 16 15 0 ------------------------------------------------------------ | | | -| BASE 15:0 | LIMIT 15:0 | 0 +| BASE 15:0 | LIMIT 15:0 | | | | ------------------------------------------------------------ ``` -Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bit 0-15 of the Descriptor contain the value for the limit. The rest of it is in LIMIT 19:16. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: +Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bits 0-15 of Limit are located in the beginning of the Descriptor. The rest of it is in LIMIT 19:16, which is located at bits 48-51 of the Descriptor. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: -1. Limit[20-bits] is at 0-15,16-19 bits. It defines `length_of_segment - 1`. It depends on `G`(Granularity) bit. +1. Limit[20-bits] is at 0-15, 48-51 bits. It defines `length_of_segment - 1`. It depends on `G`(Granularity) bit. * if `G` (bit 55) is 0 and segment limit is 0, the size of the segment is 1 Byte * if `G` is 1 and segment limit is 0, the size of the segment is 4096 Bytes @@ -85,9 +88,9 @@ Don't worry, I know it looks a little scary after real mode, but it's easy. For * if G is 0, Limit is interpreted in terms of 1 Byte and the maximum size of the segment can be 1 Megabyte. * if G is 1, Limit is interpreted in terms of 4096 Bytes = 4 KBytes = 1 Page and the maximum size of the segment can be 4 Gigabytes. Actually, when G is 1, the value of Limit is shifted to the left by 12 bits. So, 20 bits + 12 bits = 32 bits and 232 = 4 Gigabytes. -2. Base[32-bits] is at (0-15, 32-39 and 56-63 bits). It defines the physical address of the segment's starting location. +2. Base[32-bits] is at 16-31, 32-39 and 56-63 bits. It defines the physical address of the segment's starting location. -3. Type/Attribute (40-47 bits) defines the type of segment and kinds of access to it. +3. Type/Attribute[5-bits] is at 40-44 bits. It defines the type of segment and kinds of access to it. * `S` flag at bit 44 specifies descriptor type. If `S` is 0 then this segment is a system segment, whereas if `S` is 1 then this is a code or data segment (Stack segments are data segments which must be read/write segments). To determine if the segment is a code or data segment we can check its Ex(bit 43) Attribute marked as 0 in the above diagram. If it is 0, then the segment is a Data segment otherwise it is a code segment. @@ -138,7 +141,7 @@ As we can see the first bit(bit 43) is `0` for a _data_ segment and `1` for a _c Segment registers contain segment selectors as in real mode. However, in protected mode, a segment selector is handled differently. Each Segment Descriptor has an associated Segment Selector which is a 16-bit structure: ``` -15 3 2 1 0 + 15 3 2 1 0 ----------------------------- | Index | TI | RPL | ----------------------------- From d23407fdbd41e38c0aedab398e201ed1fa62e6f0 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Sun, 7 Jan 2018 13:49:09 +0600 Subject: [PATCH 065/179] booting: add kaslr part --- Booting/linux-bootstrap-5.md | 193 ++++------------ Booting/linux-bootstrap-6.md | 417 +++++++++++++++++++++++++++++++++++ 2 files changed, 455 insertions(+), 155 deletions(-) create mode 100644 Booting/linux-bootstrap-6.md diff --git a/Booting/linux-bootstrap-5.md b/Booting/linux-bootstrap-5.md index 0cb5716..46f1e32 100644 --- a/Booting/linux-bootstrap-5.md +++ b/Booting/linux-bootstrap-5.md @@ -225,167 +225,45 @@ boot_heap: where the `BOOT_HEAP_SIZE` is macro which expands to `0x10000` (`0x400000` in a case of `bzip2` kernel) and represents the size of the heap. -After heap pointers initialization, the next step is the call of the `choose_random_location` function from [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file. As we can guess from the function name, it chooses the memory location where the kernel image will be decompressed. It may look weird that we need to find or even `choose` location where to decompress the compressed kernel image, but the Linux kernel supports [kASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) which allows decompression of the kernel into a random address, for security reasons. Let's open the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file and look at `choose_random_location`. +After heap pointers initialization, the next step is the call of the `choose_random_location` function from [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c#L425) source code file. As we can guess from the function name, it chooses the memory location where the kernel image will be decompressed. It may look weird that we need to find or even `choose` location where to decompress the compressed kernel image, but the Linux kernel supports [kASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) which allows decompression of the kernel into a random address, for security reasons. -First, `choose_random_location` tries to find the `nokaslr` option in the Linux kernel command line: +We will not consider randomization of the Linux kernel load address in this part, but will do it in the next part. -```C -if (cmdline_find_option_bool("nokaslr")) { - debug_putstr("KASLR disabled by cmdline...\n"); - return; -} -``` - -and exit if the option is present. - -For now, let's assume the kernel was configured with randomization enabled and try to understand what `kASLR` is. We can find information about it in the [documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt): - -``` -kaslr/nokaslr [X86] - -Enable/disable kernel and module base offset ASLR -(Address Space Layout Randomization) if built into -the kernel. When CONFIG_HIBERNATION is selected, -kASLR is disabled by default. When kASLR is enabled, -hibernation will be disabled. -``` - -It means that we can pass the `kaslr` option to the kernel's command line and get a random address for the decompressed kernel (you can read more about ASLR [here](https://en.wikipedia.org/wiki/Address_space_layout_randomization)). So, our current goal is to find random address where we can `safely` to decompress the Linux kernel. I repeat: `safely`. What does it mean in this context? You may remember that besides the code of decompressor and directly the kernel image, there are some unsafe places in memory. For example, the [initrd](https://en.wikipedia.org/wiki/Initrd) image is in memory too, and we must not overlap it with the decompressed kernel. - -The next function will help us to build identity mappig pages to avoid non-safe places in RAM and decompress kernel. And after this we should find a safe place where we can decompress kernel. This function is `mem_avoid_init`. It defined in the same source code [file](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/kaslr.c), and takes four arguments that we already saw in the `extract_kernel` function: - -* `input_data` - pointer to the start of the compressed kernel, or in other words, the pointer to `arch/x86/boot/compressed/vmlinux.bin.bz2`; -* `input_len` - the size of the compressed kernel; -* `output` - the start address of the future decompressed kernel; - -The main point of this function is to fill array of the `mem_vector` structures: +Now let's back to [misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c#L404). After getting the address for the kernel image, there need to be some checks to be sure that the retrieved random address is correctly aligned and address is not wrong: ```C -#define MEM_AVOID_MAX 5 +if ((unsigned long)output & (MIN_KERNEL_ALIGN - 1)) + error("Destination physical address inappropriately aligned"); -static struct mem_vector mem_avoid[MEM_AVOID_MAX]; -``` - -where the `mem_vector` structure contains information about unsafe memory regions: - -```C -struct mem_vector { - unsigned long start; - unsigned long size; -}; -``` +if (virt_addr & (MIN_KERNEL_ALIGN - 1)) + error("Destination virtual address inappropriately aligned"); -The implementation of the `mem_avoid_init` is pretty simple. Let's look on the part of this function: +if (heap > 0x3fffffffffffUL) + error("Destination address too large"); -```C - ... - ... - ... - initrd_start = (u64)real_mode->ext_ramdisk_image << 32; - initrd_start |= real_mode->hdr.ramdisk_image; - initrd_size = (u64)real_mode->ext_ramdisk_size << 32; - initrd_size |= real_mode->hdr.ramdisk_size; - mem_avoid[1].start = initrd_start; - mem_avoid[1].size = initrd_size; - ... - ... - ... -``` +if (virt_addr + max(output_len, kernel_total_size) > KERNEL_IMAGE_SIZE) + error("Destination virtual address is beyond the kernel mapping area"); -Here we can see calculation of the [initrd](http://en.wikipedia.org/wiki/Initrd) start address and size. The `ext_ramdisk_image` is the high `32-bits` of the `ramdisk_image` field from the setup header, and `ext_ramdisk_size` is the high 32-bits of the `ramdisk_size` field from the [boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt): +if ((unsigned long)output != LOAD_PHYSICAL_ADDR) + error("Destination address does not match LOAD_PHYSICAL_ADDR"); -``` -Offset Proto Name Meaning -/Size -... -... -... -0218/4 2.00+ ramdisk_image initrd load address (set by boot loader) -021C/4 2.00+ ramdisk_size initrd size (set by boot loader) -... +if (virt_addr != LOAD_PHYSICAL_ADDR) + error("Destination virtual address changed when not relocatable"); ``` -And `ext_ramdisk_image` and `ext_ramdisk_size` can be found in the [Documentation/x86/zero-page.txt](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/zero-page.txt): - -``` -Offset Proto Name Meaning -/Size -... -... -... -0C0/004 ALL ext_ramdisk_image ramdisk_image high 32bits -0C4/004 ALL ext_ramdisk_size ramdisk_size high 32bits -... -``` - -So we're taking `ext_ramdisk_image` and `ext_ramdisk_size`, shifting them left on `32` (now they will contain low 32-bits in the high 32-bit bits) and getting start address of the `initrd` and size of it. After this we store these values in the `mem_avoid` array. - -The next step after we've collected all unsafe memory regions in the `mem_avoid` array will be searching for a random address that does not overlap with the unsafe regions, using the `find_random_phys_addr` function. - -First of all we can see the alignment of the output address in the `find_random_addr` function: - -```C -minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); -``` - -You can remember `CONFIG_PHYSICAL_ALIGN` configuration option from the previous part. This option provides the value to which kernel should be aligned and it is `0x200000` by default. Once we have the aligned output address, we go through the memory regions which we got with the help of the BIOS [e820](https://en.wikipedia.org/wiki/E820) service and collect regions suitable for the decompressed kernel image: - -```C -process_e820_entries(minimum, image_size); -``` - -Recall that we collected `e820_entries` in the second part of the [Kernel booting process part 2](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-2.md#memory-detection). The `process_e820_entries` function does some checks that an `e820` memory region is not `non-RAM`, that the start address of the memory region is not bigger than maximum allowed `aslr` offset, and that the memory region is above the minimum load location: +After all these checks we will see the familiar message: -```C -for (i = 0; i < boot_params->e820_entries; i++) { - ... - ... - ... - process_mem_region(®ion, minimum, image_size); - ... - ... - ... -} ``` - -and calls the `process_mem_region` for acceptable memory regions. The `process_mem_region` function processes the given memory region and stores memory regions in the `slot_areas` array of `slot_area` structures which are defined. - -```C -#define MAX_SLOT_AREA 100 - -static struct slot_area slot_areas[MAX_SLOT_AREA]; - -struct slot_area { - unsigned long addr; - int num; -}; +Decompressing Linux... ``` -After the `process_mem_region` is done, we will have an array of addresses that are safe for the decompressed kernel. Then we call `slots_fetch_random` function to get a random item from this array: +and call the `__decompress` function: ```C -slot = kaslr_get_random_long("Physical") % slot_max; - -for (i = 0; i < slot_area_index; i++) { - if (slot >= slot_areas[i].num) { - slot -= slot_areas[i].num; - continue; - } - return slot_areas[i].addr + slot * CONFIG_PHYSICAL_ALIGN; -} -``` - -where the `kaslr_get_random_long` function checks different CPU flags as `X86_FEATURE_RDRAND` or `X86_FEATURE_TSC` and chooses a method for getting random number (it can be the RDRAND instruction, the time stamp counter, the programmable interval timer, etc...). After retrieving the random address, execution of the `choose_random_location` is finished. - -Now let's back to [misc.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/misc.c#L404). After getting the address for the kernel image, there need to be some checks to be sure that the retrieved random address is correctly aligned and address is not wrong. - -After all these checks we will see the familiar message: - -``` -Decompressing Linux... +__decompress(input_data, input_len, NULL, NULL, output, output_len, NULL, error); ``` -and call the `__decompress` function which will decompress the kernel. The `__decompress` function depends on what decompression algorithm was chosen during kernel compilation: +which will decompress the kernel. The implementation of the `__decompress` function depends on what decompression algorithm was chosen during kernel compilation: ```C #ifdef CONFIG_KERNEL_GZIP @@ -444,11 +322,11 @@ Elf64_Phdr *phdrs, *phdr; memcpy(&ehdr, output, sizeof(ehdr)); if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || - ehdr.e_ident[EI_MAG1] != ELFMAG1 || - ehdr.e_ident[EI_MAG2] != ELFMAG2 || - ehdr.e_ident[EI_MAG3] != ELFMAG3) { - error("Kernel is not a valid ELF file"); - return; + ehdr.e_ident[EI_MAG1] != ELFMAG1 || + ehdr.e_ident[EI_MAG2] != ELFMAG2 || + ehdr.e_ident[EI_MAG3] != ELFMAG3) { + error("Kernel is not a valid ELF file"); + return; } ``` @@ -466,18 +344,23 @@ and if it's not valid, it prints an error message and halts. If we got a valid ` #else dest = (void *)(phdr->p_paddr); #endif - memcpy(dest, - output + phdr->p_offset, - phdr->p_filesz); + memmove(dest, output + phdr->p_offset, phdr->p_filesz); + break; + default: break; - default: /* Ignore other PT_* */ break; } } ``` -That's all. From now on, all loadable segments are in the correct place. Implementation of the last `handle_relocations` function depends on the `CONFIG_X86_NEED_RELOCS` kernel configuration option and if it is enabled, this function adjusts addresses in the kernel image, and is called only if the `kASLR` was enabled during kernel configuration. +That's all. + +From this moment, all loadable segments are in the correct place. + +The next step after the `parse_elf` function is the call of the `handle_relocations` function. Implementation of this function depends on the `CONFIG_X86_NEED_RELOCS` kernel configuration option and if it is enabled, this function adjusts addresses in the kernel image, and is called only if the `CONFIG_RANDOMIZE_BASE` configuration option was enabled during kernel configuration. Implementation of the `handle_relocations` function is easy enough. This function subtracts value of the `LOAD_PHYSICAL_ADDR` from the value of the base load address of the kernel and thus we obtain the difference between where the kernel was linked to load and where it was actually loaded. After this we can perform kernel relocation as we know actual address where the kernel was loaded, its address where it was linked to run and relocation table which is in the end of the kernel image. + +After the kernel is relocated, we return back from the `extract_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S). -After the kernel is relocated, we return back from the `extract_kernel` to [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/compressed/head_64.S). The address of the kernel will be in the `rax` register and we jump to it: +The address of the kernel will be in the `rax` register and we jump to it: ```assembly jmp *%rax @@ -488,9 +371,9 @@ That's all. Now we are in the kernel! Conclusion -------------------------------------------------------------------------------- -This is the end of the fifth and the last part about linux kernel booting process. We will not see posts about kernel booting anymore (maybe updates to this and previous posts), but there will be many posts about other kernel internals. +This is the end of the fifth part about linux kernel booting process. We will not see posts about kernel booting anymore (maybe updates to this and previous posts), but there will be many posts about other kernel internals. -Next chapter will be about kernel initialization and we will see the first steps in the Linux kernel initialization code. +Next chapter will describe more advanced details about linux kernel booting process, like a load address randomization and etc. If you have any questions or suggestions write me a comment or ping me in [twitter](https://twitter.com/0xAX). diff --git a/Booting/linux-bootstrap-6.md b/Booting/linux-bootstrap-6.md new file mode 100644 index 0000000..48e414a --- /dev/null +++ b/Booting/linux-bootstrap-6.md @@ -0,0 +1,417 @@ +Kernel booting process. Part 6. +================================================================================ + +Introduction +-------------------------------------------------------------------------------- + +This is the sixth part of the `Kernel booting process` series. In the [previous part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-5.md) we have seen the end of the kernel boot process. But we have skipped some important advanced parts. + +As you may remember the entry point of the Linux kernel is the `start_kernel` function from the [main.c](https://github.com/torvalds/linux/blob/master/init/main.c) source code file started to execute at `LOAD_PHYSICAL_ADDR` address. This address depends on the `CONFIG_PHYSICAL_START` kernel configuration option which is `0x1000000` by default: + +``` +config PHYSICAL_START + hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP) + default "0x1000000" + ---help--- + This gives the physical address where the kernel is loaded. + ... + ... + ... +``` + +This value may be changed during kernel configuration, but also load address can be selected as random value. For this purpose the `CONFIG_RANDOMIZE_BASE` kernel configuration option should be enabled during kernel configuration. + +In this case a physical address at which Linux kernel image will be decompressed and loaded will be randomized. This part considers the case when this option is enabled and load address of the kernel image will be randomized for [security reasons](https://en.wikipedia.org/wiki/Address_space_layout_randomization). + +Initialization of page tables +-------------------------------------------------------------------------------- + +Before the kernel decompressor will start to find random memory range where the kernel will be decompressed and loaded, the identity mapped page tables should be initialized. If a [bootloader](https://en.wikipedia.org/wiki/Booting) used [16-bit or 32-bit boot protocol](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt), we already have page tables. But in any case, we may need new pages by demand if the kernel decompressor selects memory range outside of them. That's why we need to build new identity mapped page tables. + +Yes, building of identity mapped page tables is the one of the first step during randomization of load address. But before we will consider it, let's try to remember where did we come from to this point. + +In the [previous part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-5.md), we saw transition to [long mode](https://en.wikipedia.org/wiki/Long_mode) and jump to the kernel decompressor entry point - `extract_kernel` function. The randomization stuff starts here from the call of the: + +```C +void choose_random_location(unsigned long input, + unsigned long input_size, + unsigned long *output, + unsigned long output_size, + unsigned long *virt_addr) +{} +``` + +function. As you may see, this function takes following five parameters: + + * `input`; + * `input_size`; + * `output`; + * `output_isze`; + * `virt_addr`. + +Let's try to understand what these parameters are. The first `input` parameter came from parameters of the `extract_kernel` function from the [arch/x86/boot/compressed/misc.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/misc.c) source code file: + +```C +asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, + unsigned char *input_data, + unsigned long input_len, + unsigned char *output, + unsigned long output_len) +{ + ... + ... + ... + choose_random_location((unsigned long)input_data, input_len, + (unsigned long *)&output, + max(output_len, kernel_total_size), + &virt_addr); + ... + ... + ... +} +``` + +This parameter is passed from assembler code: + +```C +leaq input_data(%rip), %rdx +``` + +from the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S). The `input_data` is generated by the little [mkpiggy](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/mkpiggy.c) program. If you have compiled linux kernel source code under your hands, you may find the generated file by this program which should be placed in the `linux/arch/x86/boot/compressed/piggy.S`. In my case this file looks: + +```assembly +.section ".rodata..compressed","a",@progbits +.globl z_input_len +z_input_len = 6988196 +.globl z_output_len +z_output_len = 29207032 +.globl input_data, input_data_end +input_data: +.incbin "arch/x86/boot/compressed/vmlinux.bin.gz" +input_data_end: +``` + +As you may see it contains four global symbols. The first two `z_input_len` and `z_output_len` which are sizes of compressed and uncompressed `vmlinux.bin.gz`. The third is our `input_data` and as you may see it points to linux kernel image in raw binary format (all debugging symbols, comments and relocation information are stripped). And the last `input_data_end` points to the end of the compressed linux image. + +So, our first parameter of the `choose_random_location` function is the pointer to the compressed kernel image that is embedded into the `piggy.o` object file. + +The second parameter of the `choose_random_location` function is the `z_input_len` that we have seen just now. + +The third and fourth parameters of the `choose_random_location` function are address where to place decompressed kernel image and the length of decompressed kernel image respectively. The address where to put decompressed kernel came from [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) and it is address of the `startup_32` aligned to 2 megabytes boundary. The size of the decompressed kernel came from the same `piggy.S` and it is `z_output_len`. + +The last parameter of the `choose_random_location` function is the virtual address of the kernel load address. As we may see, by default it coincides with the default physical load address: + +```C +unsigned long virt_addr = LOAD_PHYSICAL_ADDR; +``` + +which depends on kernel configuration: + +```C +#define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ + + (CONFIG_PHYSICAL_ALIGN - 1)) \ + & ~(CONFIG_PHYSICAL_ALIGN - 1)) +``` + +Now, as we considered parameters of the `choose_random_location` function, let's look at implementation of it. This function starts from the checking of `nokaslr` option in the kernel command line: + +```C +if (cmdline_find_option_bool("nokaslr")) { + warn("KASLR disabled: 'nokaslr' on cmdline."); + return; +} +``` + +and if the options was given we exit from the `choose_random_location` function ad kernel load address will not be randomized. Related command line options can be found in the [kernel documentation](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt): + +``` +kaslr/nokaslr [X86] + +Enable/disable kernel and module base offset ASLR +(Address Space Layout Randomization) if built into +the kernel. When CONFIG_HIBERNATION is selected, +kASLR is disabled by default. When kASLR is enabled, +hibernation will be disabled. +``` + +Let's assume that we didn't pass `nokaslr` to the kernel command line and the `CONFIG_RANDOMIZE_BASE` kernel configuration option is enabled. + +The next step is the call of the: + +```C +initialize_identity_maps(); +``` + +function which is defined in the [arch/x86/boot/compressed/pagetable.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/pagetable.c) source code file. This function starts from initialization of `mapping_info` an instance of the `x86_mapping_info` structure: + +```C +mapping_info.alloc_pgt_page = alloc_pgt_page; +mapping_info.context = &pgt_data; +mapping_info.page_flag = __PAGE_KERNEL_LARGE_EXEC | sev_me_mask; +mapping_info.kernpg_flag = _KERNPG_TABLE | sev_me_mask; +``` + +The `x86_mapping_info` structure is defined in the [arch/x86/include/asm/init.h](https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/init.h) header file and looks: + +```C +struct x86_mapping_info { + void *(*alloc_pgt_page)(void *); + void *context; + unsigned long page_flag; + unsigned long offset; + bool direct_gbpages; + unsigned long kernpg_flag; +}; +``` + +This structure provides information about memory mappings. As you may remember from the previous part, we already setup'ed initial page tables from 0 up to `4G`. For now we may need to access memory above `4G` to load kernel at random position. So, the `initialize_identity_maps` function executes initialization of a memory region for a possible needed new page table. First of all let's try to look at the definition of the `x86_mapping_info` structure. + +The `alloc_pgt_page` is a callback function that will be called to allocate space for a page table entry. The `context` field is an instance of the `alloc_pgt_data` structure in our case which will be used to track allocated page tables. The `page_flag` and `kernpg_flag` fields are page flags. The first represents flags for `PMD` or `PUD` entries. The second `kernpg_flag` field represents flags for kernel pages which can be overridden later. The `direct_gbpages` field represents support for huge pages and the last `offset` field represents offset between kernel virtual addresses and physical addresses up to `PMD` level. + +The `alloc_pgt_page` callback just validates that there is space for a new page, allocates new page: + +```C +entry = pages->pgt_buf + pages->pgt_buf_offset; +pages->pgt_buf_offset += PAGE_SIZE; +``` + +in the buffer from the: + +```C +struct alloc_pgt_data { + unsigned char *pgt_buf; + unsigned long pgt_buf_size; + unsigned long pgt_buf_offset; +}; +``` + +structure and returns address of a new page. The last goal of the `initialize_identity_maps` function is to initialize `pgdt_buf_size` and `pgt_buf_offset`. As we are only in initialization phase, the `initialze_identity_maps` function sets `pgt_buf_offset` to zero: + +```C +pgt_data.pgt_buf_offset = 0; +``` + +and the `pgt_data.pgt_buf_size` will be set to `77824` or `69632` depends on which boot protocol will be used by bootloader (64-bit or 32-bit). The same is for `pgt_data.pgt_buf`. If a bootloader loaded the kernel at `startup_32`, the `pgdt_data.pgdt_buf` will point to the end of the page table which already was initialzed in the [arch/x86/boot/compressed/head_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S): + +```C +pgt_data.pgt_buf = _pgtable + BOOT_INIT_PGT_SIZE; +``` + +where `_pgtable` points to the beginning of this page table [_pgtable](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/vmlinux.lds.S). In other way, if a bootloader have used 64-bit boot protocol and loaded the kernel at `startup_64`, early page tables should be built by bootloader itself and `_pgtable` will be just overwrote: + +```C +pgt_data.pgt_buf = _pgtable +``` + +As the buffer for new page tables is initialized, we may return back to the `choose_random_location` function. + +Avoid reserved memory ranges +-------------------------------------------------------------------------------- + +After the stuff related to identity page tables is initilized, we may start to choose random location where to put decompressed kernel image. But as you may guess, we can't choose any address. There are some reseved addresses in memory ranges. Such addresses occupied by important things, like [initrd](https://en.wikipedia.org/wiki/Initial_ramdisk), kernel command line and etc. The + +```C +mem_avoid_init(input, input_size, *output); +``` + +function will help us to do this. All non-safe memory regions will be collected in the: + +```C +struct mem_vector { + unsigned long long start; + unsigned long long size; +}; + +static struct mem_vector mem_avoid[MEM_AVOID_MAX]; +``` + +array. Where `MEM_AVOID_MAX` is from `mem_avoid_index` [enum](https://en.wikipedia.org/wiki/Enumerated_type#C) which represents different types of reserved memory regions: + +```C +enum mem_avoid_index { + MEM_AVOID_ZO_RANGE = 0, + MEM_AVOID_INITRD, + MEM_AVOID_CMDLINE, + MEM_AVOID_BOOTPARAMS, + MEM_AVOID_MEMMAP_BEGIN, + MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1, + MEM_AVOID_MAX, +}; +``` + +Both are defined in the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c) source code file. + +Let's look at the implementation of the `mem_avoid_init` function. The main goal of this function is to store information about reseved memory regions described by the `mem_avoid_index` enum in the `mem_avoid` array and create new pages for such regions in our new identity mapped buffer. Numerous parts fo the `mem_avoid_index` function are similar, but let's take a look at the one of them: + +```C +mem_avoid[MEM_AVOID_ZO_RANGE].start = input; +mem_avoid[MEM_AVOID_ZO_RANGE].size = (output + init_size) - input; +add_identity_map(mem_avoid[MEM_AVOID_ZO_RANGE].start, + mem_avoid[MEM_AVOID_ZO_RANGE].size); +``` + +At the beginning of the `mem_avoid_init` function tries to avoid memory region that is used for current kernel decompression. We fill an entry from the `mem_avoid` array with the start and size of such region and call the `add_identity_map` function which should build identity mapped pages for this region. The `add_identity_map` function is defined in the [arch/x86/boot/compressed/kaslr.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c) source code file and looks: + +```C +void add_identity_map(unsigned long start, unsigned long size) +{ + unsigned long end = start + size; + + start = round_down(start, PMD_SIZE); + end = round_up(end, PMD_SIZE); + if (start >= end) + return; + + kernel_ident_mapping_init(&mapping_info, (pgd_t *)top_level_pgt, + start, end); +} +``` + +As you may see it aligns memory region to 2 megabytes boundary and checks given start and end addresses. + +In the end it just calls the `kernel_ident_mapping_init` function from the [arch/x86/mm/ident_map.c](https://github.com/torvalds/linux/blob/master/arch/x86/mm/ident_map.c) source code file and pass `mapping_info` instance that was initilized above, address of the top level page table and addresses of memory region for which new identity mapping should be built. + +The `kernel_ident_mapping_init` function sets default flags for new pages if they were not given: + +```C +if (!info->kernpg_flag) + info->kernpg_flag = _KERNPG_TABLE; +``` + +and starts to build new 2-megabytes (because of `PSE` bit in the `mapping_info.page_flag`) page entries (`PGD -> P4D -> PUD -> PMD` in a case of [five-level page tables](https://lwn.net/Articles/717293/) or `PGD -> PUD -> PMD` in a case of [four-level page tables](https://lwn.net/Articles/117749/)) related to the given addresses. + +```C +for (; addr < end; addr = next) { + p4d_t *p4d; + + next = (addr & PGDIR_MASK) + PGDIR_SIZE; + if (next > end) + next = end; + + p4d = (p4d_t *)info->alloc_pgt_page(info->context); + result = ident_p4d_init(info, p4d, addr, next); + + return result; +} +``` + +First of all here we find next entry of the `Page Global Directory` for the given address and if it is greater than `end` of the given memory region, we set it to `end`. After this we allocater a new page with our `x86_mapping_info` callback that we already considered above and call the `ident_p4d_init` function. The `ident_p4d_init` function will do the same, but for low-level page directories (`p4d` -> `pud` -> `pmd`). + +That's all. + +New page entries related to reserved addresses are in our page tables. This is not the end of the `mem_avoid_init` function, but other parts are similar. It just build pages for [initrd](https://en.wikipedia.org/wiki/Initial_ramdisk), kernel command line and etc. + +Now we may return back to `choose_random_location` function. + +Physical address randomization +-------------------------------------------------------------------------------- + +After the reserved memory regions were stored in the `mem_avoid` array and identity mapping pages were built for them, we select minimal available address to choose random memory region to decompress the kernel: + +```C +min_addr = min(*output, 512UL << 20); +``` + +As you may see it should be smaller than `512` megabytes. This `512` megabytes value was selected just to avoid unknown things in lower memory. + +The next step is to select random physical and virtual addresses to load kernel. The first is physical addresses: + +```C +random_addr = find_random_phys_addr(min_addr, output_size); +``` + +The `find_random_phys_addr` function is defined in the [same](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/kaslr.c) source code file: + +``` +static unsigned long find_random_phys_addr(unsigned long minimum, + unsigned long image_size) +{ + minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); + + if (process_efi_entries(minimum, image_size)) + return slots_fetch_random(); + + process_e820_entries(minimum, image_size); + return slots_fetch_random(); +} +``` + +The main goal of `process_efi_entries` function is to find all suitable memory ranges in full accessible memory to load kernel. If the kernel compiled and runned on the system without [EFI](https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface) support, we continue to search such memory regions in the [e820](https://en.wikipedia.org/wiki/E820) regions. All founded memory regions will be stored in the + +```C +struct slot_area { + unsigned long addr; + int num; +}; + +#define MAX_SLOT_AREA 100 + +static struct slot_area slot_areas[MAX_SLOT_AREA]; +``` + +array. The kernel decompressor should select random index of this array and it will be random place where kernel will be decompressed. This selection will be executed by the `slots_fetch_random` function. The main goal of the `slots_fetch_random` function is to select random memory range from the `slot_areas` array via `kaslr_get_random_long` function: + +```C +slot = kaslr_get_random_long("Physical") % slot_max; +``` + +The `kaslr_get_random_long` function is defined in the [arch/x86/lib/kaslr.c](https://github.com/torvalds/linux/blob/master/arch/x86/lib/kaslr.c) source code file and it just returns random number. Note that the random number will be get via different ways depends on kernel configuration and system opportunities (select random number base on [time stamp counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter), [rdrand](https://en.wikipedia.org/wiki/RdRand) and so on). + +That's all from this point random memory range will be selected. + +Virtual address randomization +-------------------------------------------------------------------------------- + +After random memory region was selected by the kernel decompressor, new identity mapped pages will be built for this region by demand: + +```C +random_addr = find_random_phys_addr(min_addr, output_size); + +if (*output != random_addr) { + add_identity_map(random_addr, output_size); + *output = random_addr; +} +``` + +From this time `output` will store the base address of a memory region where kernel will be decompressed. But for this moment, as you may remember we randomized only physical address. Virtual address should be randomized too in a case of [x86_64](https://en.wikipedia.org/wiki/X86-64) architecture: + +```C +if (IS_ENABLED(CONFIG_X86_64)) + random_addr = find_random_virt_addr(LOAD_PHYSICAL_ADDR, output_size); + +*virt_addr = random_addr; +``` + +As you may see in a case of non `x86_64` architecture, randomzed virtual address will coincide with randomized physical address. The `find_random_virt_addr` function calculates amount of virtual memory ranges that may hold kernel image and calls the `kaslr_get_random_long` that we already saw in a previous case when we tried to find random `physical` address. + +From this moment we have both randomized base physical (`*output`) and virtual (`*virt_addr`) addresses for decompressed kernel. + +That's all. + +Conclusion +-------------------------------------------------------------------------------- + +This is the end of the sixth and the last part about linux kernel booting process. We will not see posts about kernel booting anymore (maybe updates to this and previous posts), but there will be many posts about other kernel internals. + +Next chapter will be about kernel initialization and we will see the first steps in the Linux kernel initialization code. + +If you have any questions or suggestions write me a comment or ping me in [twitter](https://twitter.com/0xAX). + +**Please note that English is not my first language, And I am really sorry for any inconvenience. If you find any mistakes please send me PR to [linux-insides](https://github.com/0xAX/linux-internals).** + +Links +-------------------------------------------------------------------------------- + +* [Address space layout randomization](https://en.wikipedia.org/wiki/Address_space_layout_randomization) +* [Linux kernel boot protocol](https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt) +* [long mode](https://en.wikipedia.org/wiki/Long_mode) +* [initrd](https://en.wikipedia.org/wiki/Initial_ramdisk) +* [Enumerated type](https://en.wikipedia.org/wiki/Enumerated_type#C) +* [four-level page tables](https://lwn.net/Articles/117749/) +* [five-level page tables](https://lwn.net/Articles/717293/) +* [EFI](https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface) +* [e820](https://en.wikipedia.org/wiki/E820) +* [time stamp counter](https://en.wikipedia.org/wiki/Time_Stamp_Counter) +* [rdrand](https://en.wikipedia.org/wiki/RdRand) +* [x86_64](https://en.wikipedia.org/wiki/X86-64) +* [Previous part](https://github.com/0xAX/linux-insides/blob/master/Booting/linux-bootstrap-5.md) From bfb3d493c746065fa0ec92f094b5909da8b6b680 Mon Sep 17 00:00:00 2001 From: Aleksey Lagoshin Date: Sat, 30 Dec 2017 00:34:36 +0200 Subject: [PATCH 066/179] Fixed mistakes in the segment descriptors part --- Booting/linux-bootstrap-2.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index c175353..d4628ad 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -60,21 +60,24 @@ where the `lgdt` instruction loads the base address and limit(size) of global de As mentioned above the GDT contains `segment descriptors` which describe memory segments. Each descriptor is 64-bits in size. The general scheme of a descriptor is: ``` -31 24 19 16 7 0 + 63 56 51 48 45 39 32 ------------------------------------------------------------ | | |B| |A| | | | |0|E|W|A| | -| BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | 4 +| BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | | | |D| |L| 19:16 | | | |1|C|R|A| | +------------------------------------------------------------ + + 31 16 15 0 ------------------------------------------------------------ | | | -| BASE 15:0 | LIMIT 15:0 | 0 +| BASE 15:0 | LIMIT 15:0 | | | | ------------------------------------------------------------ ``` -Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bit 0-15 of the Descriptor contain the value for the limit. The rest of it is in LIMIT 19:16. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: +Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bits 0-15 of Limit are located in the beginning of the Descriptor. The rest of it is in LIMIT 19:16, which is located at bits 48-51 of the Descriptor. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: -1. Limit[20-bits] is at 0-15,16-19 bits. It defines `length_of_segment - 1`. It depends on `G`(Granularity) bit. +1. Limit[20-bits] is at 0-15, 48-51 bits. It defines `length_of_segment - 1`. It depends on `G`(Granularity) bit. * if `G` (bit 55) is 0 and segment limit is 0, the size of the segment is 1 Byte * if `G` is 1 and segment limit is 0, the size of the segment is 4096 Bytes @@ -85,9 +88,9 @@ Don't worry, I know it looks a little scary after real mode, but it's easy. For * if G is 0, Limit is interpreted in terms of 1 Byte and the maximum size of the segment can be 1 Megabyte. * if G is 1, Limit is interpreted in terms of 4096 Bytes = 4 KBytes = 1 Page and the maximum size of the segment can be 4 Gigabytes. Actually, when G is 1, the value of Limit is shifted to the left by 12 bits. So, 20 bits + 12 bits = 32 bits and 232 = 4 Gigabytes. -2. Base[32-bits] is at (0-15, 32-39 and 56-63 bits). It defines the physical address of the segment's starting location. +2. Base[32-bits] is at 16-31, 32-39 and 56-63 bits. It defines the physical address of the segment's starting location. -3. Type/Attribute (40-47 bits) defines the type of segment and kinds of access to it. +3. Type/Attribute[5-bits] is at 40-44 bits. It defines the type of segment and kinds of access to it. * `S` flag at bit 44 specifies descriptor type. If `S` is 0 then this segment is a system segment, whereas if `S` is 1 then this is a code or data segment (Stack segments are data segments which must be read/write segments). To determine if the segment is a code or data segment we can check its Ex(bit 43) Attribute marked as 0 in the above diagram. If it is 0, then the segment is a Data segment otherwise it is a code segment. @@ -138,7 +141,7 @@ As we can see the first bit(bit 43) is `0` for a _data_ segment and `1` for a _c Segment registers contain segment selectors as in real mode. However, in protected mode, a segment selector is handled differently. Each Segment Descriptor has an associated Segment Selector which is a 16-bit structure: ``` -15 3 2 1 0 + 15 3 2 1 0 ----------------------------- | Index | TI | RPL | ----------------------------- From 498cf21c489f44d83a81d8d795e2a6c8de9659cd Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 7 Jan 2018 13:51:06 +0600 Subject: [PATCH 067/179] Update SUMMARY.md --- SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SUMMARY.md b/SUMMARY.md index cfb74f3..935b6cb 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -6,6 +6,7 @@ * [Video mode initialization and transition to protected mode](Booting/linux-bootstrap-3.md) * [Transition to 64-bit mode](Booting/linux-bootstrap-4.md) * [Kernel decompression](Booting/linux-bootstrap-5.md) + * [Kernel load address randomization](Booting/linux-bootstrap-6.md) * [Initialization](Initialization/README.md) * [First steps in the kernel](Initialization/linux-initialization-1.md) * [Early interrupts handler](Initialization/linux-initialization-2.md) From 23bbbc31ee9900b0821dfe801897f05da9e215ac Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 7 Jan 2018 13:51:38 +0600 Subject: [PATCH 068/179] Update README.md --- Booting/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Booting/README.md b/Booting/README.md index a641b80..4338108 100644 --- a/Booting/README.md +++ b/Booting/README.md @@ -8,3 +8,4 @@ couple of posts which describes the full cycle of the kernel loading process: * [Video mode initialization and transition to protected mode](linux-bootstrap-3.md) - describes video mode initialization in the kernel setup code and transition to protected mode. * [Transition to 64-bit mode](linux-bootstrap-4.md) - describes preparation for transition into 64-bit mode and details of transition. * [Kernel Decompression](linux-bootstrap-5.md) - describes preparation before kernel decompression and details of direct decompression. +* [Kernel random address randomization](linux-bootstrap-6.md) - describes randomization of the Linux kernel load address. From a04cc2b780d828989d5aace1d80d96549417738e Mon Sep 17 00:00:00 2001 From: 0xAX <0xAX@users.noreply.github.com> Date: Sun, 7 Jan 2018 16:36:46 +0600 Subject: [PATCH 069/179] Update linux-bootstrap-6.md --- Booting/linux-bootstrap-6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-6.md b/Booting/linux-bootstrap-6.md index 48e414a..5168995 100644 --- a/Booting/linux-bootstrap-6.md +++ b/Booting/linux-bootstrap-6.md @@ -19,7 +19,7 @@ config PHYSICAL_START ... ``` -This value may be changed during kernel configuration, but also load address can be selected as random value. For this purpose the `CONFIG_RANDOMIZE_BASE` kernel configuration option should be enabled during kernel configuration. +This value may be changed during kernel configuration, but also load address can be selected as a random value. For this purpose the `CONFIG_RANDOMIZE_BASE` kernel configuration option should be enabled during kernel configuration. In this case a physical address at which Linux kernel image will be decompressed and loaded will be randomized. This part considers the case when this option is enabled and load address of the kernel image will be randomized for [security reasons](https://en.wikipedia.org/wiki/Address_space_layout_randomization). From 527b2b8921c3d9c043bd914c5990d6a991e3035b Mon Sep 17 00:00:00 2001 From: Frank Dana Date: Sun, 7 Jan 2018 18:45:48 -0500 Subject: [PATCH 070/179] Update README.md "A couple" technically means exactly 2. It can be used to describe an unknown quantity of "approximately 2", but certainly never 6. --- Booting/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/README.md b/Booting/README.md index 4338108..0688bee 100644 --- a/Booting/README.md +++ b/Booting/README.md @@ -1,7 +1,7 @@ # Kernel Boot Process This chapter describes the linux kernel boot process. Here you will see a -couple of posts which describes the full cycle of the kernel loading process: +series of posts which describes the full cycle of the kernel loading process: * [From the bootloader to kernel](linux-bootstrap-1.md) - describes all stages from turning on the computer to running the first instruction of the kernel. * [First steps in the kernel setup code](linux-bootstrap-2.md) - describes first steps in the kernel setup code. You will see heap initialization, query of different parameters like EDD, IST and etc... From 57f802b466327ccffa19250c61626d4cc376f43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Osman=20Ta=C5=9Fkaya?= Date: Wed, 10 Jan 2018 09:20:42 +0300 Subject: [PATCH 071/179] [README] License Section Moved - Files: Readme.MD - Changes: License Section Moved --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8671b94..f80c106 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,6 @@ On other languages * [Russian](https://github.com/proninyaroslav/linux-insides-ru) * [Spanish](https://github.com/leolas95/linux-insides) * [Turkish](https://github.com/ayyucedemirbas/linux-insides_Turkish) - -LICENSE -------------- - -Licensed [BY-NC-SA Creative Commons](http://creativecommons.org/licenses/by-nc-sa/4.0/). Contributions -------------- @@ -41,3 +36,8 @@ Author --------------- [@0xAX](https://twitter.com/0xAX) + +LICENSE +------------- + +Licensed [BY-NC-SA Creative Commons](http://creativecommons.org/licenses/by-nc-sa/4.0/). From 3fa666d07b25d6a606603f910bbd09892cd5325a Mon Sep 17 00:00:00 2001 From: Vijaibaskar <33416097+codevedas@users.noreply.github.com> Date: Wed, 10 Jan 2018 14:01:17 +0530 Subject: [PATCH 072/179] add summury link to description --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 8671b94..fc00172 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ linux-insides A book-in-progress about the linux kernel and its insides. -**The goal is simple** - to share my modest knowledge about the insides of the linux kernel and help people who are interested in linux kernel insides, and other low-level subject matter. - +**The goal is simple** - to share my modest knowledge about the insides of the linux kernel and help people who are interested in linux kernel insides, and other low-level subject matter.Feel free to go through the book [Start here](https://github.com/0xAX/linux-insides/blob/master/SUMMARY.md) **Questions/Suggestions**: Feel free about any questions or suggestions by pinging me at twitter [@0xAX](https://twitter.com/0xAX), adding an [issue](https://github.com/0xAX/linux-insides/issues/new) or just drop me an [email](mailto:anotherworldofworld@gmail.com). Support From cd072e902d73dd79fc3d559d7a4c719de34c8921 Mon Sep 17 00:00:00 2001 From: Alexander Kuleshov Date: Thu, 11 Jan 2018 00:14:23 +0600 Subject: [PATCH 073/179] fix typo Signed-off-by: Alexander Kuleshov --- SyncPrim/sync-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SyncPrim/sync-1.md b/SyncPrim/sync-1.md index b58e9c6..f63585b 100644 --- a/SyncPrim/sync-1.md +++ b/SyncPrim/sync-1.md @@ -24,7 +24,7 @@ mutex_unlock(&clocksource_mutex); from the [kernel/time/clocksource.c](https://github.com/torvalds/linux/master/kernel/time/clocksource.c) source code file. This code is from the `__clocksource_register_scale` function which adds the given [clocksource](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-2.html) to the clock sources list. This function produces different operations on a list with registered clock sources. For example the `clocksource_enqueue` function adds the given clock source to the list with registered clocksources - `clocksource_list`. Note that these lines of code wrapped to two functions: `mutex_lock` and `mutex_unlock` which are takes one parameter - the `clocksource_mutex` in our case. -These functions represents locking and unlocking based on [mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) synchronization primitive. As `mutex_lock` will be executed, it allows us to prevent situation when two or more threads will execute this code while the `mute_unlock` will not be executed by process-owner of the mutex. In other words, we prevent parallel operations on a `clocksource_list`. Why do we need `mutex` here? What if two parallel processes will try to register a clock source. As we already know, the `clocksource_enqueue` function adds the given clock source to the `clocksource_list` list right after a clock source in the list which has the biggest rating (a registered clock source which has the highest frequency in the system): +These functions represents locking and unlocking based on [mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) synchronization primitive. As `mutex_lock` will be executed, it allows us to prevent situation when two or more threads will execute this code while the `mutex_unlock` will not be executed by process-owner of the mutex. In other words, we prevent parallel operations on a `clocksource_list`. Why do we need `mutex` here? What if two parallel processes will try to register a clock source. As we already know, the `clocksource_enqueue` function adds the given clock source to the `clocksource_list` list right after a clock source in the list which has the biggest rating (a registered clock source which has the highest frequency in the system): ```C static void clocksource_enqueue(struct clocksource *cs) From d9c55a26e8c5ec4f5271bffd986b8632d21cc1ca Mon Sep 17 00:00:00 2001 From: Raghav Shankar Date: Fri, 12 Jan 2018 18:15:21 +0530 Subject: [PATCH 074/179] Make grammar and formatting fixes in linux-bootstrap-1.md --- Booting/linux-bootstrap-1.md | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index cb03244..d38db06 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -164,7 +164,7 @@ just as explained above. We have only 16-bit general purpose registers; the maxi where `0x10ffef` is equal to `1MB + 64KB - 16b`. An [8086](https://en.wikipedia.org/wiki/Intel_8086) processor (which was the first processor with real mode), in contrast, has a 20-bit address line. Since `2^20 = 1048576` is 1MB, this means that the actual available memory is 1MB. -General real mode's memory map is as follows: +In general, real mode's memory map is as follows: ``` 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table @@ -193,11 +193,11 @@ Bootloader There are a number of bootloaders that can boot Linux, such as [GRUB 2](https://www.gnu.org/software/grub/) and [syslinux](http://www.syslinux.org/wiki/index.php/The_Syslinux_Project). The Linux kernel has a [Boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt) which specifies the requirements for a bootloader to implement Linux support. This example will describe GRUB 2. -Continuing from before, now that the `BIOS` has chosen a boot device and transferred control to the boot sector code, execution starts from [boot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/boot.S;hb=HEAD). This code is very simple, due to the limited amount of space available, and contains a pointer which is used to jump to the location of GRUB 2's core image. The core image begins with [diskboot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/diskboot.S;hb=HEAD), which is usually stored immediately after the first sector in the unused space before the first partition. The above code loads the rest of the core image, which contains GRUB 2's kernel and drivers for handling filesystems, into memory. After loading the rest of the core image, it executes [grub_main](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/kern/main.c) function. +Continuing from before, now that the `BIOS` has chosen a boot device and transferred control to the boot sector code, execution starts from [boot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/boot.S;hb=HEAD). This code is very simple, due to the limited amount of space available, and contains a pointer which is used to jump to the location of GRUB 2's core image. The core image begins with [diskboot.img](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/boot/i386/pc/diskboot.S;hb=HEAD), which is usually stored immediately after the first sector in the unused space before the first partition. The above code loads the rest of the core image, which contains GRUB 2's kernel and drivers for handling filesystems, into memory. After loading the rest of the core image, it executes the [grub_main](http://git.savannah.gnu.org/gitweb/?p=grub.git;a=blob;f=grub-core/kern/main.c) function. -The `grub_main` function initializes the console, gets the base address for modules, sets the root device, loads/parses the grub configuration file, loads modules, etc. At the end of execution, `grub_main` function moves grub to normal mode. The `grub_normal_execute` function (from the `grub-core/normal/main.c` source code file) completes the final preparations and shows a menu to select an operating system. When we select one of the grub menu entries, the `grub_menu_execute_entry` function runs, executing the grub `boot` command and booting the selected operating system. +The `grub_main` function initializes the console, gets the base address for modules, sets the root device, loads/parses the grub configuration file, loads modules, etc. At the end of execution, the `grub_main` function moves grub to normal mode. The `grub_normal_execute` function (from the `grub-core/normal/main.c` source code file) completes the final preparations and shows a menu to select an operating system. When we select one of the grub menu entries, the `grub_menu_execute_entry` function runs, executing the grub `boot` command and booting the selected operating system. -As we can read in the kernel boot protocol, the bootloader must read and fill some fields of the kernel setup header, which starts at the `0x01f1` offset from the kernel setup code. You may look at the boot [linker script](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L16) to make sure in this offset. The kernel header [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) starts from: +As we can read in the kernel boot protocol, the bootloader must read and fill some fields of the kernel setup header, which starts at the `0x01f1` offset from the kernel setup code. You may look at the boot [linker script](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L16) to confirm the value of this offset. The kernel header [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) starts from: ```assembly .globl hdr @@ -211,9 +211,9 @@ hdr: boot_flag: .word 0xAA55 ``` -The bootloader must fill this and the rest of the headers (which are only marked as being type `write` in the Linux boot protocol, such as in [this example](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L354)) with values which it has either received from the command line or calculated during boot. (We will not go over full descriptions and explanations for all fields of the kernel setup header now but instead when the discuss how kernel uses them; you can find a description of all fields in the [boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156).) +The bootloader must fill this and the rest of the headers (which are only marked as being type `write` in the Linux boot protocol, such as in [this example](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L354)) with values which it has either received from the command line or calculated during boot. (We will not go over full descriptions and explanations for all fields of the kernel setup header now, but we shall do so when we discuss how the kernel uses them; you can find a description of all fields in the [boot protocol](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156).) -As we can see in the kernel boot protocol, the memory map will be the following after loading the kernel: +As we can see in the kernel boot protocol, the memory will be mapped as follows after loading the kernel: ```shell | Protected-mode kernel | @@ -252,10 +252,10 @@ where `X` is the address of the kernel boot sector being loaded. In my case, `X` The bootloader has now loaded the Linux kernel into memory, filled the header fields, and then jumped to the corresponding memory address. We can now move directly to the kernel setup code. -Start of Kernel Setup +The Beginning of the Kernel Setup Stage -------------------------------------------------------------------------------- -Finally, we are in the kernel! Technically, the kernel hasn't run yet; first, the kernel setup part must configure some stuff like decompressor, memory management related things and etc. After all of such things, kernel setup part will decompress actual kernel and jump on it. Execution of setup part starts from [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) at [_start](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L292). It is a little strange at first sight, as there are several instructions before it. +Finally, we are in the kernel! Technically, the kernel hasn't run yet; first, the kernel setup part must configure stuff such as the decompressor and some memory management related things, to name a few. After all these things are done, the kernel setup part will decompress the actual kernel and jump to it. Execution of the setup part starts from [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) at [_start](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L292). It is a little strange at first sight, as there are several instructions before it. A long time ago, the Linux kernel used to have its own bootloader. Now, however, if you run, for example, @@ -267,7 +267,7 @@ then you will see: ![Try vmlinuz in qemu](http://oi60.tinypic.com/r02xkz.jpg) -Actually, the `header.S` starts from [MZ](https://en.wikipedia.org/wiki/DOS_MZ_executable) (see image above), the error message printing and following the [PE](https://en.wikipedia.org/wiki/Portable_Executable) header: +Actually, the file `header.S` starts with the magic number [MZ](https://en.wikipedia.org/wiki/DOS_MZ_executable) (see image above), the error message that displays and, following that, the [PE](https://en.wikipedia.org/wiki/Portable_Executable) header: ```assembly #ifdef CONFIG_EFI_STUB @@ -293,7 +293,7 @@ The actual kernel setup entry point is: _start: ``` -The bootloader (grub2 and others) knows about this point (`0x200` offset from `MZ`) and makes a jump directly to it, despite the fact that `header.S` starts from the `.bstext` section, which prints an error message: +The bootloader (grub2 and others) knows about this point (at an offset of `0x200` from `MZ`) and makes a jump directly to it, despite the fact that `header.S` starts from the `.bstext` section, which prints an error message: ``` // @@ -317,9 +317,9 @@ _start: // ``` -Here we can see a `jmp` instruction opcode (`0xeb`) that jumps to the `start_of_setup-1f` point. In `Nf` notation, `2f` refers to the following local `2:` label; in our case, it is label `1` that is present right after the jump, and it contains the rest of the setup [header](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156). Right after the setup header, we see the `.entrytext` section, which starts at the `start_of_setup` label. +Here we can see a `jmp` instruction opcode (`0xeb`) that jumps to the `start_of_setup-1f` point. In `Nf` notation, `2f`, for example, refers to the local label `2:`; in our case, it is the label `1` that is present right after the jump, and it contains the rest of the setup [header](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/x86/boot.txt#L156). Right after the setup header, we see the `.entrytext` section, which starts at the `start_of_setup` label. -This is the first code that actually runs (aside from the previous jump instructions, of course). After the kernel setup part received control from the bootloader, the first `jmp` instruction is located at the `0x200` offset from the start of the kernel real mode, i.e., after the first 512 bytes. This we can both read in the Linux kernel boot protocol and see in the grub2 source code: +This is the first code that actually runs (aside from the previous jump instructions, of course). After the kernel setup part receives control from the bootloader, the first `jmp` instruction is located at the `0x200` offset from the start of the kernel real mode, i.e., after the first 512 bytes. This can be seen in both the Linux kernel boot protocol and the grub2 source code: ```C segment = grub_linux_real_target >> 4; @@ -345,10 +345,10 @@ After the jump to `start_of_setup`, the kernel needs to do the following: Let's look at the implementation. -Segment registers align +Aligning the Segment Registers -------------------------------------------------------------------------------- -First of all, the kernel ensures that `ds` and `es` segment registers point to the same address. Next, it clears the direction flag using the `cld` instruction: +First of all, the kernel ensures that the `ds` and `es` segment registers point to the same address. Next, it clears the direction flag using the `cld` instruction: ```assembly movw %ds, %ax @@ -356,7 +356,7 @@ First of all, the kernel ensures that `ds` and `es` segment registers point to t cld ``` -As I wrote earlier, `grub2` loads kernel setup code at address `0x10000` by default and `cs` at `0x10200` because execution doesn't start from the start of file, but from: +As I wrote earlier, `grub2` loads kernel setup code at address `0x10000` by default and `cs` at `0x10200` because execution doesn't start from the start of file, but from the jump here: ```assembly _start: @@ -364,7 +364,7 @@ _start: .byte start_of_setup-1f ``` -jump, which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L46). It also needs to align `cs` from `0x10200` to `0x10000`, as well as all other segment registers. After that, we set up the stack: +which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L46). We also need to align `cs` from `0x10200` to `0x10000`, as well as all other segment registers. After that, we set up the stack: ```assembly pushw %ds @@ -372,7 +372,7 @@ jump, which is at a `512` byte offset from [4d 5a](https://github.com/torvalds/l lretw ``` -which pushes the value of `ds` to the stack with the address of the [6](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L494) label and executes the `lretw` instruction. When the `lretw` instruction is called, it loads the address of label `6` into the [instruction pointer](https://en.wikipedia.org/wiki/Program_counter) register and loads `cs` with the value of `ds`. Afterward, `ds` and `cs` will have the same values. +which pushes the value of `ds` to the stack, followed by the address of the [6](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L494) label and executes the `lretw` instruction. When the `lretw` instruction is called, it loads the address of label `6` into the [instruction pointer](https://en.wikipedia.org/wiki/Program_counter) register and loads `cs` with the value of `ds`. Afterward, `ds` and `cs` will have the same values. Stack Setup -------------------------------------------------------------------------------- @@ -388,9 +388,9 @@ Almost all of the setup code is in preparation for the C language environment in This can lead to 3 different scenarios: -* `ss` has valid value `0x1000` (as do all other segment registers beside `cs`) -* `ss` is invalid and `CAN_USE_HEAP` flag is set (see below) -* `ss` is invalid and `CAN_USE_HEAP` flag is not set (see below) +* `ss` has a valid value `0x1000` (as do all the other segment registers beside `cs`) +* `ss` is invalid and the `CAN_USE_HEAP` flag is set (see below) +* `ss` is invalid and the `CAN_USE_HEAP` flag is not set (see below) Let's look at all three of these scenarios in turn: @@ -405,7 +405,7 @@ Let's look at all three of these scenarios in turn: sti ``` -Here we can see the alignment of `dx` (contains `sp` given by bootloader) to `4` bytes and a check for whether or not it is zero. If it is zero, we put `0xfffc` (4 byte aligned address before the maximum segment size of 64 KB) in `dx`. If it is not zero, we continue to use `sp`, given by the bootloader (0xf7f4 in my case). After this, we put the `ax` value into `ss`, which stores the correct segment address of `0x1000` and sets up a correct `sp`. We now have a correct stack: +Here we set the alignment of `dx` (which contains the value of `sp` as given by the bootloader) to `4` bytes and a check for whether or not it is zero. If it is zero, we put `0xfffc` (4 byte aligned address before the maximum segment size of 64 KB) in `dx`. If it is not zero, we continue to use the value of `sp` given by the bootloader (0xf7f4 in my case). After this, we put the value of `ax` into `ss`, which stores the correct segment address of `0x1000` and sets up a correct `sp`. We now have a correct stack: ![stack](http://oi58.tinypic.com/16iwcis.jpg) From 60c8998efe87ecd915c5e61f05e977b8af39e341 Mon Sep 17 00:00:00 2001 From: Gabriela Alexandra Moldovan Date: Fri, 12 Jan 2018 13:04:00 +0000 Subject: [PATCH 075/179] Add missing colon before label. --- Theory/asm.md | 2 +- contributors.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Theory/asm.md b/Theory/asm.md index 8e9b4a5..34ccf93 100644 --- a/Theory/asm.md +++ b/Theory/asm.md @@ -73,7 +73,7 @@ Here we see the `native_load_gdt` function which loads a base address from the [ The second optional `qualifier` is the `goto`. This qualifier tells the compiler that the given assembly statement may perform a jump to one of the labels which are listed in the `GotoLabels`. For example: ```C -__asm__ goto("jmp %l[label]" : : : label); +__asm__ goto("jmp %l[label]" : : : : label); ``` Since we finished with these two qualifiers, let's look at the main part of an assembly statement body. As we have seen above, the main part of an assembly statement consists of the following four parts: diff --git a/contributors.md b/contributors.md index c4ef5d0..dbfcf70 100644 --- a/contributors.md +++ b/contributors.md @@ -112,4 +112,5 @@ Thank you to all contributors: * [Andrés Rojas](https://github.com/c0r3dump3d) * [Beomsu Kim](https://github.com/0xF0D0) * [Firo Yang](https://github.com/firogh) -* [Edward Hu](https://github.com/BDHU) \ No newline at end of file +* [Edward Hu](https://github.com/BDHU) +* [Gabriela Moldovan](https://github.com/gabi-250) From 3b9b488267873ec1b0305f2adfa14cbdea6929ca Mon Sep 17 00:00:00 2001 From: Raghav Shankar Date: Sun, 14 Jan 2018 10:26:55 +0530 Subject: [PATCH 076/179] Grammar and formatting fixes in linux-bootstrap-2.md --- Booting/linux-bootstrap-2.md | 224 +++++++++++++++++------------------ 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/Booting/linux-bootstrap-2.md b/Booting/linux-bootstrap-2.md index d4628ad..039ef42 100644 --- a/Booting/linux-bootstrap-2.md +++ b/Booting/linux-bootstrap-2.md @@ -4,13 +4,13 @@ Kernel booting process. Part 2. First steps in the kernel setup -------------------------------------------------------------------------------- -We started to dive into linux kernel insides in the previous [part](linux-bootstrap-1.md) and saw the initial part of the kernel setup code. We stopped at the first call to the `main` function (which is the first function written in C) from [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c). +We started to dive into the linux kernel's insides in the previous [part](linux-bootstrap-1.md) and saw the initial part of the kernel setup code. We stopped at the first call to the `main` function (which is the first function written in C) from [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c). -In this part, we will continue to research the kernel setup code and -* see what `protected mode` is, -* some preparation for the transition into it, -* the heap and console initialization, -* memory detection, CPU validation, keyboard initialization +In this part, we will continue to research the kernel setup code and go over +* what `protected mode` is, +* the transition into it, +* the initialization of the heap and the console, +* memory detection, CPU validation and keyboard initialization * and much much more. So, Let's go ahead. @@ -22,16 +22,16 @@ Before we can move to the native Intel64 [Long Mode](http://en.wikipedia.org/wik What is [protected mode](https://en.wikipedia.org/wiki/Protected_mode)? Protected mode was first added to the x86 architecture in 1982 and was the main mode of Intel processors from the [80286](http://en.wikipedia.org/wiki/Intel_80286) processor until Intel 64 and long mode came. -The main reason to move away from [Real mode](http://wiki.osdev.org/Real_Mode) is that there is very limited access to the RAM. As you may remember from the previous part, there is only 220 bytes or 1 Megabyte, sometimes even only 640 Kilobytes of RAM available in the Real mode. +The main reason to move away from [Real mode](http://wiki.osdev.org/Real_Mode) is that there is very limited access to the RAM. As you may remember from the previous part, there are only 220 bytes or 1 Megabyte, sometimes even only 640 Kilobytes of RAM available in the Real mode. -Protected mode brought many changes, but the main one is the difference in memory management. The 20-bit address bus was replaced with a 32-bit address bus. It allowed access to 4 Gigabytes of memory vs 1 Megabyte of real mode. Also, [paging](http://en.wikipedia.org/wiki/Paging) support was added, which you can read about in the next sections. +Protected mode brought many changes, but the main one is the difference in memory management. The 20-bit address bus was replaced with a 32-bit address bus. It allowed access to 4 Gigabytes of memory vs the 1 Megabyte in real mode. Also, [paging](http://en.wikipedia.org/wiki/Paging) support was added, which you can read about in the next sections. Memory management in Protected mode is divided into two, almost independent parts: * Segmentation * Paging -Here we will only see segmentation. Paging will be discussed in the next sections. +Here we will only talk about segmentation. Paging will be discussed in the next sections. As you can read in the previous part, addresses consist of two parts in real mode: @@ -44,18 +44,18 @@ And we can get the physical address if we know these two parts by: PhysicalAddress = Segment Selector * 16 + Offset ``` -Memory segmentation was completely redone in protected mode. There are no 64 Kilobyte fixed-size segments. Instead, the size and location of each segment is described by an associated data structure called _Segment Descriptor_. The segment descriptors are stored in a data structure called `Global Descriptor Table` (GDT). +Memory segmentation was completely redone in protected mode. There are no 64 Kilobyte fixed-size segments. Instead, the size and location of each segment is described by an associated data structure called the _Segment Descriptor_. The segment descriptors are stored in a data structure called the `Global Descriptor Table` (GDT). -The GDT is a structure which resides in memory. It has no fixed place in the memory so, its address is stored in the special `GDTR` register. Later we will see the GDT loading in the Linux kernel code. There will be an operation for loading it into memory, something like: +The GDT is a structure which resides in memory. It has no fixed place in the memory so, its address is stored in the special `GDTR` register. Later we will see how the GDT is loaded in the Linux kernel code. There will be an operation for loading it into memory, something like: ```assembly lgdt gdt ``` -where the `lgdt` instruction loads the base address and limit(size) of global descriptor table to the `GDTR` register. `GDTR` is a 48-bit register and consists of two parts: +where the `lgdt` instruction loads the base address and limit(size) of the global descriptor table to the `GDTR` register. `GDTR` is a 48-bit register and consists of two parts: - * size(16-bit) of global descriptor table; - * address(32-bit) of the global descriptor table. + * the size(16-bit) of the global descriptor table; + * the address(32-bit) of the global descriptor table. As mentioned above the GDT contains `segment descriptors` which describe memory segments. Each descriptor is 64-bits in size. The general scheme of a descriptor is: @@ -64,103 +64,103 @@ As mentioned above the GDT contains `segment descriptors` which describe memory ------------------------------------------------------------ | | |B| |A| | | | |0|E|W|A| | | BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | -| | |D| |L| 19:16 | | | |1|C|R|A| | ------------------------------------------------------------- +| | | D | | L | 19:16 | | | | 1 | C | R | A | | +| --- | 31 16 15 0 ------------------------------------------------------------ | | | | BASE 15:0 | LIMIT 15:0 | -| | | ------------------------------------------------------------- +| | | +| --- | ``` -Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bits 0-15 of Limit are located in the beginning of the Descriptor. The rest of it is in LIMIT 19:16, which is located at bits 48-51 of the Descriptor. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: +Don't worry, I know it looks a little scary after real mode, but it's easy. For example LIMIT 15:0 means that bits 0-15 of Limit are located at the beginning of the Descriptor. The rest of it is in LIMIT 19:16, which is located at bits 48-51 of the Descriptor. So, the size of Limit is 0-19 i.e 20-bits. Let's take a closer look at it: -1. Limit[20-bits] is at 0-15, 48-51 bits. It defines `length_of_segment - 1`. It depends on `G`(Granularity) bit. +1. Limit[20-bits] is split between bits 0-15 and 48-51. It defines the `length_of_segment - 1`. It depends on the `G`(Granularity) bit. - * if `G` (bit 55) is 0 and segment limit is 0, the size of the segment is 1 Byte - * if `G` is 1 and segment limit is 0, the size of the segment is 4096 Bytes - * if `G` is 0 and segment limit is 0xfffff, the size of the segment is 1 Megabyte - * if `G` is 1 and segment limit is 0xfffff, the size of the segment is 4 Gigabytes + * if `G` (bit 55) is 0 and the segment limit is 0, the size of the segment is 1 Byte + * if `G` is 1 and the segment limit is 0, the size of the segment is 4096 Bytes + * if `G` is 0 and the segment limit is 0xfffff, the size of the segment is 1 Megabyte + * if `G` is 1 and the segment limit is 0xfffff, the size of the segment is 4 Gigabytes - So, it means that if + So, what this means is * if G is 0, Limit is interpreted in terms of 1 Byte and the maximum size of the segment can be 1 Megabyte. * if G is 1, Limit is interpreted in terms of 4096 Bytes = 4 KBytes = 1 Page and the maximum size of the segment can be 4 Gigabytes. Actually, when G is 1, the value of Limit is shifted to the left by 12 bits. So, 20 bits + 12 bits = 32 bits and 232 = 4 Gigabytes. -2. Base[32-bits] is at 16-31, 32-39 and 56-63 bits. It defines the physical address of the segment's starting location. +2. Base[32-bits] is split between bits 16-31, 32-39 and 56-63. It defines the physical address of the segment's starting location. -3. Type/Attribute[5-bits] is at 40-44 bits. It defines the type of segment and kinds of access to it. - * `S` flag at bit 44 specifies descriptor type. If `S` is 0 then this segment is a system segment, whereas if `S` is 1 then this is a code or data segment (Stack segments are data segments which must be read/write segments). +3. Type/Attribute[5-bits] is represented by bits 40-44. It defines the type of segment and how it can be accessed. + * The `S` flag at bit 44 specifies the descriptor type. If `S` is 0 then this segment is a system segment, whereas if `S` is 1 then this is a code or data segment (Stack segments are data segments which must be read/write segments). -To determine if the segment is a code or data segment we can check its Ex(bit 43) Attribute marked as 0 in the above diagram. If it is 0, then the segment is a Data segment otherwise it is a code segment. +To determine if the segment is a code or data segment, we can check its Ex(bit 43) Attribute (marked as 0 in the above diagram). If it is 0, then the segment is a Data segment, otherwise, it is a code segment. A segment can be of one of the following types: ``` -| Type Field | Descriptor Type | Description -|-----------------------------|-----------------|------------------ +| Type Field | Descriptor Type | Description | +| --------------------------- | --------------- | ---------------------------------- | | Decimal | | -| 0 E W A | | -| 0 0 0 0 0 | Data | Read-Only -| 1 0 0 0 1 | Data | Read-Only, accessed -| 2 0 0 1 0 | Data | Read/Write -| 3 0 0 1 1 | Data | Read/Write, accessed -| 4 0 1 0 0 | Data | Read-Only, expand-down -| 5 0 1 0 1 | Data | Read-Only, expand-down, accessed -| 6 0 1 1 0 | Data | Read/Write, expand-down -| 7 0 1 1 1 | Data | Read/Write, expand-down, accessed -| C R A | | -| 8 1 0 0 0 | Code | Execute-Only -| 9 1 0 0 1 | Code | Execute-Only, accessed -| 10 1 0 1 0 | Code | Execute/Read -| 11 1 0 1 1 | Code | Execute/Read, accessed -| 12 1 1 0 0 | Code | Execute-Only, conforming -| 14 1 1 0 1 | Code | Execute-Only, conforming, accessed -| 13 1 1 1 0 | Code | Execute/Read, conforming -| 15 1 1 1 1 | Code | Execute/Read, conforming, accessed +| 0 E W A | | +| 0 0 0 0 0 | Data | Read-Only | +| 1 0 0 0 1 | Data | Read-Only, accessed | +| 2 0 0 1 0 | Data | Read/Write | +| 3 0 0 1 1 | Data | Read/Write, accessed | +| 4 0 1 0 0 | Data | Read-Only, expand-down | +| 5 0 1 0 1 | Data | Read-Only, expand-down, accessed | +| 6 0 1 1 0 | Data | Read/Write, expand-down | +| 7 0 1 1 1 | Data | Read/Write, expand-down, accessed | +| C R A | | +| 8 1 0 0 0 | Code | Execute-Only | +| 9 1 0 0 1 | Code | Execute-Only, accessed | +| 10 1 0 1 0 | Code | Execute/Read | +| 11 1 0 1 1 | Code | Execute/Read, accessed | +| 12 1 1 0 0 | Code | Execute-Only, conforming | +| 14 1 1 0 1 | Code | Execute-Only, conforming, accessed | +| 13 1 1 1 0 | Code | Execute/Read, conforming | +| 15 1 1 1 1 | Code | Execute/Read, conforming, accessed | ``` As we can see the first bit(bit 43) is `0` for a _data_ segment and `1` for a _code_ segment. The next three bits (40, 41, 42) are either `EWA`(*E*xpansion *W*ritable *A*ccessible) or CRA(*C*onforming *R*eadable *A*ccessible). - * if E(bit 42) is 0, expand up otherwise expand down. Read more [here](http://www.sudleyplace.com/dpmione/expanddown.html). - * if W(bit 41)(for Data Segments) is 1, write access is allowed otherwise not. Note that read access is always allowed on data segments. - * A(bit 40) - Whether the segment is accessed by processor or not. - * C(bit 43) is conforming bit(for code selectors). If C is 1, the segment code can be executed from a lower level privilege e.g. user level. If C is 0, it can only be executed from the same privilege level. - * R(bit 41)(for code segments). If 1 read access to segment is allowed otherwise not. Write access is never allowed to code segments. + * if E(bit 42) is 0, expand up, otherwise, expand down. Read more [here](http://www.sudleyplace.com/dpmione/expanddown.html). + * if W(bit 41)(for Data Segments) is 1, write access is allowed, and if it is 0, the segment is read-only. Note that read access is always allowed on data segments. + * A(bit 40) controls whether the segment can be accessed by the processor or not. + * C(bit 43) is the conforming bit(for code selectors). If C is 1, the segment code can be executed from a lower level privilege (e.g. user) level. If C is 0, it can only be executed from the same privilege level. + * R(bit 41) controls read access to code segments; when it is 1, the segment can be read from. Write access is never granted for code segments. -4. DPL[2-bits] (Descriptor Privilege Level) is at bits 45-46. It defines the privilege level of the segment. It can be 0-3 where 0 is the most privileged. +4. DPL[2-bits] (Descriptor Privilege Level) comprises the bits 45-46. It defines the privilege level of the segment. It can be 0-3 where 0 is the most privileged level. -5. P flag(bit 47) - indicates if the segment is present in memory or not. If P is 0, the segment will be presented as _invalid_ and the processor will refuse to read this segment. +5. The P flag(bit 47) indicates if the segment is present in memory or not. If P is 0, the segment will be presented as _invalid_ and the processor will refuse to read from this segment. 6. AVL flag(bit 52) - Available and reserved bits. It is ignored in Linux. -7. L flag(bit 53) - indicates whether a code segment contains native 64-bit code. If 1 then the code segment executes in 64-bit mode. +7. The L flag(bit 53) indicates whether a code segment contains native 64-bit code. If it is set, then the code segment executes in 64-bit mode. -8. D/B flag(bit 54) - Default/Big flag represents the operand size i.e 16/32 bits. If it is set then 32 bit otherwise 16. +8. The D/B flag(bit 54) (Default/Big flag) represents the operand size i.e 16/32 bits. If set, operand size is 32 bits. Otherwise, it is 16 bits. Segment registers contain segment selectors as in real mode. However, in protected mode, a segment selector is handled differently. Each Segment Descriptor has an associated Segment Selector which is a 16-bit structure: ``` 15 3 2 1 0 ----------------------------- -| Index | TI | RPL | ------------------------------ +| Index | TI | RPL | +| ----- | ``` Where, -* **Index** shows the index number of the descriptor in the GDT. -* **TI**(Table Indicator) shows where to search for the descriptor. If it is 0 then search in the Global Descriptor Table(GDT) otherwise it will look in Local Descriptor Table(LDT). -* And **RPL** is Requester's Privilege Level. +* **Index** stores the index number of the descriptor in the GDT. +* **TI**(Table Indicator) indicates where to search for the descriptor. If it is 0 then the descriptor is searched for in the Global Descriptor Table(GDT). Otherwise, it will be searched for in the Local Descriptor Table(LDT). +* And **RPL** contains the Requester's Privilege Level. -Every segment register has a visible and hidden part. -* Visible - Segment Selector is stored here -* Hidden - Segment Descriptor(base, limit, attributes, flags) +Every segment register has a visible and a hidden part. +* Visible - The Segment Selector is stored here. +* Hidden - The Segment Descriptor (which contains the base, limit, attributes & flags) is stored here. -The following steps are needed to get the physical address in the protected mode: +The following steps are needed to get a physical address in protected mode: -* The segment selector must be loaded in one of the segment registers -* The CPU tries to find a segment descriptor by GDT address + Index from selector and load the descriptor into the *hidden* part of the segment register -* Base address (from segment descriptor) + offset will be the linear address of the segment which is the physical address (if paging is disabled). +* The segment selector must be loaded in one of the segment registers. +* The CPU tries to find a segment descriptor at the offset `GDT address + Index` from the selector and then loads the descriptor into the *hidden* part of the segment register. +* If paging is disabled, the linear address of the segment, or its physical address, is given by the formula: Base address (found in the descriptor obtained in the previous step) + Offset. Schematically it will look like this: @@ -169,8 +169,8 @@ Schematically it will look like this: The algorithm for the transition from real mode into protected mode is: * Disable interrupts -* Describe and load GDT with `lgdt` instruction -* Set PE (Protection Enable) bit in CR0 (Control Register 0) +* Describe and load the GDT with the `lgdt` instruction +* Set the PE (Protection Enable) bit in CR0 (Control Register 0) * Jump to protected mode code We will see the complete transition to protected mode in the linux kernel in the next part, but before we can move to protected mode, we need to do some more preparations. @@ -180,15 +180,15 @@ Let's look at [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/16f7 Copying boot parameters into the "zeropage" -------------------------------------------------------------------------------- -We will start from the `main` routine in "main.c". First function which is called in `main` is [`copy_boot_params(void)`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L30). It copies the kernel setup header into the field of the `boot_params` structure which is defined in the [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113). +We will start from the `main` routine in "main.c". The first function which is called in `main` is [`copy_boot_params(void)`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L30). It copies the kernel setup header into the corresponding field of the `boot_params` structure which is defined in the file [arch/x86/include/uapi/asm/bootparam.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L113). -The `boot_params` structure contains the `struct setup_header hdr` field. This structure contains the same fields as defined in [linux boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) and is filled by the boot loader and also at kernel compile/build time. `copy_boot_params` does two things: +The `boot_params` structure contains the `struct setup_header hdr` field. This structure contains the same fields as defined in the [linux boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) and is filled by the boot loader and also at kernel compile/build time. `copy_boot_params` does two things: -1. Copies `hdr` from [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L281) to the `boot_params` structure in `setup_header` field +1. It copies `hdr` from [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L281) to the `boot_params` structure in `setup_header` field -2. Updates pointer to the kernel command line if the kernel was loaded with the old command line protocol. +2. It updates the pointer to the kernel command line if the kernel was loaded with the old command line protocol. -Note that it copies `hdr` with `memcpy` function which is defined in the [copy.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S) source file. Let's have a look inside: +Note that it copies `hdr` with the `memcpy` function, defined in the [copy.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S) source file. Let's have a look inside: ```assembly GLOBAL(memcpy) @@ -208,27 +208,27 @@ GLOBAL(memcpy) ENDPROC(memcpy) ``` -Yeah, we just moved to C code and now assembly again :) First of all, we can see that `memcpy` and other routines which are defined here, start and end with the two macros: `GLOBAL` and `ENDPROC`. `GLOBAL` is described in [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/linkage.h) which defines `globl` directive and the label for it. `ENDPROC` is described in [include/linux/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/linkage.h) which marks the `name` symbol as a function name and ends with the size of the `name` symbol. +Yeah, we just moved to C code and now assembly again :) First of all, we can see that `memcpy` and other routines which are defined here, start and end with the two macros: `GLOBAL` and `ENDPROC`. `GLOBAL` is described in [arch/x86/include/asm/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/linkage.h) which defines the `globl` directive and its label. `ENDPROC` is described in [include/linux/linkage.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/linux/linkage.h) and marks the `name` symbol as a function name and ends with the size of the `name` symbol. -Implementation of `memcpy` is easy. At first, it pushes values from the `si` and `di` registers to the stack to preserve their values because they will change during the `memcpy`. `memcpy` (and other functions in copy.S) use `fastcall` calling conventions. So it gets its incoming parameters from the `ax`, `dx` and `cx` registers. Calling `memcpy` looks like this: +The implementation of `memcpy` is simple. At first, it pushes values from the `si` and `di` registers to the stack to preserve their values because they will change during the `memcpy`. `memcpy` and other functions in copy.S use `fastcall` calling conventions. So it gets its incoming parameters from the `ax`, `dx` and `cx` registers. Calling `memcpy` looks like this: ```c memcpy(&boot_params.hdr, &hdr, sizeof hdr); ``` So, -* `ax` will contain the address of the `boot_params.hdr` +* `ax` will contain the address of `boot_params.hdr` * `dx` will contain the address of `hdr` * `cx` will contain the size of `hdr` in bytes. -`memcpy` puts the address of `boot_params.hdr` into `di` and saves the size on the stack. After this it shifts to the right on 2 size (or divide on 4) and copies from `si` to `di` by 4 bytes. After this, we restore the size of `hdr` again, align it by 4 bytes and copy the rest of the bytes from `si` to `di` byte by byte (if there is more). Restore `si` and `di` values from the stack in the end and after this copying is finished. +`memcpy` puts the address of `boot_params.hdr` into `di` and saves `cx` on the stack. After this it shifts the value right 2 times (or divides it by 4) and copies four bytes from the address at `si` to the address at `di`. After this, we restore the size of `hdr` again, align it by 4 bytes and copy the rest of the bytes from the address at `si` to the address at `di` byte by byte (if there is more). Now the values of `si` and `di` are restored from the stack and the copying operation is finished. Console initialization -------------------------------------------------------------------------------- -After `hdr` is copied into `boot_params.hdr`, the next step is console initialization by calling the `console_init` function which is defined in [arch/x86/boot/early_serial_console.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/early_serial_console.c). +After `hdr` is copied into `boot_params.hdr`, the next step is to initialize the console by calling the `console_init` function, defined in [arch/x86/boot/early_serial_console.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/early_serial_console.c). -It tries to find the `earlyprintk` option in the command line and if the search was successful, it parses the port address and baud rate of the serial port and initializes the serial port. The value of `earlyprintk` command line option can be one of these: +It tries to find the `earlyprintk` option in the command line and if the search was successful, it parses the port address and baud rate of the serial port and initializes the serial port. The value of the `earlyprintk` command line option can be one of these: * serial,0x3f8,115200 * serial,ttyS0,115200 @@ -258,7 +258,7 @@ void __attribute__((section(".inittext"))) putchar(int ch) `__attribute__((section(".inittext")))` means that this code will be in the `.inittext` section. We can find it in the linker file [setup.ld](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/setup.ld#L19). -First of all, `putchar` checks for the `\n` symbol and if it is found, prints `\r` before. After that it outputs the character on the VGA screen by calling the BIOS with the `0x10` interrupt call: +First of all, `putchar` checks for the `\n` symbol and if it is found, prints `\r` before. After that it prints the character on the VGA screen by calling the BIOS with the `0x10` interrupt call: ```C static void __attribute__((section(".inittext"))) bios_putchar(int ch) @@ -285,7 +285,7 @@ Here `initregs` takes the `biosregs` structure and first fills `biosregs` with z reg->gs = gs(); ``` -Let's look at the [memset](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S#L36) implementation: +Let's look at the implementation of [memset](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/copy.S#L36): ```assembly GLOBAL(memset) @@ -304,22 +304,22 @@ GLOBAL(memset) ENDPROC(memset) ``` -As you can read above, it uses the `fastcall` calling conventions like the `memcpy` function, which means that the function gets parameters from `ax`, `dx` and `cx` registers. +As you can read above, it uses the `fastcall` calling conventions like the `memcpy` function, which means that the function gets its parameters from the `ax`, `dx` and `cx` registers. -Generally `memset` is like a memcpy implementation. It saves the value of the `di` register on the stack and puts the `ax` value into `di` which is the address of the `biosregs` structure. Next is the `movzbl` instruction, which copies the `dl` value to the low 2 bytes of the `eax` register. The remaining 2 high bytes of `eax` will be filled with zeros. +The implementation of `memset` is similar to that of memcpy. It saves the value of the `di` register on the stack and puts the value of`ax`, which stores the address of the `biosregs` structure, into `di` . Next is the `movzbl` instruction, which copies the value of `dl` to the lower 2 bytes of the `eax` register. The remaining 2 high bytes of `eax` will be filled with zeros. -The next instruction multiplies `eax` with `0x01010101`. It needs to because `memset` will copy 4 bytes at the same time. For example, we need to fill a structure with `0x7` with memset. `eax` will contain `0x00000007` value in this case. So if we multiply `eax` with `0x01010101`, we will get `0x07070707` and now we can copy these 4 bytes into the structure. `memset` uses `rep; stosl` instructions for copying `eax` into `es:di`. +The next instruction multiplies `eax` with `0x01010101`. It needs to because `memset` will copy 4 bytes at the same time. For example, if we need to fill a structure whose size is 4 bytes with the value `0x7` with memset, `eax` will contain the `0x00000007`. So if we multiply `eax` with `0x01010101`, we will get `0x07070707` and now we can copy these 4 bytes into the structure. `memset` uses the `rep; stosl` instruction to copy `eax` into `es:di`. -The rest of the `memset` function does almost the same as `memcpy`. +The rest of the `memset` function does almost the same thing as `memcpy`. After the `biosregs` structure is filled with `memset`, `bios_putchar` calls the [0x10](http://www.ctyme.com/intr/rb-0106.htm) interrupt which prints a character. Afterwards it checks if the serial port was initialized or not and writes a character there with [serial_putchar](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/tty.c#L30) and `inb/outb` instructions if it was set. Heap initialization -------------------------------------------------------------------------------- -After the stack and bss section were prepared in [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) (see previous [part](linux-bootstrap-1.md)), the kernel needs to initialize the [heap](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. +After the stack and bss section have been prepared in [header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S) (see previous [part](linux-bootstrap-1.md)), the kernel needs to initialize the [heap](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. -First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L22) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) in the kernel setup header and calculates the end of the stack if this flag was set: +First of all `init_heap` checks the [`CAN_USE_HEAP`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/uapi/asm/bootparam.h#L22) flag from the [`loadflags`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S#L321) structure in the kernel setup header and calculates the end of the stack if this flag was set: ```C char *stack_end; @@ -339,12 +339,12 @@ Then there is the `heap_end` calculation: which means `heap_end_ptr` or `_end` + `512` (`0x200h`). The last check is whether `heap_end` is greater than `stack_end`. If it is then `stack_end` is assigned to `heap_end` to make them equal. -Now the heap is initialized and we can use it using the `GET_HEAP` method. We will see how it is used, how to use it and how it is implemented in the next posts. +Now the heap is initialized and we can use it using the `GET_HEAP` method. We will see what it is used for, how to use it and how it is implemented in the next posts. CPU validation -------------------------------------------------------------------------------- -The next step as we can see is cpu validation by `validate_cpu` from [arch/x86/boot/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpu.c). +The next step as we can see is cpu validation through the `validate_cpu` function from [arch/x86/boot/cpu.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpu.c). It calls the [`check_cpu`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/cpucheck.c#L112) function and passes cpu level and required cpu level to it and checks that the kernel launches on the right cpu level. ```c @@ -354,14 +354,14 @@ if (cpu_level < req_level) { return -1; } ``` -`check_cpu` checks the CPU's flags, the presence of [long mode](http://en.wikipedia.org/wiki/Long_mode) in the case of x86_64(64-bit) CPU, checks the processor's vendor and makes preparation for certain vendors like turning off SSE+SSE2 for AMD if they are missing, etc. +`check_cpu` checks the CPU's flags, the presence of [long mode](http://en.wikipedia.org/wiki/Long_mode) in the case of x86_64(64-bit) CPU, checks the processor's vendor and makes preparations for certain vendors like turning off SSE+SSE2 for AMD if they are missing, etc. Memory detection -------------------------------------------------------------------------------- -The next step is memory detection by the `detect_memory` function. `detect_memory` basically provides a map of available RAM to the CPU. It uses different programming interfaces for memory detection like `0xe820`, `0xe801` and `0x88`. We will see only the implementation of **0xE820** here. +The next step is memory detection through the `detect_memory` function. `detect_memory` basically provides a map of available RAM to the CPU. It uses different programming interfaces for memory detection like `0xe820`, `0xe801` and `0x88`. We will see only the implementation of the **0xE820** interface here. -Let's look into the `detect_memory_e820` implementation from the [arch/x86/boot/memory.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/memory.c) source file. First of all, the `detect_memory_e820` function initializes the `biosregs` structure as we saw above and fills registers with special values for the `0xe820` call: +Let's look at the implementation of the `detect_memory_e820` function from the [arch/x86/boot/memory.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/memory.c) source file. First of all, the `detect_memory_e820` function initializes the `biosregs` structure as we saw above and fills registers with special values for the `0xe820` call: ```assembly initregs(&ireg); @@ -372,23 +372,23 @@ Let's look into the `detect_memory_e820` implementation from the [arch/x86/boot/ ``` * `ax` contains the number of the function (0xe820 in our case) -* `cx` register contains size of the buffer which will contain data about memory +* `cx` contains the size of the buffer which will contain data about the memory * `edx` must contain the `SMAP` magic number * `es:di` must contain the address of the buffer which will contain memory data * `ebx` has to be zero. -Next is a loop where data about the memory will be collected. It starts from the call of the `0x15` BIOS interrupt, which writes one line from the address allocation table. For getting the next line we need to call this interrupt again (which we do in the loop). Before the next call `ebx` must contain the value returned previously: +Next is a loop where data about the memory will be collected. It starts with a call to the `0x15` BIOS interrupt, which writes one line from the address allocation table. For getting the next line we need to call this interrupt again (which we do in the loop). Before the next call `ebx` must contain the value returned previously: ```C intcall(0x15, &ireg, &oreg); ireg.ebx = oreg.ebx; ``` -Ultimately, it does iterations in the loop to collect data from the address allocation table and writes this data into the `e820_entry` array: +Ultimately, this function collects data from the address allocation table and writes this data into the `e820_entry` array: * start of memory segment * size of memory segment -* type of memory segment (which can be reserved, usable and etc...). +* type of memory segment (whether the particular segment is usable or reserved) You can see the result of this in the `dmesg` output, something like: @@ -402,7 +402,7 @@ You can see the result of this in the `dmesg` output, something like: [ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved ``` -Next we may see call of the `set_bios_mode` function after physical memory is detected. As we may see, this function is implemented only for the `x86_64` mode: +Next, we may see a call to the `set_bios_mode` function. As we may see, this function is implemented only for the `x86_64` mode: ```C static void set_bios_mode(void) @@ -418,12 +418,12 @@ static void set_bios_mode(void) } ``` -The `set_bios_mode` executes `0x15` BIOS interrupt to tell the BIOS that [long mode](https://en.wikipedia.org/wiki/Long_mode) (in a case of `bx = 2`) will be used. +The `set_bios_mode` function executes the `0x15` BIOS interrupt to tell the BIOS that [long mode](https://en.wikipedia.org/wiki/Long_mode) (if `bx == 2`) will be used. Keyboard initialization -------------------------------------------------------------------------------- -The next step is the initialization of the keyboard with the call of the [`keyboard_init()`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L65) function. At first `keyboard_init` initializes registers using the `initregs` function and calling the [0x16](http://www.ctyme.com/intr/rb-1756.htm) interrupt for getting the keyboard status. +The next step is the initialization of the keyboard with a call to the [`keyboard_init()`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L65) function. At first `keyboard_init` initializes registers using the `initregs` function. It then calls the [0x16](http://www.ctyme.com/intr/rb-1756.htm) interrupt to query the status of the keyboard. ```c initregs(&ireg); @@ -432,7 +432,7 @@ The next step is the initialization of the keyboard with the call of the [`keybo boot_params.kbd_status = oreg.al; ``` -After this it calls [0x16](http://www.ctyme.com/intr/rb-1757.htm) again to set repeat rate and delay. +After this it calls [0x16](http://www.ctyme.com/intr/rb-1757.htm) again to set the repeat rate and delay. ```c ireg.ax = 0x0305; /* Set keyboard repeat rate */ @@ -442,15 +442,15 @@ After this it calls [0x16](http://www.ctyme.com/intr/rb-1757.htm) again to set r Querying -------------------------------------------------------------------------------- -The next couple of steps are queries for different parameters. We will not dive into details about these queries but will get back to it in later parts. Let's take a short look at these functions: +The next couple of steps are queries for different parameters. We will not dive into details about these queries but we will get back to them in later parts. Let's take a short look at these functions: -The first step is getting [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) information by calling the `query_ist` function. First of all, it checks the CPU level and if it is correct, calls `0x15` for getting info and saves the result to `boot_params`. +The first step is getting [Intel SpeedStep](http://en.wikipedia.org/wiki/SpeedStep) information by calling the `query_ist` function. It checks the CPU level and if it is correct, calls `0x15` to get the info and saves the result to `boot_params`. -The following [query_apm_bios](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/apm.c#L21) function gets [Advanced Power Management](http://en.wikipedia.org/wiki/Advanced_Power_Management) information from the BIOS. `query_apm_bios` calls the `0x15` BIOS interruption too, but with `ah` = `0x53` to check `APM` installation. After the `0x15` execution, `query_apm_bios` functions check the `PM` signature (it must be `0x504d`), carry flag (it must be 0 if `APM` supported) and value of the `cx` register (if it's 0x02, protected mode interface is supported). +Next, the [query_apm_bios](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/apm.c#L21) function gets [Advanced Power Management](http://en.wikipedia.org/wiki/Advanced_Power_Management) information from the BIOS. `query_apm_bios` calls the `0x15` BIOS interruption too, but with `ah` = `0x53` to check `APM` installation. After `0x15` finishes executing, the `query_apm_bios` functions check the `PM` signature (it must be `0x504d`), the carry flag (it must be 0 if `APM` supported) and the value of the `cx` register (if it's 0x02, the protected mode interface is supported). -Next, it calls `0x15` again, but with `ax = 0x5304` for disconnecting the `APM` interface and connecting the 32-bit protected mode interface. In the end, it fills `boot_params.apm_bios_info` with values obtained from the BIOS. +Next, it calls `0x15` again, but with `ax = 0x5304` to disconnect the `APM` interface and connect the 32-bit protected mode interface. In the end, it fills `boot_params.apm_bios_info` with values obtained from the BIOS. -Note that `query_apm_bios` will be executed only if `CONFIG_APM` or `CONFIG_APM_MODULE` was set in the configuration file: +Note that `query_apm_bios` will be executed only if the `CONFIG_APM` or `CONFIG_APM_MODULE` compile time flag was set in the configuration file: ```C #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) @@ -458,7 +458,7 @@ Note that `query_apm_bios` will be executed only if `CONFIG_APM` or `CONFIG_APM_ #endif ``` -The last is the [`query_edd`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/edd.c#L122) function, which queries `Enhanced Disk Drive` information from the BIOS. Let's look into the `query_edd` implementation. +The last is the [`query_edd`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/edd.c#L122) function, which queries `Enhanced Disk Drive` information from the BIOS. Let's look at how `query_edd` is implemented. First of all, it reads the [edd](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/Documentation/kernel-parameters.txt#L1023) option from the kernel's command line and if it was set to `off` then `query_edd` just returns. @@ -477,12 +477,12 @@ for (devno = 0x80; devno < 0x80+EDD_MBR_SIG_MAX; devno++) { } ``` -where `0x80` is the first hard drive and the value of `EDD_MBR_SIG_MAX` macro is 16. It collects data into the array of [edd_info](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/edd.h#L172) structures. `get_edd_info` checks that EDD is present by invoking the `0x13` interrupt with `ah` as `0x41` and if EDD is present, `get_edd_info` again calls the `0x13` interrupt, but with `ah` as `0x48` and `si` containing the address of the buffer where EDD information will be stored. +where `0x80` is the first hard drive and the value of the `EDD_MBR_SIG_MAX` macro is 16. It collects data into an array of [edd_info](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/uapi/linux/edd.h#L172) structures. `get_edd_info` checks that EDD is present by invoking the `0x13` interrupt with `ah` as `0x41` and if EDD is present, `get_edd_info` again calls the `0x13` interrupt, but with `ah` as `0x48` and `si` containing the address of the buffer where EDD information will be stored. Conclusion -------------------------------------------------------------------------------- -This is the end of the second part about Linux kernel insides. In the next part, we will see video mode setting and the rest of preparations before the transition to protected mode and directly transitioning into it. +This is the end of the second part about the insides of the Linux kernel. In the next part, we will see video mode setting and the rest of the preparations before the transition to protected mode and directly transitioning into it. If you have any questions or suggestions write me a comment or ping me at [twitter](https://twitter.com/0xAX). From 360b9a62b4b5365bc4b56ea01c95367bfef685fc Mon Sep 17 00:00:00 2001 From: Raghav Shankar Date: Sun, 14 Jan 2018 10:31:28 +0530 Subject: [PATCH 077/179] Add self to contributors.md --- contributors.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contributors.md b/contributors.md index c4ef5d0..90bcf8b 100644 --- a/contributors.md +++ b/contributors.md @@ -112,4 +112,5 @@ Thank you to all contributors: * [Andrés Rojas](https://github.com/c0r3dump3d) * [Beomsu Kim](https://github.com/0xF0D0) * [Firo Yang](https://github.com/firogh) -* [Edward Hu](https://github.com/BDHU) \ No newline at end of file +* [Edward Hu](https://github.com/BDHU) +* [WarpspeedSCP](https://github.com/WarpspeedSCP) \ No newline at end of file From c81fa6763b37dc2595e102e202049f1bad97bede Mon Sep 17 00:00:00 2001 From: Raghav Shankar Date: Mon, 15 Jan 2018 16:25:23 +0530 Subject: [PATCH 078/179] Make grammar and formatting fixes in linux-bootstrap-3.md --- Booting/linux-bootstrap-3.md | 116 +++++++++++++++++------------------ 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index c454afc..c66cd68 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -4,11 +4,11 @@ Kernel booting process. Part 3. Video mode initialization and transition to protected mode -------------------------------------------------------------------------------- -This is the third part of the `Kernel booting process` series. In the previous [part](linux-bootstrap-2.md#kernel-booting-process-part-2), we stopped right before the call of the `set_video` routine from [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L181). In this part, we will see: +This is the third part of the `Kernel booting process` series. In the previous [part](linux-bootstrap-2.md#kernel-booting-process-part-2), we stopped right before the call to the `set_video` routine from [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L181). In this part, we will look at: * video mode initialization in the kernel setup code, -* preparation before switching into protected mode, -* transition to protected mode +* the preparations made before switching into protected mode, +* the transition to protected mode **NOTE** If you don't know anything about protected mode, you can find some information about it in the previous [part](linux-bootstrap-2.md#protected-mode). Also, there are a couple of [links](linux-bootstrap-2.md#links) which can help you. @@ -18,7 +18,7 @@ As I wrote above, we will start from the `set_video` function which is defined i u16 mode = boot_params.hdr.vid_mode; ``` -which we filled in the `copy_boot_params` function (you can read about it in the previous post). The `vid_mode` is an obligatory field which is filled by the bootloader. You can find information about it in the kernel `boot protocol`: +which we filled in the `copy_boot_params` function (you can read about it in the previous post). `vid_mode` is an obligatory field which is filled by the bootloader. You can find information about it in the kernel `boot protocol`: ``` Offset Proto Name Meaning @@ -38,7 +38,7 @@ vga= line is parsed. ``` -So we can add `vga` option to the grub or another bootloader configuration file and it will pass this option to the kernel command line. This option can have different values as mentioned in the description. For example, it can be an integer number `0xFFFD` or `ask`. If you pass `ask` to `vga`, you will see a menu like this: +So we can add the `vga` option to the grub or another bootloader configuration file and it will pass this option to the kernel command line. This option can have different values as mentioned in the description. For example, it can be an integer number `0xFFFD` or `ask`. If you pass `ask` to `vga`, you will see a menu like this: ![video mode setup menu](http://oi59.tinypic.com/ejcz81.jpg) @@ -65,13 +65,13 @@ After we get `vid_mode` from `boot_params.hdr` in the `set_video` function, we c #define RESET_HEAP() ((void *)( HEAP = _end )) ``` -If you have read the second part, you will remember that we initialized the heap with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. We have a couple of utility functions for heap which are defined in `boot.h`. They are: +If you have read the second part, you will remember that we initialized the heap with the [`init_heap`](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L116) function. We have a couple of utility functions for managing the heap which are defined in `boot.h`. They are: ```C #define RESET_HEAP() ``` -As we saw just above, it resets the heap by setting the `HEAP` variable equal to `_end`, where `_end` is just `extern char _end[];` +As we saw just above, it resets the heap by setting the `HEAP` variable to `_end`, where `_end` is just `extern char _end[];` Next is the `GET_HEAP` macro: @@ -82,11 +82,11 @@ Next is the `GET_HEAP` macro: for heap allocation. It calls the internal function `__get_heap` with 3 parameters: -* size of a type in bytes, which need be allocated -* `__alignof__(type)` shows how variables of this type are aligned -* `n` tells how many items to allocate +* the size of the datatype to be allocated for +* `__alignof__(type)` specifies how variables of this type are to be aligned +* `n` specifies how many items to allocate -Implementation of `__get_heap` is: +The implementation of `__get_heap` is: ```C static inline char *__get_heap(size_t s, size_t a, size_t n) @@ -106,7 +106,7 @@ and we will further see its usage, something like: saved.data = GET_HEAP(u16, saved.x * saved.y); ``` -Let's try to understand how `__get_heap` works. We can see here that `HEAP` (which is equal to `_end` after `RESET_HEAP()`) is the address of aligned memory according to the `a` parameter. After this we save the memory address from `HEAP` to the `tmp` variable, move `HEAP` to the end of the allocated block and return `tmp` which is the start address of allocated memory. +Let's try to understand how `__get_heap` works. We can see here that `HEAP` (which is equal to `_end` after `RESET_HEAP()`) is assigned the address of the aligned memory according to the `a` parameter. After this we save the memory address from `HEAP` to the `tmp` variable, move `HEAP` to the end of the allocated block and return `tmp` which is the start address of allocated memory. And the last function is: @@ -117,7 +117,7 @@ static inline bool heap_free(size_t n) } ``` -which subtracts value of the `HEAP` from the `heap_end` (we calculated it in the previous [part](linux-bootstrap-2.md)) and returns 1 if there is enough memory for `n`. +which subtracts value of the `HEAP` pointer from the `heap_end` (we calculated it in the previous [part](linux-bootstrap-2.md)) and returns 1 if there is enough memory available for `n`. That's all. Now we have a simple API for heap and can setup video mode. @@ -126,20 +126,20 @@ Set up video mode Now we can move directly to video mode initialization. We stopped at the `RESET_HEAP()` call in the `set_video` function. Next is the call to `store_mode_params` which stores video mode parameters in the `boot_params.screen_info` structure which is defined in [include/uapi/linux/screen_info.h](https://github.com/0xAX/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/include/uapi/linux/screen_info.h). -If we look at the `store_mode_params` function, we can see that it starts with the call to the `store_cursor_position` function. As you can understand from the function name, it gets information about cursor and stores it. +If we look at the `store_mode_params` function, we can see that it starts with a call to the `store_cursor_position` function. As you can understand from the function name, it gets information about the cursor and stores it. -First of all, `store_cursor_position` initializes two variables which have type `biosregs` with `AH = 0x3`, and calls `0x10` BIOS interruption. After the interruption is successfully executed, it returns row and column in the `DL` and `DH` registers. Row and column will be stored in the `orig_x` and `orig_y` fields from the `boot_params.screen_info` structure. +First of all, `store_cursor_position` initializes two variables which have type `biosregs` with `AH = 0x3`, and calls the `0x10` BIOS interruption. After the interruption is successfully executed, it returns row and column in the `DL` and `DH` registers. Row and column will be stored in the `orig_x` and `orig_y` fields of the `boot_params.screen_info` structure. After `store_cursor_position` is executed, the `store_video_mode` function will be called. It just gets the current video mode and stores it in `boot_params.screen_info.orig_video_mode`. -After this, the `store_mode_params` checks the current video mode and sets the `video_segment`. After the BIOS transfers control to the boot sector, the following addresses are for video memory: +After this, `store_mode_params` checks the current video mode and sets the `video_segment`. After the BIOS transfers control to the boot sector, the following addresses are for video memory: ``` 0xB000:0x0000 32 Kb Monochrome Text Video Memory 0xB800:0x0000 32 Kb Color Text Video Memory ``` -So we set the `video_segment` variable to `0xb000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0xb800` if the current video mode is in color mode. After setting up the address of the video segment, font size needs to be stored in `boot_params.screen_info.orig_video_points` with: +So we set the `video_segment` variable to `0xb000` if the current video mode is MDA, HGC, or VGA in monochrome mode and to `0xb800` if the current video mode is in color mode. After setting up the address of the video segment, the font size needs to be stored in `boot_params.screen_info.orig_video_points` with: ```C set_fs(0); @@ -156,7 +156,7 @@ y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1; Next, we get the amount of columns by address `0x44a` and rows by address `0x484` and store them in `boot_params.screen_info.orig_video_cols` and `boot_params.screen_info.orig_video_lines`. After this, execution of `store_mode_params` is finished. -Next we can see the `save_screen` function which just saves screen content to the heap. This function collects all data which we got in the previous functions like rows and columns amount etc. and stores it in the `saved_screen` structure, which is defined as: +Next we can see the `save_screen` function which just saves the contents of the screen to the heap. This function collects all the data which we got in the previous functions (like the rows and columns, and stuff) and stores it in the `saved_screen` structure, which is defined as: ```C static struct saved_screen { @@ -175,7 +175,7 @@ if (!heap_free(saved.x*saved.y*sizeof(u16)+512)) and allocates space in the heap if it is enough and stores `saved_screen` in it. -The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting moment, we can see the loop: +The next call is `probe_cards(0)` from [arch/x86/boot/video-mode.c](https://github.com/0xAX/linux/blob/0e271fd59fe9e6d8c932309e7a42a4519c5aac6f/arch/x86/boot/video-mode.c#L33). It goes over all video_cards and collects the number of modes provided by the cards. Here is the interesting part, we can see the loop: ```C for (card = video_cards; card < video_cards_end; card++) { @@ -183,7 +183,7 @@ for (card = video_cards; card < video_cards_end; card++) { } ``` -but `video_cards` is not declared anywhere. The answer is simple: every video mode presented in the x86 kernel setup code has definition like this: +but `video_cards` is not declared anywhere. The answer is simple: every video mode presented in the x86 kernel setup code has a definition that looks like this: ```C static __videocard video_vga = { @@ -199,7 +199,7 @@ where `__videocard` is a macro: #define __videocard struct card_info __attribute__((used,section(".videocards"))) ``` -which means that `card_info` structure: +which means that the `card_info` structure: ```C struct card_info { @@ -224,13 +224,13 @@ is in the `.videocards` segment. Let's look in the [arch/x86/boot/setup.ld](http } ``` -It means that `video_cards` is just a memory address and all `card_info` structures are placed in this segment. It means that all `card_info` structures are placed between `video_cards` and `video_cards_end`, so we can use it in a loop to go over all of it. After `probe_cards` executes we have all structures like `static __videocard video_vga` with filled `nmodes` (number of video modes). +It means that `video_cards` is just a memory address and all `card_info` structures are placed in this segment. It means that all `card_info` structures are placed between `video_cards` and `video_cards_end`, so we can use a loop to go over all of it. After `probe_cards` executes we have a bunch of structures like `static __videocard video_vga` with the `nmodes` (the number of video modes) filled in. -After `probe_cards` execution is finished, we move to the main loop in the `set_video` function. There is an infinite loop which tries to set up video mode with the `set_mode` function or prints a menu if we passed `vid_mode=ask` to the kernel command line or video mode is undefined. +After the `probe_cards` function is done, we move to the main loop in the `set_video` function. There is an infinite loop which tries to set up the video mode with the `set_mode` function or prints a menu if we passed `vid_mode=ask` to the kernel command line or if video mode is undefined. -The `set_mode` function is defined in [video-mode.c](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/video-mode.c#L147) and gets only one parameter, `mode`, which is the number of video modes (we got it from the menu or in the start of `setup_video`, from the kernel setup header). +The `set_mode` function is defined in [video-mode.c](https://github.com/0xAX/linux/blob/0a07b238e5f488b459b6113a62e06b6aab017f71/arch/x86/boot/video-mode.c#L147) and gets only one parameter, `mode`, which is the number of video modes (we got this value from the menu or in the start of `setup_video`, from the kernel setup header). -The `set_mode` function checks the `mode` and calls the `raw_set_mode` function. The `raw_set_mode` calls the `set_mode` function for the selected card i.e. `card->set_mode(struct mode_info*)`. We can get access to this function from the `card_info` structure. Every video mode defines this structure with values filled depending upon the video mode (for example for `vga` it is the `video_vga.set_mode` function. See above example of `card_info` structure for `vga`). `video_vga.set_mode` is `vga_set_mode`, which checks the vga mode and calls the respective function: +The `set_mode` function checks the `mode` and calls the `raw_set_mode` function. The `raw_set_mode` calls the selected card's `set_mode` function, i.e. `card->set_mode(struct mode_info*)`. We can get access to this function from the `card_info` structure. Every video mode defines this structure with values filled depending upon the video mode (for example for `vga` it is the `video_vga.set_mode` function. See the above example of the `card_info` structure for `vga`). `video_vga.set_mode` is `vga_set_mode`, which checks the vga mode and calls the respective function: ```C static int vga_set_mode(struct mode_info *mode) @@ -268,22 +268,22 @@ static int vga_set_mode(struct mode_info *mode) Every function which sets up video mode just calls the `0x10` BIOS interrupt with a certain value in the `AH` register. -After we have set video mode, we pass it to `boot_params.hdr.vid_mode`. +After we have set the video mode, we pass it to `boot_params.hdr.vid_mode`. -Next `vesa_store_edid` is called. This function simply stores the [EDID](https://en.wikipedia.org/wiki/Extended_Display_Identification_Data) (**E**xtended **D**isplay **I**dentification **D**ata) information for kernel use. After this `store_mode_params` is called again. Lastly, if `do_restore` is set, the screen is restored to an earlier state. +Next, `vesa_store_edid` is called. This function simply stores the [EDID](https://en.wikipedia.org/wiki/Extended_Display_Identification_Data) (**E**xtended **D**isplay **I**dentification **D**ata) information for kernel use. After this `store_mode_params` is called again. Lastly, if `do_restore` is set, the screen is restored to an earlier state. -After this, we have set video mode and now we can switch to the protected mode. +Having done this, the video mode setup is complete and now we can switch to the protected mode. Last preparation before transition into protected mode -------------------------------------------------------------------------------- -We can see the last function call - `go_to_protected_mode` - in [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L184). As the comment says: `Do the last things and invoke protected mode`, so let's see these last things and switch into protected mode. +We can see the last function call - `go_to_protected_mode` - in [main.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/main.c#L184). As the comment says: `Do the last things and invoke protected mode`, so let's see what these last things are and switch into protected mode. -The `go_to_protected_mode` is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what they do and how it works. +The `go_to_protected_mode` function is defined in [arch/x86/boot/pm.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/pm.c#L104). It contains some functions which make the last preparations before we can jump into protected mode, so let's look at it and try to understand what it does and how it works. First is the call to the `realmode_switch_hook` function in `go_to_protected_mode`. This function invokes the real mode switch hook if it is present and disables [NMI](http://en.wikipedia.org/wiki/Non-maskable_interrupt). Hooks are used if the bootloader runs in a hostile environment. You can read more about hooks in the [boot protocol](https://www.kernel.org/doc/Documentation/x86/boot.txt) (see **ADVANCED BOOT LOADER HOOKS**). -The `realmode_switch` hook presents a pointer to the 16-bit real mode far subroutine which disables non-maskable interrupts. After `realmode_switch` hook (it isn't present for me) is checked, disabling of Non-Maskable Interrupts(NMI) occurs: +The `realmode_switch` hook presents a pointer to the 16-bit real mode far subroutine which disables non-maskable interrupts. After the `realmode_switch` hook (it isn't present for me) is checked, Non-Maskable Interrupts(NMI) is disabled: ```assembly asm volatile("cli"); @@ -291,11 +291,11 @@ outb(0x80, 0x70); /* Disable NMI */ io_delay(); ``` -At first, there is an inline assembly instruction with a `cli` instruction which clears the interrupt flag (`IF`). After this, external interrupts are disabled. The next line disables NMI (non-maskable interrupt). +At first, there is an inline assembly statement with a `cli` instruction which clears the interrupt flag (`IF`). After this, external interrupts are disabled. The next line disables NMI (non-maskable interrupt). -An interrupt is a signal to the CPU which is emitted by hardware or software. After getting the signal, the CPU suspends the current instruction sequence, saves its state and transfers control to the interrupt handler. After the interrupt handler has finished it's work, it transfers control to the interrupted instruction. Non-maskable interrupts (NMI) are interrupts which are always processed, independently of permission. It cannot be ignored and is typically used to signal for non-recoverable hardware errors. We will not dive into details of interrupts now but will discuss it in the next posts. +An interrupt is a signal to the CPU which is emitted by hardware or software. After getting such a signal, the CPU suspends the current instruction sequence, saves its state and transfers control to the interrupt handler. After the interrupt handler has finished it's work, it transfers control back to the interrupted instruction. Non-maskable interrupts (NMI) are interrupts which are always processed, independently of permission. They cannot be ignored and are typically used to signal for non-recoverable hardware errors. We will not dive into the details of interrupts now but we will be discussing them in the coming posts. -Let's get back to the code. We can see that second line is writing `0x80` (disabled bit) byte to `0x70` (CMOS Address register). After that, a call to the `io_delay` function occurs. `io_delay` causes a small delay and looks like: +Let's get back to the code. We can see in the second line that we are writing the byte `0x80` (disabled bit) to `0x70` (the CMOS Address register). After that, a call to the `io_delay` function occurs. `io_delay` causes a small delay and looks like: ```C static inline void io_delay(void) @@ -305,9 +305,9 @@ static inline void io_delay(void) } ``` -To output any byte to the port `0x80` should delay exactly 1 microsecond. So we can write any value (value from `AL` register in our case) to the `0x80` port. After this delay `realmode_switch_hook` function has finished execution and we can move to the next function. +To output any byte to the port `0x80` should delay exactly 1 microsecond. So we can write any value (the value from `AL` in our case) to the `0x80` port. After this delay the `realmode_switch_hook` function has finished execution and we can move to the next function. -The next function is `enable_a20`, which enables [A20 line](http://en.wikipedia.org/wiki/A20_line). This function is defined in [arch/x86/boot/a20.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/a20.c) and it tries to enable the A20 gate with different methods. The first is the `a20_test_short` function which checks if A20 is already enabled or not with the `a20_test` function: +The next function is `enable_a20`, which enables the [A20 line](http://en.wikipedia.org/wiki/A20_line). This function is defined in [arch/x86/boot/a20.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/a20.c) and it tries to enable the A20 gate with different methods. The first is the `a20_test_short` function which checks if A20 is already enabled or not with the `a20_test` function: ```C static int a20_test(int loops) @@ -333,11 +333,11 @@ static int a20_test(int loops) } ``` -First of all, we put `0x0000` in the `FS` register and `0xffff` in the `GS` register. Next, we read the value in address `A20_TEST_ADDR` (it is `0x200`) and put this value into the `saved` variable and `ctr`. +First of all, we put `0x0000` in the `FS` register and `0xffff` in the `GS` register. Next, we read the value at the address `A20_TEST_ADDR` (it is `0x200`) and put this value into the variables `saved` and `ctr`. -Next, we write an updated `ctr` value into `fs:gs` with the `wrfs32` function, then delay for 1ms, and then read the value from the `GS` register by address `A20_TEST_ADDR+0x10`, if it's not zero we already have enabled the A20 line. If A20 is disabled, we try to enable it with a different method which you can find in the `a20.c`. For example with call of `0x15` BIOS interrupt with `AH=0x2041` etc. +Next, we write an updated `ctr` value into `fs:gs` with the `wrfs32` function, then delay for 1ms, and then read the value from the `GS` register into the address `A20_TEST_ADDR+0x10`, if it's not zero we've already enabled the A20 line. If A20 is disabled, we try to enable it with a different method which you can find in `a20.c`. For example, it can be done with a call to the `0x15` BIOS interrupt with `AH=0x2041`. -If the `enabled_a20` function finished with fail, print an error message and call function `die`. You can remember it from the first source code file where we started - [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S): +If the `enabled_a20` function finished with a failure, print an error message and call the function `die`. You can remember it from the first source code file where we started - [arch/x86/boot/header.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/boot/header.S): ```assembly die: @@ -366,10 +366,10 @@ This masks all interrupts on the secondary PIC (Programmable Interrupt Controlle And after all of these preparations, we can see the actual transition into protected mode. -Set up Interrupt Descriptor Table +Set up the Interrupt Descriptor Table -------------------------------------------------------------------------------- -Now we set up the Interrupt Descriptor table (IDT). `setup_idt`: +Now we set up the Interrupt Descriptor table (IDT) in the `setup_idt` function: ```C static void setup_idt(void) @@ -379,7 +379,7 @@ static void setup_idt(void) } ``` -which sets up the Interrupt Descriptor Table (describes interrupt handlers and etc.). For now, the IDT is not installed (we will see it later), but now we just the load IDT with the `lidtl` instruction. `null_idt` contains address and size of IDT, but now they are just zero. `null_idt` is a `gdt_ptr` structure, it as defined as: +which sets up the Interrupt Descriptor Table (describes interrupt handlers and etc.). For now, the IDT is not installed (we will see it later), but now we just load the IDT with the `lidtl` instruction. `null_idt` contains the address and size of the IDT, but for now they are just zero. `null_idt` is a `gdt_ptr` structure, it is defined as: ```C struct gdt_ptr { @@ -393,7 +393,7 @@ where we can see the 16-bit length(`len`) of the IDT and the 32-bit pointer to i Set up Global Descriptor Table -------------------------------------------------------------------------------- -Next is the setup of the Global Descriptor Table (GDT). We can see the `setup_gdt` function which sets up GDT (you can read about it in the [Kernel booting process. Part 2.](linux-bootstrap-2.md#protected-mode)). There is a definition of the `boot_gdt` array in this function, which contains the definition of the three segments: +Next is the setup of the Global Descriptor Table (GDT). We can see the `setup_gdt` function which sets up the GDT (you can read about it in the post [Kernel booting process. Part 2.](linux-bootstrap-2.md#protected-mode)). There is a definition of the `boot_gdt` array in this function, which contains the definition of the three segments: ```C static const u64 boot_gdt[] __attribute__((aligned(16))) = { @@ -403,7 +403,7 @@ static const u64 boot_gdt[] __attribute__((aligned(16))) = { }; ``` -for code, data and TSS (Task State Segment). We will not use the task state segment for now, it was added there to make Intel VT happy as we can see in the comment line (if you're interested you can find commit which describes it - [here](https://github.com/torvalds/linux/commit/88089519f302f1296b4739be45699f06f728ec31)). Let's look at `boot_gdt`. First of all note that it has the `__attribute__((aligned(16)))` attribute. It means that this structure will be aligned by 16 bytes. +for code, data and TSS (Task State Segment). We will not use the task state segment for now, it was added there to make Intel VT happy as we can see in the comment line (if you're interested you can find the commit which describes it - [here](https://github.com/torvalds/linux/commit/88089519f302f1296b4739be45699f06f728ec31)). Let's look at `boot_gdt`. First of all note that it has the `__attribute__((aligned(16)))` attribute. It means that this structure will be aligned by 16 bytes. Let's look at a simple example: @@ -430,7 +430,7 @@ int main(void) } ``` -Technically a structure which contains one `int` field must be 4 bytes, but here `aligned` structure will be 16 bytes: +Technically a structure which contains one `int` field must be 4 bytes in size, but an `aligned` structure will need 16 bytes to store in memory: ``` $ gcc test.c -o test && test @@ -438,9 +438,9 @@ Not aligned - 4 Aligned - 16 ``` -The `GDT_ENTRY_BOOT_CS` has index - 2 here, `GDT_ENTRY_BOOT_DS` is `GDT_ENTRY_BOOT_CS + 1` and etc. It starts from 2, because first is a mandatory null descriptor (index - 0) and the second is not used (index - 1). +The `GDT_ENTRY_BOOT_CS` has index - 2 here, `GDT_ENTRY_BOOT_DS` is `GDT_ENTRY_BOOT_CS + 1` and etc. It starts from 2, because the first is a mandatory null descriptor (index - 0) and the second is not used (index - 1). -The `GDT_ENTRY` is a macro which takes flags, base, limit and builds GDT entry. For example, let's look at the code segment entry. `GDT_ENTRY` takes following values: +`GDT_ENTRY` is a macro which takes flags, base, limit and builds a GDT entry. For example, let's look at the code segment entry. `GDT_ENTRY` takes the following values: * base - 0 * limit - 0xfffff @@ -481,7 +481,7 @@ Next we get a pointer to the GDT with: gdt.ptr = (u32)&boot_gdt + (ds() << 4); ``` -Here we just get the address of `boot_gdt` and add it to the address of the data segment left-shifted by 4 bits (remember we're in the real mode now). +Here we just get the address of `boot_gdt` and add it to the address of the data segment left-shifted by 4 bits (remember we're in real mode now). Lastly we execute the `lgdtl` instruction to load the GDT into the GDTR register: @@ -492,7 +492,7 @@ asm volatile("lgdtl %0" : : "m" (gdt)); Actual transition into protected mode -------------------------------------------------------------------------------- -This is the end of the `go_to_protected_mode` function. We loaded IDT, GDT, disable interruptions and now can switch the CPU into protected mode. The last step is calling the `protected_mode_jump` function with two parameters: +This is the end of the `go_to_protected_mode` function. We loaded the IDT and GDT, disabled interrupts and now can switch the CPU into protected mode. The last step is calling the `protected_mode_jump` function with two parameters: ```C protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4)); @@ -502,12 +502,12 @@ which is defined in [arch/x86/boot/pmjump.S](https://github.com/torvalds/linux/b It takes two parameters: -* address of protected mode entry point +* address of the protected mode entry point * address of `boot_params` Let's look inside `protected_mode_jump`. As I wrote above, you can find it in `arch/x86/boot/pmjump.S`. The first parameter will be in the `eax` register and the second one is in `edx`. -First of all, we put the address of `boot_params` in the `esi` register and the address of code segment register `cs` (0x1000) in `bx`. After this, we shift `bx` by 4 bits and add it to the memory location labeled `2` (which is `bx << 4 + in_pm32`, the physical address to jump after transitioned to 32-bit mode) and jump to label `1`. Next we put data segment and task state segment in the `cx` and `di` registers with: +First of all, we put the address of `boot_params` in the `esi` register and the address of the code segment register `cs` (0x1000) in `bx`. After this, we shift `bx` by 4 bits and add it to the memory location labeled `2` (which is `bx << 4 + in_pm32`, the physical address to jump after transitioned to 32-bit mode) and jump to label `1`. Next we put the data segment and the task state segment in the `cx` and `di` registers with: ```assembly movw $__BOOT_DS, %cx @@ -537,16 +537,16 @@ where: * `0x66` is the operand-size prefix which allows us to mix 16-bit and 32-bit code * `0xea` - is the jump opcode * `in_pm32` is the segment offset -* `__BOOT_CS` is the code segment +* `__BOOT_CS` is the code segment we want to jump to. -After this we are finally in the protected mode: +After this we are finally in protected mode: ```assembly .code32 .section ".text32","ax" ``` -Let's look at the first steps in protected mode. First of all we set up the data segment with: +Let's look at the first steps taken in protected mode. First of all we set up the data segment with: ```assembly movl %ecx, %ds @@ -558,13 +558,13 @@ movl %ecx, %ss If you paid attention, you can remember that we saved `$__BOOT_DS` in the `cx` register. Now we fill it with all segment registers besides `cs` (`cs` is already `__BOOT_CS`). -And setup valid stack for debugging purposes: +And setup a valid stack for debugging purposes: ```assembly addl %ebx, %esp ``` -The last step before jump into 32-bit entry point is clearing of general purpose registers: +The last step before the jump into 32-bit entry point is to clear the general purpose registers: ```assembly xorl %ecx, %ecx @@ -582,12 +582,12 @@ jmpl *%eax Remember that `eax` contains the address of the 32-bit entry (we passed it as the first parameter into `protected_mode_jump`). -That's all. We're in the protected mode and stop at it's entry point. We will see what happens next in the next part. +That's all. We're in protected mode and stop at its entry point. We will see what happens next in the next part. Conclusion -------------------------------------------------------------------------------- -This is the end of the third part about linux kernel insides. In next part, we will see first steps in the protected mode and transition into the [long mode](http://en.wikipedia.org/wiki/Long_mode). +This is the end of the third part about linux kernel insides. In the next part, we will look at the first steps we take in protected mode and transition into [long mode](http://en.wikipedia.org/wiki/Long_mode). If you have any questions or suggestions write me a comment or ping me at [twitter](https://twitter.com/0xAX). From a51574ae2b25b016cb298ec0ceb7065c3f795425 Mon Sep 17 00:00:00 2001 From: Raghav Shankar Date: Mon, 15 Jan 2018 16:30:48 +0530 Subject: [PATCH 079/179] Formatting change --- Booting/linux-bootstrap-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-3.md b/Booting/linux-bootstrap-3.md index c66cd68..b4a2950 100644 --- a/Booting/linux-bootstrap-3.md +++ b/Booting/linux-bootstrap-3.md @@ -38,7 +38,7 @@ vga= line is parsed. ``` -So we can add the `vga` option to the grub or another bootloader configuration file and it will pass this option to the kernel command line. This option can have different values as mentioned in the description. For example, it can be an integer number `0xFFFD` or `ask`. If you pass `ask` to `vga`, you will see a menu like this: +So we can add the `vga` option to the grub (or another bootloader's) configuration file and it will pass this option to the kernel command line. This option can have different values as mentioned in the description. For example, it can be an integer number `0xFFFD` or `ask`. If you pass `ask` to `vga`, you will see a menu like this: ![video mode setup menu](http://oi59.tinypic.com/ejcz81.jpg) From 60fbd201229369a2b4b77a9337235664820c6eb6 Mon Sep 17 00:00:00 2001 From: kuritonasu Date: Tue, 23 Jan 2018 10:21:18 +0200 Subject: [PATCH 080/179] Modified a couple of points that sound more correct --- Booting/linux-bootstrap-1.md | 2 +- contributors.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index d38db06..a5a0be6 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -21,7 +21,7 @@ All posts will also be accessible at [github repo](https://github.com/0xAX/linux Anyway, if you are just starting to learn such tools, I will try to explain some parts during this and the following posts. Alright, this is the end of the simple introduction, and now we can start to dive into the Linux kernel and low-level stuff. -I've started to write this book at the time of the `3.18` Linux kernel, and many things might change from that time. If there are changes, I will update the posts accordingly. +I've started writing this book at the time of the `3.18` Linux kernel, and many things might have changed from that time. If there are changes, I will update the posts accordingly. The Magical Power Button, What happens next? -------------------------------------------------------------------------------- diff --git a/contributors.md b/contributors.md index dde8523..0bab64f 100644 --- a/contributors.md +++ b/contributors.md @@ -114,4 +114,5 @@ Thank you to all contributors: * [Firo Yang](https://github.com/firogh) * [Edward Hu](https://github.com/BDHU) * [WarpspeedSCP](https://github.com/WarpspeedSCP) -* [Gabriela Moldovan](https://github.com/gabi-250) \ No newline at end of file +* [Gabriela Moldovan](https://github.com/gabi-250) +* [kuritonasu](https://github.com/kuritonasu/) From 3513614cb897d3f6bdc4b9d805d7b6e37ca3fabc Mon Sep 17 00:00:00 2001 From: kuritonasu Date: Tue, 23 Jan 2018 10:30:42 +0200 Subject: [PATCH 081/179] Replaced from with since --- Booting/linux-bootstrap-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index a5a0be6..66e0508 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -21,7 +21,7 @@ All posts will also be accessible at [github repo](https://github.com/0xAX/linux Anyway, if you are just starting to learn such tools, I will try to explain some parts during this and the following posts. Alright, this is the end of the simple introduction, and now we can start to dive into the Linux kernel and low-level stuff. -I've started writing this book at the time of the `3.18` Linux kernel, and many things might have changed from that time. If there are changes, I will update the posts accordingly. +I've started writing this book at the time of the `3.18` Linux kernel, and many things might have changed since that time. If there are changes, I will update the posts accordingly. The Magical Power Button, What happens next? -------------------------------------------------------------------------------- From 9f25c762c377a9b070aee980994f89eb5ee7933e Mon Sep 17 00:00:00 2001 From: Theo grevet benbezza Date: Tue, 23 Jan 2018 17:13:34 +0100 Subject: [PATCH 082/179] typo fix --- Misc/program_startup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/program_startup.md b/Misc/program_startup.md index 5f680db..fa21a32 100644 --- a/Misc/program_startup.md +++ b/Misc/program_startup.md @@ -150,7 +150,7 @@ In the previous paragraph we saw how an executable file is prepared to run by th $ gcc -Wall program.c -o sum ``` -You may guess that `_start` comes from the [stanard libray](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass the `-v` option to gcc which will enable `verbose mode`, you will see a long output. The full output is not interesting for us, let's look at the following steps: +You may guess that `_start` comes from the [standard library](https://en.wikipedia.org/wiki/Standard_library) and that's true. If you try to compile our program again and pass the `-v` option to gcc which will enable `verbose mode`, you will see a long output. The full output is not interesting for us, let's look at the following steps: First of all, our program should be compiled with `gcc`: From ddb7c468123dcd74aeaf26809620c5665e09f456 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Sun, 28 Jan 2018 17:47:14 +0100 Subject: [PATCH 083/179] Fix typo and/or gender assumption ;) --- interrupts/interrupts-10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interrupts/interrupts-10.md b/interrupts/interrupts-10.md index 83e9f7a..37a880a 100644 --- a/interrupts/interrupts-10.md +++ b/interrupts/interrupts-10.md @@ -210,7 +210,7 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, } ``` -We arelady saw the `irqaction` and the `irq_desc` structures in this chapter. The first structure represents per interrupt action descriptor and contains pointers to the interrupt handler, name of the device, interrupt number, etc. The second structure represents a descriptor of an interrupt and contains pointer to the `irqaction`, interrupt flags, etc. Note that the `request_threaded_irq` function called by the `request_irq` with the additioanal parameter: `irq_handler_t thread_fn`. If this parameter is not `NULL`, the `irq` thread will be created and the given `irq` handler will be executed in this thread. In the next step we need to make following checks: +We already saw the `irqaction` and the `irq_desc` structures in this chapter. The first structure represents per interrupt action descriptor and contains pointers to the interrupt handler, name of the device, interrupt number, etc. The second structure represents a descriptor of an interrupt and contains pointer to the `irqaction`, interrupt flags, etc. Note that the `request_threaded_irq` function called by the `request_irq` with the additional parameter: `irq_handler_t thread_fn`. If this parameter is not `NULL`, the `irq` thread will be created and the given `irq` handler will be executed in this thread. In the next step we need to make following checks: ```C if (((irqflags & IRQF_SHARED) && !dev_id) || From 081d4335ff4a6d918313ed902d9e07918f152f2c Mon Sep 17 00:00:00 2001 From: Miles Frain Date: Tue, 30 Jan 2018 02:08:26 -0700 Subject: [PATCH 084/179] syscalls-1: MSR_LSTAR clarification and minor edits --- SysCall/syscall-1.md | 40 ++++++++++++++++++++++------------------ contributors.md | 1 + 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/SysCall/syscall-1.md b/SysCall/syscall-1.md index 99ab140..bf6e606 100644 --- a/SysCall/syscall-1.md +++ b/SysCall/syscall-1.md @@ -76,15 +76,19 @@ by those selector values correspond to the fixed values loaded into the descript caches; the SYSCALL instruction does not ensure this correspondence. ``` -and we are initializing `syscalls` by the writing of the `entry_SYSCALL_64` that defined in the [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S) assembler file and represents `SYSCALL` instruction entry to the `IA32_STAR` [Model specific register](https://en.wikipedia.org/wiki/Model-specific_register): - +To summarize, the `syscall` instruction jumps to the address stored in the `MSR_LSTAR` [Model specific register](https://en.wikipedia.org/wiki/Model-specific_register) (Long system target address register). The kernel is responsible for providing its own custom function for handling syscalls as well as writing the address of this handler function to the `MSR_LSTAR` register upon system startup. +The custom function is `entry_SYSCALL_64`, which is defined in [arch/x86/entry/entry_64.S](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/entry_64.S#L98). The address of this syscall handling function is written to the `MSR_LSTAR` register during startup in [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c#L1335). ```C wrmsrl(MSR_LSTAR, entry_SYSCALL_64); ``` -in the [arch/x86/kernel/cpu/common.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/kernel/cpu/common.c) source code file. +So, the `syscall` instruction invokes a handler of a given system call. But how does it know which handler to call? Actually it gets this information from the general purpose [registers](https://en.wikipedia.org/wiki/Processor_register). As you can see in the system call [table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl), each system call has a unique number. In our example the first system call is `write`, which writes data to the given file. Let's look in the system call table and try to find the `write` system call. As we can see, the [write](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L10) system call has number `1`. We pass the number of this system call through the `rax` register in our example. The next general purpose registers: `%rdi`, `%rsi`, and `%rdx` take the three parameters of the `write` syscall. In our case, they are: + +* [File descriptor](https://en.wikipedia.org/wiki/File_descriptor) (`1` is [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29) in our case) +* Pointer to our string +* Size of data -So, the `syscall` instruction invokes a handler of a given system call. But how does it know which handler to call? Actually it gets this information from the general purpose [registers](https://en.wikipedia.org/wiki/Processor_register). As you can see in the system call [table](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl), each system call has a unique number. In our example, first system call is - `write` that writes data to the given file. Let's look in the system call table and try to find `write` system call. As we can see, the [write](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L10) system call has number - `1`. We pass the number of this system call through the `rax` register in our example. The next general purpose registers: `%rdi`, `%rsi` and `%rdx` take parameters of the `write` syscall. In our case, they are [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) (`1` is [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29) in our case), second parameter is the pointer to our string, and the third is size of data. Yes, you heard right. Parameters for a system call. As I already wrote above, a system call is a just `C` function in the kernel space. In our case first system call is write. This system call defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and looks like: +Yes, you heard right. Parameters for a system call. As I already wrote above, a system call is a just `C` function in the kernel space. In our case first system call is write. This system call defined in the [fs/read_write.c](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/fs/read_write.c) source code file and looks like: ```C SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, @@ -104,7 +108,7 @@ ssize_t write(int fd, const void *buf, size_t nbytes); Don't worry about the `SYSCALL_DEFINE3` macro for now, we'll come back to it. -The second part of our example is the same, but we call other system call. In this case we call [exit](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L69) system call. This system call gets only one parameter: +The second part of our example is the same, but we call another system call. In this case we call the [exit](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L69) system call. This system call gets only one parameter: * Return value @@ -120,18 +124,18 @@ _exit(0) = ? +++ exited with 0 +++ ``` -In the first line of the `strace` output, we can see [execve](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This and other agreement for the `x86_64` architecture explained in the special document - [System V Application Binary Interface. PDF](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: +In the first line of the `strace` output, we can see the [execve](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/entry/syscalls/syscall_64.tbl#L68) system call that executes our program, and the second and third are system calls that we have used in our program: `write` and `exit`. Note that we pass the parameter through the general purpose registers in our example. The order of the registers is not accidental. The order of the registers is defined by the following agreement - [x86-64 calling conventions](https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions). This, and the other agreement for the `x86_64` architecture are explained in the special document - [System V Application Binary Interface. PDF](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf). In a general way, argument(s) of a function are placed either in registers or pushed on the stack. The right order is: -* `rdi`; -* `rsi`; -* `rdx`; -* `rcx`; -* `r8`; -* `r9`. +* `rdi` +* `rsi` +* `rdx` +* `rcx` +* `r8` +* `r9` -for the first six parameters of a function. If a function has more than six arguments, other parameters will be placed on the stack. +for the first six parameters of a function. If a function has more than six arguments, the remaining parameters will be placed on the stack. -We do not use system calls in our code directly, but our program uses it when we want to print something, check access to a file or just write or read something to it. +We do not use system calls in our code directly, but our program uses them when we want to print something, check access to a file or just write or read something to it. For example: @@ -152,13 +156,13 @@ int main(int argc, char **argv) } ``` -There are no `fopen`, `fgets`, `printf` and `fclose` system calls in the Linux kernel, but `open`, `read` `write` and `close` instead. I think you know that these four functions `fopen`, `fgets`, `printf` and `fclose` are just functions that defined in the `C` [standard library](https://en.wikipedia.org/wiki/GNU_C_Library). Actually these functions are wrappers for the system calls. We do not call system calls directly in our code, but using [wrapper](https://en.wikipedia.org/wiki/Wrapper_function) functions from the standard library. The main reason of this is simple: a system call must be performed quickly, very quickly. As a system call must be quick, it must be small. The standard library takes responsibility to perform system calls with the correct set parameters and makes different checks before it will call the given system call. Let's compile our program with the following command: +There are no `fopen`, `fgets`, `printf`, and `fclose` system calls in the Linux kernel, but `open`, `read`, `write`, and `close` instead. I think you know that `fopen`, `fgets`, `printf`, and `fclose` are defined in the `C` [standard library](https://en.wikipedia.org/wiki/GNU_C_Library). Actually, these functions are just wrappers for the system calls. We do not call system calls directly in our code, but instead use these [wrapper](https://en.wikipedia.org/wiki/Wrapper_function) functions from the standard library. The main reason of this is simple: a system call must be performed quickly, very quickly. As a system call must be quick, it must be small. The standard library takes responsibility to perform system calls with the correct parameters and makes different checks before it will call the given system call. Let's compile our program with the following command: ``` $ gcc test.c -o test ``` -and look on it with the [ltrace](https://en.wikipedia.org/wiki/Ltrace) util: +and examine it with the [ltrace](https://en.wikipedia.org/wiki/Ltrace) util: ``` $ ltrace ./test @@ -172,13 +176,13 @@ fclose(0x602010) = 0 +++ exited (status 0) +++ ``` -The `ltrace` util displays a set of userspace calls of a program. The `fopen` function opens the given text file, the `fgets` reads file content to the `buf` buffer, the `puts` function prints it to the `stdout` and the `fclose` function closes file by the given file descriptor. And as I already wrote, all of these functions call an appropriate system call. For example `puts` calls the `write` system call inside, we can see it if we will add `-S` option to the `ltrace` program: +The `ltrace` util displays a set of userspace calls of a program. The `fopen` function opens the given text file, the `fgets` function reads file content to the `buf` buffer, the `puts` function prints the buffer to `stdout`, and the `fclose` function closes the file given by the file descriptor. And as I already wrote, all of these functions call an appropriate system call. For example, `puts` calls the `write` system call inside, we can see it if we will add `-S` option to the `ltrace` program: ``` write@SYS(1, "Hello World!\n\n", 14) = 14 ``` -Yes, system calls are ubiquitous. Each program needs to open/write/read file, network connection, allocate memory and many other things that can be provided only by the kernel. The [proc](https://en.wikipedia.org/wiki/Procfs) file system contains special files in a format: `/proc/pid/systemcall` that exposes the system call number and argument registers for the system call currently being executed by the process. For example, pid 1, that is [systemd](https://en.wikipedia.org/wiki/Systemd) for me: +Yes, system calls are ubiquitous. Each program needs to open/write/read files and network connections, allocate memory, and many other things that can be provided only by the kernel. The [proc](https://en.wikipedia.org/wiki/Procfs) file system contains special files in a format: `/proc/pid/systemcall` that exposes the system call number and argument registers for the system call currently being executed by the process. For example, pid 1 is [systemd](https://en.wikipedia.org/wiki/Systemd) for me: ``` $ sudo cat /proc/1/comm diff --git a/contributors.md b/contributors.md index 0bab64f..781040b 100644 --- a/contributors.md +++ b/contributors.md @@ -116,3 +116,4 @@ Thank you to all contributors: * [WarpspeedSCP](https://github.com/WarpspeedSCP) * [Gabriela Moldovan](https://github.com/gabi-250) * [kuritonasu](https://github.com/kuritonasu/) +* [Miles Frain](https://github.com/milesfrain) From af8826bca15e8bb3fc19980bbf4b2f75359edcb0 Mon Sep 17 00:00:00 2001 From: Horace Heaven Date: Wed, 14 Feb 2018 03:35:19 -0400 Subject: [PATCH 085/179] Minor sentence fixes to make it easier to read --- SyncPrim/sync-1.md | 20 ++++++++++---------- contributors.md | 1 + 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/SyncPrim/sync-1.md b/SyncPrim/sync-1.md index f63585b..17f9d75 100644 --- a/SyncPrim/sync-1.md +++ b/SyncPrim/sync-1.md @@ -4,9 +4,9 @@ Synchronization primitives in the Linux kernel. Part 1. Introduction -------------------------------------------------------------------------------- -This part opens new chapter in the [linux-insides](http://0xax.gitbooks.io/linux-insides/content/) book. Timers and time management related stuff was described in the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html). Now time to go next. As you may understand from the part's title, this chapter will describe [synchronization](https://en.wikipedia.org/wiki/Synchronization_%28computer_science%29) primitives in the Linux kernel. +This part opens a new chapter in the [linux-insides](http://0xax.gitbooks.io/linux-insides/content/) book. Timers and time management related stuff was described in the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html). Now time to go next. As you may understand from the part's title, this chapter will describe [synchronization](https://en.wikipedia.org/wiki/Synchronization_%28computer_science%29) primitives in the Linux kernel. -As always, before we will consider something synchronization related, we will try to know what is `synchronization primitive` in general. Actually, synchronization primitive is a software mechanism which provides ability to two or more [parallel](https://en.wikipedia.org/wiki/Parallel_computing) processes or threads to not execute simultaneously on the same segment of a code. For example let's look on the following piece of code: +As always, before we will consider something synchronization related, we will try to know what is `synchronization primitive` in general. Actually, synchronization primitive is a software mechanism which provides the ability to two or more [parallel](https://en.wikipedia.org/wiki/Parallel_computing) processes or threads to not execute simultaneously on the same segment of a code. For example, let's look on the following piece of code: ```C mutex_lock(&clocksource_mutex); @@ -22,9 +22,9 @@ clocksource_select(); mutex_unlock(&clocksource_mutex); ``` -from the [kernel/time/clocksource.c](https://github.com/torvalds/linux/master/kernel/time/clocksource.c) source code file. This code is from the `__clocksource_register_scale` function which adds the given [clocksource](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-2.html) to the clock sources list. This function produces different operations on a list with registered clock sources. For example the `clocksource_enqueue` function adds the given clock source to the list with registered clocksources - `clocksource_list`. Note that these lines of code wrapped to two functions: `mutex_lock` and `mutex_unlock` which are takes one parameter - the `clocksource_mutex` in our case. +from the [kernel/time/clocksource.c](https://github.com/torvalds/linux/master/kernel/time/clocksource.c) source code file. This code is from the `__clocksource_register_scale` function which adds the given [clocksource](https://0xax.gitbooks.io/linux-insides/content/Timers/timers-2.html) to the clock sources list. This function produces different operations on a list with registered clock sources. For example, the `clocksource_enqueue` function adds the given clock source to the list with registered clocksources - `clocksource_list`. Note that these lines of code wrapped to two functions: `mutex_lock` and `mutex_unlock` which takes one parameter - the `clocksource_mutex` in our case. -These functions represents locking and unlocking based on [mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) synchronization primitive. As `mutex_lock` will be executed, it allows us to prevent situation when two or more threads will execute this code while the `mutex_unlock` will not be executed by process-owner of the mutex. In other words, we prevent parallel operations on a `clocksource_list`. Why do we need `mutex` here? What if two parallel processes will try to register a clock source. As we already know, the `clocksource_enqueue` function adds the given clock source to the `clocksource_list` list right after a clock source in the list which has the biggest rating (a registered clock source which has the highest frequency in the system): +These functions represent locking and unlocking based on [mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) synchronization primitive. As `mutex_lock` will be executed, it allows us to prevent the situation when two or more threads will execute this code while the `mutex_unlock` will not be executed by process-owner of the mutex. In other words, we prevent parallel operations on a `clocksource_list`. Why do we need `mutex` here? What if two parallel processes will try to register a clock source. As we already know, the `clocksource_enqueue` function adds the given clock source to the `clocksource_list` list right after a clock source in the list which has the biggest rating (a registered clock source which has the highest frequency in the system): ```C static void clocksource_enqueue(struct clocksource *cs) @@ -39,7 +39,7 @@ static void clocksource_enqueue(struct clocksource *cs) } ``` -If two parallel processes will try to do it simultaneously, both process may found the same `entry` may occur [race condition](https://en.wikipedia.org/wiki/Race_condition) or in other words, the second process which will execute `list_add`, will overwrite a clock source from first thread. +If two parallel processes will try to do it simultaneously, both process may found the same `entry` may occur [race condition](https://en.wikipedia.org/wiki/Race_condition) or in other words, the second process which will execute `list_add`, will overwrite a clock source from the first thread. Besides this simple example, synchronization primitives are ubiquitous in the Linux kernel. If we will go through the previous [chapter](https://0xax.gitbooks.io/linux-insides/content/Timers/index.html) or other chapters again or if we will look at the Linux kernel source code in general, we will meet many places like this. We will not consider how `mutex` is implemented in the Linux kernel. Actually, the Linux kernel provides a set of different synchronization primitives like: @@ -87,7 +87,7 @@ typedef struct spinlock { } spinlock_t; ``` -The `raw_spinlock` structure defined in the [same](https://github.com/torvalds/linux/master/include/linux/spinlock_types.h) header file and represents implementation of `normal` spinlock. Let's look how the `raw_spinlock` structure is defined: +The `raw_spinlock` structure defined in the [same](https://github.com/torvalds/linux/master/include/linux/spinlock_types.h) header file and represents the implementation of `normal` spinlock. Let's look how the `raw_spinlock` structure is defined: ```C typedef struct raw_spinlock { @@ -307,13 +307,13 @@ static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock) } ``` -The `__acquire` here is just [sparse](https://en.wikipedia.org/wiki/Sparse) related macro and we are not interesting in it in this moment. Location of the definition of the `arch_spin_lock` function depends on two things: the first is architecture of system and the second do we use `queued spinlocks` or not. In our case we consider only `x86_64` architecture, so the definition of the `arch_spin_lock` is represented as the macro from the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlocks.h) header file: +The `__acquire` here is just [sparse](https://en.wikipedia.org/wiki/Sparse) related macro and we are not interested in it in this moment. Location of the definition of the `arch_spin_lock` function depends on two things: the first is the architecture of the system and the second do we use `queued spinlocks` or not. In our case we consider only `x86_64` architecture, so the definition of the `arch_spin_lock` is represented as the macro from the [include/asm-generic/qspinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/include/asm-generic/qspinlocks.h) header file: ```C #define arch_spin_lock(l) queued_spin_lock(l) ``` -if we are using `queued spinlocks`. Or in other case, the `arch_spin_lock` function is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/spinlock.h) header file. Now we will consider only `normal spinlock` and information related to `queued spinlocks` we will see later. Let's look again on the definition of the `arch_spinlock` structure, to understand implementation of the `arch_spin_lock` function: +if we are using `queued spinlocks`. Or in other case, the `arch_spin_lock` function is defined in the [arch/x86/include/asm/spinlock.h](https://github.com/torvalds/linux/blob/16f73eb02d7e1765ccab3d2018e0bd98eb93d973/arch/x86/include/asm/spinlock.h) header file. Now we will consider only `normal spinlock` and information related to `queued spinlocks` we will see later. Let's look again on the definition of the `arch_spinlock` structure, to understand the implementation of the `arch_spin_lock` function: ```C typedef struct arch_spinlock { @@ -362,9 +362,9 @@ At the beginning of the `arch_spin_lock` function we can initialization of the ` #define __TICKET_LOCK_INC 1 ``` -In the next line we execute [xadd](http://x86.renejeschke.de/html/file_module_x86_id_327.html) operation on the `inc` and `lock->tickets`. After this operation the `inc` will store value of the `tickets` of the given `lock` and the `tickets.tail` will be increased on `inc` or `1`. The `tail` value was increased on `1` which means that one process started to try to hold a lock. In the next step we do the check that checks that `head` and `tail` have the same value. If these values are equal, this means that nobody holds lock and we go to the `out` label. In the end of the `arch_spin_lock` function we may see the `barrier` macro which represents `barrier instruction` which guarantees that compiler will not change order of operations that access memory (more about memory barriers you can read in the kernel [documentation](https://www.kernel.org/doc/Documentation/memory-barriers.txt)). +In the next line we execute [xadd](http://x86.renejeschke.de/html/file_module_x86_id_327.html) operation on the `inc` and `lock->tickets`. After this operation the `inc` will store value of the `tickets` of the given `lock` and the `tickets.tail` will be increased on `inc` or `1`. The `tail` value was increased on `1` which means that one process started to try to hold a lock. In the next step we do the check that checks that `head` and `tail` have the same value. If these values are equal, this means that nobody holds lock and we go to the `out` label. In the end of the `arch_spin_lock` function we may see the `barrier` macro which represents `barrier instruction` which guarantees that compiler will not change the order of operations that access memory (more about memory barriers you can read in the kernel [documentation](https://www.kernel.org/doc/Documentation/memory-barriers.txt)). -If one process held a lock and a second process started to execute the `arch_spin_lock` function, the `head` will not be `equal` to `tail`, because the `tail` will be greater than `head` on `1`. In this way, process will occur in the loop. There will be comparison between `head` and the `tail` values at each loop iteration. If these values are not equal, the `cpu_relax` will be called which is just [NOP](https://en.wikipedia.org/wiki/NOP) instruction: +If one process held a lock and a second process started to execute the `arch_spin_lock` function, the `head` will not be `equal` to `tail`, because the `tail` will be greater than `head` on `1`. In this way, the process will occur in the loop. There will be comparison between `head` and the `tail` values at each loop iteration. If these values are not equal, the `cpu_relax` will be called which is just [NOP](https://en.wikipedia.org/wiki/NOP) instruction: ```C diff --git a/contributors.md b/contributors.md index 781040b..d3fb869 100644 --- a/contributors.md +++ b/contributors.md @@ -117,3 +117,4 @@ Thank you to all contributors: * [Gabriela Moldovan](https://github.com/gabi-250) * [kuritonasu](https://github.com/kuritonasu/) * [Miles Frain](https://github.com/milesfrain) +* [Horace Heaven](https://github.com/horaceheaven) From 6d69c2431baa928987366f906357205c552398d5 Mon Sep 17 00:00:00 2001 From: Joshua Murphy Date: Wed, 14 Feb 2018 10:03:16 -0330 Subject: [PATCH 086/179] Refactored files for a unified naming convention, making an autoamted LaTeX build easier too --- Cgroups/{cgroups1.md => linux-cgroups1.md} | 0 Concepts/{per-cpu.md => linux-cpu-1.md} | 0 Concepts/{cpumask.md => linux-cpu-2.md} | 0 Concepts/{initcall.md => linux-cpu-3.md} | 0 Concepts/{notification_chains.md => linux-cpu-4.md} | 0 DataStructures/{dlist.md => linux-datastructures1.md} | 0 DataStructures/{radix-tree.md => linux-datastructures2.md} | 0 DataStructures/{bitmap.md => linux-datastructures3.md} | 0 KernelStructures/{idt.md => linux-kernelstructure-1.md} | 0 Misc/{contribute.md => linux-misc-1.md} | 0 Misc/{how_kernel_compiled.md => linux-misc-2.md} | 0 Misc/{linkers.md => linux-misc-3.md} | 0 Misc/{program_startup.md => linux-misc-4.md} | 0 SyncPrim/{sync-1.md => linux-sync-1.md} | 0 SyncPrim/{sync-2.md => linux-sync-2.md} | 0 SyncPrim/{sync-3.md => linux-sync-3.md} | 0 SyncPrim/{sync-4.md => linux-sync-4.md} | 0 SyncPrim/{sync-5.md => linux-sync-5.md} | 0 SyncPrim/{sync-6.md => linux-sync-6.md} | 0 SysCall/{syscall-1.md => linux-syscall-1.md} | 0 SysCall/{syscall-2.md => linux-syscall-2.md} | 0 SysCall/{syscall-3.md => linux-syscall-3.md} | 0 SysCall/{syscall-4.md => linux-syscall-4.md} | 0 SysCall/{syscall-5.md => linux-syscall-5.md} | 0 SysCall/{syscall-6.md => linux-syscall-6.md} | 0 Theory/{Paging.md => linux-theory-1.md} | 0 Theory/{ELF.md => linux-theory-2.md} | 0 Theory/{asm.md => linux-theory-3.md} | 0 Timers/{timers-1.md => linux-timers-1.md} | 0 Timers/{timers-2.md => linux-timers-2.md} | 0 Timers/{timers-3.md => linux-timers-3.md} | 0 Timers/{timers-4.md => linux-timers-4.md} | 0 Timers/{timers-5.md => linux-timers-5.md} | 0 Timers/{timers-6.md => linux-timers-6.md} | 0 Timers/{timers-7.md => linux-timers-7.md} | 0 interrupts/{interrupts-1.md => linux-interrupts-1.md} | 0 interrupts/{interrupts-10.md => linux-interrupts-10.md} | 0 interrupts/{interrupts-2.md => linux-interrupts-2.md} | 0 interrupts/{interrupts-3.md => linux-interrupts-3.md} | 0 interrupts/{interrupts-4.md => linux-interrupts-4.md} | 0 interrupts/{interrupts-5.md => linux-interrupts-5.md} | 0 interrupts/{interrupts-6.md => linux-interrupts-6.md} | 0 interrupts/{interrupts-7.md => linux-interrupts-7.md} | 0 interrupts/{interrupts-8.md => linux-interrupts-8.md} | 0 interrupts/{interrupts-9.md => linux-interrupts-9.md} | 0 45 files changed, 0 insertions(+), 0 deletions(-) rename Cgroups/{cgroups1.md => linux-cgroups1.md} (100%) rename Concepts/{per-cpu.md => linux-cpu-1.md} (100%) rename Concepts/{cpumask.md => linux-cpu-2.md} (100%) rename Concepts/{initcall.md => linux-cpu-3.md} (100%) rename Concepts/{notification_chains.md => linux-cpu-4.md} (100%) rename DataStructures/{dlist.md => linux-datastructures1.md} (100%) rename DataStructures/{radix-tree.md => linux-datastructures2.md} (100%) rename DataStructures/{bitmap.md => linux-datastructures3.md} (100%) rename KernelStructures/{idt.md => linux-kernelstructure-1.md} (100%) rename Misc/{contribute.md => linux-misc-1.md} (100%) rename Misc/{how_kernel_compiled.md => linux-misc-2.md} (100%) rename Misc/{linkers.md => linux-misc-3.md} (100%) rename Misc/{program_startup.md => linux-misc-4.md} (100%) rename SyncPrim/{sync-1.md => linux-sync-1.md} (100%) rename SyncPrim/{sync-2.md => linux-sync-2.md} (100%) rename SyncPrim/{sync-3.md => linux-sync-3.md} (100%) rename SyncPrim/{sync-4.md => linux-sync-4.md} (100%) rename SyncPrim/{sync-5.md => linux-sync-5.md} (100%) rename SyncPrim/{sync-6.md => linux-sync-6.md} (100%) rename SysCall/{syscall-1.md => linux-syscall-1.md} (100%) rename SysCall/{syscall-2.md => linux-syscall-2.md} (100%) rename SysCall/{syscall-3.md => linux-syscall-3.md} (100%) rename SysCall/{syscall-4.md => linux-syscall-4.md} (100%) rename SysCall/{syscall-5.md => linux-syscall-5.md} (100%) rename SysCall/{syscall-6.md => linux-syscall-6.md} (100%) rename Theory/{Paging.md => linux-theory-1.md} (100%) rename Theory/{ELF.md => linux-theory-2.md} (100%) rename Theory/{asm.md => linux-theory-3.md} (100%) rename Timers/{timers-1.md => linux-timers-1.md} (100%) rename Timers/{timers-2.md => linux-timers-2.md} (100%) rename Timers/{timers-3.md => linux-timers-3.md} (100%) rename Timers/{timers-4.md => linux-timers-4.md} (100%) rename Timers/{timers-5.md => linux-timers-5.md} (100%) rename Timers/{timers-6.md => linux-timers-6.md} (100%) rename Timers/{timers-7.md => linux-timers-7.md} (100%) rename interrupts/{interrupts-1.md => linux-interrupts-1.md} (100%) rename interrupts/{interrupts-10.md => linux-interrupts-10.md} (100%) rename interrupts/{interrupts-2.md => linux-interrupts-2.md} (100%) rename interrupts/{interrupts-3.md => linux-interrupts-3.md} (100%) rename interrupts/{interrupts-4.md => linux-interrupts-4.md} (100%) rename interrupts/{interrupts-5.md => linux-interrupts-5.md} (100%) rename interrupts/{interrupts-6.md => linux-interrupts-6.md} (100%) rename interrupts/{interrupts-7.md => linux-interrupts-7.md} (100%) rename interrupts/{interrupts-8.md => linux-interrupts-8.md} (100%) rename interrupts/{interrupts-9.md => linux-interrupts-9.md} (100%) diff --git a/Cgroups/cgroups1.md b/Cgroups/linux-cgroups1.md similarity index 100% rename from Cgroups/cgroups1.md rename to Cgroups/linux-cgroups1.md diff --git a/Concepts/per-cpu.md b/Concepts/linux-cpu-1.md similarity index 100% rename from Concepts/per-cpu.md rename to Concepts/linux-cpu-1.md diff --git a/Concepts/cpumask.md b/Concepts/linux-cpu-2.md similarity index 100% rename from Concepts/cpumask.md rename to Concepts/linux-cpu-2.md diff --git a/Concepts/initcall.md b/Concepts/linux-cpu-3.md similarity index 100% rename from Concepts/initcall.md rename to Concepts/linux-cpu-3.md diff --git a/Concepts/notification_chains.md b/Concepts/linux-cpu-4.md similarity index 100% rename from Concepts/notification_chains.md rename to Concepts/linux-cpu-4.md diff --git a/DataStructures/dlist.md b/DataStructures/linux-datastructures1.md similarity index 100% rename from DataStructures/dlist.md rename to DataStructures/linux-datastructures1.md diff --git a/DataStructures/radix-tree.md b/DataStructures/linux-datastructures2.md similarity index 100% rename from DataStructures/radix-tree.md rename to DataStructures/linux-datastructures2.md diff --git a/DataStructures/bitmap.md b/DataStructures/linux-datastructures3.md similarity index 100% rename from DataStructures/bitmap.md rename to DataStructures/linux-datastructures3.md diff --git a/KernelStructures/idt.md b/KernelStructures/linux-kernelstructure-1.md similarity index 100% rename from KernelStructures/idt.md rename to KernelStructures/linux-kernelstructure-1.md diff --git a/Misc/contribute.md b/Misc/linux-misc-1.md similarity index 100% rename from Misc/contribute.md rename to Misc/linux-misc-1.md diff --git a/Misc/how_kernel_compiled.md b/Misc/linux-misc-2.md similarity index 100% rename from Misc/how_kernel_compiled.md rename to Misc/linux-misc-2.md diff --git a/Misc/linkers.md b/Misc/linux-misc-3.md similarity index 100% rename from Misc/linkers.md rename to Misc/linux-misc-3.md diff --git a/Misc/program_startup.md b/Misc/linux-misc-4.md similarity index 100% rename from Misc/program_startup.md rename to Misc/linux-misc-4.md diff --git a/SyncPrim/sync-1.md b/SyncPrim/linux-sync-1.md similarity index 100% rename from SyncPrim/sync-1.md rename to SyncPrim/linux-sync-1.md diff --git a/SyncPrim/sync-2.md b/SyncPrim/linux-sync-2.md similarity index 100% rename from SyncPrim/sync-2.md rename to SyncPrim/linux-sync-2.md diff --git a/SyncPrim/sync-3.md b/SyncPrim/linux-sync-3.md similarity index 100% rename from SyncPrim/sync-3.md rename to SyncPrim/linux-sync-3.md diff --git a/SyncPrim/sync-4.md b/SyncPrim/linux-sync-4.md similarity index 100% rename from SyncPrim/sync-4.md rename to SyncPrim/linux-sync-4.md diff --git a/SyncPrim/sync-5.md b/SyncPrim/linux-sync-5.md similarity index 100% rename from SyncPrim/sync-5.md rename to SyncPrim/linux-sync-5.md diff --git a/SyncPrim/sync-6.md b/SyncPrim/linux-sync-6.md similarity index 100% rename from SyncPrim/sync-6.md rename to SyncPrim/linux-sync-6.md diff --git a/SysCall/syscall-1.md b/SysCall/linux-syscall-1.md similarity index 100% rename from SysCall/syscall-1.md rename to SysCall/linux-syscall-1.md diff --git a/SysCall/syscall-2.md b/SysCall/linux-syscall-2.md similarity index 100% rename from SysCall/syscall-2.md rename to SysCall/linux-syscall-2.md diff --git a/SysCall/syscall-3.md b/SysCall/linux-syscall-3.md similarity index 100% rename from SysCall/syscall-3.md rename to SysCall/linux-syscall-3.md diff --git a/SysCall/syscall-4.md b/SysCall/linux-syscall-4.md similarity index 100% rename from SysCall/syscall-4.md rename to SysCall/linux-syscall-4.md diff --git a/SysCall/syscall-5.md b/SysCall/linux-syscall-5.md similarity index 100% rename from SysCall/syscall-5.md rename to SysCall/linux-syscall-5.md diff --git a/SysCall/syscall-6.md b/SysCall/linux-syscall-6.md similarity index 100% rename from SysCall/syscall-6.md rename to SysCall/linux-syscall-6.md diff --git a/Theory/Paging.md b/Theory/linux-theory-1.md similarity index 100% rename from Theory/Paging.md rename to Theory/linux-theory-1.md diff --git a/Theory/ELF.md b/Theory/linux-theory-2.md similarity index 100% rename from Theory/ELF.md rename to Theory/linux-theory-2.md diff --git a/Theory/asm.md b/Theory/linux-theory-3.md similarity index 100% rename from Theory/asm.md rename to Theory/linux-theory-3.md diff --git a/Timers/timers-1.md b/Timers/linux-timers-1.md similarity index 100% rename from Timers/timers-1.md rename to Timers/linux-timers-1.md diff --git a/Timers/timers-2.md b/Timers/linux-timers-2.md similarity index 100% rename from Timers/timers-2.md rename to Timers/linux-timers-2.md diff --git a/Timers/timers-3.md b/Timers/linux-timers-3.md similarity index 100% rename from Timers/timers-3.md rename to Timers/linux-timers-3.md diff --git a/Timers/timers-4.md b/Timers/linux-timers-4.md similarity index 100% rename from Timers/timers-4.md rename to Timers/linux-timers-4.md diff --git a/Timers/timers-5.md b/Timers/linux-timers-5.md similarity index 100% rename from Timers/timers-5.md rename to Timers/linux-timers-5.md diff --git a/Timers/timers-6.md b/Timers/linux-timers-6.md similarity index 100% rename from Timers/timers-6.md rename to Timers/linux-timers-6.md diff --git a/Timers/timers-7.md b/Timers/linux-timers-7.md similarity index 100% rename from Timers/timers-7.md rename to Timers/linux-timers-7.md diff --git a/interrupts/interrupts-1.md b/interrupts/linux-interrupts-1.md similarity index 100% rename from interrupts/interrupts-1.md rename to interrupts/linux-interrupts-1.md diff --git a/interrupts/interrupts-10.md b/interrupts/linux-interrupts-10.md similarity index 100% rename from interrupts/interrupts-10.md rename to interrupts/linux-interrupts-10.md diff --git a/interrupts/interrupts-2.md b/interrupts/linux-interrupts-2.md similarity index 100% rename from interrupts/interrupts-2.md rename to interrupts/linux-interrupts-2.md diff --git a/interrupts/interrupts-3.md b/interrupts/linux-interrupts-3.md similarity index 100% rename from interrupts/interrupts-3.md rename to interrupts/linux-interrupts-3.md diff --git a/interrupts/interrupts-4.md b/interrupts/linux-interrupts-4.md similarity index 100% rename from interrupts/interrupts-4.md rename to interrupts/linux-interrupts-4.md diff --git a/interrupts/interrupts-5.md b/interrupts/linux-interrupts-5.md similarity index 100% rename from interrupts/interrupts-5.md rename to interrupts/linux-interrupts-5.md diff --git a/interrupts/interrupts-6.md b/interrupts/linux-interrupts-6.md similarity index 100% rename from interrupts/interrupts-6.md rename to interrupts/linux-interrupts-6.md diff --git a/interrupts/interrupts-7.md b/interrupts/linux-interrupts-7.md similarity index 100% rename from interrupts/interrupts-7.md rename to interrupts/linux-interrupts-7.md diff --git a/interrupts/interrupts-8.md b/interrupts/linux-interrupts-8.md similarity index 100% rename from interrupts/interrupts-8.md rename to interrupts/linux-interrupts-8.md diff --git a/interrupts/interrupts-9.md b/interrupts/linux-interrupts-9.md similarity index 100% rename from interrupts/interrupts-9.md rename to interrupts/linux-interrupts-9.md From 463fcd587aea6d485f2fc0f90ed53dc6ef107793 Mon Sep 17 00:00:00 2001 From: Joshua Murphy Date: Wed, 14 Feb 2018 10:58:22 -0330 Subject: [PATCH 087/179] Now successfuly converting each chapter into LaTeX, compiling it and then merging each PDF together into a single book. Currently no image support! --- .gitignore | 2 ++ .../{linux-cgroups1.md => linux-cgroups-1.md} | 0 LinuxKernelInsides.pdf | Bin 0 -> 4784291 bytes latex.sh | 23 ++++++++++++++++++ 4 files changed, 25 insertions(+) create mode 100644 .gitignore rename Cgroups/{linux-cgroups1.md => linux-cgroups-1.md} (100%) create mode 100644 LinuxKernelInsides.pdf create mode 100755 latex.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb2f774 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.tex +build diff --git a/Cgroups/linux-cgroups1.md b/Cgroups/linux-cgroups-1.md similarity index 100% rename from Cgroups/linux-cgroups1.md rename to Cgroups/linux-cgroups-1.md diff --git a/LinuxKernelInsides.pdf b/LinuxKernelInsides.pdf new file mode 100644 index 0000000000000000000000000000000000000000..675a6a2aff3526419decf8a1cdd7d30dc6d2fe14 GIT binary patch literal 4784291 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%0A8v;ed0gfO7aHs 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%0Dp|;5clXAd07S@e+KEGWZv1KF?SGR6iLS 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%0A&1c4F77@w!rXzo2E;SP5;D@ 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

crt;9X)smDC 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�ci-Age%hC=6^fAATE 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 bXZwj($a&BFcY#l$R_cZL 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

w)V2tq|Ooc=nAH~0(#F$n6+lM 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%0DyziN3l>IS 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%0DP{XFNXW#OATAl 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≺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

6V7)J*!pDkhlRr+ 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

)Y}c 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