Skip to content
Snippets Groups Projects
Commit b616010a authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Materialien, Beispiele und Tafelbilder 11., 18. und 25.5.2018

parent 19b55ee2
Branches
Tags
No related merge requests found
Showing with 529 additions and 0 deletions
Hello, world! 25.05.2017, 13:31:13
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hello.c:5: printf()
ioputs.c:32: _IO_puts()
ioputs.c:41: _IO_putc_unlocked()
genops.c:227: __overflow()
fileops.c:814: _IO_new_file_overflow()
fileops.c:867: _IO_do_write()
fileops.c:499: _IO_new_do_write()
fileops.c:502: new_do_write()
fileops.c:509: new_do_write()
fileops.c:526: _IO_SYSWRITE()
fileops.c:1263: _IO_new_file_write()
fileops.c:1271: write()
../sysdeps/unix/syscall-template.S:84: write() -- Systemaufruf (System Call), Assembler
0x7ffff7b16590 <write> cmpl $0x0,0x2c21a9(%rip) # 0x7ffff7dd8740 <__libc_multiple_threads>
0x7ffff7b16597 <write+7> jne 0x7ffff7b165a9 <write+25>
0x7ffff7b16599 <__write_nocancel> mov $0x1,%eax
0x7ffff7b1659e <__write_nocancel+5> syscall
0x7ffff7b165a0 <__write_nocancel+7> cmp $0xfffffffffffff001,%rax
0x7ffff7b165a6 <__write_nocancel+13> jae 0x7ffff7b165d9 <write+73>
0x7ffff7b165a8 <__write_nocancel+15> retq
0x7ffff7b165a9 <write+25> sub $0x8,%rsp
0x7ffff7b165ad <write+29> callq 0x7ffff7b30130 <__libc_enable_asynccancel>
0x7ffff7b165b2 <write+34> mov %rax,(%rsp)
0x7ffff7b165b6 <write+38> mov $0x1,%eax
0x7ffff7b165bb <write+43> syscall
0x7ffff7b165bd <write+45> mov (%rsp),%rdi
0x7ffff7b165c1 <write+49> mov %rax,%rdx
0x7ffff7b165c4 <write+52> callq 0x7ffff7b30190 <__libc_disable_asynccancel>
0x7ffff7b165c9 <write+57> mov %rdx,%rax
0x7ffff7b165cc <write+60> add $0x8,%rsp
0x7ffff7b165d0 <write+64> cmp $0xfffffffffffff001,%rax
0x7ffff7b165d6 <write+70> jae 0x7ffff7b165d9 <write+73>
0x7ffff7b165d8 <write+72> retq
0x7ffff7b165d9 <write+73> mov 0x2bc898(%rip),%rcx # 0x7ffff7dd2e78
0x7ffff7b165e0 <write+80> neg %eax
0x7ffff7b165e2 <write+82> mov %eax,%fs:(%rcx)
0x7ffff7b165e5 <write+85> or $0xffffffffffffffff,%rax
0x7ffff7b165e9 <write+89> retq
GDB-Unterbrechungspunkte:
in _IO_puts at ioputs.c:41
in new_do_write at fileops.c:526
in _IO_new_file_write at fileops.c:1271
in main at hello-1.c:5
in __GI___overflow at genops.c:232
GDB Source Directories:
/home/peter/bo/2017ss/bs/20170519/glibc-2.24/libio
/home/peter/bo/2017ss/bs/20170519/glibc-2.24/io
/home/peter/bo/2017ss/bs/20170519/glibc-2.24
Kernel, 25.05.2017, 17:53:23
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Suchbegriff: sys_call_table
/usr/src/linux-headers-4.9.0-2-amd64/arch/x86/include/generated/asm/syscalls_64.h
arch/x86/entry/syscall_64.c: Defnition sys_call_table
arch/x86/entry/entry_64.S: Verwendung sys_call_table
arch/x86/kernel/cpu/common.c: wrmsrl(MSR_LSTAR, (unsigned long)entry_SYSCALL_64);
https://sites.google.com/site/masumzh/articles/hypervisor-based-virtualization/compute-virtualization
"As shown below, the content of the IA32_LSTAR MSR (Model Specific Register)
is copied to the instruction pointer register (RIP) [...]"
--> Weiter geht's mit dem Eintrag in sys_call_table,
also mit der Implementation von sys_write().
Wenn man lange genug sucht, findet man: fs/read_write.c
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count)
ret = vfs_write(f.file, buf, count, &pos);
ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
ret = __vfs_write(file, buf, count, pos);
ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, loff_t *pos)
if (file->f_op->write) return file->f_op->write(file, p, count, pos);
:-)
Jetzt fehlt nur noch: Wie bekommt f_op->write den Wert, den das Modul hinterlegt hat?
Kernel und Treiber, 11.05.2018, 14:02:08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
open.c:
static int do_dentry_open(struct file *f,
struct inode *inode,
int (*open)(struct inode *, struct file *),
const struct cred *cred)
f->f_op = fops_get(inode->i_fop);
"File Operations" werden aus dem "inode" in die "file"-Struktur kopiert.
Ein "inode" ist die einem Dateinamen zugeordnete Struktur, die die Datei beschreibt.
#include <stdio.h>
extern void test1 (void);
extern void test2 (void);
extern void test3 (void);
void (*func[3]) (void) = { test1, test2, test3 };
void test1 (void)
{
printf ("Dies ist ein Test.\n");
}
void test2 (void)
{
printf ("Was ist das?.\n");
}
void test3 (void)
{
printf ("Ein Test.\n");
}
int main (void)
{
for (int i = 0; i < 3; i++)
func[i] ();
return 0;
}
#include <stdio.h>
extern void test1 (void);
extern void test2 (void);
extern void test3 (void);
typedef void (*funcptr) (void);
funcptr func[3] = { test1, test2, test3 };
void test1 (void)
{
printf ("Dies ist ein Test.\n");
}
void test2 (void)
{
printf ("Was ist das?.\n");
}
void test3 (void)
{
printf ("Ein Test.\n");
}
int main (void)
{
for (int i = 0; i < 3; i++)
func[i] ();
return 0;
}
#include <stdio.h>
extern void test1 (void);
extern void test2 (void);
extern void test3 (void);
typedef void (*funcptr) (void);
funcptr func[3] = {
[1] = test2,
[2] = test3,
[0] = test1,
};
void test1 (void)
{
printf ("Dies ist ein Test.\n");
}
void test2 (void)
{
printf ("Was ist das?.\n");
}
void test3 (void)
{
printf ("Ein Test.\n");
}
int main (void)
{
for (int i = 0; i < 3; i++)
func[i] ();
return 0;
}
#include <stdio.h>
#define __SYSCALL(index, name) extern void name (void);
#include "functions.h"
#undef __SYSCALL
typedef void (*funcptr) (void);
#define __SYSCALL(index, name) [ index ] = name,
funcptr func[3] = {
#include "functions.h"
};
#undef __SYSCALL
void test1 (void)
{
printf ("Dies ist ein Test.\n");
}
void test2 (void)
{
printf ("Was ist das?.\n");
}
void test3 (void)
{
printf ("Ein Test.\n");
}
int main (void)
{
for (int i = 0; i < 3; i++)
func[i] ();
return 0;
}
__SYSCALL (2, test3)
// This is a comment.
// Note that there is no comma after the call to the macro.
__SYSCALL (1, test2)
// The system call #0 is for testing.
__SYSCALL (0, test1)
20180518/U-Boot OLinuXino-LIME2.jpg

