\documentclass[addpoints,12pt]{exam}

\usepackage{ngerman}
\usepackage{listings,color}
\usepackage{graphicx}

\firstpageheadrule
\runningheadrule
\lhead{Manuel Traut\\Sommersemester 2014}
\chead{Hochschule Ravensburg-Weingarten\\Linux-Kernelprogrammierung}
\rhead{MatrNr:\\Datum:}

\firstpagefootrule
\runningfootrule
\firstpagefooter{Page \thepage\ of \numpages}
{}
{Punkte: \makebox[.5in]{\hrulefill}\\
von \pointsonpage{\thepage} Punkten}

\runningfooter{Page \thepage\ of \numpages}
{}
{}

\pagestyle{headandfoot}

\pointsinrightmargin
\pointpoints{Punkt}{Punkte}

\begin{document}


\begin{coverpages}
\begin{titlepage}
\title{Pr\"ufung Linux-Kernelprogrammierung}
\author{Dozent: Manuel Traut}
\date{21. Juli 2014 08:00 Uhr}
\maketitle
\begin{center}
Hochschule Ravensburg-Weingarten
\vspace{1cm}

Dauer: 60 Minuten, erlaubte Hilfsmittel: handschriftliche Mitschriebe/Notizen
\end{center}

\vspace{2cm}
Name:\enspace\hrulefill
\vspace{2cm}
MatrNr:\enspace\hrulefill
\begin{center}
\begin{lstlisting}
              a8888b.
             d888888b.
             8P"YP"Y88      (((((((())))))))))
             8|o||o|88      ||VIEL ERFOLG !!||
             8'    .88      ((((((((((((()))))
             8`._.' Y8.
            d/      `8b.
          .dP   .     Y8b.
         d8:'   "   `::88b.
        d8"           `Y88b
       :8P     '       :888
        8a.    :      _a88P
      ._/"Yaa_ :    .| 88P|
      \    YP"      `| 8P  `.
      /     \._____.d|    .'
      `--..__)888888P`._.'
\end{lstlisting}
\end{center}
\end{titlepage}
\end{coverpages}

\lstset{ %
  basicstyle=\scriptsize,   % the size of the fonts that are used for the code
  breaklines=true,          % sets automatic line breaking
  frame=single,             % adds a frame around the code
  language=C,               % the language of the code
  numbers=left,             % where to put the line-numbers;
  numbersep=5pt,            % how far the line-numbers are from the code
  numberstyle=\tiny,        % the style that is used for the line-numbers
  tabsize=8,                % sets default tabsize to 2 spaces
}


\begin{questions}

\section*{Entwicklungsmodell - Development process}

\question[7] Beschreiben Sie den Releasezyklus und die Versionierung des
  Linuxkernel (seit v3.0). Verwenden Sie in diesem Zusammenhang die Begriffe:
  'stable Kernel', 'Release Candidate', 'merge window'
\begin{verbatim}
Describe the release cycle and version numbering of the Linux kernel
(since linux v3.0). Use the terms 'release candidate', 'merge window',
'stable kernel'.
\end{verbatim}

\question Im Linux Quellcode gibt es einen Ordner 'staging'.
\begin{verbatim}
There is a folder named 'staging' inside the linux source tree.
\end{verbatim}
\begin{parts}
\part[1] Was findet man in diesem Ordner?
\begin{verbatim}
What is stored in this folder?
\end{verbatim}
\part[2] Wann werden Dateien aus diesem Ordner gel\"oscht / verschoben?
\begin{verbatim}
What conditions needs to be met that a file from this folder will be
moved or deleted?
\end{verbatim}
\end{parts}

\question Der Linux Kernel wird im Versionskontrollsystem git verwaltet.
\begin{verbatim}
The Linux kernel is maintained in the version control system git.
\end{verbatim}
\begin{parts}
\part[1] Welches Subkommando verwenden Sie um den Quellcode z.B. des Linux
Kernels auf Ihren PC zu \"ubertragen?
\begin{verbatim}
Which subcommand to you use to transfer e.g. the source code of the linux
kernel to your pc?
\end{verbatim}
\part[3] Was k\"onnen Sie mit dem Subkommando 'branch' alles machen?
\begin{verbatim}
What can be done with the subcommand 'branch'?
\end{verbatim}
\end{parts}

\newpage

\section*{Tools}

