Review and link kernel_module/user examples to README

This commit is contained in:
Ciro Santilli
2018-07-09 10:58:18 +01:00
parent 258add9c9d
commit f2bf644cfd
15 changed files with 121 additions and 74 deletions

View File

@@ -4863,9 +4863,6 @@ sendkey shift-pgdown
===== Ctrl Alt Del ===== Ctrl Alt Del
* https://superuser.com/questions/193652/does-linux-have-a-ctrlaltdel-equivalent/1324415#1324415
* https://unix.stackexchange.com/questions/42573/meaning-and-commands-for-ctrlaltdel/444969#444969
Reboot guest: Reboot guest:
.... ....
@@ -4952,9 +4949,12 @@ ever reaches the kernel tty layer, and it's up to the program
to decide what to do with it. to decide what to do with it.
.... ....
===== SysRq Bibliography:
https://en.wikipedia.org/wiki/Magic_SysRq_key * https://superuser.com/questions/193652/does-linux-have-a-ctrlaltdel-equivalent/1324415#1324415
* https://unix.stackexchange.com/questions/42573/meaning-and-commands-for-ctrlaltdel/444969#444969
===== SysRq
We cannot test these actual shortcuts on QEMU since the host captures them at a lower level, but from: We cannot test these actual shortcuts on QEMU since the host captures them at a lower level, but from:
@@ -5004,6 +5004,8 @@ The bitmask is documented at:
less linux/Documentation/admin-guide/sysrq.rst less linux/Documentation/admin-guide/sysrq.rst
.... ....
Bibliography: https://en.wikipedia.org/wiki/Magic_SysRq_key
==== TTY ==== TTY
In order to play with TTYs, do this: In order to play with TTYs, do this:
@@ -5076,6 +5078,8 @@ Identify the current TTY with the command:
tty tty
.... ....
Bibliography:
* https://unix.stackexchange.com/questions/270272/how-to-get-the-tty-in-which-bash-is-running/270372 * https://unix.stackexchange.com/questions/270272/how-to-get-the-tty-in-which-bash-is-running/270372
* https://unix.stackexchange.com/questions/187319/how-to-get-the-real-name-of-the-controlling-terminal * https://unix.stackexchange.com/questions/187319/how-to-get-the-real-name-of-the-controlling-terminal
* https://unix.stackexchange.com/questions/77796/how-to-get-the-current-terminal-name * https://unix.stackexchange.com/questions/77796/how-to-get-the-current-terminal-name
@@ -5133,7 +5137,7 @@ insmod /kthread.ko
and switch between virtual terminals, to understand that the dmesg goes to whatever current virtual terminal you are on, but not the others, and not to the serial terminals. and switch between virtual terminals, to understand that the dmesg goes to whatever current virtual terminal you are on, but not the others, and not to the serial terminals.
See also: Bibliography:
* https://serverfault.com/questions/119736/how-to-enable-multiple-virtual-consoles-on-linux * https://serverfault.com/questions/119736/how-to-enable-multiple-virtual-consoles-on-linux
* https://github.com/mirror/busybox/blob/1_28_3/examples/inittab#L60 * https://github.com/mirror/busybox/blob/1_28_3/examples/inittab#L60
@@ -5197,7 +5201,7 @@ Instead, the shell appears on `/dev/tty7`.
If you run in <<graphic-mode>>, then you get a Penguin image for <<number-of-cores,every core>> above the console! https://askubuntu.com/questions/80938/is-it-possible-to-get-the-tux-logo-on-the-text-based-boot If you run in <<graphic-mode>>, then you get a Penguin image for <<number-of-cores,every core>> above the console! https://askubuntu.com/questions/80938/is-it-possible-to-get-the-tux-logo-on-the-text-based-boot
This is due to the `CONFIG_LOGO=y` option which we enable by default. This is due to the link:https://github.com/torvalds/linux/blob/v4.17/drivers/video/logo/Kconfig#L5[`CONFIG_LOGO=y`] option which we enable by default.
`reset` on the terminal then kills the poor penguins. `reset` on the terminal then kills the poor penguins.
@@ -5350,7 +5354,7 @@ When I build it on Ubuntu 18.04 host, it does not generate any executable, so I'
=== Linux kernel testing === Linux kernel testing
https://stackoverflow.com/questions/3177338/how-is-the-linux-kernel-tested Bibliography: https://stackoverflow.com/questions/3177338/how-is-the-linux-kernel-tested
==== LTP ==== LTP
@@ -5417,8 +5421,6 @@ Some QEMU specific features to play with and limitations to cry over.
=== Snapshot === Snapshot
https://stackoverflow.com/questions/40227651/does-qemu-emulator-have-checkpoint-function/48724371#48724371
QEMU allows us to take snapshots at any time through the monitor. QEMU allows us to take snapshots at any time through the monitor.
You can then restore CPU, memory and disk state back at any time. You can then restore CPU, memory and disk state back at any time.
@@ -5493,6 +5495,8 @@ And the output is `0`.
Our setup does not allow for snapshotting while using <<initrd>>. Our setup does not allow for snapshotting while using <<initrd>>.
Bibliography: https://stackoverflow.com/questions/40227651/does-qemu-emulator-have-checkpoint-function/48724371#48724371
==== Snapshot internals ==== Snapshot internals
Snapshots are stored inside the `.qcow2` images themselves. Snapshots are stored inside the `.qcow2` images themselves.
@@ -5918,8 +5922,6 @@ Rationale: we found out that the kernels that build for `qemu -M versatilepb` do
At the same time, we also found out that Versatile Express (`vexpress`) does support armv7, so maybe we could port it over, but I had lost interest at that point, and decided to just go with the simpler `-M virt` machine instead. At the same time, we also found out that Versatile Express (`vexpress`) does support armv7, so maybe we could port it over, but I had lost interest at that point, and decided to just go with the simpler `-M virt` machine instead.
https://stackoverflow.com/questions/28315265/how-to-add-a-new-device-in-qemu-source-code/44612957#44612957
Uses: Uses:
* `hw/misc/lkmc_platform_device.c` minimal device added in our QEMU fork to `-M versatilepb` * `hw/misc/lkmc_platform_device.c` minimal device added in our QEMU fork to `-M versatilepb`
@@ -5951,6 +5953,8 @@ The IRQ number `34` was found by on the dmesg after:
insmod /platform_device.ko insmod /platform_device.ko
.... ....
Bibliography: https://stackoverflow.com/questions/28315265/how-to-add-a-new-device-in-qemu-source-code/44612957#44612957
==== gem5 educational hardware models ==== gem5 educational hardware models
TODO get some working! TODO get some working!
@@ -5963,8 +5967,6 @@ This protocol allows sharing a mountable filesystem between guest and host.
With networking, it's boring, we can just use any of the old tools like sshfs and NFS. With networking, it's boring, we can just use any of the old tools like sshfs and NFS.
https://superuser.com/questions/628169/how-to-share-a-directory-with-the-host-without-networking-in-qemu
One advantage of this method over NFS is that can run without `sudo` on host, or having to pass host credentials on guest for sshfs. One advantage of this method over NFS is that can run without `sudo` on host, or having to pass host credentials on guest for sshfs.
TODO performance compared to NFS. TODO performance compared to NFS.
@@ -6011,7 +6013,10 @@ security_model=mapped
+ +
writes from guest failed due to user mismatch problems: https://serverfault.com/questions/342801/read-write-access-for-passthrough-9p-filesystems-with-libvirt-qemu writes from guest failed due to user mismatch problems: https://serverfault.com/questions/342801/read-write-access-for-passthrough-9p-filesystems-with-libvirt-qemu
The feature is documented at: https://wiki.qemu.org/Documentation/9psetup Bibliography:
* https://superuser.com/questions/628169/how-to-share-a-directory-with-the-host-without-networking-in-qemu
* https://wiki.qemu.org/Documentation/9psetup
==== 9P gem5 ==== 9P gem5
@@ -6093,8 +6098,6 @@ We us this exact procedure to connect to <<gdbserver>>.
===== ssh into guest ===== ssh into guest
https://unix.stackexchange.com/questions/124681/how-to-ssh-from-host-to-guest-using-qemu/307557#307557
Not enabled by default due to the build / runtime overhead. To enable, build with: Not enabled by default due to the build / runtime overhead. To enable, build with:
.... ....
@@ -6115,6 +6118,8 @@ And finally on host:
ssh root@localhost -p 45456 ssh root@localhost -p 45456
.... ....
Bibliography: https://unix.stackexchange.com/questions/124681/how-to-ssh-from-host-to-guest-using-qemu/307557#307557
===== gem5 host to guest networking ===== gem5 host to guest networking
Could not do port forwarding from host to guest, and therefore could not use `gdbserver`: https://stackoverflow.com/questions/48941494/how-to-do-port-forwarding-from-guest-to-host-in-gem5 Could not do port forwarding from host to guest, and therefore could not use `gdbserver`: https://stackoverflow.com/questions/48941494/how-to-do-port-forwarding-from-guest-to-host-in-gem5
@@ -6133,9 +6138,7 @@ gives:
Could not open guest forwarding device 'guestfwd.tcp.45456' Could not open guest forwarding device 'guestfwd.tcp.45456'
.... ....
Related: Bibliography: https://serverfault.com/questions/769874/how-to-forward-a-port-from-guest-to-host-in-qemu-kvm
* https://serverfault.com/questions/769874/how-to-forward-a-port-from-guest-to-host-in-qemu-kvm
==== Secondary disk ==== Secondary disk
@@ -6967,24 +6970,57 @@ Buildroot supports it, which makes everything just trivial:
.... ....
./build -B 'BR2_PACKAGE_OPENBLAS=y' -k ./build -B 'BR2_PACKAGE_OPENBLAS=y' -k
./run -F '/openblas.out' ./run -F '/openblas.out; echo $?'
....
Outcome: the test passes:
....
0
.... ....
Source: link:kernel_module/user/openblas.c[] Source: link:kernel_module/user/openblas.c[]
The test performs a general matrix multiplication:
....
| 1.0 -3.0 | | 1.0 2.0 1.0 | | 0.5 0.5 0.5 | | 11.0 - 9.0 5.0 |
1 * | 2.0 4.0 | * | -3.0 4.0 -1.0 | + 2 * | 0.5 0.5 0.5 | = | - 9.0 21.0 -1.0 |
| 1.0 -1.0 | | 0.5 0.5 0.5 | | 5.0 - 1.0 3.0 |
....
This can be deduced from the Fortran interfaces at: `out/x86_64/buildroot/build/openblas-*/reference/dgemmf.f`, which we can map to our call as:
....
C := alpha*op( A )*op( B ) + beta*C,
SUBROUTINE DGEMMF( TRANA, TRANB, M,N,K, ALPHA,A,LDA,B,LDB,BETA,C,LDC)
cblas_dgemm( CblasColMajor, CblasNoTrans, CblasTrans,3,3,2 ,1, A,3, B,3, 2 ,C,3 );
....
===== Eigen ===== Eigen
Header only linear algebra library supported by Buildroot: Header only linear algebra library with a mainline Buildroot package:
.... ....
./build -B 'BR2_PACKAGE_EIGEN=y' -k ./build -B 'BR2_PACKAGE_EIGEN=y' -k
./run -F '/eigen_hello.out;/eigen_svd.out'
.... ....
Source: Just create an array and print it:
* link:kernel_module/user/eigen.cpp[] ....
* link:kernel_module/user/eigen_svd.cpp[] ./run -F '/eigen.out'
....
Output:
....
3 -1
2.5 1.5
....
Source: link:kernel_module/user/eigen.cpp[]
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:http://github.com/cirosantilli/linux-kernel-module-cheat/commit/a4bdcf102c068762bb1ef26c591fcf71e5907525[a4bdcf102c068762bb1ef26c591fcf71e5907525]
@@ -7658,7 +7694,7 @@ which gives pretty close results, and serve as a nice sanity check that the cycl
It is also nice to see that `rdtsc` is a bit smaller than the `stats.txt` value, since the latter also includes the exec syscall for `m5`. It is also nice to see that `rdtsc` is a bit smaller than the `stats.txt` value, since the latter also includes the exec syscall for `m5`.
See also: Bibliography:
* https://en.wikipedia.org/wiki/Time_Stamp_Counter * https://en.wikipedia.org/wiki/Time_Stamp_Counter
* https://stackoverflow.com/questions/9887839/clock-cycle-count-wth-gcc/9887979 * https://stackoverflow.com/questions/9887839/clock-cycle-count-wth-gcc/9887979

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#anonymous-inode */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>

View File

@@ -3,13 +3,17 @@
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#include <fcntl.h> /* open */ #include <fcntl.h> /* open */
#include <math.h> /* fabs */
#include <stdint.h> /* uint64_t */ #include <stdint.h> /* uint64_t */
#include <stdlib.h> /* size_t */ #include <stdlib.h> /* size_t */
#include <stdio.h> /* snprintf */
#include <sys/types.h>
#include <unistd.h> /* pread, sysconf */ #include <unistd.h> /* pread, sysconf */
#include <stdbool.h>
/* Format documented at: /* Format documented at:
* https://github.com/torvalds/linux/blob/v4.9/Documentation/vm/pagemap.txt * https://github.com/torvalds/linux/blob/v4.9/Documentation/vm/pagemap.txt
**/ */
typedef struct { typedef struct {
uint64_t pfn : 54; uint64_t pfn : 54;
unsigned int soft_dirty : 1; unsigned int soft_dirty : 1;
@@ -33,8 +37,12 @@ int pagemap_get_entry(PagemapEntry *entry, int pagemap_fd, uintptr_t vaddr)
nread = 0; nread = 0;
while (nread < sizeof(data)) { while (nread < sizeof(data)) {
ret = pread(pagemap_fd, &data, sizeof(data), ret = pread(
(vaddr / sysconf(_SC_PAGE_SIZE)) * sizeof(data) + nread); pagemap_fd,
&data,
sizeof(data),
(vaddr / sysconf(_SC_PAGE_SIZE)) * sizeof(data) + nread
);
nread += ret; nread += ret;
if (ret <= 0) { if (ret <= 0) {
return 1; return 1;
@@ -74,4 +82,18 @@ int virt_to_phys_user(uintptr_t *paddr, pid_t pid, uintptr_t vaddr)
return 0; return 0;
} }
bool common_vector_equal(size_t n, double * v1, double * v2, double max_err)
{
double sum = 0.0;
double diff;
size_t i;
for (i = 0; i < n; ++i) {
diff = v1[i] - v2[i];
sum += diff * diff;
}
if (sqrt(sum)/n > max_err)
return false;
return true;
}
#endif #endif

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#ctrl-alt-del */
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#include <signal.h> #include <signal.h>
#include <stdio.h> #include <stdio.h>

View File

@@ -1,4 +1,6 @@
/* Adapted from: https://eigen.tuxfamily.org/dox/GettingStarted.html */ /* https://github.com/cirosantilli/linux-kernel-module-cheat#eigen
* Adapted from: https://eigen.tuxfamily.org/dox/GettingStarted.html
*/
#include <iostream> #include <iostream>
#include <Eigen/Dense> #include <Eigen/Dense>
int main() { int main() {

View File

@@ -1,24 +0,0 @@
/* Adapted from: https://eigen.tuxfamily.org/dox/classEigen_1_1JacobiSVD.html */
#include <iostream>
using std::cout;
using std::endl;
#include <Eigen/Core>
#include <Eigen/SVD>
using Eigen::ComputeThinU;
using Eigen::ComputeThinV;
using Eigen::JacobiSVD;
using Eigen::MatrixXf;
using Eigen::Vector3f;
int main() {
MatrixXf m = MatrixXf::Random(3,2);
JacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV);
Vector3f rhs(1, 0, 0);
cout << "m = " << endl << m << endl << endl;
cout << "svd.singularValues() = " << endl << svd.singularValues() << endl << endl;
cout << "svd.MatrixU() = " << endl << svd.matrixU() << endl << endl;
cout << "svd.MatrixV() = " << endl << svd.matrixV() << endl << endl;
cout << "svd.solve() = " << endl << svd.solve(rhs) << endl << endl;
}

View File

@@ -1,4 +1,5 @@
/* Adapted from: https://github.com/dvdhrm/docs/blob/fad7c3203b14e67053e0fc41d8490138b8ff47dd/drm-howto/modeset.c */ /* https://github.com/cirosantilli/linux-kernel-module-cheat#drm
* Adapted from: https://github.com/dvdhrm/docs/blob/fad7c3203b14e67053e0fc41d8490138b8ff47dd/drm-howto/modeset.c */
/* /*
* modeset - DRM Modesetting Example * modeset - DRM Modesetting Example

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#m5ops-instructions */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#mmap */
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#include <assert.h> #include <assert.h>
#include <fcntl.h> #include <fcntl.h>

View File

@@ -1,4 +1,4 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#kernel-module-parameters#myinsmod */ /* https://github.com/cirosantilli/linux-kernel-module-cheat#myinsmod */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <fcntl.h> #include <fcntl.h>

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#myinsmod */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>

View File

@@ -1,15 +1,16 @@
/* Adapted from: https://github.com/xianyi/OpenBLAS/wiki/User-Manual/59b62f98e7400270fb03ad1d85fba5b64ebbff2b#call-cblas-interface */ /* https://github.com/cirosantilli/linux-kernel-module-cheat#blas
* Adapted from: https://github.com/xianyi/OpenBLAS/wiki/User-Manual/59b62f98e7400270fb03ad1d85fba5b64ebbff2b#call-cblas-interface */
#include "common.h"
#include <assert.h>
#include <cblas.h> #include <cblas.h>
#include <stdio.h>
int main() { int main()
size_t i = 0; {
double A[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double A[6] = {1.0, 2.0, 1.0, -3.0, 4.0, -1.0};
double B[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double B[6] = {1.0, 2.0, 1.0, -3.0, 4.0, -1.0};
double C[9] = {.5,.5,.5,.5,.5,.5,.5,.5,.5}; double C[9] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans,3,3,2,1,A, 3, B, 3,2,C,3); cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, 3, 3, 2, 1, A, 3, B, 3, 2, C, 3);
for(i = 0; i < 9; i++) assert(common_vector_equal(9, C, (double[]){11.0, -9.0, 5.0, -9.0, 21.0, -1.0, 5.0, -1.0, 3.0}, 1e-6));
printf("%f ", C[i]);
printf("\n");
} }

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#openmp */
#include <omp.h> #include <omp.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>

View File

@@ -1,3 +1,5 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#poll */
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#include <assert.h> #include <assert.h>
#include <fcntl.h> /* creat, O_CREAT */ #include <fcntl.h> /* creat, O_CREAT */

View File

@@ -1,9 +1,4 @@
/* /* https://github.com/cirosantilli/linux-kernel-module-cheat#rdtsc */
Only works in x86_64.
- https://en.wikipedia.org/wiki/Time_Stamp_Counter
- https://stackoverflow.com/questions/9887839/clock-cycle-count-wth-gcc/9887979
*/
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>