577 KiB

Bootvorgang
- Hardware startet BIOS/UEFI
- ... lädt Bootloader
- ... lädt ggf. seine Stage 2
- ... bietet Auswahlmenü
- ... erzeugt RAM-Disk
- ... startet Kernel
- ... startet init- bzw. systemd-Prozeß
- ... startet Programme gemäß Run-Level, z.B. getty und Display-Manager
- ... starten Log-In-Prozeß
- ... starten Oberfläche
Bootloader: engl. Wikipedia
- Das U-Boot
- Device Tree
- GNU GRUB
- statt Device Tree: Hardware-Konfiguration via BIOS/UEFI
Massenspeicher
- blockorientierte Gerätedateien
- Partitionen: Trennung zwischen verschiedenen Nutzungen der Platte
- siehe auch: engl. Wikipedia: GNU GRUB
- in den Partitionen: Dateisysteme: schnelles Auffinden von Daten
- FAT16, FAT32
- ext2, inodes
Dateisysteme
~~~~~~~~~~~~
Treiber für Block-Gerätedatei:
z.B. drivers/block/hd.c
Suchbegriffe: module_init, register_blkdev, hd_fops --> Wo sind die fops?
--> http://www.tldp.org/LDP/tlk/dd/drivers.html
z.B. drivers/scsi/sd.c
Direktzugriff auf Blöcke: dd
--> Massenspeicher nutzbar, aber unkomfortabel
Dateisystem = Inhaltsverzeichnisstruktur der Festplatte
Hardware - Block-Gerätedatei - Dateisystem - Dateizugriff - Anwender-Software
Netzwerk - Dateisystem - Dateizugriff - Anwender-Software
Netzwerk - Block-Gerätedatei - Dateisystem - Dateizugriff - Anwender-Software
Software-Treiber:
- FAT: dt. Wikipedia
~/bo/2012ws/systech/material/linux-3.7-rc1/fs/fat/namei_vfat.c
- ext2: engl. Wikipedia
- ext3, ext4, reiserfs, ...
- nfs, cifs, ...
- procfs, sysfs
- devfs --> udev [--> systemd]
Bootvorgang
~~~~~~~~~~~
* schwarzer Bildschirm
* Num-Lock-LED geht an - BIOS detektiert Tastatur
* Cursor
* Fujitsu A2 - nur bei Kalt-, nicht bei Warmstart
* Fujitsu B2 - F2 drücken --> BIOS --> Quiet Boot disable --> mehr Informationen
bzw. American Megatrends - 8 logical CPUs - ...
- Das BIOS lädt die ersten 512 Bytes von der Festplatte,
den sog. Master Boot Record (MBR), und startet das Programm darin (440 B)
* GRUB Loading
Welcome to GRUB!
Das Programm im MBR (Stage 1 von GRUB) lädt
weitere Teile (Stage 2) von Platte nach
* Menü: GNU GRUB
(Stage 2 von GRUB)
* FreeDOS starten: GRUB erzeugt eine virtuelle Floppy (1440 kB) im RAM
und startet syslinux
* syslinux verbiegt Interrupt-Vektoren, lädt den Boot-Sektor von der "Floppy"
und startet FreeDOS - Versions- und Copyright-Informationen - "InitDisk"
* FreeDOS startet ein Menü
* A:\>
* GNU/Linux starten:
Das Programm /sbin/init liest seine Konfigurationsdatei /etc/inittab
und startet weitere Programme, u.a. "getty"s und "/etc/init.d/rc x",
wobei "x" für den Runlevel steht
Loading, please wait...
INIT: version 2.88 booting
...
[info] ...
[ ok ] ...
...
INIT: Entering runlevel: 2
...
[info] ...
[ ok ] ...
...
* Willkommen im Linux-Poolraum!
[...]
stud42 login:
BIOS/UEFI --> MBR --> Boot-Loader --> Kernel --> initrd
--> init --> Display-Manager --> Desktop-Umgebung --> Anwenderprogramme
`-> getty --> login --> bash --> Anwenderprogramme
20180518/photo-20180518-151109.jpg

148 KiB

20180518/photo-20180518-151139.jpg

155 KiB

20180518/photo-20180518-151206.jpg

168 KiB

systemd-+-ModemManager-+-{gdbus}
| `-{gmain}
|-NetworkManager-+-{gdbus}
| `-{gmain}
|-accounts-daemon-+-{gdbus}
| `-{gmain}
|-acpid
|-agetty
|-apache2---7*[apache2]
|-at-spi-bus-laun-+-{dconf worker}
| |-{gdbus}
| `-{gmain}
|-atd
|-avahi-daemon---avahi-daemon
|-bluetoothd
|-colord-+-{gdbus}
| `-{gmain}
|-console-kit-dae-+-62*[{console-kit-dae}]
| |-{gdbus}
| `-{gmain}
|-cron
|-cups-browsed-+-{gdbus}
| `-{gmain}
|-cupsd---dbus
|-3*[dbus-daemon]
|-2*[dbus-launch]
|-dconf-service-+-{gdbus}
| `-{gmain}
|-dhclient
|-ff---sleep
|-gconfd-2
|-gnome-keyring-d-+-{gdbus}
| |-{gmain}
| `-{timer}
|-goa-daemon-+-{dconf worker}
| |-{gdbus}
| |-{gmain}
| `-{goa-daemon}
|-goa-identity-se-+-{gdbus}
| |-{gmain}
| `-{pool}
|-gvfs-afc-volume-+-{gdbus}
| |-{gmain}
| `-{gvfs-afc-volume}
|-gvfs-goa-volume-+-{gdbus}
| `-{gmain}
|-gvfs-gphoto2-vo-+-{gdbus}
| `-{gmain}
|-gvfs-mtp-volume-+-{gdbus}
| `-{gmain}
|-gvfs-udisks2-vo-+-{gdbus}
| `-{gmain}
|-gvfsd-+-{gdbus}
| `-{gmain}
|-gvfsd-dnssd-+-{gdbus}
| `-{gmain}
|-gvfsd-metadata-+-{gdbus}
| `-{gmain}
|-gvfsd-network-+-{dconf worker}
| |-{gdbus}
| `-{gmain}
|-gvfsd-smb-brows-+-{dconf worker}
| |-{gdbus}
| `-{gmain}
|-gvfsd-trash-+-{gdbus}
| `-{gmain}
|-iio-sensor-prox-+-{gdbus}
| `-{gmain}
|-irqbalance
|-lvmetad
|-myterm---urxvt-+-showdatebat---sleep
| `-urxvt
|-nmbd
|-polkitd-+-{gdbus}
| `-{gmain}
|-privoxy
|-pulseaudio-+-{alsa-sink-ALC26}
| `-{alsa-source-ALC}
|-rpcbind
|-rsyslogd-+-{in:imklog}
| |-{in:imuxsock}
| `-{rs:main Q:Reg}
|-rtkit-daemon---2*[{rtkit-daemon}]
|-slim-+-Xorg-+-{InputThread}
| | `-{Xorg}
| `-ck-launch-sessi-+-ssh-agent
| `-x-window-manage-+-sh---myterm---urxvt-+-bash---screen---screen-+-bash-+-pstree
| | | | `-xpdf.real
| | | |-bash---vim
| | | |-bash---sudo---su---bash
| | | `-bash
| | `-urxvt
| |-sh---myterm---urxvt-+-bash
| | `-urxvt
| |-sh---myterm---urxvt-+-bash---screen---screen-+-bash-+-firefox-esr-+-{BgHangMan+
| | | | | |-{Cache I/O+
| | | | | |-{Cache2 I/+
| | | | | |-{Composito+
| | | | | |-3*[{DOM Wo+
| | | | | |-3*[{DataSt+
| | | | | |-{GMPThread+
| | | | | |-{Gecko_IOT+
| | | | | |-{HTML5 Par+
| | | | | |-{Hang Moni+
| | | | | |-{IPDL Back+
| | | | | |-{ImageBrid+
| | | | | |-{ImageIO}
| | | | | |-{ImgDecode+
| | | | | |-{ImgDecode+
| | | | | |-{ImgDecode+
| | | | | |-8*[{JS Hel+
| | | | | |-{JS Watchd+
| | | | | |-{Link Moni+
| | | | | |-{Proxy R~o+
| | | | | |-{Socket Th+
| | | | | |-{SoftwareV+
| | | | | |-{Timer}
| | | | | |-{URL Class+
| | | | | |-{dconf wor+
| | | | | |-{firefox-e+
| | | | | |-{gdbus}
| | | | | |-{gmain}
| | | | | |-{localStor+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | |-{mozStorag+
| | | | | `-{threaded-+
| | | | `-vim
| | | `-bash---gpg
| | `-urxvt
| |-sh---myterm---urxvt-+-bash---screen---screen-+-bash-+-vim
| | | | `-xpdf.real
| | | |-bash---xpdf.real
| | | `-2*[bash---vim]
| | `-urxvt
| `-sh---myterm---urxvt-+-bash---screen---screen-+-bash
| | `-bash---vim
| `-urxvt
|-smbd-+-cleanupd
| |-lpqd
| `-smbd-notifyd
|-sshd---sshd---sshd---bash---screen
|-systemd-+-(sd-pam)
| |-dbus-daemon
| `-gpg-agent---{gpg-agent}
|-systemd-journal
|-systemd-logind
|-systemd-timesyn---{sd-resolve}
|-systemd-udevd
|-timidity
|-tor
|-udisksd-+-{cleanup}
| |-{gdbus}
| |-{gmain}
| `-{probing-thread}
|-upowerd-+-{gdbus}
| `-{gmain}
|-winbindd---winbindd
|-2*[wpa_supplicant]
|-xclock
|-xpdf.real
`-xscreensaver
init/systemd
- /etc/inittab
- /etc/init.d/rc
- Skripte in /etc/init.d/
- Symbolische Links in /etc/rc[0-6].d/
- systemd: eigene symbolische Links, verwaltet mit z.B.:
systemctl disable apache2.service
Runlevel
- systemd: Targets statt Runlevel
- Wenn durch Abhängigkeiten "Loops" entstehen, werden Runlevel ignoriert.
Massenspeicher
- blockorientierte Gerätedateien
- Partitionen: Trennung zwischen verschiedenen Nutzungen der Platte
- siehe auch: engl. Wikipedia: GNU GRUB
- in den Partitionen: Dateisysteme: schnelles Auffinden von Daten
- FAT16, FAT32
- ext2, inodes
Speicherverwaltung
- Segment- und Offset-Adressen des Intel 8086: Relokation
- Selektoren ab Intel 80286: Speicherschutzmechanismen
- MMU ab Intel 80386: virtueller Speicher
Grafik
- VGA
- /dev/fb0
- (Fortsetzung folgt)
20180525/photo-20180525-150610.jpg

193 KiB

20180525/photo-20180525-150641.jpg

175 KiB

20180525/photo-20180525-150729.jpg

143 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment