Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!ut-emx!ibmchs!auschs!awdprime!john From: john@fulcrum.austin.ibm.com (John R. Miller/20000) Newsgroups: comp.unix.aix Subject: Re: how to build a kernel extension Message-ID: Date: 31 Oct 90 01:00:57 GMT References: <4648@spdcc.SPDCC.COM> Sender: news@awdprime.UUCP Organization: IBM AWD, Austin, TX Lines: 205 In-reply-to: dyer@spdcc.COM's message of 26 Oct 90 22:12:55 GMT Apologies if this is a repost. I think our NNTP server was full and dropped my previous post. In article <4648@spdcc.SPDCC.COM> dyer@spdcc.COM (Steve Dyer) writes: I have the manual named "Kernel Extensions and Device Support Programming Concepts", but while it goes into some issues in excruciating detail, I can't really find ANYWHERE where it addresses the simple step-by-step set of instructions you must follow to create a loadable kernel extension file once you compile your extension foo.c and get a foo.o file. I'm including a trivial example below. `unshar', `make all' and you've got a loadable kernel extension that increments its argument. `make' and you can run the test as well. Note that loading a kernel extension requires "appropriate privilege" (i.e., root-ness). Hope this helps. -------- John R. Miller (not to be confused with my employer) 512/823-3867 john@fulcrum.austin.ibm.com ...!cs.utexas.edu!ibmaus!auschs!fulcrum.austin.ibm.com!john ---X---X---X---X---X---X---X-cut here--X---X---X---X---X---X---X---X---X--- #! /bin/sh # # This is a shell archive. Save this into a file, edit it # and delete all lines above this comment. Then give this # file to sh by executing the command "sh file". The files # will be extracted into the current directory owned by # you with default permissions. # # The files contained herein are: # # -rw-r--r-- 1 john staff 391 Oct 27 20:32 Makefile # -rw-r--r-- 1 john staff 61 Oct 27 20:32 bingo.c # -rw-r--r-- 1 john staff 22 Oct 27 21:03 bingo.exp # -rw-r--r-- 1 john staff 339 Oct 27 20:49 loadbingo.c # -rw-r--r-- 1 john staff 429 Oct 27 20:49 querybingo.c # -rw-r--r-- 1 john staff 274 Oct 27 20:33 testofbingo.c # -rw-r--r-- 1 john staff 506 Oct 27 20:49 unloadbingo.c # echo 'x - Makefile' if test -f Makefile; then echo 'shar: not overwriting Makefile'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > Makefile Xtestofbingo: testofbingo.o X cc -o testofbingo testofbingo.o -bI:bingo.exp X Xloadbingo: loadbingo.o X cc -o loadbingo loadbingo.o X Xquerybingo: querybingo.o X cc -o querybingo querybingo.o X Xunloadbingo: unloadbingo.o X cc -o unloadbingo unloadbingo.o X Xbingosyscall.o: bingo.o bingo.exp X ld -o bingosyscall.o bingo.o -bE:bingo.exp -bM:SRE X Xall: loadbingo querybingo unloadbingo bingosyscall.o UnLiKeLy@@@StUfF if test `wc -c < Makefile` -ne 391; then echo 'shar: Makefile was damaged during transit (should have been 391 bytes)' fi fi ; : end of overwriting check echo 'x - bingo.c' if test -f bingo.c; then echo 'shar: not overwriting bingo.c'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > bingo.c X/* this game is rigged */ X Xint Xbingo(int i) X{ X return i+1; X} UnLiKeLy@@@StUfF if test `wc -c < bingo.c` -ne 61; then echo 'shar: bingo.c was damaged during transit (should have been 61 bytes)' fi fi ; : end of overwriting check echo 'x - bingo.exp' if test -f bingo.exp; then echo 'shar: not overwriting bingo.exp'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > bingo.exp X#!/unix Xbingo syscall UnLiKeLy@@@StUfF if test `wc -c < bingo.exp` -ne 22; then echo 'shar: bingo.exp was damaged during transit (should have been 22 bytes)' fi fi ; : end of overwriting check echo 'x - loadbingo.c' if test -f loadbingo.c; then echo 'shar: not overwriting loadbingo.c'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > loadbingo.c X/* load the well known bingo sbr */ X X#include X Xmain() X{ X int kmod_id; X struct cfg_load cfg_ld; X char *path = "./bingosyscall.o"; X X cfg_ld.path = path; X if (sysconfig(SYS_KLOAD, (void *)&cfg_ld, (int)sizeof(cfg_ld))) { X perror("sysconfig(SYS_KLOAD)"); X exit(1); X } X printf("Its kmid is %d.\n", cfg_ld.kmid); X exit(0); X} UnLiKeLy@@@StUfF if test `wc -c < loadbingo.c` -ne 339; then echo 'shar: loadbingo.c was damaged during transit (should have been 339 bytes)' fi fi ; : end of overwriting check echo 'x - querybingo.c' if test -f querybingo.c; then echo 'shar: not overwriting querybingo.c'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > querybingo.c X/* is the well known bingo sbr loaded? */ X X#include X Xmain() X{ X int kmod_id; X struct cfg_load cfg_ld; X char *path = "./bingosyscall.o"; X X cfg_ld.path = path; X if (sysconfig(SYS_QUERYLOAD, (void *)&cfg_ld, (int)sizeof(cfg_ld))) { X perror("sysconfig(SYS_KULOAD)"); X exit(1); X } X if (cfg_ld.kmid) X printf("It's there all right. Its kmid is %d.\n", cfg_ld.kmid); X else X printf("It's not there.\n"); X exit(0); X} UnLiKeLy@@@StUfF if test `wc -c < querybingo.c` -ne 429; then echo 'shar: querybingo.c was damaged during transit (should have been 429 bytes)' fi fi ; : end of overwriting check echo 'x - testofbingo.c' if test -f testofbingo.c; then echo 'shar: not overwriting testofbingo.c'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > testofbingo.c X/* ah. but does bingo() work? */ X X#include X Xmain() X{ X int rc; X X if ((rc = bingo(3)) != 4) { X perror("bingo"); X fprintf(stderr, "bingo() is a fraud!\n"); X fprintf(stderr, "I sent 3 and it returned %d\n", rc); X exit(1); X } X printf("all is well\n"); X exit(0); X} UnLiKeLy@@@StUfF if test `wc -c < testofbingo.c` -ne 274; then echo 'shar: testofbingo.c was damaged during transit (should have been 274 bytes)' fi fi ; : end of overwriting check echo 'x - unloadbingo.c' if test -f unloadbingo.c; then echo 'shar: not overwriting unloadbingo.c'; else sed 's/^X//' << 'UnLiKeLy@@@StUfF' > unloadbingo.c X/* unload the well known bingo sbr */ X X#include X Xmain() X{ X int kmod_id; X struct cfg_load cfg_ld; X char *path = "./bingosyscall.o"; X X cfg_ld.path = path; X if (sysconfig(SYS_QUERYLOAD, (void *)&cfg_ld, (int)sizeof(cfg_ld))) { X perror("sysconfig(SYS_KULOAD)"); X exit(1); X } X if (!cfg_ld.kmid) { X printf("I can't unload it. It's not there.\n"); X exit(1); X } X if (sysconfig(SYS_KULOAD, (void *)&cfg_ld, (int)sizeof(cfg_ld))) { X perror("sysconfig(SYS_KULOAD)"); X exit(1); X } X exit(0); X} UnLiKeLy@@@StUfF if test `wc -c < unloadbingo.c` -ne 506; then echo 'shar: unloadbingo.c was damaged during transit (should have been 506 bytes)' fi fi ; : end of overwriting check exit 0 --