\question
\begin{parts}
\part[1] Welches Kommando f\"uhrt zu den Ausgaben auf folgendem Bild?
\begin{verbatim}
Which command was used to produce the following output?
\end{verbatim}
\part[1] \"Uber welche Dateien wird der Inhalt / Struktur des Tools gesteuert?
\begin{verbatim}
What files are used to alter the content and layout of the tool?
\end{verbatim}
\end{parts}

\includegraphics[height=0.3\textwidth]{./images/kconfig.png}

\question[6] Ein von Ihnen entwickelter Kerneltreiber funktioniert nicht wie
erwartet. Welche Debugging M\"oglichkeiten haben Sie?

Nennen Sie mindestens zwei und beschreiben Sie Vor- und Nachteile

\begin{verbatim}
You developed a linux driver that doesn't work as expected.
What kind of debugging is available?

Describe the advantages and disadvantages of two different methods.
\end{verbatim}


\section*{Rootfilesysteme - Rootfilesystems}

\question[2] Sie haben ein statisch gelinktes C Programm und wollen, dass der
Kernel dieses direkt anstartet. Wie erreichen Sie dies?
\begin{verbatim}
You have a staticly linked C application that should be started directly by
the kernel. What needs to be done?
\end{verbatim}

\question[2] In welchen F\"allen macht es Sinn keine Linux Distribution
einzusetzen?
\begin{verbatim}
In which cases is it useful to avoid using a linux distribution?
\end{verbatim}

\newpage

\section*{Programmierung - Programming}

\question Das Kernelsubsystem 'Userspace-IO' (UIO) kann zur Entwicklung eigener
  Treiber verwendet werden.
\begin{verbatim}
The Userspace-IO (UIO) subsystem of the kernel can be used
to develop an own driver.
\end{verbatim}
\begin{parts}
\part[3] Welche Einschr\"ankungen gelten?
\begin{verbatim}
What limitations are given?
\end{verbatim}
\part[2] Mu\ss \space der Quellcode des Treibers ver\"offentlicht
  werden?
\begin{verbatim}
Do you need to publish the source code of the driver?
\end{verbatim}
\part[1] F\"ur welche Hardware macht ein UIO Treiber keinen Sinn?
\begin{verbatim}
For what kind of hardware is an UIO driver non-sense?
\end{verbatim}
\end{parts}

\question Sie wollen Ihren eigenen Treiber in Mainline Linux integriert
  haben.
\begin{verbatim}
You have developed an own driver and you want to get it
integrated into mainline linux.
\end{verbatim}
\begin{parts}
\part[4] Was \"ubermitteln Sie auf welchem Weg wohin?
\begin{verbatim}
What do you transfer? How do you transfer it? And who is the recipient?
\end{verbatim}
\part[2] Wie wird die Qualit\"at Ihres Treibers gepr\"uft, wie reagieren Sie
  gegebenenfalls auf Beanstandungen?
\begin{verbatim}
What will be done to check the quality of your driver? How do you react on
change requests?
\end{verbatim}
\end{parts}

\newpage

\question

Die folgenden Fragen beziehen sich auf den Quellcode des Kernelmoduls im Anhang.
\begin{verbatim}
The following questions are related to the source code of the kernel module
in the appendix.
\end{verbatim}

\begin{parts}
\part[2] Welche Zeile Quellcode m\"u\ss en Sie l\"oschen damit der Code keine
 Funktion hat?
\begin{verbatim}
Which source-line needs to be deleted to disable the
functionality of the code?
\end{verbatim}

\part[4] Welche 'virtuellen Dateien' werden von dem Code angelegt?
\begin{verbatim}
Which 'virtual files' are created by this code?
\end{verbatim}

\part[2] In der probe Funktion wird eine major id ausgegeben. Was k\"onnen
 Sie mit dieser Information anfangen?
\begin{verbatim}
The probe function reports a major id.
What can you do with this information?
\end{verbatim}

\part[4] Sie wollen vom Userspace aus mittels des Kernelmoduls
  folgende Datei erstellen. Welche Kommandos oder Pseudo-C Code verwenden Sie?
\begin{verbatim}
You want to use the kernel module to generate the following file from the
userspace. Which commands or Pseudo-C code do you use?
\end{verbatim}

[/tmp/huhu.txt]
\begin{lstlisting}
8888
\end{lstlisting}

\part[6] Suchen Sie sich drei Funktionen aus, erkl\"aren Sie jeweils wann die
Funktion aufgerufen wird und was Sie tut.
\begin{verbatim}
Choose 3 functions. Explain for each function what triggers the call
and describe its job.
\end{verbatim}

