Accessing User Space

The first 2.1 versions of the kernel introduced a new (and better) way to access user space from kernel code. The change is meant to fix a long-standing misbehavior and to enhance system performance.

When you compile code for version 2.1 of the kernel and need to access user space, you need to include <asm/uaccess.h> instead of <asm/segment.h>. You must also use a different set of functions from those in 2.0. Needless to say, the header sysdep-2.1.h takes care of these differences as much as possible and allows you to use the 2.1 semantics when compiling with 2.0.

The most noticeable difference in user access is that verify_area is gone, as most of the verification is performed by the CPU instead. See Section 17.10 later in this chapter for more details on this subject.

The new set of functions that can be used to access user space is:

int access_ok (int type, unsigned long addr, ,                unsigned long size);

This function returns true (1) if the current process is allowed to access memory at address addr, false (0) otherwise. This function is a replacement for verify_area, although it does less checking. It receives the same arguments as the old verify_area, but is much faster. The function should be called to check a user-space address before you dereference it; if you fail to check, the user might be able to access and modify kernel memory. The section Section 17.9, later in the chapter, explains the issue in more detail. Fortunately, most ...

Get Linux Device Drivers now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.