summaryrefslogtreecommitdiff
path: root/hurd/translator/procfs/jkoenig/discussion.mdwn
blob: 9f5316aea29797791c2a78bb37a7ccbed64ef3b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
[[!meta copyright="Copyright © 2010, 2011, 2012, 2013, 2014 Free Software
Foundation, Inc."]]

[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license
is included in the section entitled [[GNU Free Documentation
License|/fdl]]."]]"""]]

[[!tag open_issue_hurd]]

[[!toc]]


# `/proc/version`

[[!taglink open_issue_documentation]]: edit and move to [[FAQ]].


## IRC, freenode, #hurd, around 2010-09

    <pinotree> (also, shouldn't /proc/version say something else than "Linux"?)
    <youpi> to make linux tools work, no :/
    <youpi> kfreebsd does that too
    <pinotree> really?
    <youpi> yes
    <youpi> (kfreebsd, not freebsd)
    <pinotree> does kbsd's one print just "Linux version x.y.z" too, or
      something more eg in a second line?
    <pinotree> (as curiosity)
    <youpi> % cat /proc/version
    <youpi> Linux version 2.6.16 (des@freebsd.org) (gcc version 4.3.5) #4 Sun
      Dec 18 04:30:00 CET 1977
    <pinotree> k


## IRC, freenode, #hurd, 2013-06-04

    <safinaskar> ?@?#@?$?@#???!?!?!?!??!?!?!?! why /proc/version on gnu system
      reports "Linux version 2.6.1 (GNU 0.3...)"?
    <braunr> safinaskar: because /proc/version is a linux thing
    <braunr> applications using it don't expect to see anything else than linux
      when parsing
    <braunr> think of it as your web brower allowing you to set the user-agent
    <safinaskar> braunr: yes, i just thought about user-agent, too
    <safinaskar> braunr: but freebsd doesn't report it is linux (as well as i
      know)
    <braunr> their choice
    <braunr> we could change it, but frankly, we don't care
    <safinaskar> so why "uname" says "GNU" and not "Linux"?
    <braunr> uname is posix
    <braunr> note that /proc/version also includes GNU and GNU Mach/Hurd
      versions
    <safinaskar> if some program read the word "Linux" from /proc/version, it
      will assume it is linux. so, i think it is bad idea
    <braunr> why ?
    <safinaskar> there is no standard /proc across unixen
    <braunr> if a program reads /proc/version, it expects to be run on linux
    <safinaskar> every unix implement his own /proc
    <safinaskar> so, we don't need to create /proc which is fully compatible
      with linux
    <braunr> procfs doesn't by default
    <safinaskar> instead, we can make /proc, which is partially compatible with
      linux
    <braunr> debiansets the -c compatibility flag
    <braunr> that's what we did
    <safinaskar> but /proc/version should really report kernel name and its
      version
    <braunr> why ?
    <braunr> (and again, it does)
    <safinaskar> because this is why /proc/version created
    <pinotree> no?
    <braunr> on linux, yes
    <braunr> pinotree: hm ?
    <safinaskar> and /proc/version should not contain the "Linux" word, because
      this is not Linux
    <braunr> pinotree: no to what ? :)
    <braunr> safinaskar: *sigh*
    <braunr> i explained the choice to you
    <pinotree> safinaskar: if you are using /proc/version to get the kernel
      name and version, you're doing bad already
    <braunr> disagree if you want
    <braunr> but there is a point to using the word Linux there
    <pinotree> safinaskar: there's the proper aposix api for that, which is
      uname
    <safinaskar> pinotree: okey. so why we ever implement /proc/version?
    <braunr> it's a linux thing
    <braunr> they probably wanted more than what the posix api was intended to
      do
    <safinaskar> okey, so why we need this linux thing?   there is a lot of
      linux thing which is useful in hurd.  but not this thing.   because this
      is not linux.    if we support /proc/version, we should not write "Linux"
      to it
    <pinotree> and even on freebsd their linprocfs (mounted on /proc) is not
      mounted by default
    <braunr> 10:37 < braunr> applications using it don't expect to see anything
      else than linux when parsing
    <braunr> 10:37 < braunr> think of it as your web brower allowing you to set
      the user-agent
    <braunr> safinaskar: the answer hasn't changed
    <safinaskar> pinotree: but they don't export /proc/version with "Linux"
      word in it anyway
    <pinotree> safinaskar: they do
    <safinaskar> pinotree: ??? their /proc/version contain Linux?
    <pinotree> Linux version 2.6.16 (des@freebsd.org) (gcc version 4.6.3) #4
      Sun Dec 18 04:30:00 CET 1977
    <kilobug> safinaskar: it's like all web browsers reporting "mozilla" in
      their UA, it may be silly, but it's how it is for
      compatibility/historical reasons, and it's just not worth the trouble of
      changing it
    <pinotree> that's on a debian gnu/kfreebsd machine
    <pinotree> and on a freebsd machine it is the same
    <braunr> safinaskar: you should understand that parsing this string allows
      correctly walking the rest of the /proc tree
    <pinotree> and given such filesystem on freebsd is called "linprocfs", you
      can already have a guess what it is for
    <kilobug> safinaskar: saying "Linux version 2.6.1" just means "I'm
      compatible with Linux 2.6.1 interfaces", like saying "Mozilla/5.0 (like
      Gecko)" in the UA means "I'm a modern browser"
    <safinaskar> so, is there really a lot of programs which expect "Linux"
      word in /proc/version even on non-linux platforms?
    <braunr> no
    <braunr> but when they do, they do


# <a name="self">`/proc/self`</a>

## IRC, freenode, #hurd, around 2010-09

    <youpi> jkoenig: is it not possible to provide a /proc/self which points at
      the client's pid?
    <pinotree> looks like he did 'self' too, see rootdir_entries[] in rootdir.c
    <youpi> but it doesn't point at self
    <antrik> youpi: there is no way to provide /proc/self, because the server
      doesn't know the identity of the client
    <youpi> :/
    <antrik> youpi: using the existing mechanisms, we would need another magic
      lookup type
    <antrik> an alternative idea I discussed with cfhammer once would be for
      the client to voluntarily provide it's identity to the server... but that
      would be a rather fundamental change that requires careful consideration
    <antrik> also, object migration could be used, so the implementation would
      be provided by the server, but the execution would happen in the
      client... but that's even more involved :-)
    <youpi> but we've seen how much that'd help with a lot of other stuff
    <antrik> I'm not sure whether we discussed this on the ML at some point, or
      only on IRC
    <youpi> it "just" needs to be commited :)
    <antrik> in either case, it can't hurt to bring this up again :-)

[[mtab/discussion]], *IRC, freenode, #hurd, 2013-09-07*.
Look at `[glibc]/hurd/lookup-retry.c` for how [[`FS_RETRY_MAGICAL`
lookups|interface/dir_lookup]] work.


# root group

## IRC, freenode, #hurd, around October 2010

    <pinotree> the only glitch is that files/dirs have the right user as
      owner, but always with root group


# `/proc/[PID]/stat` being 400 and not 444, and some more

## IRC, freenode, #hurd, 2011-03-27

    <pochu> is there a reason for /proc/$pid/stat to be 400 and not 444 like on
      Linux?
    <pochu> there is an option to procfs to make it 444 like Linux
    <pochu> jkoenig: ^
    <jkoenig> pochu, hi
    <jkoenig> /proc/$pid/stat reveals information which is not usually
      available on Hurd
    <jkoenig> so I made it 400 by default to avoid leaking anything
    <pochu> is there a security risk in providing that info?
    <jkoenig> probably not so much, but it seemed like it's not really a
      descision procfs should make
    <jkoenig> I'm not sure which information we're speaking about, though, I
      just remember the abstract reason.
    <pochu> things like the pid, the memory, the priority, the state...
    <pochu> sounds safe to expose
    <jkoenig> also it's 0444 by default in "compatible" mode
    <jkoenig> (which is necessary for the linux tools to work well)
    <pochu> yeah I saw that :)
    <pochu> my question is, should we change it to 0444 by default? if there
      are no security risks and this improves compatibility, sounds like a good
      thing to me
    <pochu> we're already 'leaking' part of that info through e.g. ps
    <jkoenig> I think /proc should be translated by /hurd/procfs --compatible
      by default (I'm not sure whether it's already the case)
    <jkoenig> also I'm not sure why hurd-ps is setuid root, rather than the
      proc server being less paranoid, but maybe I'm missing something.
    <pochu> jkoenig: it's not, at least not on Debian
    <pochu> youpi: hi, what do you think about starting procfs with
      --compatible by default?
    <pochu> youpi: or changing /proc/$pid/stat to 0444 like on Linux
      (--compatible does that among a few other things)
    <youpi> I guess you need it for something?
    <pochu> I'm porting libgtop :)
    <youpi> k
    <pochu> though I still think we should do this in procfs itself
    <youpi> ymmv
    <jkoenig> pochu, youpi, --compatible is also needed because mach's high
      reported sysconf(_SC_CLK_TCK) makes some integers overflow (IIRC)
    <youpi> agreed
    <jkoenig> luckily, tools which use procfs usually try to detect the value
      /proc uses rather than rely on CLK_TCK
    <jkoenig> (so we can choose whatever reasonable value we want)


## IRC, freenode, #hurd, 2011-03-28

    <antrik> jkoenig: does procfs expose any information that is not available
      to everyone through the proc server?...
    <antrik> also, why is --compatible not the default; or rather, why is there
      even another mode? the whole point of procfs is compatibility...
    <jkoenig> antrik, yes, through the <pid>/environ and (as mentionned above)
      <pid>/stat files, but I've been careful to make these files readable only
      to the process owner
    <jkoenig> --compatible is not the default because it relaxes this paranoia
      wrt. the stat file, and does not conform to the specification with regard
      to clock tick counters
    <antrik> what specification?
    <jkoenig> the linux proc(5) manpage
    <jkoenig> which says clock tick counters are in units of
      1/sysconf(_SC_CLK_TCK)
    <antrik> so you are saying that there is some information that the Hurd
      proc server doesn't expose to unprivileged processes, but linux /proc
      does?
    <jkoenig> yes
    <antrik> that's odd. I wonder what the reasoning behind that could be
    <antrik> but this information is available through Hurd ps?
    <antrik> BTW, what exactly is _SC_CLK_TCK supposed to be?
    <pinotree> jkoenig: hm, just tried with two random processes on linux
      (2.6.32), and enrivon is 400
    <pinotree> (which makes sense, as you could have sensible informations eg
      in http_proxy or other envvars)
    <jkoenig> antrik, CLK_TCK is similar to HZ (maybe clock resolution instead
      of time slices ?)
    <jkoenig> sysconf(3) says "The number of clock ticks per second."
    <jkoenig> antrik, I don't remember precisely what information this was, but
      ps-hurd is setuid root.
    <jkoenig> anyway, if you run procfs --compatible as a user and try to read
      foo/1/stat, the result is an I/O error, which is the result of the proc
      server denying access.
    <antrik> but Linux /proc acutally uses HZ as the unit IIRC? or is
      _SC_CLK_TCK=HZ on Linux?...
    <jkoenig> I expect they're equal.
    <jkoenig> in practice procps uses heuristics to guess what value /proc uses
      (for compatibility purposes with older kernels)
    <jkoenig> I don't think HZ is POSIX, while _SC_CLK_TCK is specifies as the
      unit for (at least) the values returned by times()
    <jkoenig> s/specifies/specified/
    <jkoenig> antrik, some the information is fetched directly from mach by
      libps, and understandably, the proc server does not give the task port to
      anyone who asks.
    <antrik> well, as long as the information is exposed through ps, there is
      no point in hiding it in procfs...
    <antrik> and I'm aware of the crazy guessing in libproc... I was actually
      mentoring the previous procfs implementation
    <antrik> (though I never got around to look at his buggy code...)
    <jkoenig> ok


