Running bin file from a module


 
Thread Tools Search this Thread
Top Forums Programming Running bin file from a module
# 8  
Old 03-17-2011
Well, Corona688 I see you have very large knowledge about writing linux drivers, so I would be very pleased to receive any help from you.
Let's go to the very begining. I have such files:

Code:
SimpleBin:
void main() {
 write(2, "Write\n", 6);
}

Code:
CallSimpleBin:
#include <stdlib.h>

void main() {
  system("./SimpleBin");
}

Running 'CallSimpleBin' I can call 'SimpleBin'.
Now I would like to call SimpleBin from module:

Code:
SimpleModule:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

static int mymodule_init(void) {
 printk(KERN_ALERT "mymodule init\n");
/* here I would like to call SimpleBin */
 return 0;
}

static int mymodule_exit(void) {
 printk(KERN_ALERT "mymodule exit\n");
}
 
module_init(mymodule_init);
module_exit(mymodule_exit);

I also created static library:
Code:
SimpleLib:
void writeToScreen(char* str, int length) {
 write(2, str, length);
}

and I can call it from my user space application:
Code:
extern void writeToScreen(char* str, int length);

void main() {
 writeToScreen("Hi\n", 3);
}

it works. Unfortunatelly I cannot call 'writeToScreen' from module - it even could not compile.

Could you tell me some hints how I can do that?
I really apreciate any of your help.

Last edited by Chrisdot; 03-17-2011 at 11:32 AM..
# 9  
Old 03-17-2011
Quote:
In final version my driver would load UEFI driver from hardware's flash.
I am confused. UEFI drivers are intended to extend firmware, have no OS dependence and have nothing to do with an operating system kernel.

How do you expect the kernel to load and interface with a UEFI driver? UEFI drivers can be 32 bit, 64-bit and more commonly EBC (Efi Byte Code). Have you read the Driver Writers Guide for UEFI?

Are you aware, for example, that 64-bit UEFI uses the Microsoft X64 calling convention whereas Linux uses the AMD64 calling convention.
Code:
//
// Unix/Linux arg passing:  RCX, RDX,  R8,  R9
//                                     RSI, RDI scratch 
//   UEFI/EFI arg passing:  RDI, RSI, RDX, RCX, R8, R9
//                                     Callee allocates 32 bytes on stack to spill registers
//                                     RSI, RDI callee-save
//
//   Mapping between registers
//
//   arg1   arg2    arg3   arg4   arg5     arg6      arg7       arg8
//
//   gcc:  (AMD64 ABI)
//   %rdi,  %rsi,  %rdx,  %rcx,    %r8,     %r9,     8(%rsp), 16(%rsp),  ....
//
//   efi:  (Microsoft X64)
//   %rcx,  %rdx,   %r8,   %r9,  32(%rsp), 40(%rsp), 48(%rsp), 56(%rsp), ....
//

You also need a UEFI-aware operating system of which there are a limited number out there. Recent 64-bit versions of Fedora/Redhat/etc.

If you describe exactly what you are trying to achieve - the big picture and not the how to - we can probably help you.
# 10  
Old 03-17-2011
You are right. My friend is creating an UEFI emulator that redefine calls and do all necessary operations.
I need to take advantage of library already loaded (for concept purposes I assume library placed on HDD).
That solution is targeted to work on Redhat.

What I want for now is to make a kind of demo (concept).
It can be simple driver loading simple library and using it for e.g. printing to dmesg.
# 11  
Old 03-17-2011
Quote:
Originally Posted by Chrisdot
Well, Corona688 I see you have very large knowledge about writing linux drivers
I've done enough work with them to know they are a severe challenge. I've occasionally had to alter some predefined values. I wrote a linux driver that prints 'hello world' to dmesg. I couldn't write a real driver yet.

But I know enough to tell you that windmills device drivers don't work that way. The kernel isn't going to reach into userspace, rip one function out of your userspace program, and run it raw because you don't get the same kind of stack; you don't get an ordinary heap; you don't get anything from libc; you don't get the same kind of files -- what does stderr even mean when you have no descriptor table? -- you don't get easy system calls like read() and write(); you don't even get easy, direct access to large amounts of available memory, and what memory there is is laid out in an alien way. The ease of all these things in userspace is a convincing illusion created by the kernel, more or less, and the way to use them is to be in userspace. Ordinary code can't run in kernel space any more than you could breathe in a vacuum.

Nearly all communication with the kernel is done through files and system calls instead. Your device driver can create a device file under /dev/ tied to your own kernel functions. someone opens it and your driver's read handler gets called, someone reads it and your device's read-handler gets called, etc. On boot, something in userspace could read from the ROM device and dump it into your special firmware-loading device file, and you'd be done.

Last edited by Corona688; 03-17-2011 at 01:15 PM..
This User Gave Thanks to Corona688 For This Post:
# 12  
Old 03-17-2011
Well, let me try to summarize what we get for now:

- it is impossible to load dll library / any other library from hdd/device's flash to RAM memory and take advantage of its functions by device driver (which I used to call just 'module'), isn't it?

- way to do that is e.g. mount (somehow) that dll / any other library as a device and use it in a way of reading / writing to that