\part[4] Sie wollen dass der Code keine sysfs device Attribute mehr exportiert.
Nennen Sie alle Bereiche, die gel\"oscht werden k\"onnen.
\begin{verbatim}
You want the code to avoid exporting sysfs device attributes.
Which lines/areas of the source-code can be removed?
\end{verbatim}
\end{parts}

\end{questions}

\vspace{1cm}
Punkte: \_\_\_\_ von \numpoints
\hspace{1cm}
Note:

\newpage

\begin{appendix}
\begin{lstlisting}
/*
 * Example driver for Linux
 * Copyright (C) 2014, Manuel Traut <manut@mecka.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/init.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>

#define DEVICE_NAME "hswgt"
static int major;

static struct class *dummy;

static struct device hswgt_dev = {
	.init_name = DEVICE_NAME,
};

static ssize_t hswgt_show_ro(struct device *hswgt_dev,
	struct device_attribute *hswgt_attr, char *buf)
{
	return scnprintf(buf, PAGE_SIZE, "%s\n", "show some cool value");
}

static ssize_t hswgt_show_rw(struct device *hswgt_dev,
	struct device_attribute *hswgt_attr, char *buf)
{
	return scnprintf(buf, PAGE_SIZE, "%s\n", "write value, look at dmesg");
}

static ssize_t hswgt_store_rw(struct device *hswgt_dev,
	struct device_attribute *hswgt_attr, const char *buf, size_t count)
{
	pr_notice("hswgt_store_rw: %s", buf);
	return count;
}


static DEVICE_ATTR(hswgt_ro, S_IRUGO, hswgt_show_ro, NULL);
static DEVICE_ATTR(hswgt_rw, S_IWUSR|S_IRUGO, hswgt_show_rw, hswgt_store_rw);

static struct attribute *hswgt_dev_attrs[] = {
	&dev_attr_hswgt_ro.attr,
	&dev_attr_hswgt_rw.attr,
	NULL,
};

static struct attribute_group hswgt_dev_attr_group1 = {
	.attrs = hswgt_dev_attrs,
};

static const struct attribute_group *hswgt_dev_attr_groups[] = {
	&hswgt_dev_attr_group1,
	NULL,
};

static int hswgt_char_open(struct inode *node, struct file *f)
{
	pr_notice("%s\n", __func__);
	return 0;
}

static ssize_t hswgt_char_read(struct file *f, char __user *buf,
	size_t count, loff_t *pos)
{
	pr_notice("%s\n", __func__);
	memset(buf, 8, count);
	return count;
}

static ssize_t hswgt_char_write(struct file *f, const char __user *buf,
	size_t count, loff_t *pos)
{
	size_t i;
	for (i = 0; i < count; i++)
		pr_notice("%s[%d]: %x\n", __func__, (int)i, buf[i]);
	return count;
}

static const struct file_operations hswgt_fops = {
	.open = hswgt_char_open,
	.read = hswgt_char_read,
	.write = hswgt_char_write,
};

static int __init hswgt_init(void)
{
	int ret = 0;

	pr_notice("%s\n", __func__);

	dummy = class_create(THIS_MODULE, "dummy");
	device_initialize(&hswgt_dev);
	hswgt_dev.parent = NULL;
	hswgt_dev.bus = NULL;
	hswgt_dev.class = dummy;
	hswgt_dev.groups = hswgt_dev_attr_groups;

	ret = device_add(&hswgt_dev);
	if (ret) {
		pr_err("%s device_add failed: %x\n", __func__, ret);
		goto failed_dev;
	}

	major = register_chrdev(0, "hswgt", &hswgt_fops);
	if (major < 0) {
		ret = major;
		pr_err("%s register chrdev failed; %d\n", __func__, ret);
		goto failed_char;
	}
	pr_notice("%s major device node %d\n",
		__func__, major);

	return 0;

failed_char:
	unregister_chrdev(major, "hswgt");
failed_dev:
	device_del(&hswgt_dev);
	class_destroy(dummy);

	return ret;
}

static void __exit hswgt_exit(void)
{
	pr_notice("%s\n", __func__);

	device_del(&hswgt_dev);
	class_destroy(dummy);
	unregister_chrdev(major, "hswgt");
}

module_init(hswgt_init);
module_exit(hswgt_exit);

MODULE_AUTHOR("Manuel Traut");
MODULE_DESCRIPTION("dummy test driver");
MODULE_VERSION("3");
MODULE_LICENSE("GPL");
\end{lstlisting}
\end{appendix}


\end{document}