## IRC, freenode, #hurd, 2011-07-22

    <pinotree> hm, why /proc/$pid/stat is 600 instead of 644 of linux?
    <jkoenig> pinotree, it reveals information which, while not that sensitive,
      would not be available to users through the normal proc interface.
    <jkoenig> (it's available through the ps command which is setuid root)
    <jkoenig> we discussed at some point making it 644, IIRC.
    <pinotree> hm, then why is it not a problem on eg linux?
    <jkoenig> (btw you can change it with the -s option.)
    <jkoenig> pinotree, it's not a problem because the information is not that
      sensitive, but when rewriting procfs I preferred to play it self and
      consider it's not procfs' job to decide what is sensitive or not.
    <jkoenig> IIRC it's not sensitive but you need the task port to query it.
    <jkoenig> like, thread times or something.
    <pinotree> status is 644 though
    <jkoenig> but status contains information which anyone can ask to the proc
      server anyway, I think.


# `/proc/mounts`, `/proc/[PID]/mounts`

## IRC, freenode, #hurd, 2011-07-25

    < pinotree> jkoenig: btw, what do you think about providing empty
      /proc/mounts and /proc/$pid/mounts files?
    < jkoenig> pinotree, I guess one would have to evaluate the consequences
      wrt. existing use cases (in other words, "I have absolutely no clue
      whatsoever about whether that would be desirable" :-)
    < jkoenig> pinotree, the thing is, an error message like "/proc/mounts: No
      such file or directory" is rather explicit, whereas errors which would be
      caused by missing data in /proc/mounts would maybe be harder to track
    < braunr> this seems reasonable though
    < braunr> there already are many servers with e.g. grsecurity or chrooted
      environments where mounts is empty
    < pinotree> well, currently we also have an empty mtab
    < braunr> pinotree: but what do you need that for ?
    < braunr> pinotree: the init system ?
    < pinotree> and the mnt C api already returns no entries (or it bails out,
      i don't remember)
    < pinotree> not a strict need

A [[mtab]] translator now exists.


## IRC, freenode, #hurd, 2013-09-20

    <pinotree> teythoon: should procfs now have $pid/mounts files pointing to
      ../mounts?
    <teythoon> pinotree: probably yes


# `/proc/[PID]/auxv`

Needed by glibc's `pldd` tool (commit
11988f8f9656042c3dfd9002ac85dff33173b9bd).


# `/proc/[PID]/exe`

Needed by glibc's `pldd` tool (commit
11988f8f9656042c3dfd9002ac85dff33173b9bd).


## `/proc/self/exe`

[[!message-id "alpine.LFD.2.02.1110111111260.2016@akari"]].  Needed by glibc's
`stdlib/tst-secure-getenv.c`.
`HAVE_PROC_SELF_EXE` in `[GCC]/libjava/configure.ac`.
Also used in `[GCC]/libgfortran/runtime/main.c`:`store_exe_path`.

Is it generally possible to use something like the following instead?
Disadvantage is that every program using this needs to be patched.

    #include <dlfcn.h>
    [...]
    Dl_info DLInfo;
    int err = dladdr(&main, &DLInfo);
    if (err == 0)
      [...]
    /* Pathname of shared object that contains address: DLInfo.dli_fname.  */
    /* Filter it through realpath.  */

This is used in `[LLVM]/lib/Support/Unix/Path.inc`.


### IRC, OFTC, #debian-hurd, 2013-11-10

    <mjt> Hello.  Does hurd have /proc/self/exe equivalent, to "re-exec myself"
      ?
    <youpi> no, only argv[0]
    <mjt> busybox uses /proc/self/exe by default to re-exec itself when running
      one of its applets, or failing that, tries to find it in $PATH.  I guess
      it doesn't work on hurd... :)
    <mjt> and argv0 is unreliable
    <youpi> some discussion on the hurd wiki talks about using Dl_info DLInfo
    <youpi> which contains DLInfo.dli_fname
    <youpi> err, I mean, callling dladdr(&main, &DLInfo);
    <youpi> this is kernel-agnostic, provided one uses glibc
    <mjt> um. -ldl. nice for static linking
    <mjt> gcc t.c -ldl -static
    <mjt> ./a.out 
    <mjt> fname=AVA� �j
    <mjt> bah :)
    <mjt> (it just prints dli_fname)
    <teythoon> :/
    <youpi> ah, yes, that won't work with static linking
    <teythoon> fixing /proc/self is on my todo list, it shouldn't be too hard
    <youpi> since in that case it's the exec server which sets the process up,
      not dl.so
    <teythoon> but we do not have the exe link either
    <mjt> (the above test run was on linux not on hurd, fwiw_
    <mjt> )


# `/proc/[PID]/fd/`

## IRC, freenode, #hurd, 2012-04-24

    <antrik> braunr: /proc/*/fd can be implemented in several ways. none of
      them would require undue centralisation
    <antrik> braunr: the easiest would be adding one more type of magic lookup
      to the existing magic lookup mechanism
    <antrik> wait, I mean /proc/self... for /proc/*/fd it's even more
      straighforward -- we might even have a magic lookup for that already
    <pinotree> i guess the ideal thing would be implement that fd logic in
      libps
    <antrik> pinotree: nope. it doesn't need to ask proc (or any other server)
      at all. it's local information. that's what we have the magic lookups for
    <antrik> one option we were considering at some point would be using the
      object migration mechanism, so the actual handling would still happen
      client-side, but the server could supply the code doing it. this would
      allow servers to add arbitrary magic lookup methods without any global
      modifications... but has other downsides :-)
    <gnu_srs> youpi: How much info for /proc/*/fd is possible to get from
      libps? Re: d-h@
    <youpi> see my mail
    <youpi> I don't think there is an interface for that
    <youpi> processes handle fds themselves
    <youpi> so libps would have to peek in there
    <youpi> and I don't remember having seen any code like that
    <gnu_srs> 10:17:17< antrik> wait, I mean /proc/self... for /proc/*/fd it's
      even more straighforward -- we might even have a magic lookup for that
      already
    <gnu_srs> pinotree: For me that does not ring a bell on RPCs. Don't know
      what magic means,,
    <youpi> for /proc/self/fd we have a magic lookup
    <youpi> for /proc/pid/fd, I don't think we have
    <gnu_srs> magic lookup*
    <gnu_srs> magic lookup == RPC?
    <youpi> magic lookup is a kind of answer to the lookup RPC
    <youpi> that basically says "it's somewhere else, see there"
    <youpi> the magic FD lookup tells the process "it's your FD number x"
    <youpi> which works for /proc/self/fd, but not /proc/pid/fd
    <civodul> youpi, gnu_srs: regarding FDs, there the msg_get_fd RPC that
      could be used
    <civodul> `msgport' should have --get-fd, actually
    <youpi> civodul: I assumed that the reason why msgport doesn't have it is
      that it didn't exist
    <youpi> so we can get a port on the fd
    <youpi> but then how to know what it is?
    <civodul> youpi: ah, you mean for the /proc/X/fd symlinks?
    <civodul> good question
    <civodul> it's not designed to be mapped back to names, indeed :-)
    <antrik> youpi: yeah, I realized myself that only /proc/self/fd is trivial
    <antrik> BTW, in Linux it's nor real symlinks. it's magic, with some very
      strange (but useful in certain situations) semantics
    <antrik> not real symlinks
    <antrik> it's very weird for example for fd connected to files that have
      been unlinked. it looks like a broken symlink, but when dereferencing
      (e.g. with cp), you get the actual file contents...


# `/proc/[PID]/maps`

[[!GNU_Savannah_bug 32770]]


## IRC, OFTC, #debian-hurd, 2012-06-20

    <pinotree> bdefreese: the two elfutils tests fail because there are no
      /proc/$pid/maps files
    <pinotree> that code is quite relying on linux features, like locating the
      linux kernel executables and their modules, etc
    <pinotree> (see eg libdwfl/linux-kernel-modules.c)
    <pinotree> refactor elfutils to have the linux parts executed only on linux
      :D
    <bdefreese> Oh yeah, the maintainer already seems really thrilled about
      Hurd..  Did you see
      http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662041 ?
    <pinotree> kurt is generally helpful with us (= hurd)
    <pinotree> most probably there he is complaining that we let elfutils build
      with nocheck (ie skipping the test suite run) instead of investigate and
      report why the test suite failed


## `/proc/self/maps`

`HAVE_PROC_SELF_MAPS` in `[GCC]/libjava/configure.ac`.
Also used in `[GCC]/intl/relocatable.c`:`find_shared_library_fullname` for
`#ifdef __linux__`.


### IRC, freenode, #hurd, 2013-10-03

    <camm`> what's the equivalent of cat /proc/self/maps on hurd?
    <braunr> camm`: for now, /proc/self doesn't work as expected
    <camm`> thanks, I just want to get a list of maps and protection status for
      a running process -- how?
    <braunr> vminfo
    <camm`> thanks so much!  I'm trying to debug an unexec failure on hurd when
      a linker script is present.  All works with the default script, but when
      the text address is changed, unexec fails, running into a page with no
      access in the middle of the executable:    0xc4b000[0x1000] (prot=0,
      max_prot=RWX, offs=0xb55000)
    <camm`> I get a segfault when trying to read from this page.
    <braunr> unexec ?
    <camm`> emacs/gcl/maxima/acl2/hol88/axiom use unexec to dump a running
      image into a saved executable elf file.
    <braunr> what is unexec ?
    <braunr> ok looks like a dirty tool
    <braunr> camm`: what is segfaulting, unexec or the resulting executable ?
    <camm`> unexec opens the file from which the running program was originally
      executed, finds its section start addresses, then writes a new file
      replacing any data in the old file with possibly modified versions in
      running memory.  The reverse of 'exec'.
    <camm`> the read from running memory delimited by the addresses in the
      executable file is hitting a page which has been protected with *no*
      access, and is segfaulting.  Somehow, when the binary file is loaded,
      hurd turning off all rights to this page.
    <camm`> let me check the stack location ...
    <camm`> ok I think I've got it -- hurd moves the sbrk(0) address away from
      the end of .data (as reported by readelf) if the addresses are low,
      presumably to avoid running into the stack.
    <camm`> starting sbrk(0)!=.data+data_size on hurd
    <braunr> i'm not sure there is anything like the heap on the hurd
    <braunr> sbrk is probably implemented on top of mmap
    <braunr> camm`: hm no, i'm wrong, glibc implements brk and sbrk mostly as
      expected, but remapping the area isn't atomic
    <braunr> "Now reallocate it with no access allowed"
    <braunr> then, there is a call to vm_protect
    <braunr> and no error checking
    <braunr> ...
    <camm`> ok, that's fine, but need to know -- in general there is no
      relationship between the address returned by sbrk(0) and the .data
      addresses reported by readelf on the file, (hurd only) yes?
    <braunr> i don't know about that
    <braunr> there should be ..
    <camm`> Specific example: readelf -a ->   [24] .data             PROGBITS
      000f5580 0c4580 000328 00  WA  0   0 32
    <camm`>  
    <camm`> sbrk(0)->(void *) 0x8021000
    <braunr> camm`: is that on an executable or a shared object ?
    <camm`> executable
    <braunr> 000f5580 looks very low
    <camm`> This is using a linker script.  The default setup works just fine.
    <camm`> I think it (might) make sense for hurd to silently do this give the
      placement of the C stack, but the assumptions behind my algorithm need
      changing (perhaps). 
    <camm`> (I probe in configure the allowable range of __executable_start,
      and then choose a value to either ensure a large free signed range around
      NULL, or a low data start to maximize heap)
    <camm`> braunr: are there any guarantees of sbrk(0)==.data+size without a
      linker script?
    <braunr> camm`: i'm not sure at all
    <braunr> sbrk isn't even posix
    <camm`> thanks


## IRC, freenode, #hurd, 2014-02-22

    <ignaker> i'm trying to implement proc/maps 
    <ignaker> actually I can't well evaluate complexity of tasks. However, I
      appreciate your comments
    <braunr> the complexity can be roughly estimated from the number of
      components involved
    <braunr> proc/maps involves procfs, ports, virtual memory, and file systems
    <braunr> the naive implementation would merely be associating names to
      memory objects, and why not, but a more complete one would go ask file
      system servers about them
    <braunr> perhaps more
    <braunr> although personally i'd go for the naive one because less
      dependencies usually means better reliability
    <braunr> something similar to task_set_name could do the job


# `/proc/[PID]/mem`

Needed by glibc's `pldd` tool (commit
11988f8f9656042c3dfd9002ac85dff33173b9bd).


# `/proc/[PID]/cwd`

## IRC, freenode, #hurd, 2012-06-30

    * pinotree has a local work to add the /proc/$pid/cwd symlink, but relying
        on "internal" (but exported) glibc functions


# CPU Usage

## IRC, freenode, #hurd, 2013-01-30

    <gnu_srs> Hi, htop seems to report CPU usage correct, but not top, is that
      a known issue? 
    <youpi> does your /proc have the -c flag?
    <gnu_srs> /hurd/procfs -c
    <youpi> I don't remember which way it works, but iirc depending on whether
      -c is there or not, it will work or not
    <youpi> problem being that nothing says linux' clock is 100Hz, but a lot of
      programs assume it
    <gnu_srs> seems like htop gets it right though
    <youpi> possibly just by luc
    <youpi> k


### IRC, freenode, #hurd, 2013-01-31

    <braunr> both htop and top seem to have problems report the cpu time
    <braunr> so i expect the problem to be in procfs


# IRC, freenode, #hurd, 2013-10-03

    <braunr> teythoon: any reason the static variable translator_exists isn't
      protected by a lock in procfs/rootdir.c ?


## IRC, freenode, #hurd, 2013-10-04

    <braunr> teythoon: can you tell me why translator_exists isn't protected
      from shared access in rootdir_mounts_exists ?
    <teythoon> braunr: hm, dunno tbh, I probably thought the race was harmless
      enough
    <braunr> it probably is
    <braunr> settrans -Rg doesn't work on procfs :(


# Kernel PID

## IRC, freenode, #hurd, 2013-09-25

    <braunr> hm cute, htop layout has become buggy, top just won't start
    <teythoon> braunr: make sure your procfs knows the correct kernel pid
    <teythoon> # showtrans /proc
    <teythoon> /hurd/procfs -c -k 3
    <teythoon> we could have handled this nicer if procfs were integrated
      upstream
    <teythoon> we should probably just update the default
    <braunr> teythoon: mhm
    <braunr> $ fsysopts /proc
    <braunr> /hurd/procfs --stat-mode=444 --fake-self=1
    <braunr> $ showtrans /proc
    <braunr> /hurd/procfs -c
    <pinotree> -c == --stat-mode=444 --fake-self=1
    <braunr> better indeed
    <braunr> teythoon: thanks


## IRC, freenode, #hurd, 2013-10-04

    <braunr> youpi: i fixed procfs on ironforge and exodar to be started as
      procfs -c -k 3
    <braunr> without -k 3, many things as simple as top and uptime won't work


## IRC, freenode, #hurd, 2013-10-24

    <gg0> braunr: i'm using your repo and i can't see cpu percentage in htop
      anymore, all zeroes, confirmed?
    <braunr> gg0: no
    <braunr> gg0: you probably need to reset procfs
    <braunr> gg0: settrans /proc /hurd/procfs -c -k 3