readme: setup github pages to overcome 512k limit

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2019-07-05 00:00:00 +00:00
parent c98d93f7f7
commit de1457c932
9 changed files with 384 additions and 51 deletions

24
.gitignore vendored
View File

@@ -1,4 +1,8 @@
# Extensions and prefixes. # Important directories.
/out
/data
# Temporary files.
*.tmp *.tmp
tmp.* tmp.*
*.tmp.* *.tmp.*
@@ -6,12 +10,11 @@ tmp.*
*.gitignore *.gitignore
gitignore.* gitignore.*
# Specific files. # https://github.com/cirosantilli/linux-kernel-module-cheat#prebuilt
/data
/gem5/out
/lkmc-*.zip /lkmc-*.zip
/out
/out.* # https://github.com/cirosantilli/linux-kernel-module-cheat#bst-vs-heap-vs-hashmap
*.dat
# Python trash. # Python trash.
*.pyc *.pyc
@@ -23,15 +26,12 @@ __pycache__
*.o *.o
*.out *.out
# Data to be plotted output.
*.dat
# Kernel modules. # Kernel modules.
.cache.mk *.ko
*.ko.cmd *.ko.cmd
*.mod.c
*.o.cmd *.o.cmd
.cache.mk
.tmp_versions .tmp_versions
Module.symvers Module.symvers
*.ko
*.mod.c
modules.order modules.order

View File

@@ -1,3 +1,5 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'asciidoctor', '2.0.10' gem 'asciidoctor', '2.0.10'
#gem 'jekyll', '3.8.6'
gem 'github-pages'

View File

@@ -1,13 +1,250 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
activesupport (4.2.11.1)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.6.0)
public_suffix (>= 2.0.2, < 4.0)
asciidoctor (2.0.10) asciidoctor (2.0.10)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.17.13)
ruby-enum (~> 0.5)
concurrent-ruby (1.1.5)
dnsruby (1.61.2)
addressable (~> 2.5)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
ethon (0.12.0)
ffi (>= 1.3.0)
eventmachine (1.2.7)
execjs (2.7.0)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
ffi (1.11.1)
forwardable-extended (2.6.0)
gemoji (3.0.1)
github-pages (198)
activesupport (= 4.2.11.1)
github-pages-health-check (= 1.16.1)
jekyll (= 3.8.5)
jekyll-avatar (= 0.6.0)
jekyll-coffeescript (= 1.1.1)
jekyll-commonmark-ghpages (= 0.1.5)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.11.0)
jekyll-gist (= 1.5.0)
jekyll-github-metadata (= 2.12.1)
jekyll-mentions (= 1.4.1)
jekyll-optional-front-matter (= 0.3.0)
jekyll-paginate (= 1.1.0)
jekyll-readme-index (= 0.2.0)
jekyll-redirect-from (= 0.14.0)
jekyll-relative-links (= 0.6.0)
jekyll-remote-theme (= 0.3.1)
jekyll-sass-converter (= 1.5.2)
jekyll-seo-tag (= 2.5.0)
jekyll-sitemap (= 1.2.0)
jekyll-swiss (= 0.4.0)
jekyll-theme-architect (= 0.1.1)
jekyll-theme-cayman (= 0.1.1)
jekyll-theme-dinky (= 0.1.1)
jekyll-theme-hacker (= 0.1.1)
jekyll-theme-leap-day (= 0.1.1)
jekyll-theme-merlot (= 0.1.1)
jekyll-theme-midnight (= 0.1.1)
jekyll-theme-minimal (= 0.1.1)
jekyll-theme-modernist (= 0.1.1)
jekyll-theme-primer (= 0.5.3)
jekyll-theme-slate (= 0.1.1)
jekyll-theme-tactile (= 0.1.1)
jekyll-theme-time-machine (= 0.1.1)
jekyll-titles-from-headings (= 0.5.1)
jemoji (= 0.10.2)
kramdown (= 1.17.0)
liquid (= 4.0.0)
listen (= 3.1.5)
mercenary (~> 0.3)
minima (= 2.5.0)
nokogiri (>= 1.8.5, < 2.0)
rouge (= 2.2.1)
terminal-table (~> 1.4)
github-pages-health-check (1.16.1)
addressable (~> 2.3)
dnsruby (~> 1.60)
octokit (~> 4.0)
public_suffix (~> 3.0)
typhoeus (~> 1.3)
html-pipeline (2.11.0)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.8.5)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
jekyll-avatar (0.6.0)
jekyll (~> 3.0)
jekyll-coffeescript (1.1.1)
coffee-script (~> 2.2)
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.3.1)
commonmarker (~> 0.14)
jekyll (>= 3.7, < 5.0)
jekyll-commonmark-ghpages (0.1.5)
commonmarker (~> 0.17.6)
jekyll-commonmark (~> 1)
rouge (~> 2)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
jekyll-feed (0.11.0)
jekyll (~> 3.3)
jekyll-gist (1.5.0)
octokit (~> 4.2)
jekyll-github-metadata (2.12.1)
jekyll (~> 3.4)
octokit (~> 4.0, != 4.4.0)
jekyll-mentions (1.4.1)
html-pipeline (~> 2.3)
jekyll (~> 3.0)
jekyll-optional-front-matter (0.3.0)
jekyll (~> 3.0)
jekyll-paginate (1.1.0)
jekyll-readme-index (0.2.0)
jekyll (~> 3.0)
jekyll-redirect-from (0.14.0)
jekyll (~> 3.3)
jekyll-relative-links (0.6.0)
jekyll (~> 3.3)
jekyll-remote-theme (0.3.1)
jekyll (~> 3.5)
rubyzip (>= 1.2.1, < 3.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-seo-tag (2.5.0)
jekyll (~> 3.3)
jekyll-sitemap (1.2.0)
jekyll (~> 3.3)
jekyll-swiss (0.4.0)
jekyll-theme-architect (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-cayman (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-dinky (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-hacker (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-leap-day (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-merlot (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-midnight (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-minimal (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-modernist (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-primer (0.5.3)
jekyll (~> 3.5)
jekyll-github-metadata (~> 2.9)
jekyll-seo-tag (~> 2.0)
jekyll-theme-slate (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-tactile (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-time-machine (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-titles-from-headings (0.5.1)
jekyll (~> 3.3)
jekyll-watch (2.2.1)
listen (~> 3.0)
jemoji (0.10.2)
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (~> 3.0)
kramdown (1.17.0)
liquid (4.0.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
mini_portile2 (2.4.0)
minima (2.5.0)
jekyll (~> 3.5)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.11.3)
multipart-post (2.1.1)
nokogiri (1.10.3)
mini_portile2 (~> 2.4.0)
octokit (4.14.0)
sawyer (~> 0.8.0, >= 0.5.3)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.1.1)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (2.2.1)
ruby-enum (0.7.2)
i18n
ruby_dep (1.5.0)
rubyzip (1.2.3)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sawyer (0.8.2)
addressable (>= 2.3.5)
faraday (> 0.8, < 2.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6)
typhoeus (1.3.1)
ethon (>= 0.9.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
unicode-display_width (1.6.0)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
asciidoctor (= 2.0.10) asciidoctor (= 2.0.10)
github-pages
BUNDLED WITH BUNDLED WITH
2.0.2 2.0.2

View File

@@ -13,6 +13,8 @@ The perfect emulation setup to study and develop the <<linux-kernel>> v5.1, kern
TL;DR: <<qemu-buildroot-setup-getting-started>> TL;DR: <<qemu-buildroot-setup-getting-started>>
The source code for this page is located at: https://github.com/cirosantilli/linux-kernel-module-cheat[]. Due to link:https://github.com/isaacs/github/issues/1610[a GitHub limitation], this README is too long and not fully rendered on github.com. Either use: https://www.cirosantilli.com/linux-kernel-module-cheat or <<build-the-documentation,build the docs yourself>>.
toc::[] toc::[]
== Getting started == Getting started
@@ -1371,8 +1373,8 @@ continue
See also: See also:
* http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642 * https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
* http://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/42316607#42316607 * https://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/42316607#42316607
==== GDB step debug kernel boot other archs ==== GDB step debug kernel boot other archs
@@ -1545,7 +1547,7 @@ From inside tmux, you can create new terminals on a new window with `Ctrl-B C` s
=== GDB step debug kernel module === GDB step debug kernel module
http://stackoverflow.com/questions/28607538/how-to-debug-linux-kernel-modules-with-qemu/44095831#44095831 https://stackoverflow.com/questions/28607538/how-to-debug-linux-kernel-modules-with-qemu/44095831#44095831
Loadable kernel modules are a bit trickier since the kernel can place them at different memory locations depending on load order. Loadable kernel modules are a bit trickier since the kernel can place them at different memory locations depending on load order.
@@ -4417,7 +4419,7 @@ TODO <<kmscube>> failed on `aarch64` with:
kmscube[706]: unhandled level 2 translation fault (11) at 0x00000000, esr 0x92000006, in libgbm.so.1.0.0[7fbf6a6000+e000] kmscube[706]: unhandled level 2 translation fault (11) at 0x00000000, esr 0x92000006, in libgbm.so.1.0.0[7fbf6a6000+e000]
.... ....
Tested on: link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/38fd6153d965ba20145f53dc1bb3ba34b336bde9[38fd6153d965ba20145f53dc1bb3ba34b336bde9] Tested on: link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/38fd6153d965ba20145f53dc1bb3ba34b336bde9[38fd6153d965ba20145f53dc1bb3ba34b336bde9]
==== Graphic mode gem5 aarch64 ==== Graphic mode gem5 aarch64
@@ -6570,7 +6572,7 @@ sh -x ./fops.sh
We have put printks on each fop, so this allows you to see which system calls are being made for each command. We have put printks on each fop, so this allows you to see which system calls are being made for each command.
No, there no official documentation: http://stackoverflow.com/questions/15213932/what-are-the-struct-file-operations-arguments No, there no official documentation: https://stackoverflow.com/questions/15213932/what-are-the-struct-file-operations-arguments
==== seq_file ==== seq_file
@@ -6843,8 +6845,8 @@ The sleep is done with `usleep_range`, see: <<sleep>>.
Bibliography: Bibliography:
* http://stackoverflow.com/questions/10177641/proper-way-of-handling-threads-in-kernel * https://stackoverflow.com/questions/10177641/proper-way-of-handling-threads-in-kernel
* http://stackoverflow.com/questions/4084708/how-to-wait-for-a-linux-kernel-thread-kthreadto-exit * https://stackoverflow.com/questions/4084708/how-to-wait-for-a-linux-kernel-thread-kthreadto-exit
==== kthreads ==== kthreads
@@ -7041,7 +7043,7 @@ Therefore they produce more accurate timing than thread scheduling, which is mor
Bibliography: Bibliography:
* http://stackoverflow.com/questions/10812858/timers-in-linux-device-drivers * https://stackoverflow.com/questions/10812858/timers-in-linux-device-drivers
* https://gist.github.com/yagihiro/310149 * https://gist.github.com/yagihiro/310149
=== IRQ === IRQ
@@ -7831,7 +7833,7 @@ It only appears once on every log I've seen so far, checked with `grep 0x1000000
+ +
Then when we count the instructions that run before the kernel entry point, there is only about 100k instructions, which is insignificant compared to the kernel boot itself. Then when we count the instructions that run before the kernel entry point, there is only about 100k instructions, which is insignificant compared to the kernel boot itself.
+ +
TODO `--arch arm` and `--arch aarch64` does not count firmware instructions properly because the entry point address of the ELF file (`ffffff8008080000` for `aarch64`) does not show up on the trace at all. Tested on link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/f8c0502bb2680f2dbe7c1f3d7958f60265347005[f8c0502bb2680f2dbe7c1f3d7958f60265347005]. TODO `--arch arm` and `--arch aarch64` does not count firmware instructions properly because the entry point address of the ELF file (`ffffff8008080000` for `aarch64`) does not show up on the trace at all. Tested on link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/f8c0502bb2680f2dbe7c1f3d7958f60265347005[f8c0502bb2680f2dbe7c1f3d7958f60265347005].
* We can also discount the instructions after `init` runs by using `readelf` to get the initial address of `init`. One easy way to do that now is to just run: * We can also discount the instructions after `init` runs by using `readelf` to get the initial address of `init`. One easy way to do that now is to just run:
+ +
.... ....
@@ -8492,7 +8494,7 @@ Bibliography:
* https://en.wikipedia.org/wiki/Direct_Rendering_Manager * https://en.wikipedia.org/wiki/Direct_Rendering_Manager
* https://en.wikipedia.org/wiki/Mode_setting KMS * https://en.wikipedia.org/wiki/Mode_setting KMS
Tested on: link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/93e383902ebcc03d8a7ac0d65961c0e62af9612b[93e383902ebcc03d8a7ac0d65961c0e62af9612b] Tested on: link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/93e383902ebcc03d8a7ac0d65961c0e62af9612b[93e383902ebcc03d8a7ac0d65961c0e62af9612b]
==== kmscube ==== kmscube
@@ -8541,7 +8543,7 @@ failed to initialize legacy DRM
See also: https://github.com/robclark/kmscube/issues/12 and https://stackoverflow.com/questions/26920835/can-egl-application-run-in-console-mode/26921287#26921287 See also: https://github.com/robclark/kmscube/issues/12 and https://stackoverflow.com/questions/26920835/can-egl-application-run-in-console-mode/26921287#26921287
Tested on: link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/2903771275372ccfecc2b025edbb0d04c4016930[2903771275372ccfecc2b025edbb0d04c4016930] Tested on: link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/2903771275372ccfecc2b025edbb0d04c4016930[2903771275372ccfecc2b025edbb0d04c4016930]
==== kmscon ==== kmscon
@@ -9386,7 +9388,7 @@ and go back to the terminal with:
Ctrl-A C Ctrl-A C
.... ....
* http://stackoverflow.com/questions/14165158/how-to-switch-to-qemu-monitor-console-when-running-with-curses * https://stackoverflow.com/questions/14165158/how-to-switch-to-qemu-monitor-console-when-running-with-curses
* https://superuser.com/questions/488263/how-to-switch-to-the-qemu-control-panel-with-nographics * https://superuser.com/questions/488263/how-to-switch-to-the-qemu-control-panel-with-nographics
When in graphic mode, we can do it from the GUI: When in graphic mode, we can do it from the GUI:
@@ -10372,7 +10374,7 @@ Source: link:userland/libs/eigen/hello.cpp[]
This example just creates a matrix and prints it out. This example just creates a matrix and prints it out.
Tested on: link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/a4bdcf102c068762bb1ef26c591fcf71e5907525[a4bdcf102c068762bb1ef26c591fcf71e5907525] Tested on: link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/a4bdcf102c068762bb1ef26c591fcf71e5907525[a4bdcf102c068762bb1ef26c591fcf71e5907525]
===== PARSEC benchmark ===== PARSEC benchmark
@@ -11328,7 +11330,7 @@ We setup 2 big and 2 small CPUs, but `cat /proc/cpuinfo` shows 4 identical CPUs
TODO: why is the `--dtb` required despite `fs_bigLITTLE.py` having a DTB generation capability? Without it, nothing shows on terminal, and the simulation terminates with `simulate() limit reached @ 18446744073709551615`. The magic `vmlinux.vexpress_gem5_v1.20170616` works however without a DTB. TODO: why is the `--dtb` required despite `fs_bigLITTLE.py` having a DTB generation capability? Without it, nothing shows on terminal, and the simulation terminates with `simulate() limit reached @ 18446744073709551615`. The magic `vmlinux.vexpress_gem5_v1.20170616` works however without a DTB.
Tested on: link:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/18c1c823feda65f8b54cd38e261c282eee01ed9f[18c1c823feda65f8b54cd38e261c282eee01ed9f] Tested on: link:https://github.com/cirosantilli/linux-kernel-module-cheat/commit/18c1c823feda65f8b54cd38e261c282eee01ed9f[18c1c823feda65f8b54cd38e261c282eee01ed9f]
=== gem5 unit tests === gem5 unit tests
@@ -12065,7 +12067,7 @@ Particularly important numerical analysis instruction, that is used in particula
FMA is so important that <<ieee-754>> specifies it with single precision drop compared to a separate add and multiply! FMA is so important that <<ieee-754>> specifies it with single precision drop compared to a separate add and multiply!
Micro-op fun: http://stackoverflow.com/questions/28630864/how-is-fma-implemented Micro-op fun: https://stackoverflow.com/questions/28630864/how-is-fma-implemented
Historically, FMA instructions have been added relatively late to instruction sets. Historically, FMA instructions have been added relatively late to instruction sets.
@@ -12331,8 +12333,8 @@ Official specification: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042
Bibliography: Bibliography:
* https://en.wikipedia.org/wiki/Calling_convention#ARM_(A32) Wiki contains the master list as usual. * https://en.wikipedia.org/wiki/Calling_convention#ARM_(A32) Wiki contains the master list as usual.
* http://stackoverflow.com/questions/8422287/calling-c-functions-from-arm-assembly * https://stackoverflow.com/questions/8422287/calling-c-functions-from-arm-assembly
* http://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save * https://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save
* https://stackoverflow.com/questions/10494848/arm-whats-the-difference-between-apcs-and-aapcs-abi * https://stackoverflow.com/questions/10494848/arm-whats-the-difference-between-apcs-and-aapcs-abi
=== GNU GAS assembler === GNU GAS assembler
@@ -12455,7 +12457,7 @@ Bibliography: https://stackoverflow.com/questions/27147043/n-suffix-to-branch-in
link:userland/arch/x86_64/char_literals.S[] link:userland/arch/x86_64/char_literals.S[]
http://stackoverflow.com/questions/33246811/how-to-use-character-literals-in-gnu-gas-to-replace-numbers https://stackoverflow.com/questions/33246811/how-to-use-character-literals-in-gnu-gas-to-replace-numbers
This syntax plays horribly with the C preprocessor: This syntax plays horribly with the C preprocessor:
@@ -12474,7 +12476,7 @@ No OPeration.
Does nothing except take up one processor cycle and occupy some instruction memory. Does nothing except take up one processor cycle and occupy some instruction memory.
Applications: http://stackoverflow.com/questions/234906/whats-the-purpose-of-the-nop-opcode Applications: https://stackoverflow.com/questions/234906/whats-the-purpose-of-the-nop-opcode
== x86 userland assembly == x86 userland assembly
@@ -12616,7 +12618,7 @@ mov (%rsp), %rax
add $8, %rsp add $8, %rsp
.... ....
Why do those instructions exist at all vs MOV / ADD / SUB: http://stackoverflow.com/questions/4584089/what-is-the-function-of-push-pop-registers-in-x86-assembly/33583134#33583134 Why do those instructions exist at all vs MOV / ADD / SUB: https://stackoverflow.com/questions/4584089/what-is-the-function-of-push-pop-registers-in-x86-assembly/33583134#33583134
==== x86 CQTO and CLTQ instructions ==== x86 CQTO and CLTQ instructions
@@ -12697,14 +12699,14 @@ where `cc` are the same flags as Jcc.
Vs jmp: Vs jmp:
* http://stackoverflow.com/questions/14131096/why-is-a-conditional-move-not-vulnerable-for-branch-prediction-failure * https://stackoverflow.com/questions/14131096/why-is-a-conditional-move-not-vulnerable-for-branch-prediction-failure
* http://stackoverflow.com/questions/27136961/what-is-it-about-cmov-which-improves-cpu-pipeline-performance * https://stackoverflow.com/questions/27136961/what-is-it-about-cmov-which-improves-cpu-pipeline-performance
* http://stackoverflow.com/questions/26154488/difference-between-conditional-instructions-cmov-and-jump-instructions * https://stackoverflow.com/questions/26154488/difference-between-conditional-instructions-cmov-and-jump-instructions
* http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c?lq=1#comment8007791_6754495 * https://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c?lq=1#comment8007791_6754495
Not necessarily faster because of branch prediction. Not necessarily faster because of branch prediction.
This is partly why the ternary `?` C operator exists: http://stackoverflow.com/questions/3565368/ternary-operator-vs-if-else This is partly why the ternary `?` C operator exists: https://stackoverflow.com/questions/3565368/ternary-operator-vs-if-else
It is interesting to compare this with ARMv7 conditional executaion: which is available for all instructions: <<arm-conditional-execution>> It is interesting to compare this with ARMv7 conditional executaion: which is available for all instructions: <<arm-conditional-execution>>
@@ -12880,7 +12882,7 @@ REP and REPZ also additionally stop if the comparison operation they repeat fail
link:userland/arch/x86_64/enter.S[] link:userland/arch/x86_64/enter.S[]
These instructions were designed to allocate and deallocate function stack frames in the prologue and epilogue: http://stackoverflow.com/questions/5959890/enter-vs-push-ebp-mov-ebp-esp-sub-esp-imm-and-leave-vs-mov-esp-ebp These instructions were designed to allocate and deallocate function stack frames in the prologue and epilogue: https://stackoverflow.com/questions/5959890/enter-vs-push-ebp-mov-ebp-esp-sub-esp-imm-and-leave-vs-mov-esp-ebp
ENTER appears obsolete and is kept mostly for backwards compatibility. LEAVE is still emitted by some compilers. ENTER appears obsolete and is kept mostly for backwards compatibility. LEAVE is still emitted by some compilers.
@@ -12897,7 +12899,7 @@ which implies an allocation of:
* one dword to remember EBP * one dword to remember EBP
* A bytes for local function variables * A bytes for local function variables
I didn't have the patience to study the B parameter, and it does not seem to be used often: http://stackoverflow.com/questions/26323215/do-any-languages-compilers-utilize-the-x86-enter-instruction-with-a-nonzero-ne I didn't have the patience to study the B parameter, and it does not seem to be used often: https://stackoverflow.com/questions/26323215/do-any-languages-compilers-utilize-the-x86-enter-instruction-with-a-nonzero-ne
LEAVE is equivalent to: LEAVE is equivalent to:
@@ -13005,7 +13007,7 @@ Instructions such as FLDL convert standard <<ieee-754>> 64-bit values from memor
==== x86 x87 FPU vs SIMD ==== x86 x87 FPU vs SIMD
http://stackoverflow.com/questions/1844669/benefits-of-x87-over-sse https://stackoverflow.com/questions/1844669/benefits-of-x87-over-sse
Modern x86 has two main ways of doing floating point operations: Modern x86 has two main ways of doing floating point operations:
@@ -13622,7 +13624,7 @@ The registers are encoded as single bits inside the instruction: each bit repres
As a consequence, the push order is fixed no matter how you write the assembly instruction: there is just not enough space to encode ordering. As a consequence, the push order is fixed no matter how you write the assembly instruction: there is just not enough space to encode ordering.
AArch64 loses those instructions, likely because it was not possible anymore to encode all registers: http://stackoverflow.com/questions/27941220/push-lr-and-pop-lr-in-arm-arch64 and replaces them with the <<armv8-aarch64-ldp-and-stp-instructions>> AArch64 loses those instructions, likely because it was not possible anymore to encode all registers: https://stackoverflow.com/questions/27941220/push-lr-and-pop-lr-in-arm-arch64 and replaces them with the <<armv8-aarch64-ldp-and-stp-instructions>>
=== ARM data processing instructions === ARM data processing instructions
@@ -15772,7 +15774,9 @@ but note that this does not include script specific options.
=== Build the documentation === Build the documentation
You don't need to depend on GitHub. To build the first time use: You don't need to depend on GitHub.
To build the first time use:
.... ....
./build --download-dependencies docs ./build --download-dependencies docs
@@ -15794,7 +15798,6 @@ Then just open the HTML output at:
xdg-open out/README.html xdg-open out/README.html
.... ....
[[documentation-verification]]
==== Documentation verification ==== Documentation verification
When running link:build-doc[], we do the following checks: When running link:build-doc[], we do the following checks:
@@ -15853,6 +15856,43 @@ explicitly-given
One application we have in mind for this is that as of 2.0.10 Asciidoctor does not warn on header ID collisions between auto-generated IDs: https://github.com/asciidoctor/asciidoctor/issues/3147 But this script doesn't solve that yet as it would require generating the section IDs without the `-N` suffix. Section generation happens at `Section.generate_id` in Asciidoctor code. One application we have in mind for this is that as of 2.0.10 Asciidoctor does not warn on header ID collisions between auto-generated IDs: https://github.com/asciidoctor/asciidoctor/issues/3147 But this script doesn't solve that yet as it would require generating the section IDs without the `-N` suffix. Section generation happens at `Section.generate_id` in Asciidoctor code.
[[asciidoctor-link-target-up-rb]]
=== asciidoctor/link-target-up.rb
The Asciidoctor extension scripts:
* link:asciidoctor-link-up.rb
* link:asciidoctor-link-github.rb
hack the README `link:` targets to make them work from:
* inside the `out/` directory with `../`
* <<github-pages>>, with explicit GitHub blob URLs
==== GitHub pages
As mentioned before the TOC, we have to push this README to GitHub pages due to: https://github.com/isaacs/github/issues/1610
For now, instead of pushing with `git push`, I just remember to always push with:
....
./publish-gh-pages
....
Source: link:publish-gh-pages[]
I'm going this way for now because:
* the Jekyll Asciidoctor plugin is not enabled by default on GitHub: https://webapps.stackexchange.com/questions/114606/can-github-pages-render-asciidoc
* link:https://stackoverflow.com/questions/1797074/local-executing-hook-after-a-git-push[post-push hooks don't exist]
* I'm lazy to setup a proper Travis CI push
* I'm the only contributor essentially, so no problems with pull requests
The only files used by the GitHub pages are:
* link:Gemfile[]
* link:_config.yml[]
=== Clean the build === Clean the build
You did something crazy, and nothing seems to work anymore? You did something crazy, and nothing seems to work anymore?

6
_config.yml Normal file
View File

@@ -0,0 +1,6 @@
exclude: [
data/,
out/,
rootfs_overlay/etc/ld.so.cache,
submodules/,
]

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env ruby
#
# https://github.com/cirosantilli/linux-kernel-module-cheat#asciidoctor-link-target-up-rb
require 'asciidoctor'
require 'asciidoctor/extensions'
require_relative 'link-target-up.rb'
class LinkTargetGitHub < LinkTargetUp
named :link
def target_base
'https://github.com/cirosantilli/linux-kernel-module-cheat/blob/master/'
end
end
Asciidoctor::Extensions.register do
inline_macro LinkTargetGitHub
end

View File

@@ -1,29 +1,31 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
=begin # https://github.com/cirosantilli/linux-kernel-module-cheat#asciidoctor-link-target-up-rb
README.html links break because we place that output file in out/
This extension hacks local link targets to the right path.
=end
require 'asciidoctor' require 'asciidoctor'
require 'asciidoctor/extensions' require 'asciidoctor/extensions'
class Main < Asciidoctor::Extensions::InlineMacroProcessor class LinkTargetUp < Asciidoctor::Extensions::InlineMacroProcessor
use_dsl use_dsl
named :link named :link
ExternalLinkRegex = /^https?:\/\// ExternalLinkRegex = /^https?:\/\//
def target_base
'..'
end
def process parent, target, attrs def process parent, target, attrs
text = attrs[1] text = attrs[1]
if text.nil? || text.empty? if text.nil? || text.empty?
text = target text = target
end end
if !ExternalLinkRegex.match?(target) if !ExternalLinkRegex.match?(target)
target = File.join('..', target) target = File.join(target_base, target)
end end
create_anchor parent, text, type: :link, target: target create_anchor parent, text, type: :link, target: target
end end
end end
Asciidoctor::Extensions.register do Asciidoctor::Extensions.register do
inline_macro Main inline_macro LinkTargetUp
end end

View File

@@ -17,14 +17,26 @@ class Main(common.LkmcCliFunction):
https://github.com/cirosantilli/linux-kernel-module-cheat#build-the-documentation https://github.com/cirosantilli/linux-kernel-module-cheat#build-the-documentation
''', ''',
) )
self.add_argument(
'--github-pages',
default=False,
help='''
Build for GitHub pages instead of a local build. This redirects all links
from the README to example sources to GitHub rather than locally.
'''
)
def timed_main(self): def timed_main(self):
asciidoctor_dir = os.path.join(self.env['root_dir'], 'asciidoctor') asciidoctor_dir = os.path.join(self.env['root_dir'], 'asciidoctor')
if self.env['github_pages']:
link_target_script = 'link-target-github.rb'
else:
link_target_script = 'link-target-up.rb'
exit_status = self.sh.run_cmd( exit_status = self.sh.run_cmd(
[ [
'asciidoctor', LF, 'asciidoctor', LF,
'--failure-level', 'info', LF, '--failure-level', 'info', LF,
'--require', os.path.join(asciidoctor_dir, 'link-target-up.rb'), LF, '--require', os.path.join(asciidoctor_dir, link_target_script), LF,
'--out-file', self.env['readme_out'], LF, '--out-file', self.env['readme_out'], LF,
'--trace', LF, '--trace', LF,
'--verbose', LF, '--verbose', LF,

15
publish-gh-pages Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# https://github.com/cirosantilli/linux-kernel-module-cheat#github-pages
set -eu
git push
./build-doc --github-pages
git branch -D gh-pages
git checkout --orphan gh-pages
git reset
cp out/README.html index.html
git add _config.yml index.html
git commit --message "$(git log -n1 --pretty='%H' master)"
git push --force
git symbolic-ref HEAD refs/heads/master
git reset
rm index.html