Quote:
Originally Posted by Corona688
Your device driver can create a device file under /dev/ tied to your own kernel functions. (...) On boot, something in userspace could read from the ROM device and dump it into your special firmware-loading device file
Are there any other possibilities to solve that problem?
# 13  
Old 03-17-2011
Quote:
Originally Posted by Chrisdot
- it is impossible to load dll library / any other library from hdd/device's flash to RAM memory and take advantage of its functions by device driver (which I used to call just 'module'), isn't it?
If by that you mean "directly run userspace code in kernel space", then yes, it's impossible. Otherwise... it really, really depends what the content of this thing is. You can't run just anything in kernel space, it has to be code compiled for your kernel's environment. It also really, really depends on how it's stored and where. The kernel's capable of reading firmware files on demand, I think, but from the sounds of it that's no file...
Quote:
- way to do that is e.g. mount (somehow) that dll / any other library as a device and use it in a way of reading / writing to that
If this dll is userspace code that won't help because it will still be userspace code and unable to operate in kernel space.
Quote:
Are there any other possibilities to solve that problem?
Extract the userspace code in userspace. Use the userspace code in userspace. Communicate data, not program instructions, in and out of the kernel.

Last edited by Corona688; 03-17-2011 at 03:16 PM..
# 14  
Old 03-17-2011
Hmm... so if I create simple doing nothing (or printing text to dmesg) kernel space dynamic library, save it wherever on HDD and try to use from device driver - would that work?
Is there a way to create dynamic library in kernel space and call it from device driver?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Usage of #!/bin/sh vs #!/bin/bash shell scripts?

Some question about the usage of shell scripts: 1.) Are the commands of the base shell scripts a subset of bash commands? 2.) Assume I got a long, long script WITHOUT the first line. How can I find out if the script was originally designed für "sh" or "bash"? 3.) How can I check a given... (3 Replies)
Discussion started by: pstein
3 Replies

2. AIX

Redistribution bin required for AIX. j7r164redist.7.1.0.25.bin

Hi, I am planning to install a version of Informatica on my AIX box. It requires a specific java build in pap6470_27sr2-20141101_01(SR2). The current link for IBM 64-bit SDK for AIX®, JavaTM Technology Edition, Version 7 Release 1 has a more recent version in j7r164redist.7.1.0.75.bin. Is... (4 Replies)
Discussion started by: meetpraveens
4 Replies

3. Ubuntu

Compile smbfs module in kernel version 3.10 running Ubuntu 12.04 LTS

Is there any way to compile smbfs module in kernel 3.10 running Ubuntu 12.04 LTS. I did a 'make menuconfig' and it shows cifs. I found out online that smbfs is deprecated and replaced by cifs. I have an old system with kernel version 2.4 which only has smbfs (no cifs). Is it possible to compile... (1 Reply)
Discussion started by: Monil
1 Replies

4. Programming

Why am i getting these strange packets while running my packet capture module written in c.?

I have made an packet capture application running on intel machine, it is capturing packets with src address- 17.0.0.0 destination ip- 66.0.0.0, source port- 0, destination port- 0, and protocol- 0 what does these packets mean ? The code written to interpreter captured bytes is given below.... (5 Replies)
Discussion started by: arunpushkar
5 Replies

5. OS X (Apple)

When to use /Users/m/bin instead of /usr/local/bin (& whats the diff?)?

Q1. I understand that /usr/local/bin means I can install/uninstall stuff in here and have any chance of messing up my original system files or effecting any other users. I created this directory myself. But what about the directory I didn't create, namely /Users/m/bin? How is that directory... (1 Reply)
Discussion started by: michellepace
1 Replies

6. UNIX for Dummies Questions & Answers

fuser: difference with bin/sh and bin/ksh shell script

Hi, I have a problem I don't understand with fuser. I launch a simple shell script mysleep.sh: I launch the command fuser -fu mysleep.sh but fuser doesn't return anything excepted: mysleep: Then I modify my script switching from #!/bin/sh to #!/bin/ksh I launch the command fuser -fu... (4 Replies)
Discussion started by: Peuj
4 Replies

7. Shell Programming and Scripting

Why does my /bin/csh take longer than /bin/perl?

Okay, so I have two "Hello, world!" scripts, "test.pl" and "test.sh". #!/bin/perl -w use strict; print "Hello, world!\n"; #!/bin/csh echo Hello,\ world! When I run test.pl, it runs instantly, always. When I run test.sh, it takes anywhere between 4 and 22 seconds! I'd like to know what... (3 Replies)
Discussion started by: acheong87
3 Replies

8. Linux

How to convert Linux Kernel built-in module into a loadable module

Hi all, I am working on USB data monitoring on Fedora Core 9. Kernel 2.6.25 has a built-in module (the one that isn't loadable, but compiles and links statically with the kernel during compilation) to snoop USB data. It is in <kernel_source_code>/drivers/usb/mon/. I need to know if I can... (0 Replies)
Discussion started by: anitemp
0 Replies

9. Programming

find the fully-qualified path for the app my module is running in

Hi- I need the cpp call that will tell me the full path to the app I'm running in. For example, I'm running in a loaded library for either mozilla or firefox, but would like to know the full path to the executable /usr/bin/firefox /usr/bin/mozilla /usr/local/firefox1_5 etc... (For... (4 Replies)
Discussion started by: erwinfletch
4 Replies

10. UNIX for Dummies Questions & Answers

/bin/sh: /usr/bin/vi: No such file or directory when doing crontab

I just set up an ftp server with Red Hat 5.2. I am doing the work, I'm baby stepping, but it seems like every step I get stuck. Currently, I'm trying to set up a crontab job, but I'm getting the following message: /bin/sh: /usr/bin/vi: No such file or directory. I see that vi exists in /bin/vi,... (3 Replies)
Discussion started by: kwalter
3 Replies
Login or Register to Ask a Question